pg_cntl
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (pg_cntl != NULL)
pg_cntl->funcs->dsc_pg_control(pg_cntl, dsc->inst, false);
if (dc->debug.enable_pg_cntl_debug_logs && dc->res_pool->pg_cntl) {
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (!pg_cntl)
if (dc->res_pool->pg_cntl->funcs->print_pg_status)
if (pg_cntl->funcs->hpo_pg_control)
pg_cntl->funcs->hpo_pg_control(pg_cntl, false);
dc->res_pool->pg_cntl->funcs->print_pg_status(dc->res_pool->pg_cntl, debug_func, debug_log);
if (pg_cntl->funcs->hubp_dpp_pg_control)
pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, false);
if (pg_cntl->funcs->dsc_pg_control)
pg_cntl->funcs->dsc_pg_control(pg_cntl, i, false);
if (pg_cntl->funcs->dsc_pg_control)
pg_cntl->funcs->dsc_pg_control(pg_cntl, i, false);
if (pg_cntl->funcs->hubp_dpp_pg_control)
pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, false);
if (pg_cntl->funcs->plane_otg_pg_control)
pg_cntl->funcs->plane_otg_pg_control(pg_cntl, false);
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (!pg_cntl)
if (pg_cntl->funcs->plane_otg_pg_control)
pg_cntl->funcs->plane_otg_pg_control(pg_cntl, true);
if (pg_cntl->funcs->dsc_pg_control)
pg_cntl->funcs->dsc_pg_control(pg_cntl, i, true);
if (pg_cntl->funcs->hubp_dpp_pg_control)
pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, true);
if (pg_cntl->funcs->dsc_pg_control)
pg_cntl->funcs->dsc_pg_control(pg_cntl, i, true);
if (pg_cntl->funcs->hpo_pg_control)
pg_cntl->funcs->hpo_pg_control(pg_cntl, true);
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (!pg_cntl)
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);
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (pg_cntl != NULL) {
if (pg_cntl->funcs->dsc_pg_control != NULL) {
pg_cntl->funcs->dsc_pg_control(pg_cntl, dc->res_pool->dscs[i]->inst, false);
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (!pg_cntl || dc->debug.ignore_pg)
if (pg_cntl->funcs->dsc_pg_control)
pg_cntl->funcs->dsc_pg_control(pg_cntl, i, false);
if (pg_cntl->funcs->hubp_dpp_pg_control)
pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, false);
if (pg_cntl->funcs->plane_otg_pg_control)
pg_cntl->funcs->plane_otg_pg_control(pg_cntl, false);
struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
if (!pg_cntl || dc->debug.ignore_pg)
if (pg_cntl->funcs->plane_otg_pg_control)
pg_cntl->funcs->plane_otg_pg_control(pg_cntl, true);
if (pg_cntl->funcs->hubp_dpp_pg_control)
pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, true);
if (pg_cntl->funcs->dsc_pg_control)
pg_cntl->funcs->dsc_pg_control(pg_cntl, i, true);
struct pg_cntl *pg_cntl;
void (*dsc_pg_control)(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on);
void (*hubp_dpp_pg_control)(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst, bool power_on);
void (*hpo_pg_control)(struct pg_cntl *pg_cntl, bool power_on);
void (*io_clk_pg_control)(struct pg_cntl *pg_cntl, bool power_on);
void (*plane_otg_pg_control)(struct pg_cntl *pg_cntl, bool power_on);
void (*mpcc_pg_control)(struct pg_cntl *pg_cntl, unsigned int mpcc_inst, bool power_on);
void (*opp_pg_control)(struct pg_cntl *pg_cntl, unsigned int opp_inst, bool power_on);
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 (*mem_pg_control)(struct pg_cntl *pg_cntl, bool power_on);
void (*dio_pg_control)(struct pg_cntl *pg_cntl, bool power_on);
void (*init_pg_status)(struct pg_cntl *pg_cntl);
void (*print_pg_status)(struct pg_cntl *pg_cntl, const char *debug_func, const char *debug_log);
pg_cntl->pg_pipe_res_enable[PG_DSC][dsc_inst] = power_on;
static bool pg_cntl35_hubp_dpp_pg_status(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst, bool power_on)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
bool skip_pg = pg_cntl->ctx->dc->debug.ignore_pg ||
pg_cntl->ctx->dc->debug.disable_hubp_power_gate ||
pg_cntl->ctx->dc->debug.disable_dpp_power_gate ||
pg_cntl->ctx->dc->idle_optimizations_allowed;
block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, hubp_dpp_inst);
pg_cntl->pg_pipe_res_enable[PG_HUBP][hubp_dpp_inst] = power_on;
pg_cntl->pg_pipe_res_enable[PG_DPP][hubp_dpp_inst] = power_on;
static bool pg_cntl35_hpo_pg_status(struct pg_cntl *pg_cntl)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
if (pg_cntl->ctx->dc->debug.ignore_pg ||
pg_cntl->ctx->dc->debug.disable_hpo_power_gate ||
pg_cntl->ctx->dc->idle_optimizations_allowed)
block_enabled = pg_cntl35_hpo_pg_status(pg_cntl);
pg_cntl->pg_res_enable[PG_HPO] = power_on;
static bool pg_cntl35_io_clk_status(struct pg_cntl *pg_cntl)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
if (pg_cntl->ctx->dc->debug.ignore_pg ||
pg_cntl->ctx->dc->idle_optimizations_allowed)
block_enabled = pg_cntl35_io_clk_status(pg_cntl);
#define TO_DCN_PG_CNTL(pg_cntl)\
container_of(pg_cntl, struct dcn_pg_cntl, base)
pg_cntl->pg_res_enable[PG_DCCG] = power_on;
pg_cntl->pg_res_enable[PG_DIO] = power_on;
pg_cntl->pg_res_enable[PG_DCIO] = power_on;
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);
void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
if (pg_cntl->ctx->dc->idle_optimizations_allowed)
pg_cntl->pg_pipe_res_enable[PG_MPCC][mpcc_inst] = power_on;
void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
if (pg_cntl->ctx->dc->idle_optimizations_allowed)
pg_cntl->pg_pipe_res_enable[PG_OPP][opp_inst] = power_on;
void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
if (pg_cntl->ctx->dc->idle_optimizations_allowed)
pg_cntl->pg_pipe_res_enable[PG_OPTC][optc_inst] = power_on;
void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
if (pg_cntl->ctx->dc->debug.ignore_pg ||
pg_cntl->ctx->dc->debug.disable_optc_power_gate ||
pg_cntl->ctx->dc->idle_optimizations_allowed)
block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
struct pipe_ctx *pipe_ctx = &pg_cntl->ctx->dc->current_state->res_ctx.pipe_ctx[i];
if (pg_cntl->pg_pipe_res_enable[PG_MPCC][i])
if (pg_cntl->pg_pipe_res_enable[PG_OPP][i])
if (pg_cntl->pg_pipe_res_enable[PG_OPTC][i])
|| !all_stream_disabled || pg_cntl->pg_res_enable[PG_DWB])
for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
pg_cntl->pg_pipe_res_enable[PG_MPCC][i] = power_on;
pg_cntl->pg_pipe_res_enable[PG_OPP][i] = power_on;
pg_cntl->pg_pipe_res_enable[PG_OPTC][i] = power_on;
pg_cntl->pg_res_enable[PG_DWB] = power_on;
void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on)
if (pg_cntl->ctx->dc->idle_optimizations_allowed)
pg_cntl->pg_res_enable[PG_DWB] = power_on;
pg_cntl->ctx->logger
static bool pg_cntl35_mem_status(struct pg_cntl *pg_cntl)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl)
pg_cntl->pg_res_enable[PG_HPO] = pg_cntl35_hpo_pg_status(pg_cntl);
block_enabled = pg_cntl35_io_clk_status(pg_cntl);
pg_cntl->pg_res_enable[PG_DCCG] = block_enabled;
static bool pg_cntl35_dsc_pg_status(struct pg_cntl *pg_cntl, unsigned int dsc_inst)
pg_cntl->pg_res_enable[PG_DIO] = block_enabled;
pg_cntl->pg_res_enable[PG_DCIO] = block_enabled;
block_enabled = pg_cntl35_mem_status(pg_cntl);
pg_cntl->pg_res_enable[PG_DCHUBBUB] = block_enabled;
pg_cntl->pg_res_enable[PG_DCHVM] = block_enabled;
for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, i);
pg_cntl->pg_pipe_res_enable[PG_HUBP][i] = block_enabled;
pg_cntl->pg_pipe_res_enable[PG_DPP][i] = block_enabled;
block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, i);
pg_cntl->pg_pipe_res_enable[PG_DSC][i] = block_enabled;
block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
pg_cntl->pg_pipe_res_enable[PG_MPCC][i] = block_enabled;
pg_cntl->pg_pipe_res_enable[PG_OPP][i] = block_enabled;
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
pg_cntl->pg_pipe_res_enable[PG_OPTC][i] = block_enabled;
pg_cntl->pg_res_enable[PG_DWB] = block_enabled;
static void pg_cntl35_print_pg_status(struct pg_cntl *pg_cntl, const char *debug_func, const char *debug_log)
block_enabled = pg_cntl35_io_clk_status(pg_cntl);
block_enabled = pg_cntl35_mem_status(pg_cntl);
block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
block_enabled = pg_cntl35_hpo_pg_status(pg_cntl);
for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, i);
if (pg_cntl->ctx->dc->debug.ignore_pg)
block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, i);
struct pg_cntl *pg_cntl35_create(
struct pg_cntl *base;
void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(*pg_cntl);
*pg_cntl = NULL;
void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on)
struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
bool skip_pg = pg_cntl->ctx->dc->debug.ignore_pg ||
pg_cntl->ctx->dc->debug.disable_dsc_power_gate ||
pg_cntl->ctx->dc->idle_optimizations_allowed;
block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, dsc_inst);
struct pg_cntl base;
void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on);
void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl,
void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on);
void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on);
void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on);
void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
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);
struct pg_cntl *pg_cntl35_create(
void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl);
if (pool->base.pg_cntl != NULL)
dcn_pg_cntl_destroy(&pool->base.pg_cntl);
pool->base.pg_cntl = pg_cntl35_create(ctx, &pg_cntl_regs, &pg_cntl_shift, &pg_cntl_mask);
if (pool->base.pg_cntl == NULL) {
if (pool->base.pg_cntl != NULL)
dcn_pg_cntl_destroy(&pool->base.pg_cntl);
pool->base.pg_cntl = pg_cntl35_create(ctx, &pg_cntl_regs, &pg_cntl_shift, &pg_cntl_mask);
if (pool->base.pg_cntl == NULL) {
if (pool->base.pg_cntl != NULL)
dcn_pg_cntl_destroy(&pool->base.pg_cntl);
pool->base.pg_cntl = pg_cntl35_create(ctx, &pg_cntl_regs, &pg_cntl_shift, &pg_cntl_mask);
if (pool->base.pg_cntl == NULL) {