diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-02-16 12:10:38 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2013-02-20 15:55:28 +1000 |
commit | 36808c37d518cdb8759892b15b9fcf03a5d1315f (patch) | |
tree | 309cf6e8e68c81892a4ad2291f0e81326c499349 /nvkm | |
parent | 9a283830539e94d26692a1aecc23120a3ed9b8ae (diff) | |
download | nouveau-36808c37d518cdb8759892b15b9fcf03a5d1315f.tar.gz |
devinit/nv50: reverse the logic for running encoder init scripts
A single U encoder table can match multiple DCB entries, whereas the
reverse is not true and can lead to us not matching a DCB entry at
all, and fail to initialise some encoders.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nvkm')
-rw-r--r-- | nvkm/subdev/devinit/nv50.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/nvkm/subdev/devinit/nv50.c b/nvkm/subdev/devinit/nv50.c index ae7249b09..4a8577838 100644 --- a/nvkm/subdev/devinit/nv50.c +++ b/nvkm/subdev/devinit/nv50.c @@ -78,12 +78,13 @@ nv50_devinit_init(struct nouveau_object *object) if (ret) return ret; - /* if we ran the init tables, execute first script pointer for each - * display table output entry that has a matching dcb entry. + /* if we ran the init tables, we have to execute the first script + * pointer of each dcb entry's display encoder table in order + * to properly initialise each encoder. */ - while (priv->base.post && ver) { - u16 data = nvbios_outp_parse(bios, i++, &ver, &hdr, &cnt, &len, &info); - if (data && dcb_outp_match(bios, info.type, info.mask, &ver, &len, &outp)) { + while (priv->base.post && dcb_outp_parse(bios, i, &ver, &hdr, &outp)) { + if (nvbios_outp_match(bios, outp.hasht, outp.hashm, + &ver, &hdr, &cnt, &len, &info)) { struct nvbios_init init = { .subdev = nv_subdev(priv), .bios = bios, @@ -95,7 +96,8 @@ nv50_devinit_init(struct nouveau_object *object) nvbios_exec(&init); } - }; + i++; + } return 0; } |