Commit cfdc4c44 authored by Ben Skeggs's avatar Ben Skeggs

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

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 572fb13d
...@@ -26,6 +26,13 @@ struct nvkm_object { ...@@ -26,6 +26,13 @@ struct nvkm_object {
#endif #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 * static inline struct nvkm_object *
nv_object(void *obj) nv_object(void *obj)
{ {
......
...@@ -224,10 +224,14 @@ static int ...@@ -224,10 +224,14 @@ static int
nvkm_ioctl_rd(struct nvkm_handle *handle, void *data, u32 size) nvkm_ioctl_rd(struct nvkm_handle *handle, void *data, u32 size)
{ {
struct nvkm_object *object = handle->object; struct nvkm_object *object = handle->object;
struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
union { union {
struct nvif_ioctl_rd_v0 v0; struct nvif_ioctl_rd_v0 v0;
} *args = data; } *args = data;
union {
u8 b08;
u16 b16;
u32 b32;
} v;
int ret; int ret;
nvif_ioctl(object, "rd size %d\n", size); nvif_ioctl(object, "rd size %d\n", size);
...@@ -236,22 +240,16 @@ nvkm_ioctl_rd(struct nvkm_handle *handle, void *data, u32 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); args->v0.version, args->v0.size, args->v0.addr);
switch (args->v0.size) { switch (args->v0.size) {
case 1: case 1:
if (ret = -ENODEV, ofuncs->rd08) { ret = nvkm_object_rd08(object, args->v0.addr, &v.b08);
args->v0.data = nv_ro08(object, args->v0.addr); args->v0.data = v.b08;
ret = 0;
}
break; break;
case 2: case 2:
if (ret = -ENODEV, ofuncs->rd16) { ret = nvkm_object_rd16(object, args->v0.addr, &v.b16);
args->v0.data = nv_ro16(object, args->v0.addr); args->v0.data = v.b16;
ret = 0;
}
break; break;
case 4: case 4:
if (ret = -ENODEV, ofuncs->rd32) { ret = nvkm_object_rd32(object, args->v0.addr, &v.b32);
args->v0.data = nv_ro32(object, args->v0.addr); args->v0.data = v.b32;
ret = 0;
}
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
...@@ -266,7 +264,6 @@ static int ...@@ -266,7 +264,6 @@ static int
nvkm_ioctl_wr(struct nvkm_handle *handle, void *data, u32 size) nvkm_ioctl_wr(struct nvkm_handle *handle, void *data, u32 size)
{ {
struct nvkm_object *object = handle->object; struct nvkm_object *object = handle->object;
struct nvkm_ofuncs *ofuncs = object->oclass->ofuncs;
union { union {
struct nvif_ioctl_wr_v0 v0; struct nvif_ioctl_wr_v0 v0;
} *args = data; } *args = data;
...@@ -278,32 +275,18 @@ nvkm_ioctl_wr(struct nvkm_handle *handle, void *data, u32 size) ...@@ -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", "wr vers %d size %d addr %016llx data %08x\n",
args->v0.version, args->v0.size, args->v0.addr, args->v0.version, args->v0.size, args->v0.addr,
args->v0.data); args->v0.data);
switch (args->v0.size) { } else
case 1: return ret;
if (ret = -ENODEV, ofuncs->wr08) {
nv_wo08(object, args->v0.addr, args->v0.data); switch (args->v0.size) {
ret = 0; 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);
break; case 4: return nvkm_object_wr32(object, args->v0.addr, args->v0.data);
case 2: default:
if (ret = -ENODEV, ofuncs->wr16) { break;
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;
default:
ret = -EINVAL;
break;
}
} }
return ret; return -EINVAL;
} }
static int static int
......
...@@ -24,6 +24,75 @@ ...@@ -24,6 +24,75 @@
#include <core/object.h> #include <core/object.h>
#include <core/engine.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 int
nvkm_object_create_(struct nvkm_object *parent, struct nvkm_object *engine, nvkm_object_create_(struct nvkm_object *parent, struct nvkm_object *engine,
struct nvkm_oclass *oclass, u32 pclass, struct nvkm_oclass *oclass, u32 pclass,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment