提交 75a1fccf 编写于 作者: B Ben Skeggs

drm/nouveau/dp: store unencoded link_bw everywhere

Signed-off-by: NBen Skeggs <bskeggs@redhat.com>
上级 27a45987
...@@ -6199,7 +6199,14 @@ parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb, ...@@ -6199,7 +6199,14 @@ parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb,
} }
case OUTPUT_DP: case OUTPUT_DP:
entry->dpconf.sor.link = (conf & 0x00000030) >> 4; entry->dpconf.sor.link = (conf & 0x00000030) >> 4;
entry->dpconf.link_bw = (conf & 0x00e00000) >> 21; switch ((conf & 0x00e00000) >> 21) {
case 0:
entry->dpconf.link_bw = 162000;
break;
default:
entry->dpconf.link_bw = 270000;
break;
}
switch ((conf & 0x0f000000) >> 24) { switch ((conf & 0x0f000000) >> 24) {
case 0xf: case 0xf:
entry->dpconf.link_nr = 4; entry->dpconf.link_nr = 4;
......
...@@ -708,11 +708,8 @@ nouveau_connector_mode_valid(struct drm_connector *connector, ...@@ -708,11 +708,8 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
case OUTPUT_TV: case OUTPUT_TV:
return get_slave_funcs(encoder)->mode_valid(encoder, mode); return get_slave_funcs(encoder)->mode_valid(encoder, mode);
case OUTPUT_DP: case OUTPUT_DP:
if (nv_encoder->dp.link_bw == DP_LINK_BW_2_7) max_clock = nv_encoder->dp.link_nr;
max_clock = nv_encoder->dp.link_nr * 270000; max_clock *= nv_encoder->dp.link_bw;
else
max_clock = nv_encoder->dp.link_nr * 162000;
clock = clock * nouveau_connector_bpp(connector) / 8; clock = clock * nouveau_connector_bpp(connector) / 8;
break; break;
default: default:
......
...@@ -516,7 +516,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder, u32 datarate) ...@@ -516,7 +516,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder, u32 datarate)
nouveau_bios_run_init_table(dev, ROM16(bios[6]), dp.dcb, dp.crtc); nouveau_bios_run_init_table(dev, ROM16(bios[6]), dp.dcb, dp.crtc);
/* start off at highest link rate supported by encoder and display */ /* start off at highest link rate supported by encoder and display */
if (nv_encoder->dp.link_bw == DP_LINK_BW_1_62) while (*link_bw > nv_encoder->dp.link_bw)
link_bw++; link_bw++;
while (link_bw[0]) { while (link_bw[0]) {
...@@ -566,24 +566,24 @@ nouveau_dp_detect(struct drm_encoder *encoder) ...@@ -566,24 +566,24 @@ nouveau_dp_detect(struct drm_encoder *encoder)
if (ret) if (ret)
return false; return false;
NV_DEBUG_KMS(dev, "encoder: link_bw %d, link_nr %d\n"
"display: link_bw %d, link_nr %d version 0x%02x\n",
nv_encoder->dcb->dpconf.link_bw,
nv_encoder->dcb->dpconf.link_nr,
dpcd[1], dpcd[2] & 0x0f, dpcd[0]);
nv_encoder->dp.dpcd_version = dpcd[0]; nv_encoder->dp.dpcd_version = dpcd[0];
nv_encoder->dp.link_bw = 27000 * dpcd[1];
nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK;
nv_encoder->dp.enhanced_frame = dpcd[2] & DP_ENHANCED_FRAME_CAP;
nv_encoder->dp.link_bw = dpcd[1]; NV_DEBUG_KMS(dev, "display: %dx%d dpcd 0x%02x\n",
if (nv_encoder->dp.link_bw != DP_LINK_BW_1_62 && nv_encoder->dp.link_nr, nv_encoder->dp.link_bw, dpcd[0]);
!nv_encoder->dcb->dpconf.link_bw) NV_DEBUG_KMS(dev, "encoder: %dx%d\n",
nv_encoder->dp.link_bw = DP_LINK_BW_1_62; nv_encoder->dcb->dpconf.link_nr,
nv_encoder->dcb->dpconf.link_bw);
nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK; if (nv_encoder->dcb->dpconf.link_nr < nv_encoder->dp.link_nr)
if (nv_encoder->dp.link_nr > nv_encoder->dcb->dpconf.link_nr)
nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr; nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr;
if (nv_encoder->dcb->dpconf.link_bw < nv_encoder->dp.link_bw)
nv_encoder->dp.link_bw = nv_encoder->dcb->dpconf.link_bw;
nv_encoder->dp.enhanced_frame = (dpcd[2] & DP_ENHANCED_FRAME_CAP); NV_DEBUG_KMS(dev, "maximum: %dx%d\n",
nv_encoder->dp.link_nr, nv_encoder->dp.link_bw);
return true; return true;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册