pp_smu
static void pp_rv_set_wm_ranges(struct pp_smu *pp,
static void pp_rv_set_pme_wa_enable(struct pp_smu *pp)
static void pp_rv_set_active_display_count(struct pp_smu *pp, int count)
static void pp_rv_set_min_deep_sleep_dcfclk(struct pp_smu *pp, int clock)
static void pp_rv_set_hard_min_dcefclk_by_freq(struct pp_smu *pp, int clock)
static void pp_rv_set_hard_min_fclk_by_freq(struct pp_smu *pp, int mhz)
static enum pp_smu_status pp_nv_set_wm_ranges(struct pp_smu *pp,
static enum pp_smu_status pp_nv_set_display_count(struct pp_smu *pp, int count)
pp_nv_set_min_deep_sleep_dcfclk(struct pp_smu *pp, int mhz)
struct pp_smu *pp, int mhz)
pp_nv_set_hard_min_uclk_by_freq(struct pp_smu *pp, int mhz)
struct pp_smu *pp, bool pstate_handshake_supported)
static enum pp_smu_status pp_nv_set_voltage_by_freq(struct pp_smu *pp,
struct pp_smu *pp, struct pp_smu_nv_clock_table *max_clocks)
static enum pp_smu_status pp_nv_get_uclk_dpm_states(struct pp_smu *pp,
struct pp_smu *pp, struct dpm_clocks *clock_table)
static enum pp_smu_status pp_rn_set_wm_ranges(struct pp_smu *pp,
funcs->rv_funcs.pp_smu.dm = ctx;
funcs->nv_funcs.pp_smu.dm = ctx;
funcs->rn_funcs.pp_smu.dm = ctx;
struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *pp_smu, struct dccg *dccg)
rn_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
rn_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
rv2_clk_mgr_construct(ctx, clk_mgr, pp_smu);
rv1_clk_mgr_construct(ctx, clk_mgr, pp_smu);
dcn201_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn3_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn20_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
vg_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn31_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn315_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn316_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn32_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn314_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn351_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
dcn35_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
struct pp_smu_funcs_rv *pp_smu = NULL;
ASSERT(clk_mgr->pp_smu);
pp_smu = &clk_mgr->pp_smu->rv_funcs;
if (pp_smu->set_display_count)
pp_smu->set_display_count(&pp_smu->pp_smu, display_count);
if (pp_smu->set_hard_min_fclk_by_freq &&
pp_smu->set_hard_min_dcfclk_by_freq &&
pp_smu->set_min_deep_sleep_dcfclk) {
pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(new_clocks->fclk_khz));
pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(new_clocks->dcfclk_khz));
pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, khz_to_mhz_ceil(new_clocks->dcfclk_deep_sleep_khz));
if (pp_smu->set_hard_min_fclk_by_freq &&
pp_smu->set_hard_min_dcfclk_by_freq &&
pp_smu->set_min_deep_sleep_dcfclk) {
pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(new_clocks->fclk_khz));
pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(new_clocks->dcfclk_khz));
pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, khz_to_mhz_ceil(new_clocks->dcfclk_deep_sleep_khz));
struct pp_smu_funcs_rv *pp_smu = NULL;
if (clk_mgr->pp_smu) {
pp_smu = &clk_mgr->pp_smu->rv_funcs;
if (pp_smu->set_pme_wa_enable)
pp_smu->set_pme_wa_enable(&pp_smu->pp_smu);
void rv1_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *clk_mgr, struct pp_smu_funcs *pp_smu)
clk_mgr->pp_smu = pp_smu;
void rv1_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *clk_mgr, struct pp_smu_funcs *pp_smu);
void rv2_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *clk_mgr, struct pp_smu_funcs *pp_smu)
rv1_clk_mgr_construct(ctx, clk_mgr, pp_smu);
void rv2_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *clk_mgr, struct pp_smu_funcs *pp_smu);
struct pp_smu_funcs_nv *pp_smu = NULL;
if (dc->res_pool->pp_smu)
pp_smu = &dc->res_pool->pp_smu->nv_funcs;
if (pp_smu && pp_smu->set_display_count)
pp_smu->set_display_count(&pp_smu->pp_smu, display_count);
if (pp_smu && pp_smu->set_hard_min_dcfclk_by_freq)
pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(clk_mgr_base->clks.dcfclk_khz));
if (pp_smu && pp_smu->set_min_deep_sleep_dcfclk)
pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, khz_to_mhz_ceil(clk_mgr_base->clks.dcfclk_deep_sleep_khz));
if (pp_smu && pp_smu->set_hard_min_socclk_by_freq)
pp_smu->set_hard_min_socclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(clk_mgr_base->clks.socclk_khz));
if (pp_smu && pp_smu->set_pstate_handshake_support)
pp_smu->set_pstate_handshake_support(&pp_smu->pp_smu, clk_mgr_base->clks.p_state_change_support);
if (pp_smu && pp_smu->set_hard_min_uclk_by_freq)
pp_smu->set_hard_min_uclk_by_freq(&pp_smu->pp_smu, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz));
if (pp_smu && pp_smu->set_voltage_by_freq)
pp_smu->set_voltage_by_freq(&pp_smu->pp_smu, PP_SMU_NV_DISPCLK, khz_to_mhz_ceil(clk_mgr_base->clks.disp_dpp_voltage_level_khz));
struct pp_smu_funcs_nv *pp_smu = NULL;
if (clk_mgr->pp_smu) {
pp_smu = &clk_mgr->pp_smu->nv_funcs;
if (pp_smu->set_pme_wa_enable)
pp_smu->set_pme_wa_enable(&pp_smu->pp_smu);
struct pp_smu_funcs_nv *pp_smu = NULL;
if (!clk_mgr->pp_smu || !clk_mgr->pp_smu->nv_funcs.set_voltage_by_freq)
pp_smu = &clk_mgr->pp_smu->nv_funcs;
pp_smu->set_voltage_by_freq(&pp_smu->pp_smu, PP_SMU_NV_PHYCLK, khz_to_mhz_ceil(clk_mgr_base->clks.phyclk_khz));
struct pp_smu_funcs *pp_smu,
clk_mgr->pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu = clk_mgr->pp_smu;
if (pp_smu && pp_smu->rn_funcs.set_wm_ranges)
pp_smu->rn_funcs.set_wm_ranges(&pp_smu->rn_funcs.pp_smu, &clk_mgr_base->ranges);
struct pp_smu_funcs *pp_smu,
clk_mgr->pp_smu = pp_smu;
if (pp_smu && pp_smu->rn_funcs.get_dpm_clock_table) {
status = pp_smu->rn_funcs.get_dpm_clock_table(&pp_smu->rn_funcs.pp_smu, &clock_table);
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
clk_mgr->base.pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
clk_mgr->base.pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
clk_mgr->base.pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
clk_mgr->base.pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
clk_mgr->base.pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
dcn35_clk_mgr_construct(ctx, clk_mgr, pp_smu, dccg);
struct pp_smu_funcs *pp_smu,
clk_mgr->base.pp_smu = pp_smu;
struct pp_smu_funcs *pp_smu,
struct pp_smu_funcs *pp_smu,
dc->clk_mgr = dc_clk_mgr_create(dc->ctx, dc->res_pool->pp_smu, dc->res_pool->dccg);
void (*set_display_count)(struct pp_smu *pp, int count);
void (*set_wm_ranges)(struct pp_smu *pp,
void (*set_hard_min_dcfclk_by_freq)(struct pp_smu *pp, int mhz);
void (*set_min_deep_sleep_dcfclk)(struct pp_smu *pp, int mhz);
void (*set_hard_min_fclk_by_freq)(struct pp_smu *pp, int mhz);
void (*set_hard_min_socclk_by_freq)(struct pp_smu *pp, int mhz);
void (*set_pme_wa_enable)(struct pp_smu *pp);
struct pp_smu pp_smu;
enum pp_smu_status (*set_display_count)(struct pp_smu *pp, int count);
enum pp_smu_status (*set_hard_min_dcfclk_by_freq)(struct pp_smu *pp, int Mhz);
enum pp_smu_status (*set_min_deep_sleep_dcfclk)(struct pp_smu *pp, int Mhz);
enum pp_smu_status (*set_hard_min_uclk_by_freq)(struct pp_smu *pp, int Mhz);
enum pp_smu_status (*set_hard_min_socclk_by_freq)(struct pp_smu *pp, int Mhz);
enum pp_smu_status (*set_pme_wa_enable)(struct pp_smu *pp);
enum pp_smu_status (*set_voltage_by_freq)(struct pp_smu *pp,
enum pp_smu_status (*set_wm_ranges)(struct pp_smu *pp,
enum pp_smu_status (*get_maximum_sustainable_clocks)(struct pp_smu *pp,
enum pp_smu_status (*get_uclk_dpm_states)(struct pp_smu *pp,
enum pp_smu_status (*set_pstate_handshake_support)(struct pp_smu *pp,
struct pp_smu pp_smu;
enum pp_smu_status (*set_wm_ranges)(struct pp_smu *pp,
enum pp_smu_status (*get_dpm_clock_table) (struct pp_smu *pp,
struct pp_smu pp_smu;
enum pp_smu_status (*set_wm_ranges)(struct pp_smu *pp,
enum pp_smu_status (*get_dpm_clock_table) (struct pp_smu *pp,
enum pp_smu_status (*notify_smu_timeout) (struct pp_smu *pp);
struct pp_smu ctx;
struct pp_smu pp_smu;
if (dc->res_pool->pp_smu)
pp = &dc->res_pool->pp_smu->rv_funcs;
pp->set_wm_ranges(&pp->pp_smu, &ranges);
struct pp_smu_funcs *pp_smu;
struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *pp_smu, struct dccg *dccg);
struct pp_smu_funcs *pp_smu;
kfree(pool->base.pp_smu);
pool->base.pp_smu = dcn10_pp_smu_create(ctx);
if (pool->base.pp_smu != NULL
&& pool->base.pp_smu->rv_funcs.set_pme_wa_enable != NULL)
struct pp_smu_funcs *pp_smu = kzalloc_obj(*pp_smu);
if (!pp_smu)
return pp_smu;
dm_pp_get_funcs(ctx, pp_smu);
return pp_smu;
static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
if (pool->base.pp_smu != NULL)
dcn20_pp_smu_destroy(&pool->base.pp_smu);
struct pp_smu_funcs *pp_smu = kzalloc_obj(*pp_smu);
if (!pp_smu)
return pp_smu;
dm_pp_get_funcs(ctx, pp_smu);
if (pp_smu->ctx.ver != PP_SMU_VER_NV)
pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
return pp_smu;
static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
if (pp_smu && *pp_smu) {
kfree(*pp_smu);
*pp_smu = NULL;
if (pool->base.pp_smu) {
if (pool->base.pp_smu->nv_funcs.get_uclk_dpm_states) {
status = (pool->base.pp_smu->nv_funcs.get_uclk_dpm_states)
(&pool->base.pp_smu->nv_funcs.pp_smu, uclk_states, &num_states);
if (pool->base.pp_smu->nv_funcs.get_maximum_sustainable_clocks) {
status = (*pool->base.pp_smu->nv_funcs.get_maximum_sustainable_clocks)
(&pool->base.pp_smu->nv_funcs.pp_smu, &max_clocks);
pool->base.pp_smu = dcn20_pp_smu_create(ctx);
if (pool->base.pp_smu && pool->base.pp_smu->nv_funcs.set_wm_ranges)
pool->base.pp_smu->nv_funcs.set_wm_ranges(&pool->base.pp_smu->nv_funcs.pp_smu, &ranges);
struct pp_smu_funcs *pp_smu = kzalloc_obj(*pp_smu);
if (!pp_smu)
return pp_smu;
dm_pp_get_funcs(ctx, pp_smu);
if (pp_smu->ctx.ver != PP_SMU_VER_RN)
pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
return pp_smu;
static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
if (pp_smu && *pp_smu) {
kfree(*pp_smu);
*pp_smu = NULL;
pool->base.pp_smu = dcn21_pp_smu_create(ctx);
static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
if (pool->base.pp_smu != NULL)
dcn21_pp_smu_destroy(&pool->base.pp_smu);
struct pp_smu_funcs *pp_smu,
pp_smu->nv_funcs.set_wm_ranges(&pp_smu->nv_funcs.pp_smu, &ranges);
if (!dc->debug.disable_pplib_wm_range && pool->base.pp_smu->nv_funcs.set_wm_ranges)
set_wm_ranges(pool->base.pp_smu, &dcn3_01_soc);