diff options
| -rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c index 972370ed36f0..7c7efa4ea0d0 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c | |||
| @@ -36,6 +36,7 @@ nvbios_dp_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) | |||
| 36 | if (data) { | 36 | if (data) { |
| 37 | *ver = nvbios_rd08(bios, data + 0x00); | 37 | *ver = nvbios_rd08(bios, data + 0x00); |
| 38 | switch (*ver) { | 38 | switch (*ver) { |
| 39 | case 0x20: | ||
| 39 | case 0x21: | 40 | case 0x21: |
| 40 | case 0x30: | 41 | case 0x30: |
| 41 | case 0x40: | 42 | case 0x40: |
| @@ -63,6 +64,7 @@ nvbios_dpout_entry(struct nvkm_bios *bios, u8 idx, | |||
| 63 | if (data && idx < *cnt) { | 64 | if (data && idx < *cnt) { |
| 64 | u16 outp = nvbios_rd16(bios, data + *hdr + idx * *len); | 65 | u16 outp = nvbios_rd16(bios, data + *hdr + idx * *len); |
| 65 | switch (*ver * !!outp) { | 66 | switch (*ver * !!outp) { |
| 67 | case 0x20: | ||
| 66 | case 0x21: | 68 | case 0x21: |
| 67 | case 0x30: | 69 | case 0x30: |
| 68 | *hdr = nvbios_rd08(bios, data + 0x04); | 70 | *hdr = nvbios_rd08(bios, data + 0x04); |
| @@ -96,12 +98,16 @@ nvbios_dpout_parse(struct nvkm_bios *bios, u8 idx, | |||
| 96 | info->type = nvbios_rd16(bios, data + 0x00); | 98 | info->type = nvbios_rd16(bios, data + 0x00); |
| 97 | info->mask = nvbios_rd16(bios, data + 0x02); | 99 | info->mask = nvbios_rd16(bios, data + 0x02); |
| 98 | switch (*ver) { | 100 | switch (*ver) { |
| 101 | case 0x20: | ||
| 102 | info->mask |= 0x00c0; /* match any link */ | ||
| 103 | /* fall-through */ | ||
| 99 | case 0x21: | 104 | case 0x21: |
| 100 | case 0x30: | 105 | case 0x30: |
| 101 | info->flags = nvbios_rd08(bios, data + 0x05); | 106 | info->flags = nvbios_rd08(bios, data + 0x05); |
| 102 | info->script[0] = nvbios_rd16(bios, data + 0x06); | 107 | info->script[0] = nvbios_rd16(bios, data + 0x06); |
| 103 | info->script[1] = nvbios_rd16(bios, data + 0x08); | 108 | info->script[1] = nvbios_rd16(bios, data + 0x08); |
| 104 | info->lnkcmp = nvbios_rd16(bios, data + 0x0a); | 109 | if (*len >= 0x0c) |
| 110 | info->lnkcmp = nvbios_rd16(bios, data + 0x0a); | ||
| 105 | if (*len >= 0x0f) { | 111 | if (*len >= 0x0f) { |
| 106 | info->script[2] = nvbios_rd16(bios, data + 0x0c); | 112 | info->script[2] = nvbios_rd16(bios, data + 0x0c); |
| 107 | info->script[3] = nvbios_rd16(bios, data + 0x0e); | 113 | info->script[3] = nvbios_rd16(bios, data + 0x0e); |
| @@ -170,6 +176,7 @@ nvbios_dpcfg_parse(struct nvkm_bios *bios, u16 outp, u8 idx, | |||
| 170 | memset(info, 0x00, sizeof(*info)); | 176 | memset(info, 0x00, sizeof(*info)); |
| 171 | if (data) { | 177 | if (data) { |
| 172 | switch (*ver) { | 178 | switch (*ver) { |
| 179 | case 0x20: | ||
| 173 | case 0x21: | 180 | case 0x21: |
| 174 | info->dc = nvbios_rd08(bios, data + 0x02); | 181 | info->dc = nvbios_rd08(bios, data + 0x02); |
| 175 | info->pe = nvbios_rd08(bios, data + 0x03); | 182 | info->pe = nvbios_rd08(bios, data + 0x03); |
