[v2,2/2] drm/amd/display: Use new connector state when getting color depth

Submitted by Kazlauskas, Nicholas on May 22, 2019, 4 p.m.

Details

Message ID 20190522160055.26665-2-nicholas.kazlauskas@amd.com
State Accepted
Commit 42ba01fc30e6f84e7433879052474e716237ab33
Headers show
Series "Series without cover letter" ( rev: 1 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Kazlauskas, Nicholas May 22, 2019, 4 p.m.
[Why]
The current state on the connector is queried when getting the max bpc
rather than the new state. This means that a new max bpc value can only
currently take effect on the commit *after* it changes.

The new state should be passed in instead.

[How]
Pass down the dm_state as drm state to where we do color depth lookup.

The passed in state can still be NULL when called from
amdgpu_dm_connector_mode_valid, so make sure that we have reasonable
defaults in place. That should probably be addressed at some point.

This change now (correctly) causes a modeset to occur when changing the
max bpc for a connector.

v2: Drop extra TODO.

Cc: Leo Li <sunpeng.li@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 ++++++++++---------
 1 file changed, 15 insertions(+), 12 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index b8e88209ef5d..fd0421794e0f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3038,13 +3038,13 @@  static void update_stream_scaling_settings(const struct drm_display_mode *mode,
 }
 
 static enum dc_color_depth
-convert_color_depth_from_display_info(const struct drm_connector *connector)
+convert_color_depth_from_display_info(const struct drm_connector *connector,
+				      const struct drm_connector_state *state)
 {
 	uint32_t bpc = connector->display_info.bpc;
 
-	/* TODO: Use passed in state instead of the current state. */
-	if (connector->state) {
-		bpc = connector->state->max_bpc;
+	if (state) {
+		bpc = state->max_bpc;
 		/* Round down to the nearest even number. */
 		bpc = bpc - (bpc & 1);
 	}
@@ -3165,11 +3165,12 @@  static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_
 
 }
 
-static void
-fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
-					     const struct drm_display_mode *mode_in,
-					     const struct drm_connector *connector,
-					     const struct dc_stream_state *old_stream)
+static void fill_stream_properties_from_drm_display_mode(
+	struct dc_stream_state *stream,
+	const struct drm_display_mode *mode_in,
+	const struct drm_connector *connector,
+	const struct drm_connector_state *connector_state,
+	const struct dc_stream_state *old_stream)
 {
 	struct dc_crtc_timing *timing_out = &stream->timing;
 	const struct drm_display_info *info = &connector->display_info;
@@ -3192,7 +3193,7 @@  fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
 
 	timing_out->timing_3d_format = TIMING_3D_FORMAT_NONE;
 	timing_out->display_color_depth = convert_color_depth_from_display_info(
-			connector);
+		connector, connector_state);
 	timing_out->scan_type = SCANNING_TYPE_NODATA;
 	timing_out->hdmi_vic = 0;
 
@@ -3389,6 +3390,8 @@  create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
 {
 	struct drm_display_mode *preferred_mode = NULL;
 	struct drm_connector *drm_connector;
+	const struct drm_connector_state *con_state =
+		dm_state ? &dm_state->base : NULL;
 	struct dc_stream_state *stream = NULL;
 	struct drm_display_mode mode = *drm_mode;
 	bool native_mode_found = false;
@@ -3461,10 +3464,10 @@  create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
 	*/
 	if (!scale || mode_refresh != preferred_refresh)
 		fill_stream_properties_from_drm_display_mode(stream,
-			&mode, &aconnector->base, NULL);
+			&mode, &aconnector->base, con_state, NULL);
 	else
 		fill_stream_properties_from_drm_display_mode(stream,
-			&mode, &aconnector->base, old_stream);
+			&mode, &aconnector->base, con_state, old_stream);
 
 	update_stream_scaling_settings(&mode, dm_state, stream);
 

Comments

On 2019-05-22 12:00 p.m., Nicholas Kazlauskas wrote:
> [CAUTION: External Email]

> 

> [Why]

