On Wed, 10 Jan 2024 at 22:18, Kuogee Hsieh <quic_khsieh@xxxxxxxxxxx> wrote:
MSA MISC0 bit 1 to 7 contains Colorimetry Indicator Field. At currenthttps://docs.kernel.org/process/submitting-patches.html#describe-your-changes
implementation, Colorimetry Indicator Field of MISC0 is not configured
correctly. This patch add support of RGB formats Colorimetry.
Also the commit message doesn't provide any details or what was incorrect.
Fixes: c943b4948b58 ("drm/msm/dp: add displayPort driver support")test_dyn_range has the value of (dpcd[DP_TEST_MISC0] &
Signed-off-by: Kuogee Hsieh <quic_khsieh@xxxxxxxxxxx>
---
drivers/gpu/drm/msm/dp/dp_ctrl.c | 5 ++--
drivers/gpu/drm/msm/dp/dp_link.c | 26 ++++++++++++++++-----
drivers/gpu/drm/msm/dp/dp_panel.c | 48 +++++++++++++++++++++++++++++++++++++++
drivers/gpu/drm/msm/dp/dp_panel.h | 2 ++
4 files changed, 73 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c
index 77a8d93..2ef89fb 100644
--- a/drivers/gpu/drm/msm/dp/dp_ctrl.c
+++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2023, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved
*/
#define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__
@@ -172,7 +173,7 @@ static void dp_ctrl_configure_source_params(struct dp_ctrl_private *ctrl)
tb = dp_link_get_test_bits_depth(ctrl->link,
ctrl->panel->dp_mode.bpp);
- cc = dp_link_get_colorimetry_config(ctrl->link);
+ cc = dp_panel_get_misc_colorimetry_val(ctrl->panel);
dp_catalog_ctrl_config_misc(ctrl->catalog, cc, tb);
dp_panel_timing_cfg(ctrl->panel);
}
diff --git a/drivers/gpu/drm/msm/dp/dp_link.c b/drivers/gpu/drm/msm/dp/dp_link.c
index 98427d4..21fa1a2 100644
--- a/drivers/gpu/drm/msm/dp/dp_link.c
+++ b/drivers/gpu/drm/msm/dp/dp_link.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved
*/
#define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__
@@ -12,6 +13,11 @@
#define DP_TEST_REQUEST_MASK 0x7F
+enum dynamic_range {
+ DP_DYNAMIC_RANGE_RGB_VESA,
+ DP_DYNAMIC_RANGE_RGB_CEA,
+};
+
enum audio_sample_rate {
AUDIO_SAMPLE_RATE_32_KHZ = 0x00,
AUDIO_SAMPLE_RATE_44_1_KHZ = 0x01,
@@ -1083,6 +1089,7 @@ int dp_link_process_request(struct dp_link *dp_link)
int dp_link_get_colorimetry_config(struct dp_link *dp_link)
{
u32 cc;
+ enum dynamic_range dr;
struct dp_link_private *link;
if (!dp_link) {
@@ -1092,14 +1099,21 @@ int dp_link_get_colorimetry_config(struct dp_link *dp_link)
link = container_of(dp_link, struct dp_link_private, dp_link);
- /*
- * Unless a video pattern CTS test is ongoing, use RGB_VESA
- * Only RGB_VESA and RGB_CEA supported for now
- */
+ /* unless a video pattern CTS test is ongoing, use CEA_VESA */
if (dp_link_is_video_pattern_requested(link))
- cc = link->dp_link.test_video.test_dyn_range;
+ dr = link->dp_link.test_video.test_dyn_range;
DP_TEST_DYNAMIC_RANGE_CEA), so it can not be assigned to dr.
I don't feel like this has been tested.
elseNo undefined magic, please.
- cc = DP_TEST_DYNAMIC_RANGE_VESA;
+ dr = DP_DYNAMIC_RANGE_RGB_VESA;
+
+ /* Only RGB_VESA and RGB_CEA supported for now */
+ switch (dr) {
+ case DP_DYNAMIC_RANGE_RGB_CEA:
+ cc = BIT(2);
+ break;The driver doesn't attach the colorspace property, so this part is
+ case DP_DYNAMIC_RANGE_RGB_VESA:
+ default:
+ cc = 0;
+ }
return cc;
}
diff --git a/drivers/gpu/drm/msm/dp/dp_panel.c b/drivers/gpu/drm/msm/dp/dp_panel.c
index 127f6af..785bb59 100644
--- a/drivers/gpu/drm/msm/dp/dp_panel.c
+++ b/drivers/gpu/drm/msm/dp/dp_panel.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved
*/
#include "dp_panel.h"
@@ -386,6 +387,53 @@ int dp_panel_init_panel_info(struct dp_panel *dp_panel)
return 0;
}
+/*
+ * Mapper function which outputs colorimetry to be used for a
+ * given colorspace value when misc field of MSA is used to
+ * change the colorimetry. Currently only RGB formats have been
+ * added. This API will be extended to YUV once it's supported on DP.
+ */
+u8 dp_panel_get_misc_colorimetry_val(struct dp_panel *dp_panel)
+{
+ u8 colorimetry;
+ u32 colorspace;
+ u32 cc;
+ struct dp_panel_private *panel;
+
+ panel = container_of(dp_panel, struct dp_panel_private, dp_panel);
+
+ cc = dp_link_get_colorimetry_config(panel->link);
+ /*
+ * If there is a non-zero value then compliance test-case
+ * is going on, otherwise we can honor the colorspace setting
+ */
+ if (cc)
+ return cc;
+
+ colorspace = dp_panel->connector->state->colorspace;
useless. Anyway, I think adding colorimetry support will require more
changes than just setting the register in the DisplayPort controller.
+ drm_dbg_dp(panel->drm_dev, "colorspace=%d\n", colorspace);Please define these magic values.
+
+ switch (colorspace) {
+ case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
+ case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
+ colorimetry = 0x7;
+ break;
+ case DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED:
+ colorimetry = 0x3;
+ break;
+ case DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT:
+ colorimetry = 0xb;
+ break;
+ case DRM_MODE_COLORIMETRY_OPRGB:
+ colorimetry = 0xc;
+ break;
+ default:
+ colorimetry = 0; /* legacy RGB mode */
+ }
+
+ return colorimetry;
+}
+
struct dp_panel *dp_panel_get(struct dp_panel_in *in)
{
struct dp_panel_private *panel;
diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h
index a0dfc57..c34a51d 100644
--- a/drivers/gpu/drm/msm/dp/dp_panel.h
+++ b/drivers/gpu/drm/msm/dp/dp_panel.h
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved
*/
#ifndef _DP_PANEL_H_
@@ -65,6 +66,7 @@ int dp_panel_get_modes(struct dp_panel *dp_panel,
struct drm_connector *connector);
void dp_panel_handle_sink_request(struct dp_panel *dp_panel);
void dp_panel_tpg_config(struct dp_panel *dp_panel, bool enable);
+u8 dp_panel_get_misc_colorimetry_val(struct dp_panel *dp_panel);
/**
* is_link_rate_valid() - validates the link rate
--
2.7.4