2021-06-09 08:54:03

by Werner Sembach

[permalink] [raw]
Subject: [PATCH 0/7] Add "activ bpc" and "active color format" drm property

I started work on my proposal for better color handling in Linux display
drivers: https://lkml.org/lkml/2021/5/12/764

In this 2nd revision the first two read-only properties are now implemented for
amdgpu and i915. I post it here to collect collect some additional feedback, if
someone sees an improvement opportunity.

I have already commited the first patch in this series independently as it fixes
a function already in use.

Some of the feedback from the first post is already implemented.

The actual update of the values is implemented in patch three and four and six
and seven in the atomic_commit_tail() function of amdgpu and atomic_commit()
function of i915 respectively. They do get updated more often than needed with
the current approach, but without harm since just the same value is written
again. A check if the update is required would be the same amount of
computation.



2021-06-09 08:54:27

by Werner Sembach

[permalink] [raw]
Subject: [PATCH v2 7/7] drm/i915/display: Add handling for new "active color format" property

This commit implements the "active color format" drm property for the Intel GPU
driver.

Signed-off-by: Werner Sembach <[email protected]>
---
drivers/gpu/drm/i915/display/intel_display.c | 20 +++++++++++++++++++-
drivers/gpu/drm/i915/display/intel_dp.c | 2 ++
drivers/gpu/drm/i915/display/intel_dp_mst.c | 1 +
drivers/gpu/drm/i915/display/intel_hdmi.c | 1 +
4 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 50c11b8770a7..e3e98c959cb4 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -10158,6 +10158,21 @@ static void intel_atomic_prepare_plane_clear_colors(struct intel_atomic_state *s
}
}

+static int convert_intel_output_format_into_drm_color_format(enum intel_output_format output_format)
+{
+ switch (output_format) {
+ case INTEL_OUTPUT_FORMAT_RGB:
+ return DRM_COLOR_FORMAT_RGB444;
+ case INTEL_OUTPUT_FORMAT_YCBCR420:
+ return DRM_COLOR_FORMAT_YCRCB420;
+ case INTEL_OUTPUT_FORMAT_YCBCR444:
+ return DRM_COLOR_FORMAT_YCRCB444;
+ default:
+ break;
+ }
+ return 0;
+}
+
static void intel_atomic_commit_tail(struct intel_atomic_state *state)
{
struct drm_device *dev = state->base.dev;
@@ -10465,9 +10480,12 @@ static int intel_atomic_commit(struct drm_device *dev,
if (crtc) {
struct intel_crtc_state *new_crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
new_conn_state->active_bpc = new_crtc_state->pipe_bpp / 3;
+ new_conn_state->active_color_format = convert_intel_output_format_into_drm_color_format(new_crtc_state->output_format);
}
- else
+ else {
new_conn_state->active_bpc = 0;
+ new_conn_state->active_color_format = 0;
+ }
}

drm_atomic_state_get(&state->base);
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 67826ba976ed..7d58bc7972d0 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -4674,10 +4674,12 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
if (HAS_GMCH(dev_priv)) {
drm_connector_attach_max_bpc_property(connector, 6, 10);
drm_connector_attach_active_bpc_property(connector, 6, 10);
+ drm_connector_attach_active_color_format_property(connector);
}
else if (DISPLAY_VER(dev_priv) >= 5) {
drm_connector_attach_max_bpc_property(connector, 6, 12);
drm_connector_attach_active_bpc_property(connector, 6, 12);
+ drm_connector_attach_active_color_format_property(connector);
}

/* Register HDMI colorspace for case of lspcon */
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 5a1869dc2210..9143adccb5d0 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -847,6 +847,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
if (connector->max_bpc_property) {
drm_connector_attach_max_bpc_property(connector, 6, 12);
drm_connector_attach_active_bpc_property(connector, 6, 12);
+ drm_connector_attach_active_color_format_property(connector);
}

return connector;
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 8af78b27b6ce..0b57d924987e 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2466,6 +2466,7 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c
if (!HAS_GMCH(dev_priv)) {
drm_connector_attach_max_bpc_property(connector, 8, 12);
drm_connector_attach_active_bpc_property(connector, 8, 12);
+ drm_connector_attach_active_color_format_property(connector);
}
}

--
2.25.1