aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1585-drm-amd-display-Refactor-reg_set-and-reg_update.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1585-drm-amd-display-Refactor-reg_set-and-reg_update.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1585-drm-amd-display-Refactor-reg_set-and-reg_update.patch181
1 files changed, 181 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1585-drm-amd-display-Refactor-reg_set-and-reg_update.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1585-drm-amd-display-Refactor-reg_set-and-reg_update.patch
new file mode 100644
index 00000000..e407eae3
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1585-drm-amd-display-Refactor-reg_set-and-reg_update.patch
@@ -0,0 +1,181 @@
+From 6a6e78d8c19b1e88124f6349ec4db690c9653c2e Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Wed, 13 Feb 2019 10:35:43 -0500
+Subject: [PATCH 1585/2940] drm/amd/display: Refactor reg_set and reg_update.
+
+[Why]
+Current reg update and reg set use same functions and
+only delta is update reads reg value and call update function.
+
+[How]
+Refactor reg update and reg set functions.
+1.Implement different functions for reg update and reg set.
+2.Wrap same process to a help function, both reg update and
+reg set will call it.
+
+Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dc_helper.c | 52 +++++++++++++++----
+ .../amd/display/dc/dcn10/dcn10_link_encoder.c | 2 -
+ drivers/gpu/drm/amd/display/dc/dm_services.h | 9 ++--
+ .../gpu/drm/amd/display/dc/inc/reg_helper.h | 3 +-
+ 4 files changed, 50 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_helper.c b/drivers/gpu/drm/amd/display/dc/dc_helper.c
+index 5ba53947ad17..0ac1b8364d14 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_helper.c
++++ b/drivers/gpu/drm/amd/display/dc/dc_helper.c
+@@ -70,20 +70,16 @@ static inline void set_reg_field_value_masks(
+ field_value_mask->mask = field_value_mask->mask | mask;
+ }
+
+-uint32_t generic_reg_update_ex(const struct dc_context *ctx,
+- uint32_t addr, uint32_t reg_val, int n,
++static void set_reg_field_values(struct dc_reg_value_masks *field_value_mask,
++ uint32_t addr, int n,
+ uint8_t shift1, uint32_t mask1, uint32_t field_value1,
+- ...)
++ va_list ap)
+ {
+- struct dc_reg_value_masks field_value_mask = {0};
+ uint32_t shift, mask, field_value;
+ int i = 1;
+
+- va_list ap;
+- va_start(ap, field_value1);
+-
+ /* gather all bits value/mask getting updated in this register */
+- set_reg_field_value_masks(&field_value_mask,
++ set_reg_field_value_masks(field_value_mask,
+ field_value1, mask1, shift1);
+
+ while (i < n) {
+@@ -91,10 +87,48 @@ uint32_t generic_reg_update_ex(const struct dc_context *ctx,
+ mask = va_arg(ap, uint32_t);
+ field_value = va_arg(ap, uint32_t);
+
+- set_reg_field_value_masks(&field_value_mask,
++ set_reg_field_value_masks(field_value_mask,
+ field_value, mask, shift);
+ i++;
+ }
++}
++
++uint32_t generic_reg_update_ex(const struct dc_context *ctx,
++ uint32_t addr, int n,
++ uint8_t shift1, uint32_t mask1, uint32_t field_value1,
++ ...)
++{
++ struct dc_reg_value_masks field_value_mask = {0};
++ uint32_t reg_val;
++ va_list ap;
++
++ va_start(ap, field_value1);
++
++ set_reg_field_values(&field_value_mask, addr, n, shift1, mask1,
++ field_value1, ap);
++
++ va_end(ap);
++
++ /* mmio write directly */
++ reg_val = dm_read_reg(ctx, addr);
++ reg_val = (reg_val & ~field_value_mask.mask) | field_value_mask.value;
++ dm_write_reg(ctx, addr, reg_val);
++ return reg_val;
++}
++
++uint32_t generic_reg_set_ex(const struct dc_context *ctx,
++ uint32_t addr, uint32_t reg_val, int n,
++ uint8_t shift1, uint32_t mask1, uint32_t field_value1,
++ ...)
++{
++ struct dc_reg_value_masks field_value_mask = {0};
++ va_list ap;
++
++ va_start(ap, field_value1);
++
++ set_reg_field_values(&field_value_mask, addr, n, shift1, mask1,
++ field_value1, ap);
++
+ va_end(ap);
+
+ #ifdef CONFIG_DRM_AMD_DC_DMUB
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
+index a9db372688ff..0126a44ba012 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
+@@ -1304,7 +1304,6 @@ void dcn10_link_encoder_connect_dig_be_to_fe(
+ #define HPD_REG_UPDATE_N(reg_name, n, ...) \
+ generic_reg_update_ex(CTX, \
+ HPD_REG(reg_name), \
+- HPD_REG_READ(reg_name), \
+ n, __VA_ARGS__)
+
+ #define HPD_REG_UPDATE(reg_name, field, val) \
+@@ -1337,7 +1336,6 @@ void dcn10_link_encoder_disable_hpd(struct link_encoder *enc)
+ #define AUX_REG_UPDATE_N(reg_name, n, ...) \
+ generic_reg_update_ex(CTX, \
+ AUX_REG(reg_name), \
+- AUX_REG_READ(reg_name), \
+ n, __VA_ARGS__)
+
+ #define AUX_REG_UPDATE(reg_name, field, val) \
+diff --git a/drivers/gpu/drm/amd/display/dc/dm_services.h b/drivers/gpu/drm/amd/display/dc/dm_services.h
+index 56832425a4d5..a62d53a1df31 100644
+--- a/drivers/gpu/drm/amd/display/dc/dm_services.h
++++ b/drivers/gpu/drm/amd/display/dc/dm_services.h
+@@ -144,10 +144,14 @@ static inline uint32_t set_reg_field_value_ex(
+ reg_name ## __ ## reg_field ## _MASK,\
+ reg_name ## __ ## reg_field ## __SHIFT)
+
+-uint32_t generic_reg_update_ex(const struct dc_context *ctx,
++uint32_t generic_reg_set_ex(const struct dc_context *ctx,
+ uint32_t addr, uint32_t reg_val, int n,
+ uint8_t shift1, uint32_t mask1, uint32_t field_value1, ...);
+
++uint32_t generic_reg_update_ex(const struct dc_context *ctx,
++ uint32_t addr, int n,
++ uint8_t shift1, uint32_t mask1, uint32_t field_value1, ...);
++
+ #define FD(reg_field) reg_field ## __SHIFT, \
+ reg_field ## _MASK
+
+@@ -172,11 +176,10 @@ unsigned int generic_reg_wait(const struct dc_context *ctx,
+
+ #define generic_reg_update_soc15(ctx, inst_offset, reg_name, n, ...)\
+ generic_reg_update_ex(ctx, DCE_BASE.instance[0].segment[mm##reg_name##_BASE_IDX] + mm##reg_name + inst_offset, \
+- dm_read_reg_func(ctx, mm##reg_name + DCE_BASE.instance[0].segment[mm##reg_name##_BASE_IDX] + inst_offset, __func__), \
+ n, __VA_ARGS__)
+
+ #define generic_reg_set_soc15(ctx, inst_offset, reg_name, n, ...)\
+- generic_reg_update_ex(ctx, DCE_BASE.instance[0].segment[mm##reg_name##_BASE_IDX] + mm##reg_name + inst_offset, 0, \
++ generic_reg_set_ex(ctx, DCE_BASE.instance[0].segment[mm##reg_name##_BASE_IDX] + mm##reg_name + inst_offset, 0, \
+ n, __VA_ARGS__)
+
+ #define get_reg_field_value_soc15(reg_value, block, reg_num, reg_name, reg_field)\
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/reg_helper.h b/drivers/gpu/drm/amd/display/dc/inc/reg_helper.h
+index 6b808cb1895c..50b221f77a75 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/reg_helper.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/reg_helper.h
+@@ -52,7 +52,7 @@
+
+ /* macro to set register fields. */
+ #define REG_SET_N(reg_name, n, initial_val, ...) \
+- generic_reg_update_ex(CTX, \
++ generic_reg_set_ex(CTX, \
+ REG(reg_name), \
+ initial_val, \
+ n, __VA_ARGS__)
+@@ -225,7 +225,6 @@
+ #define REG_UPDATE_N(reg_name, n, ...) \
+ generic_reg_update_ex(CTX, \
+ REG(reg_name), \
+- REG_READ(reg_name), \
+ n, __VA_ARGS__)
+
+ #define REG_UPDATE(reg_name, field, val) \
+--
+2.17.1
+