summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2014-11-03 15:01:33 +1000
committerBen Skeggs <bskeggs@redhat.com>2014-11-10 10:26:09 +1000
commit4f901c0a430a3ebb11a8ce5763db815434ef974a (patch)
tree26bd1e77d03a408f9b8d04ec3fa609daea7f37f7
parent495c1a10e5078932c2e1e7bc1be5df9de9f70f1c (diff)
downloadnouveau-4f901c0a430a3ebb11a8ce5763db815434ef974a.tar.gz
kms/nv50: use sclass() instead of trial-and-error
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drm/nv50_display.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/drm/nv50_display.c b/drm/nv50_display.c
index daff111a3..f0d2a8f31 100644
--- a/drm/nv50_display.c
+++ b/drm/nv50_display.c
@@ -65,15 +65,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;
}