> The current state on the connector is queried when getting the max bpc

> rather than the new state. This means that a new max bpc value can only

> currently take effect on the commit *after* it changes.

> 

> The new state should be passed in instead.

> 

> [How]

> Pass down the dm_state as drm state to where we do color depth lookup.

> 

> The passed in state can still be NULL when called from

> amdgpu_dm_connector_mode_valid, so make sure that we have reasonable

> defaults in place. That should probably be addressed at some point.

> 

> This change now (correctly) causes a modeset to occur when changing the

> max bpc for a connector.

> 

> v2: Drop extra TODO.

> 

> Cc: Leo Li <sunpeng.li@amd.com>

> Cc: Harry Wentland <harry.wentland@amd.com>

> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>

> Acked-by: Alex Deucher <alexander.deucher@amd.com>


Series is
Reviewed-by: Harry Wentland <harry.wentland@amd.com>


Harry

> ---

>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 ++++++++++---------

>  1 file changed, 15 insertions(+), 12 deletions(-)

> 

> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

> index b8e88209ef5d..fd0421794e0f 100644

> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

> @@ -3038,13 +3038,13 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode,

>  }

> 

>  static enum dc_color_depth

> -convert_color_depth_from_display_info(const struct drm_connector *connector)

> +convert_color_depth_from_display_info(const struct drm_connector *connector,

> +                                     const struct drm_connector_state *state)

>  {

>         uint32_t bpc = connector->display_info.bpc;

> 

> -       /* TODO: Use passed in state instead of the current state. */

> -       if (connector->state) {

> -               bpc = connector->state->max_bpc;

> +       if (state) {

> +               bpc = state->max_bpc;

>                 /* Round down to the nearest even number. */

>                 bpc = bpc - (bpc & 1);

>         }

> @@ -3165,11 +3165,12 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_

> 

>  }

> 

> -static void

> -fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,

> -                                            const struct drm_display_mode *mode_in,

> -                                            const struct drm_connector *connector,

> -                                            const struct dc_stream_state *old_stream)

> +static void fill_stream_properties_from_drm_display_mode(

> +       struct dc_stream_state *stream,

> +       const struct drm_display_mode *mode_in,

> +       const struct drm_connector *connector,

> +       const struct drm_connector_state *connector_state,

> +       const struct dc_stream_state *old_stream)

>  {

>         struct dc_crtc_timing *timing_out = &stream->timing;

>         const struct drm_display_info *info = &connector->display_info;

> @@ -3192,7 +3193,7 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,

> 

>         timing_out->timing_3d_format = TIMING_3D_FORMAT_NONE;

>         timing_out->display_color_depth = convert_color_depth_from_display_info(

> -                       connector);

> +               connector, connector_state);

>         timing_out->scan_type = SCANNING_TYPE_NODATA;

>         timing_out->hdmi_vic = 0;

> 

> @@ -3389,6 +3390,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,

>  {

>         struct drm_display_mode *preferred_mode = NULL;

>         struct drm_connector *drm_connector;

> +       const struct drm_connector_state *con_state =

> +               dm_state ? &dm_state->base : NULL;

>         struct dc_stream_state *stream = NULL;

>         struct drm_display_mode mode = *drm_mode;

>         bool native_mode_found = false;

> @@ -3461,10 +3464,10 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,

>         */

>         if (!scale || mode_refresh != preferred_refresh)

>                 fill_stream_properties_from_drm_display_mode(stream,

> -                       &mode, &aconnector->base, NULL);

> +                       &mode, &aconnector->base, con_state, NULL);

>         else

>                 fill_stream_properties_from_drm_display_mode(stream,

> -                       &mode, &aconnector->base, old_stream);

> +                       &mode, &aconnector->base, con_state, old_stream);

> 

>         update_stream_scaling_settings(&mode, dm_state, stream);

> 

> --

> 2.17.1

> 

> _______________________________________________

> amd-gfx mailing list

> amd-gfx@lists.freedesktop.org

> https://lists.freedesktop.org/mailman/listinfo/amd-gfx

>