summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-08-20 14:54:18 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-08-28 12:40:40 +1000
commit0710cc31482ae3711367c42e61580126c50c8ec0 (patch)
tree4a5214526e421b354047366348e6ab33b4eafdf6 /drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
parent19fef52d93518cc01fd284b55ee93c0a9967634f (diff)
downloadlwn-0710cc31482ae3711367c42e61580126c50c8ec0.tar.gz
lwn-0710cc31482ae3711367c42e61580126c50c8ec0.zip
drm/nouveau/dma: convert user classes to new-style nvkm_object
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/engine/device/user.c')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/device/user.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
index 58a09f828b7f..39f31e2e281b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
@@ -292,11 +292,12 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
(1ULL << NVDEV_ENGINE_FIFO) |
(1ULL << NVDEV_ENGINE_DISP) |
(1ULL << NVDEV_ENGINE_PM);
- const struct nvkm_device_oclass *sclass;
+ const struct nvkm_device_oclass *sclass = NULL;
int i;
- for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) {
- if ((engine = nvkm_device_engine(device, i))) {
+ for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) {
+ if ((engine = nvkm_device_engine(device, i)) &&
+ !engine->func) {
struct nvkm_oclass *sclass = engine->sclass;
int c = 0;
while (sclass && sclass->ofuncs) {
@@ -312,17 +313,27 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
sclass++;
}
index -= c;
+ continue;
}
+
+ if (!(engine = nvkm_device_engine(device, i)) ||
+ !(engine->func->base.sclass))
+ continue;
+ oclass->engine = engine;
+
+ index -= engine->func->base.sclass(oclass, index, &sclass);
}
- switch (index) {
- case 0: sclass = &nvkm_control_oclass; break;
- default:
- return -EINVAL;
+ if (!sclass) {
+ switch (index) {
+ case 0: sclass = &nvkm_control_oclass; break;
+ default:
+ return -EINVAL;
+ }
+ oclass->base = sclass->base;
}
oclass->ctor = nvkm_udevice_child_new;
- oclass->base = sclass->base;
oclass->priv = sclass;
return 0;
}