Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfdc4c44 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/core: wrap direct use of object accessor functions



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 572fb13d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -26,6 +26,13 @@ struct nvkm_object {
#endif
};

int nvkm_object_rd08(struct nvkm_object *, u64 addr, u8  *data);
int nvkm_object_rd16(struct nvkm_object *, u64 addr, u16 *data);
int nvkm_object_rd32(struct nvkm_object *, u64 addr, u32 *data);
int nvkm_object_wr08(struct nvkm_object *, u64 addr, u8   data);
int nvkm_object_wr16(struct nvkm_object *, u64 addr, u16  data);
int nvkm_object_wr32(struct nvkm_object *, u64 addr, u32  data);

static inline struct nvkm_object *
nv_object(void *obj)
{
+21 −38
Original line number Diff line number Diff line
@@ -224,10 +224,14 @@ static int
nvkm_ioctl_rd(struct nvkm_handle *handle, void *data, u32 size)
{
	struct nvkm_object *object = handle->object;
	struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
	union {
		struct nvif_ioctl_rd_v0 v0;
	} *args = data;
	union {
		u8  b08;
		u16 b16;
		u32 b32;
	} v;
	int ret;

	nvif_ioctl(object, "rd size %d\n", size);
@@ -236,22 +240,16 @@ nvkm_ioctl_rd(struct nvkm_handle *handle, void *data, u32 size)
			   args->v0.version, args->v0.size, args->v0.addr);
		switch (args->v0.size) {
		case 1:
			if (ret = -ENODEV, ofuncs->rd08) {
				args->v0.data = nv_ro08(object, args->v0.addr);
				ret = 0;
			}
			ret = nvkm_object_rd08(object, args->v0.addr, &v.b08);
			args->v0.data = v.b08;
			break;
		case 2:
			if (ret = -ENODEV, ofuncs->rd16) {
				args->v0.data = nv_ro16(object, args->v0.addr);
				ret = 0;
			}
			ret = nvkm_object_rd16(object, args->v0.addr, &v.b16);
			args->v0.data = v.b16;
			break;
		case 4:
			if (ret = -ENODEV, ofuncs->rd32) {
				args->v0.data = nv_ro32(object, args->v0.addr);
				ret = 0;
			}
			ret = nvkm_object_rd32(object, args->v0.addr, &v.b32);
			args->v0.data = v.b32;
			break;
		default:
			ret = -EINVAL;
@@ -266,7 +264,6 @@ static int
nvkm_ioctl_wr(struct nvkm_handle *handle, void *data, u32 size)
{
	struct nvkm_object *object = handle->object;
	struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
	union {
		struct nvif_ioctl_wr_v0 v0;
	} *args = data;
@@ -278,32 +275,18 @@ nvkm_ioctl_wr(struct nvkm_handle *handle, void *data, u32 size)
			   "wr vers %d size %d addr %016llx data %08x\n",
			   args->v0.version, args->v0.size, args->v0.addr,
			   args->v0.data);
	} else
		return ret;

	switch (args->v0.size) {
		case 1:
			if (ret = -ENODEV, ofuncs->wr08) {
				nv_wo08(object, args->v0.addr, args->v0.data);
				ret = 0;
			}
			break;
		case 2:
			if (ret = -ENODEV, ofuncs->wr16) {
				nv_wo16(object, args->v0.addr, args->v0.data);
				ret = 0;
			}
			break;
		case 4:
			if (ret = -ENODEV, ofuncs->wr32) {
				nv_wo32(object, args->v0.addr, args->v0.data);
				ret = 0;
			}
			break;
	case 1: return nvkm_object_wr08(object, args->v0.addr, args->v0.data);
	case 2: return nvkm_object_wr16(object, args->v0.addr, args->v0.data);
	case 4: return nvkm_object_wr32(object, args->v0.addr, args->v0.data);
	default:
			ret = -EINVAL;
		break;
	}
	}

	return ret;
	return -EINVAL;
}

static int
+69 −0
Original line number Diff line number Diff line
@@ -24,6 +24,75 @@
#include <core/object.h>
#include <core/engine.h>

int
nvkm_object_rd08(struct nvkm_object *object, u64 addr, u8 *data)
{
	const struct nvkm_oclass *oclass = object->oclass;
	if (oclass->ofuncs && oclass->ofuncs->rd08) {
		*data = oclass->ofuncs->rd08(object, addr);
		return 0;
	}
	*data = 0x00;
	return -ENODEV;
}

int
nvkm_object_rd16(struct nvkm_object *object, u64 addr, u16 *data)
{
	const struct nvkm_oclass *oclass = object->oclass;
	if (oclass->ofuncs && oclass->ofuncs->rd16) {
		*data = oclass->ofuncs->rd16(object, addr);
		return 0;
	}
	*data = 0x0000;
	return -ENODEV;
}

int
nvkm_object_rd32(struct nvkm_object *object, u64 addr, u32 *data)
{
	const struct nvkm_oclass *oclass = object->oclass;
	if (oclass->ofuncs && oclass->ofuncs->rd32) {
		*data = oclass->ofuncs->rd32(object, addr);
		return 0;
	}
	*data = 0x0000;
	return -ENODEV;
}

int
nvkm_object_wr08(struct nvkm_object *object, u64 addr, u8 data)
{
	const struct nvkm_oclass *oclass = object->oclass;
	if (oclass->ofuncs && oclass->ofuncs->wr08) {
		oclass->ofuncs->wr08(object, addr, data);
		return 0;
	}
	return -ENODEV;
}

int
nvkm_object_wr16(struct nvkm_object *object, u64 addr, u16 data)
{
	const struct nvkm_oclass *oclass = object->oclass;
	if (oclass->ofuncs && oclass->ofuncs->wr16) {
		oclass->ofuncs->wr16(object, addr, data);
		return 0;
	}
	return -ENODEV;
}

int
nvkm_object_wr32(struct nvkm_object *object, u64 addr, u32 data)
{
	const struct nvkm_oclass *oclass = object->oclass;
	if (oclass->ofuncs && oclass->ofuncs->wr32) {
		oclass->ofuncs->wr32(object, addr, data);
		return 0;
	}
	return -ENODEV;
}

int
nvkm_object_create_(struct nvkm_object *parent, struct nvkm_object *engine,
		    struct nvkm_oclass *oclass, u32 pclass,