aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3119-drm-amd-display-Move-dpp-reg-access-from-hwss-to-dpp.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3119-drm-amd-display-Move-dpp-reg-access-from-hwss-to-dpp.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3119-drm-amd-display-Move-dpp-reg-access-from-hwss-to-dpp.patch276
1 files changed, 276 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3119-drm-amd-display-Move-dpp-reg-access-from-hwss-to-dpp.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3119-drm-amd-display-Move-dpp-reg-access-from-hwss-to-dpp.patch
new file mode 100644
index 00000000..94772fed
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3119-drm-amd-display-Move-dpp-reg-access-from-hwss-to-dpp.patch
@@ -0,0 +1,276 @@
+From 7c842070905beea3493e2a1b8495452e7f90356b Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Wed, 20 Dec 2017 17:17:40 -0500
+Subject: [PATCH 3119/4131] drm/amd/display: Move dpp reg access from hwss to
+ dpp module.
+
+Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h | 8 -----
+ drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c | 21 +++++++++++++
+ drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h | 21 +++++++++----
+ .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 35 +++++-----------------
+ drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h | 2 --
+ drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h | 5 ++++
+ 6 files changed, 49 insertions(+), 43 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
+index c9a45d5..b3cd7ca 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
+@@ -140,10 +140,6 @@
+ BL_REG_LIST()
+
+ #define HWSEQ_DCN_REG_LIST()\
+- SRII(DPP_CONTROL, DPP_TOP, 0), \
+- SRII(DPP_CONTROL, DPP_TOP, 1), \
+- SRII(DPP_CONTROL, DPP_TOP, 2), \
+- SRII(DPP_CONTROL, DPP_TOP, 3), \
+ SRII(OPP_PIPE_CONTROL, OPP_PIPE, 0), \
+ SRII(OPP_PIPE_CONTROL, OPP_PIPE, 1), \
+ SRII(OPP_PIPE_CONTROL, OPP_PIPE, 2), \
+@@ -252,7 +248,6 @@ struct dce_hwseq_registers {
+ uint32_t DCHUB_AGP_BOT;
+ uint32_t DCHUB_AGP_TOP;
+
+- uint32_t DPP_CONTROL[4];
+ uint32_t OPP_PIPE_CONTROL[4];
+ uint32_t REFCLK_CNTL;
+ uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A;
+@@ -423,7 +418,6 @@ struct dce_hwseq_registers {
+ #define HWSEQ_DCN_MASK_SH_LIST(mask_sh)\
+ HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, OTG0_),\
+ HWS_SF1(OTG0_, PHYPLL_PIXEL_RATE_CNTL, PHYPLL_PIXEL_RATE_SOURCE, mask_sh), \
+- HWS_SF(DPP_TOP0_, DPP_CONTROL, DPP_CLOCK_ENABLE, mask_sh), \
+ HWS_SF(OPP_PIPE0_, OPP_PIPE_CONTROL, OPP_PIPE_CLOCK_EN, mask_sh),\
+ HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, mask_sh), \
+ HWS_SF(, DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, mask_sh), \
+@@ -445,7 +439,6 @@ struct dce_hwseq_registers {
+ HWS_SF(, DCHUBBUB_SDPIF_AGP_BASE, SDPIF_AGP_BASE, mask_sh), \
+ HWS_SF(, DCHUBBUB_SDPIF_AGP_BOT, SDPIF_AGP_BOT, mask_sh), \
+ HWS_SF(, DCHUBBUB_SDPIF_AGP_TOP, SDPIF_AGP_TOP, mask_sh), \
+- HWS_SF(DPP_TOP0_, DPP_CONTROL, DPPCLK_RATE_CONTROL, mask_sh), \
+ /* todo: get these from GVM instead of reading registers ourselves */\
+ HWS_SF(, VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, PAGE_DIRECTORY_ENTRY_HI32, mask_sh),\
+ HWS_SF(, VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, PAGE_DIRECTORY_ENTRY_LO32, mask_sh),\
+@@ -520,7 +513,6 @@ struct dce_hwseq_registers {
+ type HUBP_VTG_SEL; \
+ type HUBP_CLOCK_ENABLE; \
+ type DPP_CLOCK_ENABLE; \
+- type DPPCLK_RATE_CONTROL; \
+ type SDPIF_FB_TOP;\
+ type SDPIF_FB_BASE;\
+ type SDPIF_FB_OFFSET;\
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
+index f2a08b1..080c253 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
+@@ -424,6 +424,26 @@ void dpp1_set_cursor_position(
+
+ }
+
++void dpp1_dppclk_control(
++ struct dpp *dpp_base,
++ bool dppclk_div,
++ bool enable)
++{
++ struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
++
++ if (enable) {
++ if (dpp->tf_mask->DPPCLK_RATE_CONTROL) {
++ REG_UPDATE_2(DPP_CONTROL,
++ DPPCLK_RATE_CONTROL, dppclk_div,
++ DPP_CLOCK_ENABLE, 1);
++ } else {
++ ASSERT(dppclk_div == false);
++ REG_UPDATE(DPP_CONTROL, DPP_CLOCK_ENABLE, 1);
++ }
++ } else
++ REG_UPDATE(DPP_CONTROL, DPP_CLOCK_ENABLE, 0);
++}
++
+ static const struct dpp_funcs dcn10_dpp_funcs = {
+ .dpp_reset = dpp_reset,
+ .dpp_set_scaler = dpp1_dscl_set_scaler_manual_scale,
+@@ -445,6 +465,7 @@ static const struct dpp_funcs dcn10_dpp_funcs = {
+ .dpp_full_bypass = dpp1_full_bypass,
+ .set_cursor_attributes = dpp1_set_cursor_attributes,
+ .set_cursor_position = dpp1_set_cursor_position,
++ .dpp_dppclk_control = dpp1_dppclk_control,
+ };
+
+ static struct dpp_caps dcn10_dpp_cap = {
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
+index f56ee4d..ad6073a 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
+@@ -112,7 +112,8 @@
+ SRI(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id), \
+ SRI(CURSOR0_CONTROL, CNVC_CUR, id), \
+ SRI(CURSOR0_COLOR0, CNVC_CUR, id), \
+- SRI(CURSOR0_COLOR1, CNVC_CUR, id)
++ SRI(CURSOR0_COLOR1, CNVC_CUR, id), \
++ SRI(DPP_CONTROL, DPP_TOP, id)
+
+
+
+@@ -306,7 +307,8 @@
+ TF_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_EXPANSION_MODE, mask_sh), \
+ TF_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_ENABLE, mask_sh), \
+ TF_SF(CNVC_CUR0_CURSOR0_COLOR0, CUR0_COLOR0, mask_sh), \
+- TF_SF(CNVC_CUR0_CURSOR0_COLOR1, CUR0_COLOR1, mask_sh)
++ TF_SF(CNVC_CUR0_CURSOR0_COLOR1, CUR0_COLOR1, mask_sh), \
++ TF_SF(DPP_TOP0_DPP_CONTROL, DPP_CLOCK_ENABLE, mask_sh)
+
+ #define TF_REG_LIST_SH_MASK_DCN10(mask_sh)\
+ TF_REG_LIST_SH_MASK_DCN(mask_sh),\
+@@ -410,7 +412,8 @@
+ TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_MODE, mask_sh), \
+ TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_PITCH, mask_sh), \
+ TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_LINES_PER_CHUNK, mask_sh), \
+- TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_ENABLE, mask_sh)
++ TF_SF(CURSOR0_CURSOR_CONTROL, CURSOR_ENABLE, mask_sh), \
++ TF_SF(DPP_TOP0_DPP_CONTROL, DPPCLK_RATE_CONTROL, mask_sh)
+
+ #define TF_REG_FIELD_LIST(type) \
+ type EXT_OVERSCAN_LEFT; \
+@@ -1007,7 +1010,9 @@
+ type CM_BYPASS; \
+ type FORMAT_CONTROL__ALPHA_EN; \
+ type CUR0_COLOR0; \
+- type CUR0_COLOR1;
++ type CUR0_COLOR1; \
++ type DPPCLK_RATE_CONTROL; \
++ type DPP_CLOCK_ENABLE;
+
+ struct dcn_dpp_shift {
+ TF_REG_FIELD_LIST(uint8_t)
+@@ -1252,7 +1257,8 @@ struct dcn_dpp_mask {
+ uint32_t CURSOR_CONTROL; \
+ uint32_t CURSOR0_CONTROL; \
+ uint32_t CURSOR0_COLOR0; \
+- uint32_t CURSOR0_COLOR1;
++ uint32_t CURSOR0_COLOR1; \
++ uint32_t DPP_CONTROL;
+
+ struct dcn_dpp_registers {
+ DPP_COMMON_REG_VARIABLE_LIST
+@@ -1397,6 +1403,11 @@ void dpp1_cnv_setup (
+
+ void dpp1_full_bypass(struct dpp *dpp_base);
+
++void dpp1_dppclk_control(
++ struct dpp *dpp_base,
++ bool dppclk_div,
++ bool enable);
++
+ void dpp1_construct(struct dcn10_dpp *dpp1,
+ struct dc_context *ctx,
+ uint32_t inst,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index 4fedd7b..5431de7 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -193,26 +193,6 @@ void dcn10_log_hw_state(struct dc *dc)
+ DTN_INFO_END();
+ }
+
+-static void enable_dppclk(
+- struct dce_hwseq *hws,
+- uint8_t plane_id,
+- uint32_t requested_pix_clk,
+- bool dppclk_div)
+-{
+- dm_logger_write(hws->ctx->logger, LOG_SURFACE,
+- "dppclk_rate_control for pipe %d programed to %d\n",
+- plane_id,
+- dppclk_div);
+-
+- if (hws->shifts->DPPCLK_RATE_CONTROL)
+- REG_UPDATE_2(DPP_CONTROL[plane_id],
+- DPPCLK_RATE_CONTROL, dppclk_div,
+- DPP_CLOCK_ENABLE, 1);
+- else
+- REG_UPDATE(DPP_CONTROL[plane_id],
+- DPP_CLOCK_ENABLE, 1);
+-}
+-
+ static void enable_power_gating_plane(
+ struct dce_hwseq *hws,
+ bool enable)
+@@ -655,15 +635,14 @@ static void plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx)
+ {
+ struct dce_hwseq *hws = dc->hwseq;
+ struct hubp *hubp = pipe_ctx->plane_res.hubp;
++ struct dpp *dpp = pipe_ctx->plane_res.dpp;
+ int opp_id = hubp->opp_id;
+- int dpp_id = pipe_ctx->plane_res.dpp->inst;
+
+ dc->hwss.wait_for_mpcc_disconnect(dc, dc->res_pool, pipe_ctx);
+
+ hubp->funcs->hubp_clk_cntl(hubp, false);
+
+- REG_UPDATE(DPP_CONTROL[dpp_id],
+- DPP_CLOCK_ENABLE, 0);
++ dpp->funcs->dpp_dppclk_control(dpp, false, false);
+
+ if (opp_id != 0xf && pipe_ctx->stream_res.opp->mpc_tree_params.opp_list == NULL)
+ REG_UPDATE(OPP_PIPE_CONTROL[opp_id],
+@@ -1688,11 +1667,11 @@ static void update_dchubp_dpp(
+
+ /* depends on DML calculation, DPP clock value may change dynamically */
+ if (plane_state->update_flags.bits.full_update) {
+- enable_dppclk(
+- dc->hwseq,
+- pipe_ctx->plane_res.dpp->inst,
+- pipe_ctx->stream_res.pix_clk_params.requested_pix_clk,
+- context->bw.dcn.calc_clk.dppclk_div);
++ dpp->funcs->dpp_dppclk_control(
++ dpp,
++ context->bw.dcn.calc_clk.dppclk_div,
++ true);
++
+ dc->current_state->bw.dcn.cur_clk.dppclk_div =
+ context->bw.dcn.calc_clk.dppclk_div;
+ context->bw.dcn.cur_clk.dppclk_div = context->bw.dcn.calc_clk.dppclk_div;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h
+index d7b5bd2..819b749 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h
+@@ -33,7 +33,6 @@
+
+ #define IPP_REG_LIST_DCN(id) \
+ SRI(FORMAT_CONTROL, CNVC_CFG, id), \
+- SRI(DPP_CONTROL, DPP_TOP, id), \
+ SRI(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id), \
+ SRI(CURSOR0_CONTROL, CNVC_CUR, id), \
+ SRI(CURSOR0_COLOR0, CNVC_CUR, id), \
+@@ -130,7 +129,6 @@ struct dcn10_ipp_mask {
+ };
+
+ struct dcn10_ipp_registers {
+- uint32_t DPP_CONTROL;
+ uint32_t CURSOR_SETTINS;
+ uint32_t CURSOR_SETTINGS;
+ uint32_t CNVC_SURFACE_PIXEL_FORMAT;
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
+index 25edbde..78abc16 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
+@@ -131,6 +131,11 @@ struct dpp_funcs {
+ uint32_t width
+ );
+
++ void (*dpp_dppclk_control)(
++ struct dpp *dpp_base,
++ bool dppclk_div,
++ bool enable);
++
+ };
+
+
+--
+2.7.4
+