Message ID | 20210127061003.605350-2-koba.ko@canonical.com |
---|---|
State | New |
Headers | show |
Series | UBUNTU: SAUCE: Fix the video can't output through WD19TB connected on TGL's Type-C port during cold-boot | expand |
On 27.1.2021 8.10, Koba Ko wrote: > From: Imre Deak <imre.deak@intel.com> > > BugLink: https://bugs.launchpad.net/bugs/1913372 > > This function will be needed by the next patch where the driver > calculates the BW based on driver specific parameters, so export it. > > At the same time sanitize the function params, passing the more natural > link rate instead of the encoding of the same rate. > > Cc: Lyude Paul <lyude@redhat.com> > Cc: Ville Syrjala <ville.syrjala@intel.com> > Cc: <stable@vger.kernel.org> > Cc: dri-devel@lists.freedesktop.org > Signed-off-by: Imre Deak <imre.deak@intel.com> > Reviewed-by: Lyude Paul <lyude@redhat.com> > Reference: https://patchwork.freedesktop.org/series/86267/ > Signed-off-by: Koba Ko <koba.ko@canonical.com> > --- > drivers/gpu/drm/drm_dp_mst_topology.c | 24 ++++++++++++++++++------ > include/drm/drm_dp_mst_helper.h | 1 + > 2 files changed, 19 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c > index e87542533640..ae6bc2093479 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -3629,14 +3629,26 @@ static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr, > return 0; > } > > -static int drm_dp_get_vc_payload_bw(u8 dp_link_bw, u8 dp_link_count) > +/** > + * drm_dp_get_vc_payload_bw - get the VC payload BW for an MST link > + * @rate: link rate in 10kbits/s units > + * @lane_count: lane count > + * > + * Calculate the toal bandwidth of a MultiStream Transport link. The returned > + * value is in units of PBNs/(timeslots/1 MTP). This value can be used to > + * convert the number of PBNs required for a given stream to the number of > + * timeslots this stream requires in each MTP. > + */ > +int drm_dp_get_vc_payload_bw(int link_rate, int link_lane_count) > { > - if (dp_link_bw == 0 || dp_link_count == 0) > - DRM_DEBUG_KMS("invalid link bandwidth in DPCD: %x (link count: %d)\n", > - dp_link_bw, dp_link_count); > + if (link_rate == 0 || link_lane_count == 0) > + DRM_DEBUG_KMS("invalid link rate/lane count: (%d / %d)\n", > + link_rate, link_lane_count); > > - return dp_link_bw * dp_link_count / 2; > + /* See DP v2.0 2.6.4.2, VCPayload_Bandwidth_for_OneTimeSlotPer_MTP_Allocation */ > + return link_rate * link_lane_count / 54000; > } > +EXPORT_SYMBOL(drm_dp_get_vc_payload_bw); > > /** > * drm_dp_read_mst_cap() - check whether or not a sink supports MST > @@ -3692,7 +3704,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms > goto out_unlock; > } > > - mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1], > + mgr->pbn_div = drm_dp_get_vc_payload_bw(drm_dp_bw_code_to_link_rate(mgr->dpcd[1]), > mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK); > if (mgr->pbn_div == 0) { > ret = -EINVAL; > diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h > index f5e92fe9151c..bd1c39907b92 100644 > --- a/include/drm/drm_dp_mst_helper.h > +++ b/include/drm/drm_dp_mst_helper.h > @@ -783,6 +783,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector, > > struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port); > > +int drm_dp_get_vc_payload_bw(int link_rate, int link_lane_count); > > int drm_dp_calc_pbn_mode(int clock, int bpp, bool dsc); > > applied to oem-5.10, thanks
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index e87542533640..ae6bc2093479 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -3629,14 +3629,26 @@ static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr, return 0; } -static int drm_dp_get_vc_payload_bw(u8 dp_link_bw, u8 dp_link_count) +/** + * drm_dp_get_vc_payload_bw - get the VC payload BW for an MST link + * @rate: link rate in 10kbits/s units + * @lane_count: lane count + * + * Calculate the toal bandwidth of a MultiStream Transport link. The returned + * value is in units of PBNs/(timeslots/1 MTP). This value can be used to + * convert the number of PBNs required for a given stream to the number of + * timeslots this stream requires in each MTP. + */ +int drm_dp_get_vc_payload_bw(int link_rate, int link_lane_count) { - if (dp_link_bw == 0 || dp_link_count == 0) - DRM_DEBUG_KMS("invalid link bandwidth in DPCD: %x (link count: %d)\n", - dp_link_bw, dp_link_count); + if (link_rate == 0 || link_lane_count == 0) + DRM_DEBUG_KMS("invalid link rate/lane count: (%d / %d)\n", + link_rate, link_lane_count); - return dp_link_bw * dp_link_count / 2; + /* See DP v2.0 2.6.4.2, VCPayload_Bandwidth_for_OneTimeSlotPer_MTP_Allocation */ + return link_rate * link_lane_count / 54000; } +EXPORT_SYMBOL(drm_dp_get_vc_payload_bw); /** * drm_dp_read_mst_cap() - check whether or not a sink supports MST @@ -3692,7 +3704,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms goto out_unlock; } - mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1], + mgr->pbn_div = drm_dp_get_vc_payload_bw(drm_dp_bw_code_to_link_rate(mgr->dpcd[1]), mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK); if (mgr->pbn_div == 0) { ret = -EINVAL; diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index f5e92fe9151c..bd1c39907b92 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -783,6 +783,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector, struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port); +int drm_dp_get_vc_payload_bw(int link_rate, int link_lane_count); int drm_dp_calc_pbn_mode(int clock, int bpp, bool dsc);