drm/i915: Introduce intel_panel_compute_config()
Let's introduce a compute_config() helper for fixed mode panels. For now all it does is the fixed_mode->adjusted_mode copy. Note that with sDVO we have to ask the external encoder chip to spit out our actual display timings for us, so the fixed_mode to adjusted_mode copy done by intel_panel_compute_config() is redundant, but we still want to use it to do other checks for us later. We'll be fine so long as we only call it before intel_sdvo_get_preferred_input_mode() overwrites adjusted_mode with the timings from the encoder. v2: Use intel_panel_compute_config() with sDVO Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210927185207.13620-1-ville.syrjala@linux.intel.com Reviewed-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
parent
00fc3787d2
commit
cff4c2c645
|
@ -1672,14 +1672,15 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder,
|
|||
struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi,
|
||||
base);
|
||||
struct intel_connector *intel_connector = intel_dsi->attached_connector;
|
||||
const struct drm_display_mode *fixed_mode =
|
||||
intel_connector->panel.fixed_mode;
|
||||
struct drm_display_mode *adjusted_mode =
|
||||
&pipe_config->hw.adjusted_mode;
|
||||
int ret;
|
||||
|
||||
pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
|
||||
intel_panel_fixed_mode(fixed_mode, adjusted_mode);
|
||||
|
||||
ret = intel_panel_compute_config(intel_connector, adjusted_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = intel_panel_fitting(pipe_config, conn_state);
|
||||
if (ret)
|
||||
|
|
|
@ -1757,8 +1757,9 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
|||
pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
|
||||
|
||||
if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
|
||||
intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
|
||||
adjusted_mode);
|
||||
ret = intel_panel_compute_config(intel_connector, adjusted_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = intel_panel_fitting(pipe_config, conn_state);
|
||||
if (ret)
|
||||
|
|
|
@ -256,6 +256,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
|
|||
struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
|
||||
struct intel_connector *connector = to_intel_connector(conn_state->connector);
|
||||
const struct drm_display_mode *fixed_mode =
|
||||
intel_dvo->attached_connector->panel.fixed_mode;
|
||||
struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
|
||||
|
@ -266,8 +267,13 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
|
|||
* with the panel scaling set up to source from the H/VDisplay
|
||||
* of the original mode.
|
||||
*/
|
||||
if (fixed_mode)
|
||||
intel_panel_fixed_mode(fixed_mode, adjusted_mode);
|
||||
if (fixed_mode) {
|
||||
int ret;
|
||||
|
||||
ret = intel_panel_compute_config(connector, adjusted_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -444,8 +444,9 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
|
|||
* with the panel scaling set up to source from the H/VDisplay
|
||||
* of the original mode.
|
||||
*/
|
||||
intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
|
||||
adjusted_mode);
|
||||
ret = intel_panel_compute_config(intel_connector, adjusted_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -45,12 +45,19 @@ bool intel_panel_use_ssc(struct drm_i915_private *i915)
|
|||
&& !(i915->quirks & QUIRK_LVDS_SSC_DISABLE);
|
||||
}
|
||||
|
||||
void intel_panel_fixed_mode(const struct drm_display_mode *fixed_mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
int intel_panel_compute_config(struct intel_connector *connector,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;
|
||||
|
||||
if (!fixed_mode)
|
||||
return 0;
|
||||
|
||||
drm_mode_copy(adjusted_mode, fixed_mode);
|
||||
|
||||
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool is_downclock_mode(const struct drm_display_mode *downclock_mode,
|
||||
|
|
|
@ -31,6 +31,8 @@ intel_panel_mode_valid(struct intel_connector *connector,
|
|||
const struct drm_display_mode *mode);
|
||||
int intel_panel_fitting(struct intel_crtc_state *crtc_state,
|
||||
const struct drm_connector_state *conn_state);
|
||||
int intel_panel_compute_config(struct intel_connector *connector,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
struct drm_display_mode *
|
||||
intel_panel_edid_downclock_mode(struct intel_connector *connector,
|
||||
const struct drm_display_mode *fixed_mode);
|
||||
|
|
|
@ -1335,6 +1335,13 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,
|
|||
adjusted_mode);
|
||||
pipe_config->sdvo_tv_clock = true;
|
||||
} else if (IS_LVDS(intel_sdvo_connector)) {
|
||||
int ret;
|
||||
|
||||
ret = intel_panel_compute_config(&intel_sdvo_connector->base,
|
||||
adjusted_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
|
||||
intel_sdvo_connector->base.panel.fixed_mode))
|
||||
return -EINVAL;
|
||||
|
|
|
@ -279,7 +279,9 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder,
|
|||
pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
|
||||
|
||||
if (fixed_mode) {
|
||||
intel_panel_fixed_mode(fixed_mode, adjusted_mode);
|
||||
ret = intel_panel_compute_config(intel_connector, adjusted_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = intel_panel_fitting(pipe_config, conn_state);
|
||||
if (ret)
|
||||
|
|
Loading…
Reference in New Issue