Commit cedde71c authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher

drm/amd/display: Support amdgpu "max bpc" connector property (v2)

[Why]
Many panels support more than 8bpc but some modes are unavailable while
running at greater than 8bpc due to DP/HDMI bandwidth constraints.

Support for more than 8bpc was added recently in the driver but it
defaults to the maximum supported bpc - locking out these modes.

This should be a user configurable option such that the user can select
what bpc configuration they would like.

[How]
This patch adds support for getting and setting the amdgpu driver
specific "max bpc" property on the connector.

It also adds support for limiting the output bpc based on the property
value. The default limitation is the lowest value in the range, 8bpc.
This was the old value before the range was uncapped.

This patch should be updated/replaced later once common drm support
for max bpc lands.

Bugzilla: https://bugs.freedesktop.org/108542
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=201585
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=200645
Fixes: e03fd3f3 ("drm/amd/display: Do not limit color depth to 8bpc")

v2: rebase on upstream (Alex)
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 e2306cc6
...@@ -2422,8 +2422,15 @@ static void update_stream_scaling_settings(const struct drm_display_mode *mode, ...@@ -2422,8 +2422,15 @@ 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)
{ {
struct dm_connector_state *dm_conn_state =
to_dm_connector_state(connector->state);
uint32_t bpc = connector->display_info.bpc; uint32_t bpc = connector->display_info.bpc;
/* TODO: Remove this when there's support for max_bpc in drm */
if (dm_conn_state && bpc > dm_conn_state->max_bpc)
/* Round down to nearest even number. */
bpc = dm_conn_state->max_bpc - (dm_conn_state->max_bpc & 1);
switch (bpc) { switch (bpc) {
case 0: case 0:
/* /*
...@@ -3007,6 +3014,9 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector, ...@@ -3007,6 +3014,9 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
} else if (property == adev->mode_info.underscan_property) { } else if (property == adev->mode_info.underscan_property) {
dm_new_state->underscan_enable = val; dm_new_state->underscan_enable = val;
ret = 0; ret = 0;
} else if (property == adev->mode_info.max_bpc_property) {
dm_new_state->max_bpc = val;
ret = 0;
} }
return ret; return ret;
...@@ -3049,6 +3059,9 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector, ...@@ -3049,6 +3059,9 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
} else if (property == adev->mode_info.underscan_property) { } else if (property == adev->mode_info.underscan_property) {
*val = dm_state->underscan_enable; *val = dm_state->underscan_enable;
ret = 0; ret = 0;
} else if (property == adev->mode_info.max_bpc_property) {
*val = dm_state->max_bpc;
ret = 0;
} }
return ret; return ret;
} }
...@@ -3859,6 +3872,9 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, ...@@ -3859,6 +3872,9 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
drm_object_attach_property(&aconnector->base.base, drm_object_attach_property(&aconnector->base.base,
adev->mode_info.underscan_vborder_property, adev->mode_info.underscan_vborder_property,
0); 0);
drm_object_attach_property(&aconnector->base.base,
adev->mode_info.max_bpc_property,
0);
} }
......
...@@ -252,6 +252,7 @@ struct dm_connector_state { ...@@ -252,6 +252,7 @@ struct dm_connector_state {
enum amdgpu_rmx_type scaling; enum amdgpu_rmx_type scaling;
uint8_t underscan_vborder; uint8_t underscan_vborder;
uint8_t underscan_hborder; uint8_t underscan_hborder;
uint8_t max_bpc;
bool underscan_enable; bool underscan_enable;
bool freesync_enable; bool freesync_enable;
bool freesync_capable; bool freesync_capable;
......
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