diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5364-drm-amd-display-Add-invariant-support-instrumentatio.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5364-drm-amd-display-Add-invariant-support-instrumentatio.patch | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5364-drm-amd-display-Add-invariant-support-instrumentatio.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5364-drm-amd-display-Add-invariant-support-instrumentatio.patch new file mode 100644 index 00000000..cebb8e88 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5364-drm-amd-display-Add-invariant-support-instrumentatio.patch @@ -0,0 +1,193 @@ +From 8fd2082307c2f032cfc88bc7d33ed9f90e9a5fd5 Mon Sep 17 00:00:00 2001 +From: Jun Lei <Jun.Lei@amd.com> +Date: Wed, 22 Aug 2018 17:00:34 -0400 +Subject: [PATCH 5364/5725] drm/amd/display: Add invariant support + instrumentation in driver +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Existing debug dump are all invariant, new “low 32-bit of address” +dump is not invariant + +Change-Id: I59a1cba0d253ae266ed94698c3cc790cad20f083 +Signed-off-by: Jun Lei <Jun.Lei@amd.com> +Reviewed-by: Eric Yang <eric.yang2@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +--- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c | 3 + + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h | 1 + + .../display/dc/dcn10/dcn10_hw_sequencer_debug.c | 84 +++++++++++++++------- + 3 files changed, 61 insertions(+), 27 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c +index 8da2b8a..74132a1 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c +@@ -974,6 +974,9 @@ void hubp1_read_state(struct hubp *hubp) + REG_GET(DCSURF_SURFACE_EARLIEST_INUSE_HIGH, + SURFACE_EARLIEST_INUSE_ADDRESS_HIGH, &s->inuse_addr_hi); + ++ REG_GET(DCSURF_SURFACE_EARLIEST_INUSE, ++ SURFACE_EARLIEST_INUSE_ADDRESS, &s->inuse_addr_lo); ++ + REG_GET_2(DCSURF_PRI_VIEWPORT_DIMENSION, + PRI_VIEWPORT_WIDTH, &s->viewport_width, + PRI_VIEWPORT_HEIGHT, &s->viewport_height); +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h +index 7605af9..4890273 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h +@@ -639,6 +639,7 @@ struct dcn_hubp_state { + struct _vcs_dpi_display_rq_regs_st rq_regs; + uint32_t pixel_format; + uint32_t inuse_addr_hi; ++ uint32_t inuse_addr_lo; + uint32_t viewport_width; + uint32_t viewport_height; + uint32_t rotation_angle; +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c +index 9c21825..6415890 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c +@@ -105,7 +105,7 @@ static unsigned int dcn10_get_hubbub_state(struct dc *dc, char *pBuf, unsigned i + return bufSize - remaining_buffer; + } + +-static unsigned int dcn10_get_hubp_states(struct dc *dc, char *pBuf, unsigned int bufSize) ++static unsigned int dcn10_get_hubp_states(struct dc *dc, char *pBuf, unsigned int bufSize, bool invarOnly) + { + struct dc_context *dc_ctx = dc->ctx; + struct resource_pool *pool = dc->res_pool; +@@ -117,9 +117,15 @@ static unsigned int dcn10_get_hubp_states(struct dc *dc, char *pBuf, unsigned in + const uint32_t ref_clk_mhz = dc_ctx->dc->res_pool->ref_clock_inKhz / 1000; + static const unsigned int frac = 1000; + +- chars_printed = snprintf_count(pBuf, remaining_buffer, "instance,format,addr_hi,width,height,rotation,mirror,sw_mode,dcc_en,blank_en,ttu_dis,underflow," +- "min_ttu_vblank,qos_low_wm,qos_high_wm" +- "\n"); ++ if (invarOnly) ++ chars_printed = snprintf_count(pBuf, remaining_buffer, "instance,format,addr_hi,width,height,rotation,mirror,sw_mode,dcc_en,blank_en,ttu_dis,underflow," ++ "min_ttu_vblank,qos_low_wm,qos_high_wm" ++ "\n"); ++ else ++ chars_printed = snprintf_count(pBuf, remaining_buffer, "instance,format,addr_hi,addr_lo,width,height,rotation,mirror,sw_mode,dcc_en,blank_en,ttu_dis,underflow," ++ "min_ttu_vblank,qos_low_wm,qos_high_wm" ++ "\n"); ++ + remaining_buffer -= chars_printed; + pBuf += chars_printed; + +@@ -130,24 +136,45 @@ static unsigned int dcn10_get_hubp_states(struct dc *dc, char *pBuf, unsigned in + hubp->funcs->hubp_read_state(hubp); + + if (!s->blank_en) { +- chars_printed = snprintf_count(pBuf, remaining_buffer, "%x,%x,%x,%d,%d,%x,%x,%x,%x,%x,%x,%x," +- "%d.%03d,%d.%03d,%d.%03d" +- "\n", +- hubp->inst, +- s->pixel_format, +- s->inuse_addr_hi, +- s->viewport_width, +- s->viewport_height, +- s->rotation_angle, +- s->h_mirror_en, +- s->sw_mode, +- s->dcc_en, +- s->blank_en, +- s->ttu_disable, +- s->underflow_status, +- (s->min_ttu_vblank * frac) / ref_clk_mhz / frac, (s->min_ttu_vblank * frac) / ref_clk_mhz % frac, +- (s->qos_level_low_wm * frac) / ref_clk_mhz / frac, (s->qos_level_low_wm * frac) / ref_clk_mhz % frac, +- (s->qos_level_high_wm * frac) / ref_clk_mhz / frac, (s->qos_level_high_wm * frac) / ref_clk_mhz % frac); ++ if (invarOnly) ++ chars_printed = snprintf_count(pBuf, remaining_buffer, "%x,%x,%x,%d,%d,%x,%x,%x,%x,%x,%x,%x," ++ "%d.%03d,%d.%03d,%d.%03d" ++ "\n", ++ hubp->inst, ++ s->pixel_format, ++ s->inuse_addr_hi, ++ s->viewport_width, ++ s->viewport_height, ++ s->rotation_angle, ++ s->h_mirror_en, ++ s->sw_mode, ++ s->dcc_en, ++ s->blank_en, ++ s->ttu_disable, ++ s->underflow_status, ++ (s->min_ttu_vblank * frac) / ref_clk_mhz / frac, (s->min_ttu_vblank * frac) / ref_clk_mhz % frac, ++ (s->qos_level_low_wm * frac) / ref_clk_mhz / frac, (s->qos_level_low_wm * frac) / ref_clk_mhz % frac, ++ (s->qos_level_high_wm * frac) / ref_clk_mhz / frac, (s->qos_level_high_wm * frac) / ref_clk_mhz % frac); ++ else ++ chars_printed = snprintf_count(pBuf, remaining_buffer, "%x,%x,%x,%x,%d,%d,%x,%x,%x,%x,%x,%x,%x," ++ "%d.%03d,%d.%03d,%d.%03d" ++ "\n", ++ hubp->inst, ++ s->pixel_format, ++ s->inuse_addr_hi, ++ s->inuse_addr_lo, ++ s->viewport_width, ++ s->viewport_height, ++ s->rotation_angle, ++ s->h_mirror_en, ++ s->sw_mode, ++ s->dcc_en, ++ s->blank_en, ++ s->ttu_disable, ++ s->underflow_status, ++ (s->min_ttu_vblank * frac) / ref_clk_mhz / frac, (s->min_ttu_vblank * frac) / ref_clk_mhz % frac, ++ (s->qos_level_low_wm * frac) / ref_clk_mhz / frac, (s->qos_level_low_wm * frac) / ref_clk_mhz % frac, ++ (s->qos_level_high_wm * frac) / ref_clk_mhz / frac, (s->qos_level_high_wm * frac) / ref_clk_mhz % frac); + + remaining_buffer -= chars_printed; + pBuf += chars_printed; +@@ -314,9 +341,6 @@ static unsigned int dcn10_get_cm_states(struct dc *dc, char *pBuf, unsigned int + struct dpp *dpp = pool->dpps[i]; + struct dcn_dpp_state s = {0}; + +- +- +- + dpp->funcs->dpp_read_state(dpp, &s); + + if (s.is_enabled) { +@@ -462,6 +486,11 @@ static unsigned int dcn10_get_clock_states(struct dc *dc, char *pBuf, unsigned i + + void dcn10_get_hw_state(struct dc *dc, char *pBuf, unsigned int bufSize, unsigned int mask) + { ++ /* ++ * Mask Format ++ * Bit 0 - 15: Hardware block mask ++ * Bit 15: 1 = Invariant Only, 0 = All ++ */ + const unsigned int DC_HW_STATE_MASK_HUBBUB = 0x1; + const unsigned int DC_HW_STATE_MASK_HUBP = 0x2; + const unsigned int DC_HW_STATE_MASK_RQ = 0x4; +@@ -471,12 +500,13 @@ void dcn10_get_hw_state(struct dc *dc, char *pBuf, unsigned int bufSize, unsigne + const unsigned int DC_HW_STATE_MASK_MPCC = 0x40; + const unsigned int DC_HW_STATE_MASK_OTG = 0x80; + const unsigned int DC_HW_STATE_MASK_CLOCKS = 0x100; ++ const unsigned int DC_HW_STATE_INVAR_ONLY = 0x8000; + + unsigned int chars_printed = 0; + unsigned int remaining_buf_size = bufSize; + + if (mask == 0x0) +- mask = 0xFFFF; ++ mask = 0xFFFF; // Default, capture all, invariant only + + if ((mask & DC_HW_STATE_MASK_HUBBUB) && remaining_buf_size > 0) { + chars_printed = dcn10_get_hubbub_state(dc, pBuf, remaining_buf_size); +@@ -485,7 +515,7 @@ void dcn10_get_hw_state(struct dc *dc, char *pBuf, unsigned int bufSize, unsigne + } + + if ((mask & DC_HW_STATE_MASK_HUBP) && remaining_buf_size > 0) { +- chars_printed = dcn10_get_hubp_states(dc, pBuf, remaining_buf_size); ++ chars_printed = dcn10_get_hubp_states(dc, pBuf, remaining_buf_size, mask & DC_HW_STATE_INVAR_ONLY); + pBuf += chars_printed; + remaining_buf_size -= chars_printed; + } +-- +2.7.4 + |