/*
* The required data bandwidth for a mode with given pixel clock and bpp. This
* is the required net bandwidth independent of the data bandwidth efficiency.
- *
- * TODO: check if callers of this functions should use
- * intel_dp_effective_data_rate() instead.
*/
-int
-intel_dp_link_required(int pixel_clock, int bpp)
+int intel_dp_link_required(int link_clock, int lane_count,
+ int mode_clock, int mode_hdisplay,
+ int link_bpp_x16, unsigned long bw_overhead_flags)
{
- /* pixel_clock is in kHz, divide bpp by 8 for bit to Byte conversion */
- return DIV_ROUND_UP(pixel_clock * bpp, 8);
+ int bw_overhead = intel_dp_link_bw_overhead(link_clock, lane_count, mode_hdisplay,
+ 0, link_bpp_x16, bw_overhead_flags);
+
+ return intel_dp_effective_data_rate(mode_clock, link_bpp_x16, bw_overhead);
}
/**
max_rate = intel_dp_max_link_data_rate(intel_dp, max_link_clock, max_lanes);
link_bpp_x16 = intel_dp_mode_min_link_bpp_x16(connector, mode);
- mode_rate = intel_dp_link_required(target_clock, fxp_q4_to_int_roundup(link_bpp_x16));
+ mode_rate = intel_dp_link_required(max_link_clock, max_lanes,
+ target_clock, mode->hdisplay,
+ link_bpp_x16, 0);
if (intel_dp_has_dsc(connector)) {
int pipe_bpp;
const struct link_config_limits *limits)
{
int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state);
- int mode_rate, link_rate, link_avail;
+ int link_rate, link_avail;
for (bpp = fxp_q4_to_int(limits->link.max_bpp_x16);
bpp >= fxp_q4_to_int(limits->link.min_bpp_x16);
int link_bpp_x16 =
intel_dp_output_format_link_bpp_x16(pipe_config->output_format, bpp);
- mode_rate = intel_dp_link_required(clock, fxp_q4_to_int_roundup(link_bpp_x16));
-
for (i = 0; i < intel_dp->num_common_rates; i++) {
link_rate = intel_dp_common_rate(intel_dp, i);
if (link_rate < limits->min_rate ||
for (lane_count = limits->min_lane_count;
lane_count <= limits->max_lane_count;
lane_count <<= 1) {
+ const struct drm_display_mode *adjusted_mode =
+ &pipe_config->hw.adjusted_mode;
+ int mode_rate =
+ intel_dp_link_required(link_rate, lane_count,
+ clock, adjusted_mode->hdisplay,
+ link_bpp_x16, 0);
+
link_avail = intel_dp_max_link_data_rate(intel_dp,
link_rate,
lane_count);
-
if (mode_rate <= link_avail) {
pipe_config->lane_count = lane_count;
pipe_config->pipe_bpp = bpp;
{
const struct drm_display_mode *adjusted_mode =
&crtc_state->hw.adjusted_mode;
- int bpp = crtc_state->dsc.compression_enable ?
- fxp_q4_to_int_roundup(crtc_state->dsc.compressed_bpp_x16) :
- crtc_state->pipe_bpp;
+ int link_bpp_x16 = crtc_state->dsc.compression_enable ?
+ crtc_state->dsc.compressed_bpp_x16 :
+ fxp_q4_from_int(crtc_state->pipe_bpp);
- return intel_dp_link_required(adjusted_mode->crtc_clock, bpp);
+ return intel_dp_link_required(crtc_state->port_clock, crtc_state->lane_count,
+ adjusted_mode->crtc_clock, adjusted_mode->hdisplay,
+ link_bpp_x16, 0);
}
bool intel_dp_joiner_needs_dsc(struct intel_display *display,