diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2012-09-12 05:55:01 (GMT) |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-10-03 03:13:11 (GMT) |
commit | acac7bdba61226502a230db9245ca426a67102a9 (patch) | |
tree | a712b64eee485bf190709c4d530b771d081c5839 | |
parent | da07e52cf10c9584c7e197ac3d49455e1a4d4756 (diff) | |
download | linux-acac7bdba61226502a230db9245ca426a67102a9.tar.xz |
drm/nouveau/bios: check that fixed tvdac gpio data is valid before using it
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/bios/gpio.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/gpio.c b/drivers/gpu/drm/nouveau/core/subdev/bios/gpio.c index 718267d..1ae23b3 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/gpio.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/gpio.c @@ -100,13 +100,17 @@ dcb_gpio_parse(struct nouveau_bios *bios, int idx, u8 func, u8 line, /* DCB 2.2, fixed TVDAC GPIO data */ if ((entry = dcb_table(bios, &ver, &hdr, &cnt, &len)) && ver >= 0x22) { if (func == DCB_GPIO_TVDAC0) { - *gpio = (struct dcb_gpio_func) { - .func = DCB_GPIO_TVDAC0, - .line = nv_ro08(bios, entry - 4) >> 4, - .log[0] = !!(nv_ro08(bios, entry - 5) & 2), - .log[1] = !(nv_ro08(bios, entry - 5) & 2), - }; - return 0; + u8 conf = nv_ro08(bios, entry - 5); + u8 addr = nv_ro08(bios, entry - 4); + if (conf & 0x01) { + *gpio = (struct dcb_gpio_func) { + .func = DCB_GPIO_TVDAC0, + .line = addr >> 4, + .log[0] = !!(conf & 0x02), + .log[1] = !(conf & 0x02), + }; + return 0; + } } } |