drm/nv50/kms: use sclass() instead of trial-and-error

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Ben Skeggs 2014-11-03 15:01:33 +10:00
parent 036a12b681
commit 6af5289e85
1 changed files with 20 additions and 6 deletions

View 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;
}