Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/nouveau/dp: store unencoded link_bw everywhere

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>

+26 -22
+8 -1
drivers/gpu/drm/nouveau/nouveau_bios.c
··· 6199 6199 } 6200 6200 case OUTPUT_DP: 6201 6201 entry->dpconf.sor.link = (conf & 0x00000030) >> 4; 6202 - entry->dpconf.link_bw = (conf & 0x00e00000) >> 21; 6202 + switch ((conf & 0x00e00000) >> 21) { 6203 + case 0: 6204 + entry->dpconf.link_bw = 162000; 6205 + break; 6206 + default: 6207 + entry->dpconf.link_bw = 270000; 6208 + break; 6209 + } 6203 6210 switch ((conf & 0x0f000000) >> 24) { 6204 6211 case 0xf: 6205 6212 entry->dpconf.link_nr = 4;
+2 -5
drivers/gpu/drm/nouveau/nouveau_connector.c
··· 708 708 case OUTPUT_TV: 709 709 return get_slave_funcs(encoder)->mode_valid(encoder, mode); 710 710 case OUTPUT_DP: 711 - if (nv_encoder->dp.link_bw == DP_LINK_BW_2_7) 712 - max_clock = nv_encoder->dp.link_nr * 270000; 713 - else 714 - max_clock = nv_encoder->dp.link_nr * 162000; 715 - 711 + max_clock = nv_encoder->dp.link_nr; 712 + max_clock *= nv_encoder->dp.link_bw; 716 713 clock = clock * nouveau_connector_bpp(connector) / 8; 717 714 break; 718 715 default:
+16 -16
drivers/gpu/drm/nouveau/nouveau_dp.c
··· 516 516 nouveau_bios_run_init_table(dev, ROM16(bios[6]), dp.dcb, dp.crtc); 517 517 518 518 /* start off at highest link rate supported by encoder and display */ 519 - if (nv_encoder->dp.link_bw == DP_LINK_BW_1_62) 519 + while (*link_bw > nv_encoder->dp.link_bw) 520 520 link_bw++; 521 521 522 522 while (link_bw[0]) { ··· 566 566 if (ret) 567 567 return false; 568 568 569 - NV_DEBUG_KMS(dev, "encoder: link_bw %d, link_nr %d\n" 570 - "display: link_bw %d, link_nr %d version 0x%02x\n", 571 - nv_encoder->dcb->dpconf.link_bw, 572 - nv_encoder->dcb->dpconf.link_nr, 573 - dpcd[1], dpcd[2] & 0x0f, dpcd[0]); 574 - 575 569 nv_encoder->dp.dpcd_version = dpcd[0]; 576 - 577 - nv_encoder->dp.link_bw = dpcd[1]; 578 - if (nv_encoder->dp.link_bw != DP_LINK_BW_1_62 && 579 - !nv_encoder->dcb->dpconf.link_bw) 580 - nv_encoder->dp.link_bw = DP_LINK_BW_1_62; 581 - 570 + nv_encoder->dp.link_bw = 27000 * dpcd[1]; 582 571 nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK; 583 - if (nv_encoder->dp.link_nr > nv_encoder->dcb->dpconf.link_nr) 584 - nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr; 572 + nv_encoder->dp.enhanced_frame = dpcd[2] & DP_ENHANCED_FRAME_CAP; 585 573 586 - nv_encoder->dp.enhanced_frame = (dpcd[2] & DP_ENHANCED_FRAME_CAP); 574 + NV_DEBUG_KMS(dev, "display: %dx%d dpcd 0x%02x\n", 575 + nv_encoder->dp.link_nr, nv_encoder->dp.link_bw, dpcd[0]); 576 + NV_DEBUG_KMS(dev, "encoder: %dx%d\n", 577 + nv_encoder->dcb->dpconf.link_nr, 578 + nv_encoder->dcb->dpconf.link_bw); 579 + 580 + if (nv_encoder->dcb->dpconf.link_nr < nv_encoder->dp.link_nr) 581 + nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr; 582 + if (nv_encoder->dcb->dpconf.link_bw < nv_encoder->dp.link_bw) 583 + nv_encoder->dp.link_bw = nv_encoder->dcb->dpconf.link_bw; 584 + 585 + NV_DEBUG_KMS(dev, "maximum: %dx%d\n", 586 + nv_encoder->dp.link_nr, nv_encoder->dp.link_bw); 587 587 588 588 return true; 589 589 }