aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_bios.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_bios.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bios.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
index 75bceee76044..b5a9336a2e88 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
@@ -5211,6 +5211,21 @@ divine_connector_type(struct nvbios *bios, int index)
5211} 5211}
5212 5212
5213static void 5213static void
5214apply_dcb_connector_quirks(struct nvbios *bios, int idx)
5215{
5216 struct dcb_connector_table_entry *cte = &bios->dcb.connector.entry[idx];
5217 struct drm_device *dev = bios->dev;
5218
5219 /* Gigabyte NX85T */
5220 if ((dev->pdev->device == 0x0421) &&
5221 (dev->pdev->subsystem_vendor == 0x1458) &&
5222 (dev->pdev->subsystem_device == 0x344c)) {
5223 if (cte->type == DCB_CONNECTOR_HDMI_1)
5224 cte->type = DCB_CONNECTOR_DVI_I;
5225 }
5226}
5227
5228static void
5214parse_dcb_connector_table(struct nvbios *bios) 5229parse_dcb_connector_table(struct nvbios *bios)
5215{ 5230{
5216 struct drm_device *dev = bios->dev; 5231 struct drm_device *dev = bios->dev;
@@ -5238,13 +5253,14 @@ parse_dcb_connector_table(struct nvbios *bios)
5238 entry = conntab + conntab[1]; 5253 entry = conntab + conntab[1];
5239 cte = &ct->entry[0]; 5254 cte = &ct->entry[0];
5240 for (i = 0; i < conntab[2]; i++, entry += conntab[3], cte++) { 5255 for (i = 0; i < conntab[2]; i++, entry += conntab[3], cte++) {
5256 cte->index = i;
5241 if (conntab[3] == 2) 5257 if (conntab[3] == 2)
5242 cte->entry = ROM16(entry[0]); 5258 cte->entry = ROM16(entry[0]);
5243 else 5259 else
5244 cte->entry = ROM32(entry[0]); 5260 cte->entry = ROM32(entry[0]);
5245 5261
5246 cte->type = (cte->entry & 0x000000ff) >> 0; 5262 cte->type = (cte->entry & 0x000000ff) >> 0;
5247 cte->index = (cte->entry & 0x00000f00) >> 8; 5263 cte->index2 = (cte->entry & 0x00000f00) >> 8;
5248 switch (cte->entry & 0x00033000) { 5264 switch (cte->entry & 0x00033000) {
5249 case 0x00001000: 5265 case 0x00001000:
5250 cte->gpio_tag = 0x07; 5266 cte->gpio_tag = 0x07;
@@ -5266,6 +5282,8 @@ parse_dcb_connector_table(struct nvbios *bios)
5266 if (cte->type == 0xff) 5282 if (cte->type == 0xff)
5267 continue; 5283 continue;
5268 5284
5285 apply_dcb_connector_quirks(bios, i);
5286
5269 NV_INFO(dev, " %d: 0x%08x: type 0x%02x idx %d tag 0x%02x\n", 5287 NV_INFO(dev, " %d: 0x%08x: type 0x%02x idx %d tag 0x%02x\n",
5270 i, cte->entry, cte->type, cte->index, cte->gpio_tag); 5288 i, cte->entry, cte->type, cte->index, cte->gpio_tag);
5271 5289
@@ -5287,10 +5305,16 @@ parse_dcb_connector_table(struct nvbios *bios)
5287 break; 5305 break;
5288 default: 5306 default:
5289 cte->type = divine_connector_type(bios, cte->index); 5307 cte->type = divine_connector_type(bios, cte->index);
5290 NV_WARN(dev, "unknown type, using 0x%02x", cte->type); 5308 NV_WARN(dev, "unknown type, using 0x%02x\n", cte->type);
5291 break; 5309 break;
5292 } 5310 }
5293 5311
5312 if (nouveau_override_conntype) {
5313 int type = divine_connector_type(bios, cte->index);
5314 if (type != cte->type)
5315 NV_WARN(dev, " -> type 0x%02x\n", cte->type);
5316 }
5317
5294 } 5318 }
5295} 5319}
5296 5320