diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-05-27 01:00:36 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-06-11 02:10:46 -0400 |
commit | b17932c01a006d36a716ec0ab678d15711dea072 (patch) | |
tree | 367272ff786b07c8361ab011b02cac058b1e84c5 | |
parent | 3b52a1f90639a88b3c76e4d42b60c34dd950cad3 (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.c | 32 |
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 | ||
1557 | void | 1547 | void |