Commit 0713b451 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/dp: fix required link bandwidth calculations

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 028791bb
...@@ -1516,11 +1516,11 @@ nv50_disp_intr_unk20_2(struct nv50_disp_priv *priv, int head) ...@@ -1516,11 +1516,11 @@ nv50_disp_intr_unk20_2(struct nv50_disp_priv *priv, int head)
} }
switch ((ctrl & 0x000f0000) >> 16) { switch ((ctrl & 0x000f0000) >> 16) {
case 6: datarate = pclk * 30 / 8; break; case 6: datarate = pclk * 30; break;
case 5: datarate = pclk * 24 / 8; break; case 5: datarate = pclk * 24; break;
case 2: case 2:
default: default:
datarate = pclk * 18 / 8; datarate = pclk * 18;
break; break;
} }
......
...@@ -1159,11 +1159,11 @@ nvd0_disp_intr_unk2_2(struct nv50_disp_priv *priv, int head) ...@@ -1159,11 +1159,11 @@ nvd0_disp_intr_unk2_2(struct nv50_disp_priv *priv, int head)
if (outp->info.type == DCB_OUTPUT_DP) { if (outp->info.type == DCB_OUTPUT_DP) {
u32 sync = nv_rd32(priv, 0x660404 + (head * 0x300)); u32 sync = nv_rd32(priv, 0x660404 + (head * 0x300));
switch ((sync & 0x000003c0) >> 6) { switch ((sync & 0x000003c0) >> 6) {
case 6: pclk = pclk * 30 / 8; break; case 6: pclk = pclk * 30; break;
case 5: pclk = pclk * 24 / 8; break; case 5: pclk = pclk * 24; break;
case 2: case 2:
default: default:
pclk = pclk * 18 / 8; pclk = pclk * 18;
break; break;
} }
......
...@@ -34,7 +34,7 @@ nvkm_output_dp_train(struct nvkm_output *base, u32 datarate, bool wait) ...@@ -34,7 +34,7 @@ nvkm_output_dp_train(struct nvkm_output *base, u32 datarate, bool wait)
struct nvkm_output_dp *outp = (void *)base; struct nvkm_output_dp *outp = (void *)base;
bool retrain = true; bool retrain = true;
u8 link[2], stat[3]; u8 link[2], stat[3];
u32 rate; u32 linkrate;
int ret, i; int ret, i;
/* check that the link is trained at a high enough rate */ /* check that the link is trained at a high enough rate */
...@@ -44,8 +44,10 @@ nvkm_output_dp_train(struct nvkm_output *base, u32 datarate, bool wait) ...@@ -44,8 +44,10 @@ nvkm_output_dp_train(struct nvkm_output *base, u32 datarate, bool wait)
goto done; goto done;
} }
rate = link[0] * 27000 * (link[1] & DPCD_LC01_LANE_COUNT_SET); linkrate = link[0] * 27000 * (link[1] & DPCD_LC01_LANE_COUNT_SET);
if (rate < ((datarate / 8) * 10)) { linkrate = (linkrate * 8) / 10; /* 8B/10B coding overhead */
datarate = (datarate + 9) / 10; /* -> decakilobits */
if (linkrate < datarate) {
DBG("link not trained at sufficient rate\n"); DBG("link not trained at sufficient rate\n");
goto done; goto done;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment