dccg
dst_ctx->dis_clk = dc->res_pool->dccg;
static int dce_get_dp_ref_freq_khz(struct dccg *clk)
static int dce12_get_dp_ref_freq_khz(struct dccg *clk)
struct dccg *clk,
struct dccg *clk,
struct dccg *clk,
struct dccg *clk,
static void dce12_update_clocks(struct dccg *dccg,
if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) {
new_clocks->dispclk_khz = dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, dccg->clks.phyclk_khz)) {
dccg->clks.phyclk_khz = new_clocks->phyclk_khz;
dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
static int dcn1_determine_dppclk_threshold(struct dccg *dccg, struct dc_clocks *new_clocks)
bool dispclk_increase = new_clocks->dispclk_khz > dccg->clks.dispclk_khz;
bool cur_dpp_div = dccg->clks.dispclk_khz > dccg->clks.dppclk_khz;
if (dccg->clks.dispclk_khz <= disp_clk_threshold)
static void dcn1_ramp_up_dispclk_with_dpp(struct dccg *dccg, struct dc_clocks *new_clocks)
struct dc *dc = dccg->ctx->dc;
int dispclk_to_dpp_threshold = dcn1_determine_dppclk_threshold(dccg, new_clocks);
dccg->funcs->set_dispclk(dccg, dispclk_to_dpp_threshold);
dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
dccg->clks.dppclk_khz = new_clocks->dppclk_khz;
dccg->clks.max_supported_dppclk_khz = new_clocks->max_supported_dppclk_khz;
static void dcn1_update_clocks(struct dccg *dccg,
struct dc *dc = dccg->ctx->dc;
if (new_clocks->dispclk_khz > dccg->clks.dispclk_khz
|| new_clocks->phyclk_khz > dccg->clks.phyclk_khz
|| new_clocks->fclk_khz > dccg->clks.fclk_khz
|| new_clocks->dcfclk_khz > dccg->clks.dcfclk_khz)
if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, dccg->clks.phyclk_khz)) {
dccg->clks.phyclk_khz = new_clocks->phyclk_khz;
if (should_set_clock(safe_to_lower, new_clocks->fclk_khz, dccg->clks.fclk_khz)) {
dccg->clks.fclk_khz = new_clocks->fclk_khz;
dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, dccg->clks.dcfclk_khz)) {
dccg->clks.dcfclk_khz = new_clocks->dcfclk_khz;
new_clocks->dcfclk_deep_sleep_khz, dccg->clks.dcfclk_deep_sleep_khz)) {
dccg->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;
dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)
|| new_clocks->dispclk_khz == dccg->clks.dispclk_khz) {
dcn1_ramp_up_dispclk_with_dpp(dccg, new_clocks);
dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
static void dce_update_clocks(struct dccg *dccg,
struct dce_dccg *clk_dce = TO_DCE_CLOCKS(dccg);
level_change_req.power_level = dce_get_required_clocks_state(dccg, new_clocks);
if ((level_change_req.power_level < dccg->cur_min_clks_state && safe_to_lower)
|| level_change_req.power_level > dccg->cur_min_clks_state) {
if (dm_pp_apply_power_level_change_request(dccg->ctx, &level_change_req))
dccg->cur_min_clks_state = level_change_req.power_level;
if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) {
new_clocks->dispclk_khz = dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
struct dccg *dccg,
struct dce_dccg *clk_dce = TO_DCE_CLOCKS(dccg);
dccg->clks.dispclk_khz =
dccg->funcs->set_dispclk(dccg, dccg->clks.dispclk_khz);
struct dccg *base = &clk_dce->base;
struct dccg *dce_dccg_create(
struct dccg *dce110_dccg_create(
struct dccg *dce112_dccg_create(
struct dccg *dce120_dccg_create(struct dc_context *ctx)
struct dccg *dcn1_dccg_create(struct dc_context *ctx)
void dce_dccg_destroy(struct dccg **dccg)
struct dce_dccg *clk_dce = TO_DCE_CLOCKS(*dccg);
*dccg = NULL;
struct dccg *dce110_dccg_create(
struct dccg *dce112_dccg_create(
struct dccg *dce120_dccg_create(struct dc_context *ctx);
struct dccg *dcn1_dccg_create(struct dc_context *ctx);
void dce_dccg_destroy(struct dccg **dccg);
struct dccg base;
struct dccg *dce_dccg_create(
dc->res_pool->dccg->funcs->update_clocks(
dc->res_pool->dccg,
if (pool->base.dccg != NULL)
dce_dccg_destroy(&pool->base.dccg);
pool->base.dccg = dce_dccg_create(ctx,
if (pool->base.dccg == NULL) {
pool->base.dccg->max_clks_state =
pp_display_cfg->disp_clk_khz = dc->res_pool->dccg->clks.dispclk_khz;
struct dccg *dccg = dc->res_pool->dccg;
if (dccg->funcs->update_dfs_bypass)
dccg->funcs->update_dfs_bypass(
dccg,
dccg->funcs->update_clocks(
dccg,
pool->base.dccg = dce110_dccg_create(ctx,
if (pool->base.dccg == NULL) {
pool->base.dccg->max_clks_state =
if (pool->base.dccg != NULL)
dce_dccg_destroy(&pool->base.dccg);
pool->base.dccg = dce112_dccg_create(ctx,
if (pool->base.dccg == NULL) {
pool->base.dccg->max_clks_state =
if (pool->base.dccg != NULL)
dce_dccg_destroy(&pool->base.dccg);
if (pool->base.dccg != NULL)
dce_dccg_destroy(&pool->base.dccg);
pool->base.dccg = dce120_dccg_create(ctx);
if (pool->base.dccg == NULL) {
pool->base.dccg = dce_dccg_create(ctx,
if (pool->base.dccg == NULL) {
pool->base.dccg->max_clks_state =
pool->base.dccg = dce_dccg_create(ctx,
if (pool->base.dccg == NULL) {
pool->base.dccg->max_clks_state =
if (pool->base.dccg != NULL)
dce_dccg_destroy(&pool->base.dccg);
pool->base.dccg = dce_dccg_create(ctx,
if (pool->base.dccg == NULL) {
pool->base.dccg->max_clks_state =
memset(&dc->res_pool->dccg->clks, 0, sizeof(dc->res_pool->dccg->clks));
dc->res_pool->dccg->clks.dispclk_khz / 2;
dc->res_pool->dccg->clks.dppclk_khz = should_divided_by_2 ?
dc->res_pool->dccg->clks.dispclk_khz / 2 :
dc->res_pool->dccg->clks.dispclk_khz;
pp_display_cfg->min_engine_clock_khz = dc->res_pool->dccg->clks.dcfclk_khz;
pp_display_cfg->min_memory_clock_khz = dc->res_pool->dccg->clks.fclk_khz;
pp_display_cfg->min_engine_clock_deep_sleep_khz = dc->res_pool->dccg->clks.dcfclk_deep_sleep_khz;
pp_display_cfg->min_dcfc_deep_sleep_clock_khz = dc->res_pool->dccg->clks.dcfclk_deep_sleep_khz;
pp_display_cfg->min_dcfclock_khz = dc->res_pool->dccg->clks.dcfclk_khz;
pp_display_cfg->disp_clk_khz = dc->res_pool->dccg->clks.dispclk_khz;
dc->res_pool->dccg->funcs->update_clocks(
dc->res_pool->dccg,
pool->base.dccg = dcn1_dccg_create(ctx);
if (pool->base.dccg == NULL) {
if (pool->base.dccg != NULL)
dce_dccg_destroy(&pool->base.dccg);
struct dccg *dccg;
struct dccg *dis_clk;
void (*update_clocks)(struct dccg *dccg,
int (*set_dispclk)(struct dccg *dccg,
int (*get_dp_ref_clk_frequency)(struct dccg *dccg);
bool (*update_dfs_bypass)(struct dccg *dccg,