aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1067-drm-amd-display-refactor-reg_update.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1067-drm-amd-display-refactor-reg_update.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1067-drm-amd-display-refactor-reg_update.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1067-drm-amd-display-refactor-reg_update.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1067-drm-amd-display-refactor-reg_update.patch
new file mode 100644
index 00000000..134bc39d
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1067-drm-amd-display-refactor-reg_update.patch
@@ -0,0 +1,90 @@
+From 39abb84c8bc3dde5cecf3fb994e105f16bde9afe Mon Sep 17 00:00:00 2001
+From: Tony Cheng <tony.cheng@amd.com>
+Date: Wed, 24 Oct 2018 15:09:46 -0400
+Subject: [PATCH 1067/2940] drm/amd/display: refactor reg_update
+
+[why]
+separate register access from logic to allow us abstract register sequences
+
+[how]
+consolidate mask and value first then apply to register.
+
+Signed-off-by: Tony Cheng <tony.cheng@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dc_helper.c | 36 +++++++++++++++++++---
+ 1 file changed, 32 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_helper.c b/drivers/gpu/drm/amd/display/dc/dc_helper.c
+index 4842d2378bbf..597d38393379 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_helper.c
++++ b/drivers/gpu/drm/amd/display/dc/dc_helper.c
+@@ -29,31 +29,59 @@
+ #include "dm_services.h"
+ #include <stdarg.h>
+
++struct dc_reg_value_masks {
++ uint32_t value;
++ uint32_t mask;
++};
++
++struct dc_reg_sequence {
++ uint32_t addr;
++ struct dc_reg_value_masks value_masks;
++};
++
++static inline void set_reg_field_value_masks(
++ struct dc_reg_value_masks *field_value_mask,
++ uint32_t value,
++ uint32_t mask,
++ uint8_t shift)
++{
++ ASSERT(mask != 0);
++
++ field_value_mask->value = (field_value_mask->value & ~mask) | (mask & (value << shift));
++ 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,
+ uint8_t shift1, uint32_t mask1, uint32_t field_value1,
+ ...)
+ {
++ 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);
+
+- reg_val = set_reg_field_value_ex(reg_val, field_value1, mask1, shift1);
++ /* gather all bits value/mask getting updated in this register */
++ set_reg_field_value_masks(&field_value_mask,
++ field_value1, mask1, shift1);
+
+ while (i < n) {
+ shift = va_arg(ap, uint32_t);
+ mask = va_arg(ap, uint32_t);
+ field_value = va_arg(ap, uint32_t);
+
+- reg_val = set_reg_field_value_ex(reg_val, field_value, mask, shift);
++ set_reg_field_value_masks(&field_value_mask,
++ field_value, mask, shift);
+ i++;
+ }
+-
+- dm_write_reg(ctx, addr, reg_val);
+ va_end(ap);
+
++
++ /* mmio write directly */
++ reg_val = (reg_val & ~field_value_mask.mask) | field_value_mask.value;
++ dm_write_reg(ctx, addr, reg_val);
+ return reg_val;
+ }
+
+--
+2.17.1
+