aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2014-05-27 01:00:36 -0400
committerBen Skeggs <bskeggs@redhat.com>2014-06-11 02:10:46 -0400
commitb17932c01a006d36a716ec0ab678d15711dea072 (patch)
tree367272ff786b07c8361ab011b02cac058b1e84c5
parent3b52a1f90639a88b3c76e4d42b60c34dd950cad3 (diff)
drm/nv50/disp: train PIOR-attached DP from second supervisor
Same place as for SOR, between detach and attach phases. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/nv50.c32
1 files changed, 11 insertions, 21 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
index 2b9ef826959a..a73bc158d38c 100644
--- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
@@ -1457,10 +1457,17 @@ nv50_disp_intr_unk20_2(struct nv50_disp_priv *priv, int head)
1457 if (!outp) 1457 if (!outp)
1458 return; 1458 return;
1459 1459
1460 if (outp->info.location == 0 && outp->info.type == DCB_OUTPUT_DP) { 1460 if (outp->info.type == DCB_OUTPUT_DP) {
1461 u32 soff = (ffs(outp->info.or) - 1) * 0x08; 1461 u32 soff = (ffs(outp->info.or) - 1) * 0x08;
1462 u32 ctrl = nv_rd32(priv, 0x610794 + soff); 1462 u32 ctrl, datarate;
1463 u32 datarate; 1463
1464 if (outp->info.location == 0) {
1465 ctrl = nv_rd32(priv, 0x610794 + soff);
1466 soff = 1;
1467 } else {
1468 ctrl = nv_rd32(priv, 0x610b80 + soff);
1469 soff = 2;
1470 }
1464 1471
1465 switch ((ctrl & 0x000f0000) >> 16) { 1472 switch ((ctrl & 0x000f0000) >> 16) {
1466 case 6: datarate = pclk * 30 / 8; break; 1473 case 6: datarate = pclk * 30 / 8; break;
@@ -1471,7 +1478,7 @@ nv50_disp_intr_unk20_2(struct nv50_disp_priv *priv, int head)
1471 break; 1478 break;
1472 } 1479 }
1473 1480
1474 nouveau_dp_train((void *)outp, datarate); 1481 nouveau_dp_train((void *)outp, datarate / soff);
1475 } 1482 }
1476 1483
1477 exec_clkcmp(priv, head, 0, pclk, &conf); 1484 exec_clkcmp(priv, head, 0, pclk, &conf);
@@ -1535,23 +1542,6 @@ nv50_disp_intr_unk40_0(struct nv50_disp_priv *priv, int head)
1535 1542
1536 if (outp->info.location == 0 && outp->info.type == DCB_OUTPUT_TMDS) 1543 if (outp->info.location == 0 && outp->info.type == DCB_OUTPUT_TMDS)
1537 nv50_disp_intr_unk40_0_tmds(priv, &outp->info); 1544 nv50_disp_intr_unk40_0_tmds(priv, &outp->info);
1538 else
1539 if (outp->info.location == 1 && outp->info.type == DCB_OUTPUT_DP) {
1540 u32 soff = (ffs(outp->info.or) - 1) * 0x08;
1541 u32 ctrl = nv_rd32(priv, 0x610b84 + soff);
1542 u32 datarate;
1543
1544 switch ((ctrl & 0x000f0000) >> 16) {
1545 case 6: datarate = pclk * 30 / 8; break;
1546 case 5: datarate = pclk * 24 / 8; break;
1547 case 2:
1548 default:
1549 datarate = pclk * 18 / 8;
1550 break;
1551 }
1552
1553 nouveau_dp_train((void *)outp, datarate);
1554 }
1555} 1545}
1556 1546
1557void 1547void