[Intel-gfx] [PATCH 08/13] drm/i915/sdvo: Nuke attached_output tracking

Jani Nikula jani.nikula at linux.intel.com
Thu Jul 6 08:24:02 UTC 2023


On Wed, 05 Jul 2023, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Instead of operating on the output the user specified (via the
> connector) the current code tends to operate on whichever outputs
> it has detected as attached. That is not how the kms uapi is supposed
> to work. So simply get rid of attached_outputs and instead directly
> operate on the output the user has specified.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Acked-by: Jani Nikula <jani.nikula at intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_sdvo.c | 31 ++++++++++++-----------
>  1 file changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
> index fcf3a95393d9..29762716a067 100644
> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
> @@ -103,12 +103,6 @@ struct intel_sdvo {
>  	/* Pixel clock limitations reported by the SDVO device, in kHz */
>  	int pixel_clock_min, pixel_clock_max;
>  
> -	/*
> -	* For multiple function SDVO device,
> -	* this is for current attached outputs.
> -	*/
> -	u16 attached_output;
> -
>  	/*
>  	 * Hotplug activation bits for this device
>  	 */
> @@ -1223,12 +1217,13 @@ static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo,
>  
>  static bool
>  intel_sdvo_set_output_timings_from_mode(struct intel_sdvo *intel_sdvo,
> +					struct intel_sdvo_connector *intel_sdvo_connector,
>  					const struct drm_display_mode *mode)
>  {
>  	struct intel_sdvo_dtd output_dtd;
>  
>  	if (!intel_sdvo_set_target_output(intel_sdvo,
> -					  intel_sdvo->attached_output))
> +					  intel_sdvo_connector->output_flag))
>  		return false;
>  
>  	intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
> @@ -1369,7 +1364,9 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,
>  	 * the sequence to do it. Oh well.
>  	 */
>  	if (IS_TV(intel_sdvo_connector)) {
> -		if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, mode))
> +		if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
> +							     intel_sdvo_connector,
> +							     mode))
>  			return -EINVAL;
>  
>  		(void) intel_sdvo_get_preferred_input_mode(intel_sdvo,
> @@ -1387,7 +1384,9 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,
>  		if (ret)
>  			return ret;
>  
> -		if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, fixed_mode))
> +		if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
> +							     intel_sdvo_connector,
> +							     fixed_mode))
>  			return -EINVAL;
>  
>  		(void) intel_sdvo_get_preferred_input_mode(intel_sdvo,
> @@ -1528,7 +1527,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state,
>  	 * channel on the motherboard.  In a two-input device, the first input
>  	 * will be SDVOB and the second SDVOC.
>  	 */
> -	in_out.in0 = intel_sdvo->attached_output;
> +	in_out.in0 = intel_sdvo_connector->output_flag;
>  	in_out.in1 = 0;
>  
>  	intel_sdvo_set_value(intel_sdvo,
> @@ -1537,7 +1536,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state,
>  
>  	/* Set the output timings to the screen */
>  	if (!intel_sdvo_set_target_output(intel_sdvo,
> -					  intel_sdvo->attached_output))
> +					  intel_sdvo_connector->output_flag))
>  		return;
>  
>  	/* lvds has a special fixed output timing. */
> @@ -1874,6 +1873,8 @@ static void intel_enable_sdvo(struct intel_atomic_state *state,
>  	struct drm_device *dev = encoder->base.dev;
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
> +	struct intel_sdvo_connector *intel_sdvo_connector =
> +		to_intel_sdvo_connector(conn_state->connector);
>  	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
>  	u32 temp;
>  	bool input1, input2;
> @@ -1903,7 +1904,7 @@ static void intel_enable_sdvo(struct intel_atomic_state *state,
>  	if (0)
>  		intel_sdvo_set_encoder_power_state(intel_sdvo,
>  						   DRM_MODE_DPMS_ON);
> -	intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo->attached_output);
> +	intel_sdvo_set_active_outputs(intel_sdvo, intel_sdvo_connector->output_flag);
>  
>  	if (pipe_config->has_audio)
>  		intel_sdvo_enable_audio(intel_sdvo, pipe_config, conn_state);
> @@ -2158,8 +2159,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
>  	if (response == 0)
>  		return connector_status_disconnected;
>  
> -	intel_sdvo->attached_output = response;
> -
>  	if ((intel_sdvo_connector->output_flag & response) == 0)
>  		ret = connector_status_disconnected;
>  	else if (IS_TMDS(intel_sdvo_connector))
> @@ -2287,6 +2286,8 @@ static const struct drm_display_mode sdvo_tv_modes[] = {
>  static int intel_sdvo_get_tv_modes(struct drm_connector *connector)
>  {
>  	struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
> +	struct intel_sdvo_connector *intel_sdvo_connector =
> +		to_intel_sdvo_connector(connector);
>  	const struct drm_connector_state *conn_state = connector->state;
>  	struct intel_sdvo_sdtv_resolution_request tv_res;
>  	u32 reply = 0, format_map = 0;
> @@ -2304,7 +2305,7 @@ static int intel_sdvo_get_tv_modes(struct drm_connector *connector)
>  	memcpy(&tv_res, &format_map,
>  	       min(sizeof(format_map), sizeof(struct intel_sdvo_sdtv_resolution_request)));
>  
> -	if (!intel_sdvo_set_target_output(intel_sdvo, intel_sdvo->attached_output))
> +	if (!intel_sdvo_set_target_output(intel_sdvo, intel_sdvo_connector->output_flag))
>  		return 0;
>  
>  	BUILD_BUG_ON(sizeof(tv_res) != 3);

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list