Commit 42ba01fc authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher

drm/amd/display: Use new connector state when getting color depth

[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: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1825fd34
...@@ -2967,13 +2967,13 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode, ...@@ -2967,13 +2967,13 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode,
} }
static enum dc_color_depth 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; uint32_t bpc = connector->display_info.bpc;
/* TODO: Use passed in state instead of the current state. */ if (state) {
if (connector->state) { bpc = state->max_bpc;
bpc = connector->state->max_bpc;
/* Round down to the nearest even number. */ /* Round down to the nearest even number. */
bpc = bpc - (bpc & 1); bpc = bpc - (bpc & 1);
} }
...@@ -3094,10 +3094,11 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_ ...@@ -3094,10 +3094,11 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_
} }
static void static void fill_stream_properties_from_drm_display_mode(
fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream, struct dc_stream_state *stream,
const struct drm_display_mode *mode_in, const struct drm_display_mode *mode_in,
const struct drm_connector *connector, const struct drm_connector *connector,
const struct drm_connector_state *connector_state,
const struct dc_stream_state *old_stream) const struct dc_stream_state *old_stream)
{ {
struct dc_crtc_timing *timing_out = &stream->timing; struct dc_crtc_timing *timing_out = &stream->timing;
...@@ -3121,7 +3122,7 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream, ...@@ -3121,7 +3122,7 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
timing_out->timing_3d_format = TIMING_3D_FORMAT_NONE; timing_out->timing_3d_format = TIMING_3D_FORMAT_NONE;
timing_out->display_color_depth = convert_color_depth_from_display_info( timing_out->display_color_depth = convert_color_depth_from_display_info(
connector); connector, connector_state);
timing_out->scan_type = SCANNING_TYPE_NODATA; timing_out->scan_type = SCANNING_TYPE_NODATA;
timing_out->hdmi_vic = 0; timing_out->hdmi_vic = 0;
...@@ -3318,6 +3319,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, ...@@ -3318,6 +3319,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
{ {
struct drm_display_mode *preferred_mode = NULL; struct drm_display_mode *preferred_mode = NULL;
struct drm_connector *drm_connector; 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 dc_stream_state *stream = NULL;
struct drm_display_mode mode = *drm_mode; struct drm_display_mode mode = *drm_mode;
bool native_mode_found = false; bool native_mode_found = false;
...@@ -3390,10 +3393,10 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, ...@@ -3390,10 +3393,10 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
*/ */
if (!scale || mode_refresh != preferred_refresh) if (!scale || mode_refresh != preferred_refresh)
fill_stream_properties_from_drm_display_mode(stream, fill_stream_properties_from_drm_display_mode(stream,
&mode, &aconnector->base, NULL); &mode, &aconnector->base, con_state, NULL);
else else
fill_stream_properties_from_drm_display_mode(stream, 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); update_stream_scaling_settings(&mode, dm_state, stream);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment