Loading drivers/gpu/drm/nouveau/include/nvkm/core/object.h +7 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading drivers/gpu/drm/nouveau/nvkm/core/ioctl.c +21 −38 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading drivers/gpu/drm/nouveau/nvkm/core/object.c +69 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
drivers/gpu/drm/nouveau/include/nvkm/core/object.h +7 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
drivers/gpu/drm/nouveau/nvkm/core/ioctl.c +21 −38 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading
drivers/gpu/drm/nouveau/nvkm/core/object.c +69 −0 Original line number Diff line number Diff line Loading @@ -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, Loading