aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3126-drm-amd-display-Implement-CRTC-CRC-for-DCE110.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3126-drm-amd-display-Implement-CRTC-CRC-for-DCE110.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3126-drm-amd-display-Implement-CRTC-CRC-for-DCE110.patch158
1 files changed, 158 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3126-drm-amd-display-Implement-CRTC-CRC-for-DCE110.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3126-drm-amd-display-Implement-CRTC-CRC-for-DCE110.patch
new file mode 100644
index 00000000..f8d8a4ad
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3126-drm-amd-display-Implement-CRTC-CRC-for-DCE110.patch
@@ -0,0 +1,158 @@
+From 3ea424c34a4ac12913f4c5eaa863e5797b812b55 Mon Sep 17 00:00:00 2001
+From: "Leo (Sunpeng) Li" <sunpeng.li@amd.com>
+Date: Mon, 18 Dec 2017 14:38:41 -0500
+Subject: [PATCH 3126/4131] drm/amd/display: Implement CRTC CRC for DCE110
+
+Implement the timing generator hooks for configure_crc and get_crc.
+Also implement is_tg_enabled, as configure_crc uses it.
+
+Signed-off-by: Leo (Sunpeng) Li <sunpeng.li@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
+---
+ .../display/dc/dce110/dce110_timing_generator.c | 122 +++++++++++++++++++++
+ 1 file changed, 122 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
+index 25ca721..078d18c 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c
+@@ -2077,6 +2077,125 @@ bool dce110_arm_vert_intr(struct timing_generator *tg, uint8_t width)
+ return true;
+ }
+
++static bool dce110_is_tg_enabled(struct timing_generator *tg)
++{
++ uint32_t addr = 0;
++ uint32_t value = 0;
++ uint32_t field = 0;
++ struct dce110_timing_generator *tg110 = DCE110TG_FROM_TG(tg);
++
++ addr = CRTC_REG(mmCRTC_CONTROL);
++ value = dm_read_reg(tg->ctx, addr);
++ field = get_reg_field_value(value, CRTC_CONTROL,
++ CRTC_CURRENT_MASTER_EN_STATE);
++ return field == 1;
++}
++
++static bool dce110_configure_crc(struct timing_generator *tg,
++ const struct crc_params *params)
++{
++ uint32_t cntl_addr = 0;
++ uint32_t addr = 0;
++ uint32_t value;
++ struct dce110_timing_generator *tg110 = DCE110TG_FROM_TG(tg);
++
++ /* Cannot configure crc on a CRTC that is disabled */
++ if (!dce110_is_tg_enabled(tg))
++ return false;
++
++ cntl_addr = CRTC_REG(mmCRTC_CRC_CNTL);
++
++ /* First, disable CRC before we configure it. */
++ dm_write_reg(tg->ctx, cntl_addr, 0);
++
++ if (!params->enable)
++ return true;
++
++ /* Program frame boundaries */
++ /* Window A x axis start and end. */
++ value = 0;
++ addr = CRTC_REG(mmCRTC_CRC0_WINDOWA_X_CONTROL);
++ set_reg_field_value(value, params->windowa_x_start,
++ CRTC_CRC0_WINDOWA_X_CONTROL,
++ CRTC_CRC0_WINDOWA_X_START);
++ set_reg_field_value(value, params->windowa_x_end,
++ CRTC_CRC0_WINDOWA_X_CONTROL,
++ CRTC_CRC0_WINDOWA_X_END);
++ dm_write_reg(tg->ctx, addr, value);
++
++ /* Window A y axis start and end. */
++ value = 0;
++ addr = CRTC_REG(mmCRTC_CRC0_WINDOWA_Y_CONTROL);
++ set_reg_field_value(value, params->windowa_y_start,
++ CRTC_CRC0_WINDOWA_Y_CONTROL,
++ CRTC_CRC0_WINDOWA_Y_START);
++ set_reg_field_value(value, params->windowa_y_end,
++ CRTC_CRC0_WINDOWA_Y_CONTROL,
++ CRTC_CRC0_WINDOWA_Y_END);
++ dm_write_reg(tg->ctx, addr, value);
++
++ /* Window B x axis start and end. */
++ value = 0;
++ addr = CRTC_REG(mmCRTC_CRC0_WINDOWB_X_CONTROL);
++ set_reg_field_value(value, params->windowb_x_start,
++ CRTC_CRC0_WINDOWB_X_CONTROL,
++ CRTC_CRC0_WINDOWB_X_START);
++ set_reg_field_value(value, params->windowb_x_end,
++ CRTC_CRC0_WINDOWB_X_CONTROL,
++ CRTC_CRC0_WINDOWB_X_END);
++ dm_write_reg(tg->ctx, addr, value);
++
++ /* Window B y axis start and end. */
++ value = 0;
++ addr = CRTC_REG(mmCRTC_CRC0_WINDOWB_Y_CONTROL);
++ set_reg_field_value(value, params->windowb_y_start,
++ CRTC_CRC0_WINDOWB_Y_CONTROL,
++ CRTC_CRC0_WINDOWB_Y_START);
++ set_reg_field_value(value, params->windowb_y_end,
++ CRTC_CRC0_WINDOWB_Y_CONTROL,
++ CRTC_CRC0_WINDOWB_Y_END);
++ dm_write_reg(tg->ctx, addr, value);
++
++ /* Set crc mode and selection, and enable. Only using CRC0*/
++ value = 0;
++ set_reg_field_value(value, params->continuous_mode ? 1 : 0,
++ CRTC_CRC_CNTL, CRTC_CRC_CONT_EN);
++ set_reg_field_value(value, params->selection,
++ CRTC_CRC_CNTL, CRTC_CRC0_SELECT);
++ set_reg_field_value(value, 1, CRTC_CRC_CNTL, CRTC_CRC_EN);
++ dm_write_reg(tg->ctx, cntl_addr, value);
++
++ return true;
++}
++
++static bool dce110_get_crc(struct timing_generator *tg,
++ uint32_t *r_cr, uint32_t *g_y, uint32_t *b_cb)
++{
++ uint32_t addr = 0;
++ uint32_t value = 0;
++ uint32_t field = 0;
++ struct dce110_timing_generator *tg110 = DCE110TG_FROM_TG(tg);
++
++ addr = CRTC_REG(mmCRTC_CRC_CNTL);
++ value = dm_read_reg(tg->ctx, addr);
++ field = get_reg_field_value(value, CRTC_CRC_CNTL, CRTC_CRC_EN);
++
++ /* Early return if CRC is not enabled for this CRTC */
++ if (!field)
++ return false;
++
++ addr = CRTC_REG(mmCRTC_CRC0_DATA_RG);
++ value = dm_read_reg(tg->ctx, addr);
++ *r_cr = get_reg_field_value(value, CRTC_CRC0_DATA_RG, CRC0_R_CR);
++ *g_y = get_reg_field_value(value, CRTC_CRC0_DATA_RG, CRC0_G_Y);
++
++ addr = CRTC_REG(mmCRTC_CRC0_DATA_B);
++ value = dm_read_reg(tg->ctx, addr);
++ *b_cb = get_reg_field_value(value, CRTC_CRC0_DATA_B, CRC0_B_CB);
++
++ return true;
++}
++
+ static const struct timing_generator_funcs dce110_tg_funcs = {
+ .validate_timing = dce110_tg_validate_timing,
+ .program_timing = dce110_tg_program_timing,
+@@ -2112,6 +2231,9 @@ static const struct timing_generator_funcs dce110_tg_funcs = {
+ dce110_timing_generator_set_static_screen_control,
+ .set_test_pattern = dce110_timing_generator_set_test_pattern,
+ .arm_vert_intr = dce110_arm_vert_intr,
++ .is_tg_enabled = dce110_is_tg_enabled,
++ .configure_crc = dce110_configure_crc,
++ .get_crc = dce110_get_crc,
+ };
+
+ void dce110_timing_generator_construct(
+--
+2.7.4
+