Browse Source

drm/nouveau/dp: support version 4.0 of DP table

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Ben Skeggs 13 years ago
parent
commit
6544599249

+ 2 - 1
drivers/gpu/drm/nouveau/nouveau_bios.c

@@ -1144,7 +1144,8 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
 		break;
 	case 1:
 	case 2:
-		if (!(entry[5] & cond))
+		if ((table[0]  < 0x40 && !(entry[5] & cond)) ||
+		    (table[0] == 0x40 && !(entry[4] & cond)))
 			iexec->execute = false;
 		break;
 	case 5:

+ 11 - 0
drivers/gpu/drm/nouveau/nouveau_dp.c

@@ -188,6 +188,7 @@ nouveau_dp_bios_data(struct drm_device *dev, struct dcb_entry *dcb, u8 **entry)
 	case 0x20:
 	case 0x21:
 	case 0x30:
+	case 0x40:
 		break;
 	default:
 		NV_ERROR(dev, "displayport table 0x%02x unknown\n", table[0]);
@@ -366,6 +367,10 @@ dp_set_downspread(struct drm_device *dev, struct dp_state *dp, bool enable)
 		if (table[0] >= 0x20 && table[0] <= 0x30) {
 			if (enable) script = ROM16(entry[12]);
 			else        script = ROM16(entry[14]);
+		} else
+		if (table[0] == 0x40) {
+			if (enable) script = ROM16(entry[11]);
+			else        script = ROM16(entry[13]);
 		}
 	}
 
@@ -380,6 +385,9 @@ dp_link_train_init(struct drm_device *dev, struct dp_state *dp)
 	if (table) {
 		if (table[0] >= 0x20 && table[0] <= 0x30)
 			script = ROM16(entry[6]);
+		else
+		if (table[0] == 0x40)
+			script = ROM16(entry[5]);
 	}
 
 	nouveau_bios_run_init_table(dev, script, dp->dcb, dp->crtc);
@@ -393,6 +401,9 @@ dp_link_train_fini(struct drm_device *dev, struct dp_state *dp)
 	if (table) {
 		if (table[0] >= 0x20 && table[0] <= 0x30)
 			script = ROM16(entry[8]);
+		else
+		if (table[0] == 0x40)
+			script = ROM16(entry[7]);
 	}
 
 	nouveau_bios_run_init_table(dev, script, dp->dcb, dp->crtc);

+ 6 - 0
drivers/gpu/drm/nouveau/nvd0_display.c

@@ -1226,6 +1226,11 @@ nvd0_sor_dp_train_adj(struct drm_device *dev, struct dcb_entry *dcb,
 		if (table[0] == 0x30) {
 			config  = entry + table[4];
 			config += table[5] * preem;
+		} else
+		if (table[0] == 0x40) {
+			config  = table + table[1];
+			config += table[2] * table[3];
+			config += table[6] * preem;
 		}
 	}
 
@@ -1258,6 +1263,7 @@ nvd0_sor_dp_link_set(struct drm_device *dev, struct dcb_entry *dcb, int crtc,
 	table = nouveau_dp_bios_data(dev, dcb, &entry);
 	if (table) {
 		if      (table[0] == 0x30) entry = ROMPTR(dev, entry[10]);
+		else if (table[0] == 0x40) entry = ROMPTR(dev, entry[9]);
 		else                       entry = NULL;
 
 		while (entry) {