static int radeon_dp_get_dp_link_clock(struct drm_connector *connector, u8 dpcd[DP_DPCD_SIZE], int pix_clock) { int bpp = convert_bpc_to_bpp(radeon_get_monitor_bpc(connector)); int lane_num, max_pix_clock; if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == ENCODER_OBJECT_ID_NUTMEG) return 270000; lane_num = radeon_dp_get_dp_lane_number(connector, dpcd, pix_clock); max_pix_clock = dp_get_max_dp_pix_clock(162000, lane_num, bpp); if (pix_clock <= max_pix_clock) return 162000; max_pix_clock = dp_get_max_dp_pix_clock(270000, lane_num, bpp); if (pix_clock <= max_pix_clock) return 270000; if (radeon_connector_is_dp12_capable(connector)) { max_pix_clock = dp_get_max_dp_pix_clock(540000, lane_num, bpp); if (pix_clock <= max_pix_clock) return 540000; } return radeon_dp_get_max_link_rate(connector, dpcd); }
static int radeon_dp_get_dp_link_clock(struct drm_connector *connector, u8 dpcd[DP_DPCD_SIZE], int pix_clock) { int bpp = convert_bpc_to_bpp(connector->display_info.bpc); int lane_num, max_pix_clock; if (radeon_connector_encoder_is_dp_bridge(connector)) return 270000; lane_num = radeon_dp_get_dp_lane_number(connector, dpcd, pix_clock); max_pix_clock = dp_get_max_dp_pix_clock(162000, lane_num, bpp); if (pix_clock <= max_pix_clock) return 162000; max_pix_clock = dp_get_max_dp_pix_clock(270000, lane_num, bpp); if (pix_clock <= max_pix_clock) return 270000; if (radeon_connector_is_dp12_capable(connector)) { max_pix_clock = dp_get_max_dp_pix_clock(540000, lane_num, bpp); if (pix_clock <= max_pix_clock) return 540000; } return dp_get_max_link_rate(dpcd); }
static int radeon_dp_get_max_link_rate(struct drm_connector *connector, u8 dpcd[DP_DPCD_SIZE]) { int max_link_rate; if (radeon_connector_is_dp12_capable(connector)) max_link_rate = min(drm_dp_max_link_rate(dpcd), 540000); else max_link_rate = min(drm_dp_max_link_rate(dpcd), 270000); return max_link_rate; }
int radeon_dp_mode_valid_helper(struct drm_connector *connector, struct drm_display_mode *mode) { struct radeon_connector *radeon_connector = to_radeon_connector(connector); struct radeon_connector_atom_dig *dig_connector; int dp_clock; if ((mode->clock > 340000) && (!radeon_connector_is_dp12_capable(connector))) return MODE_CLOCK_HIGH; if (!radeon_connector->con_priv) return MODE_CLOCK_HIGH; dig_connector = radeon_connector->con_priv; dp_clock = radeon_dp_get_dp_link_clock(connector, dig_connector->dpcd, mode->clock); if ((dp_clock == 540000) && (!radeon_connector_is_dp12_capable(connector))) return MODE_CLOCK_HIGH; return MODE_OK; }