mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 11:40:19 -04:00
drm/amd/display: Enable DCN clock gating for DCN35
[WHY & HOW] Enable DCN clock gating for DCN35. Disable DTBCLK gate before link training and re-enable afterwards Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Acked-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Daniel Miess <daniel.miess@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
673d6d73eb
commit
5f70d4ff80
@@ -291,7 +291,11 @@
|
||||
type SYMCLKB_FE_SRC_SEL;\
|
||||
type SYMCLKC_FE_SRC_SEL;\
|
||||
type SYMCLKD_FE_SRC_SEL;\
|
||||
type SYMCLKE_FE_SRC_SEL;
|
||||
type SYMCLKE_FE_SRC_SEL;\
|
||||
type DTBCLK_P0_GATE_DISABLE;\
|
||||
type DTBCLK_P1_GATE_DISABLE;\
|
||||
type DTBCLK_P2_GATE_DISABLE;\
|
||||
type DTBCLK_P3_GATE_DISABLE;\
|
||||
|
||||
struct dccg_shift {
|
||||
DCCG_REG_FIELD_LIST(uint8_t)
|
||||
|
||||
@@ -256,6 +256,21 @@ static void dccg35_set_dtbclk_dto(
|
||||
if (params->ref_dtbclk_khz && req_dtbclk_khz) {
|
||||
uint32_t modulo, phase;
|
||||
|
||||
switch (params->otg_inst) {
|
||||
case 0:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P0_GATE_DISABLE, 1);
|
||||
break;
|
||||
case 1:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P1_GATE_DISABLE, 1);
|
||||
break;
|
||||
case 2:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P2_GATE_DISABLE, 1);
|
||||
break;
|
||||
case 3:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P3_GATE_DISABLE, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
// phase / modulo = dtbclk / dtbclk ref
|
||||
modulo = params->ref_dtbclk_khz * 1000;
|
||||
phase = req_dtbclk_khz * 1000;
|
||||
@@ -280,6 +295,21 @@ static void dccg35_set_dtbclk_dto(
|
||||
REG_UPDATE(OTG_PIXEL_RATE_CNTL[params->otg_inst],
|
||||
PIPE_DTO_SRC_SEL[params->otg_inst], 2);
|
||||
} else {
|
||||
switch (params->otg_inst) {
|
||||
case 0:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P0_GATE_DISABLE, 0);
|
||||
break;
|
||||
case 1:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P1_GATE_DISABLE, 0);
|
||||
break;
|
||||
case 2:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P2_GATE_DISABLE, 0);
|
||||
break;
|
||||
case 3:
|
||||
REG_UPDATE(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P3_GATE_DISABLE, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
REG_UPDATE_2(OTG_PIXEL_RATE_CNTL[params->otg_inst],
|
||||
DTBCLK_DTO_ENABLE[params->otg_inst], 0,
|
||||
PIPE_DTO_SRC_SEL[params->otg_inst], params->is_hdmi ? 0 : 1);
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#define DCCG_REG_LIST_DCN35() \
|
||||
DCCG_REG_LIST_DCN314(),\
|
||||
SR(DPPCLK_CTRL),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL5),\
|
||||
SR(DCCG_GATE_DISABLE_CNTL6),\
|
||||
SR(DCCG_GLOBAL_FGCG_REP_CNTL),\
|
||||
SR(SYMCLKA_CLOCK_ENABLE),\
|
||||
@@ -174,7 +175,11 @@
|
||||
DCCG_SF(SYMCLKB_CLOCK_ENABLE, SYMCLKB_FE_SRC_SEL, mask_sh),\
|
||||
DCCG_SF(SYMCLKC_CLOCK_ENABLE, SYMCLKC_FE_SRC_SEL, mask_sh),\
|
||||
DCCG_SF(SYMCLKD_CLOCK_ENABLE, SYMCLKD_FE_SRC_SEL, mask_sh),\
|
||||
DCCG_SF(SYMCLKE_CLOCK_ENABLE, SYMCLKE_FE_SRC_SEL, mask_sh)
|
||||
DCCG_SF(SYMCLKE_CLOCK_ENABLE, SYMCLKE_FE_SRC_SEL, mask_sh),\
|
||||
DCCG_SF(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P0_GATE_DISABLE, mask_sh),\
|
||||
DCCG_SF(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P1_GATE_DISABLE, mask_sh),\
|
||||
DCCG_SF(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P2_GATE_DISABLE, mask_sh),\
|
||||
DCCG_SF(DCCG_GATE_DISABLE_CNTL5, DTBCLK_P3_GATE_DISABLE, mask_sh),\
|
||||
|
||||
struct dccg *dccg35_create(
|
||||
struct dc_context *ctx,
|
||||
|
||||
@@ -332,13 +332,6 @@ void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on)
|
||||
pg_cntl->pg_res_enable[PG_DCIO] = power_on;
|
||||
}
|
||||
|
||||
void pg_cntl35_set_force_poweron_domain22(struct pg_cntl *pg_cntl, bool power_on)
|
||||
{
|
||||
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
|
||||
|
||||
REG_UPDATE(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, power_on ? 1 : 0);
|
||||
}
|
||||
|
||||
static bool pg_cntl35_plane_otg_status(struct pg_cntl *pg_cntl)
|
||||
{
|
||||
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
|
||||
@@ -508,8 +501,7 @@ static const struct pg_cntl_funcs pg_cntl35_funcs = {
|
||||
.mpcc_pg_control = pg_cntl35_mpcc_pg_control,
|
||||
.opp_pg_control = pg_cntl35_opp_pg_control,
|
||||
.optc_pg_control = pg_cntl35_optc_pg_control,
|
||||
.dwb_pg_control = pg_cntl35_dwb_pg_control,
|
||||
.set_force_poweron_domain22 = pg_cntl35_set_force_poweron_domain22
|
||||
.dwb_pg_control = pg_cntl35_dwb_pg_control
|
||||
};
|
||||
|
||||
struct pg_cntl *pg_cntl35_create(
|
||||
|
||||
@@ -183,7 +183,6 @@ void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
|
||||
unsigned int optc_inst, bool power_on);
|
||||
void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on);
|
||||
void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl);
|
||||
void pg_cntl35_set_force_poweron_domain22(struct pg_cntl *pg_cntl, bool power_on);
|
||||
|
||||
struct pg_cntl *pg_cntl35_create(
|
||||
struct dc_context *ctx,
|
||||
|
||||
@@ -682,6 +682,7 @@ struct dce_hwseq_registers {
|
||||
uint32_t DCHUBBUB_ARB_HOSTVM_CNTL;
|
||||
uint32_t HPO_TOP_HW_CONTROL;
|
||||
uint32_t DMU_CLK_CNTL;
|
||||
uint32_t DCCG_GATE_DISABLE_CNTL4;
|
||||
uint32_t DCCG_GATE_DISABLE_CNTL5;
|
||||
};
|
||||
/* set field name */
|
||||
@@ -1199,7 +1200,19 @@ struct dce_hwseq_registers {
|
||||
type PHYBSYMCLK_ROOT_GATE_DISABLE;\
|
||||
type PHYCSYMCLK_ROOT_GATE_DISABLE;\
|
||||
type PHYDSYMCLK_ROOT_GATE_DISABLE;\
|
||||
type PHYESYMCLK_ROOT_GATE_DISABLE;
|
||||
type PHYESYMCLK_ROOT_GATE_DISABLE;\
|
||||
type DTBCLK_P0_GATE_DISABLE;\
|
||||
type DTBCLK_P1_GATE_DISABLE;\
|
||||
type DTBCLK_P2_GATE_DISABLE;\
|
||||
type DTBCLK_P3_GATE_DISABLE;\
|
||||
type DPSTREAMCLK0_GATE_DISABLE;\
|
||||
type DPSTREAMCLK1_GATE_DISABLE;\
|
||||
type DPSTREAMCLK2_GATE_DISABLE;\
|
||||
type DPSTREAMCLK3_GATE_DISABLE;\
|
||||
type DPIASYMCLK0_GATE_DISABLE;\
|
||||
type DPIASYMCLK1_GATE_DISABLE;\
|
||||
type DPIASYMCLK2_GATE_DISABLE;\
|
||||
type DPIASYMCLK3_GATE_DISABLE;
|
||||
|
||||
struct dce_hwseq_shift {
|
||||
HWSEQ_REG_FIELD_LIST(uint8_t)
|
||||
|
||||
@@ -145,17 +145,36 @@ void dcn35_init_hw(struct dc *dc)
|
||||
hws->funcs.bios_golden_init(dc);
|
||||
}
|
||||
|
||||
REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
|
||||
REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
|
||||
if (!dc->debug.disable_clock_gate) {
|
||||
REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
|
||||
REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
|
||||
|
||||
/* Disable gating for PHYASYMCLK. This will be enabled in dccg if needed */
|
||||
REG_UPDATE_5(DCCG_GATE_DISABLE_CNTL2, PHYASYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYBSYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYCSYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYDSYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYESYMCLK_ROOT_GATE_DISABLE, 1);
|
||||
/* Disable gating for PHYASYMCLK. This will be enabled in dccg if needed */
|
||||
REG_UPDATE_5(DCCG_GATE_DISABLE_CNTL2, PHYASYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYBSYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYCSYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYDSYMCLK_ROOT_GATE_DISABLE, 1,
|
||||
PHYESYMCLK_ROOT_GATE_DISABLE, 1);
|
||||
|
||||
REG_WRITE(DCCG_GATE_DISABLE_CNTL5, 0x1f7c3fcf);
|
||||
REG_UPDATE_4(DCCG_GATE_DISABLE_CNTL4,
|
||||
DPIASYMCLK0_GATE_DISABLE, 0,
|
||||
DPIASYMCLK1_GATE_DISABLE, 0,
|
||||
DPIASYMCLK2_GATE_DISABLE, 0,
|
||||
DPIASYMCLK3_GATE_DISABLE, 0);
|
||||
|
||||
REG_WRITE(DCCG_GATE_DISABLE_CNTL5, 0xFFFFFFFF);
|
||||
REG_UPDATE_4(DCCG_GATE_DISABLE_CNTL5,
|
||||
DTBCLK_P0_GATE_DISABLE, 0,
|
||||
DTBCLK_P1_GATE_DISABLE, 0,
|
||||
DTBCLK_P2_GATE_DISABLE, 0,
|
||||
DTBCLK_P3_GATE_DISABLE, 0);
|
||||
REG_UPDATE_4(DCCG_GATE_DISABLE_CNTL5,
|
||||
DPSTREAMCLK0_GATE_DISABLE, 0,
|
||||
DPSTREAMCLK1_GATE_DISABLE, 0,
|
||||
DPSTREAMCLK2_GATE_DISABLE, 0,
|
||||
DPSTREAMCLK3_GATE_DISABLE, 0);
|
||||
|
||||
}
|
||||
|
||||
// Initialize the dccg
|
||||
if (res_pool->dccg->funcs->dccg_init)
|
||||
@@ -332,9 +351,6 @@ void dcn35_init_hw(struct dc *dc)
|
||||
if (dc->res_pool->pg_cntl) {
|
||||
if (dc->res_pool->pg_cntl->funcs->init_pg_status)
|
||||
dc->res_pool->pg_cntl->funcs->init_pg_status(dc->res_pool->pg_cntl);
|
||||
|
||||
if (dc->res_pool->pg_cntl->funcs->set_force_poweron_domain22)
|
||||
dc->res_pool->pg_cntl->funcs->set_force_poweron_domain22(dc->res_pool->pg_cntl, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,8 +47,6 @@ struct pg_cntl_funcs {
|
||||
void (*optc_pg_control)(struct pg_cntl *pg_cntl, unsigned int optc_inst, bool power_on);
|
||||
void (*dwb_pg_control)(struct pg_cntl *pg_cntl, bool power_on);
|
||||
void (*init_pg_status)(struct pg_cntl *pg_cntl);
|
||||
|
||||
void (*set_force_poweron_domain22)(struct pg_cntl *pg_cntl, bool power_on);
|
||||
};
|
||||
|
||||
#endif //__DC_PG_CNTL_H__
|
||||
|
||||
@@ -626,7 +626,19 @@ static struct dce_hwseq_registers hwseq_reg;
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYBSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYCSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYDSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYESYMCLK_ROOT_GATE_DISABLE, mask_sh)
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYESYMCLK_ROOT_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DTBCLK_P0_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DTBCLK_P1_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DTBCLK_P2_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DTBCLK_P3_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DPSTREAMCLK0_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DPSTREAMCLK1_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DPSTREAMCLK2_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL5, DPSTREAMCLK3_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL4, DPIASYMCLK0_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL4, DPIASYMCLK1_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL4, DPIASYMCLK2_GATE_DISABLE, mask_sh),\
|
||||
HWS_SF(, DCCG_GATE_DISABLE_CNTL4, DPIASYMCLK3_GATE_DISABLE, mask_sh)
|
||||
|
||||
static const struct dce_hwseq_shift hwseq_shift = {
|
||||
HWSEQ_DCN35_MASK_SH_LIST(__SHIFT)
|
||||
@@ -705,7 +717,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
||||
.disable_dcc = DCC_ENABLE,
|
||||
.disable_dpp_power_gate = true,
|
||||
.disable_hubp_power_gate = true,
|
||||
.disable_clock_gate = true,
|
||||
.disable_clock_gate = false,
|
||||
.disable_dsc_power_gate = true,
|
||||
.vsr_support = true,
|
||||
.performance_trace = false,
|
||||
|
||||
@@ -166,6 +166,7 @@ struct resource_pool *dcn35_create_resource_pool(
|
||||
SR(MMHUBBUB_MEM_PWR_CNTL), \
|
||||
SR(DCCG_GATE_DISABLE_CNTL), \
|
||||
SR(DCCG_GATE_DISABLE_CNTL2), \
|
||||
SR(DCCG_GATE_DISABLE_CNTL4), \
|
||||
SR(DCCG_GATE_DISABLE_CNTL5), \
|
||||
SR(DCFCLK_CNTL),\
|
||||
SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
|
||||
|
||||
@@ -6220,12 +6220,20 @@
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYD_REFCLK_ROOT_GATE_DISABLE__SHIFT 0x3
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYE_REFCLK_ROOT_GATE_DISABLE__SHIFT 0x4
|
||||
#define DCCG_GATE_DISABLE_CNTL4__HDMICHARCLK0_ROOT_GATE_DISABLE__SHIFT 0x11
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK0_GATE_DISABLE__SHIFT 0x17
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK1_GATE_DISABLE__SHIFT 0x18
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK2_GATE_DISABLE__SHIFT 0x19
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK3_GATE_DISABLE__SHIFT 0x1a
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYA_REFCLK_ROOT_GATE_DISABLE_MASK 0x00000001L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYB_REFCLK_ROOT_GATE_DISABLE_MASK 0x00000002L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYC_REFCLK_ROOT_GATE_DISABLE_MASK 0x00000004L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYD_REFCLK_ROOT_GATE_DISABLE_MASK 0x00000008L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__PHYE_REFCLK_ROOT_GATE_DISABLE_MASK 0x00000010L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__HDMICHARCLK0_ROOT_GATE_DISABLE_MASK 0x00020000L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK0_GATE_DISABLE_MASK 0x00800000L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK1_GATE_DISABLE_MASK 0x01000000L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK2_GATE_DISABLE_MASK 0x02000000L
|
||||
#define DCCG_GATE_DISABLE_CNTL4__DPIASYMCLK3_GATE_DISABLE_MASK 0x04000000L
|
||||
#define DPSTREAMCLK_CNTL__DPSTREAMCLK0_SRC_SEL__SHIFT 0x0
|
||||
#define DPSTREAMCLK_CNTL__DPSTREAMCLK0_EN__SHIFT 0x3
|
||||
#define DPSTREAMCLK_CNTL__DPSTREAMCLK1_SRC_SEL__SHIFT 0x4
|
||||
|
||||
Reference in New Issue
Block a user