drm/nv50/kms: use sclass() instead of trial-and-error
authorBen Skeggs <bskeggs@redhat.com>
Mon, 3 Nov 2014 05:01:33 +0000 (15:01 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 2 Dec 2014 05:44:01 +0000 (15:44 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv50_display.c

index 30e14e0a10f781810a97b90f47164c7e1e098dee..49f6128276ff2ffa8e4f1b5dcd7574b4d742540b 100644 (file)
@@ -66,15 +66,29 @@ static int
 nv50_chan_create(struct nvif_object *disp, const u32 *oclass, u8 head,
                 void *data, u32 size, struct nv50_chan *chan)
 {
+       const u32 handle = (oclass[0] << 16) | head;
+       u32 sclass[8];
+       int ret, i;
+
+       ret = nvif_object_sclass(disp, sclass, ARRAY_SIZE(sclass));
+       WARN_ON(ret > ARRAY_SIZE(sclass));
+       if (ret < 0)
+               return ret;
+
        while (oclass[0]) {
-               int ret = nvif_object_init(disp, NULL, (oclass[0] << 16) | head,
-                                          oclass[0], data, size,
-                                         &chan->user);
-               if (oclass++, ret == 0) {
-                       nvif_object_map(&chan->user);
-                       return ret;
+               for (i = 0; i < ARRAY_SIZE(sclass); i++) {
+                       if (sclass[i] == oclass[0]) {
+                               ret = nvif_object_init(disp, NULL, handle,
+                                                      oclass[0], data, size,
+                                                      &chan->user);
+                               if (ret == 0)
+                                       nvif_object_map(&chan->user);
+                               return ret;
+                       }
                }
+               oclass++;
        }
+
        return -ENOSYS;
 }