diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2017-12-06 19:49:35 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2017-12-18 19:16:37 -0500 |
commit | f60707a69a225f2dd87f42628b44e24ceb219d28 (patch) | |
tree | b75a42f9be9b437725a9b5f6ac4f06eae128a2c7 /drivers | |
parent | 34112bf4935dabe3c1d1fd42842ed771e279bf61 (diff) |
drm/nouveau/bios/dp: support DP Info Table 2.0
Reported-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers')
-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); |