diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0872-drm-amd-dal-Fix-HSYNC-flip-for-DCE8-10.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0872-drm-amd-dal-Fix-HSYNC-flip-for-DCE8-10.patch | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0872-drm-amd-dal-Fix-HSYNC-flip-for-DCE8-10.patch b/common/recipes-kernel/linux/files/0872-drm-amd-dal-Fix-HSYNC-flip-for-DCE8-10.patch new file mode 100644 index 00000000..24f46f14 --- /dev/null +++ b/common/recipes-kernel/linux/files/0872-drm-amd-dal-Fix-HSYNC-flip-for-DCE8-10.patch @@ -0,0 +1,207 @@ +From d46934473c1409a1734828cc2d398e3970602831 Mon Sep 17 00:00:00 2001 +From: Aric Cyr <aric.cyr@amd.com> +Date: Mon, 29 Feb 2016 12:05:52 -0500 +Subject: [PATCH 0872/1110] drm/amd/dal: Fix HSYNC flip for DCE8/10 + +DCE8/DCE10 does not support immediate flip so must also program HSYNC +flip bit. Immediate flip takes precedence on DCE11+ so enabling it will +not affect those ASICs. + +Signed-off-by: Aric Cyr <aric.cyr@amd.com> +Acked-by: Harry Wentland<harry.wentland@amd.com> +--- + .../gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c | 136 +++++++-------------- + 1 file changed, 45 insertions(+), 91 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c +index 30c6048..077278d 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c +@@ -40,64 +40,30 @@ + #define DMIF_REG(reg) (reg + mem_input110->offsets.dmif) + #define PIPE_REG(reg) (reg + mem_input110->offsets.pipe) + +-static void set_flip_control( +- struct dce110_mem_input *mem_input110, +- bool immediate) +-{ +- uint32_t value = 0; +- +- value = dm_read_reg( +- mem_input110->base.ctx, +- DCP_REG(mmGRPH_FLIP_CONTROL)); +- set_reg_field_value(value, 0, +- GRPH_FLIP_CONTROL, +- GRPH_SURFACE_UPDATE_IMMEDIATE_EN); +- set_reg_field_value(value, 0, +- GRPH_FLIP_CONTROL, +- GRPH_SURFACE_UPDATE_H_RETRACE_EN); +- if (immediate == true) +- set_reg_field_value(value, 1, +- GRPH_FLIP_CONTROL, +- GRPH_SURFACE_UPDATE_IMMEDIATE_EN); +- +- dm_write_reg( +- mem_input110->base.ctx, +- DCP_REG(mmGRPH_FLIP_CONTROL), +- value); +-} +- + static void program_sec_addr( + struct dce110_mem_input *mem_input110, + PHYSICAL_ADDRESS_LOC address) + { + uint32_t value = 0; +- uint32_t temp = 0; ++ uint32_t temp; ++ + /*high register MUST be programmed first*/ + temp = address.high_part & +-GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_MASK; +- ++ GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_MASK; + set_reg_field_value(value, temp, + GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, + GRPH_SECONDARY_SURFACE_ADDRESS_HIGH); ++ dm_write_reg(mem_input110->base.ctx, ++ DCP_REG(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH), value); + +- dm_write_reg( +- mem_input110->base.ctx, +- DCP_REG(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH), +- value); +- +- temp = 0; + value = 0; + temp = address.low_part >> +- GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS__SHIFT; +- ++ GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS__SHIFT; + set_reg_field_value(value, temp, + GRPH_SECONDARY_SURFACE_ADDRESS, + GRPH_SECONDARY_SURFACE_ADDRESS); +- +- dm_write_reg( +- mem_input110->base.ctx, +- DCP_REG(mmGRPH_SECONDARY_SURFACE_ADDRESS), +- value); ++ dm_write_reg(mem_input110->base.ctx, ++ DCP_REG(mmGRPH_SECONDARY_SURFACE_ADDRESS), value); + } + + static void program_pri_addr( +@@ -105,64 +71,25 @@ static void program_pri_addr( + PHYSICAL_ADDRESS_LOC address) + { + uint32_t value = 0; +- uint32_t temp = 0; ++ uint32_t temp; + + /*high register MUST be programmed first*/ + temp = address.high_part & +-GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_MASK; +- ++ GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_MASK; + set_reg_field_value(value, temp, + GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, + GRPH_PRIMARY_SURFACE_ADDRESS_HIGH); ++ dm_write_reg(mem_input110->base.ctx, ++ DCP_REG(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH), value); + +- dm_write_reg( +- mem_input110->base.ctx, +- DCP_REG(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH), +- value); +- +- temp = 0; + value = 0; + temp = address.low_part >> +- GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS__SHIFT; +- ++ GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS__SHIFT; + set_reg_field_value(value, temp, + GRPH_PRIMARY_SURFACE_ADDRESS, + GRPH_PRIMARY_SURFACE_ADDRESS); +- +- dm_write_reg( +- mem_input110->base.ctx, +- DCP_REG(mmGRPH_PRIMARY_SURFACE_ADDRESS), +- value); +-} +- +-static void program_addr( +- struct dce110_mem_input *mem_input110, +- const struct dc_plane_address *addr) +-{ +- switch (addr->type) { +- case PLN_ADDR_TYPE_GRAPHICS: +- if (addr->grph.addr.quad_part == 0) +- break; +- program_pri_addr( +- mem_input110, +- addr->grph.addr); +- break; +- case PLN_ADDR_TYPE_GRPH_STEREO: +- if (addr->grph_stereo.left_addr.quad_part == 0 +- || addr->grph_stereo.right_addr.quad_part == 0) +- break; +- program_pri_addr( +- mem_input110, +- addr->grph_stereo.left_addr); +- program_sec_addr( +- mem_input110, +- addr->grph_stereo.right_addr); +- break; +- case PLN_ADDR_TYPE_VIDEO_PROGRESSIVE: +- default: +- /* not supported */ +- BREAK_TO_DEBUGGER(); +- } ++ dm_write_reg(mem_input110->base.ctx, ++ DCP_REG(mmGRPH_PRIMARY_SURFACE_ADDRESS), value); + } + + static void enable(struct dce110_mem_input *mem_input110) +@@ -439,9 +366,36 @@ bool dce110_mem_input_program_surface_flip_and_addr( + { + struct dce110_mem_input *mem_input110 = TO_DCE110_MEM_INPUT(mem_input); + +- set_flip_control(mem_input110, flip_immediate); +- program_addr(mem_input110, +- address); ++ uint32_t value = 0; ++ ++ value = dm_read_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_FLIP_CONTROL)); ++ if (flip_immediate) { ++ set_reg_field_value(value, 1, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_IMMEDIATE_EN); ++ set_reg_field_value(value, 1, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_H_RETRACE_EN); ++ } else { ++ set_reg_field_value(value, 0, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_IMMEDIATE_EN); ++ set_reg_field_value(value, 0, GRPH_FLIP_CONTROL, GRPH_SURFACE_UPDATE_H_RETRACE_EN); ++ } ++ dm_write_reg(mem_input110->base.ctx, DCP_REG(mmGRPH_FLIP_CONTROL), value); ++ ++ switch (address->type) { ++ case PLN_ADDR_TYPE_GRAPHICS: ++ if (address->grph.addr.quad_part == 0) ++ break; ++ program_pri_addr(mem_input110, address->grph.addr); ++ break; ++ case PLN_ADDR_TYPE_GRPH_STEREO: ++ if (address->grph_stereo.left_addr.quad_part == 0 ++ || address->grph_stereo.right_addr.quad_part == 0) ++ break; ++ program_pri_addr(mem_input110, address->grph_stereo.left_addr); ++ program_sec_addr(mem_input110, address->grph_stereo.right_addr); ++ break; ++ default: ++ /* not supported */ ++ BREAK_TO_DEBUGGER(); ++ break; ++ } + + return true; + } +-- +2.7.4 + |