void dccg2_init(struct dccg *dccg)
{
- struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
-
- /* Hardcoded register values for DCN20
- * These are specific to 100Mhz refclk
- * Different ASICs with different refclk may override this in their own init
- */
- REG_WRITE(MICROSECOND_TIME_BASE_DIV, 0x00120264);
- REG_WRITE(MILLISECOND_TIME_BASE_DIV, 0x001186a0);
- REG_WRITE(DISPCLK_FREQ_CHANGE_CNTL, 0x0e01003c);
-
- if (REG(REFCLK_CNTL))
- REG_WRITE(REFCLK_CNTL, 0);
-}
-
-void dccg2_refclk_setup(struct dccg *dccg)
-{
- struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
-
- /* REFCLK programming that must occur after hubbub initialization */
- if (REG(REFCLK_CNTL))
- REG_WRITE(REFCLK_CNTL, 0);
-}
-
-bool dccg2_is_s0i3_golden_init_wa_done(struct dccg *dccg)
-{
- struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
-
- return REG_READ(MICROSECOND_TIME_BASE_DIV) == 0x00120464;
-}
-
-void dccg2_allow_clock_gating(struct dccg *dccg, bool allow)
-{
- struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
-
- if (allow) {
- REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
- REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
- } else {
- REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0xFFFFFFFF);
- REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0xFFFFFFFF);
- }
-}
-
-void dccg2_enable_memory_low_power(struct dccg *dccg, bool enable)
-{
- struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
-
- REG_UPDATE(DC_MEM_GLOBAL_PWR_REQ_CNTL, DC_MEM_GLOBAL_PWR_REQ_DIS, enable ? 0 : 1);
}
static const struct dccg_funcs dccg2_funcs = {
.set_fifo_errdet_ovr_en = dccg2_set_fifo_errdet_ovr_en,
.otg_add_pixel = dccg2_otg_add_pixel,
.otg_drop_pixel = dccg2_otg_drop_pixel,
- .dccg_init = dccg2_init,
- .refclk_setup = dccg2_refclk_setup, /* Deprecated - for backward compatibility only */
- .allow_clock_gating = dccg2_allow_clock_gating,
- .enable_memory_low_power = dccg2_enable_memory_low_power,
- .is_s0i3_golden_init_wa_done = dccg2_is_s0i3_golden_init_wa_done
+ .dccg_init = dccg2_init
};
struct dccg *dccg2_create(
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 2),\
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 3),\
DCCG_SRII(PIXEL_RATE_CNTL, OTG, 4),\
- DCCG_SRII(PIXEL_RATE_CNTL, OTG, 5),\
- SR(DCCG_GATE_DISABLE_CNTL),\
- SR(DCCG_GATE_DISABLE_CNTL2)
+ DCCG_SRII(PIXEL_RATE_CNTL, OTG, 5)
#define DCCG_SF(reg_name, field_name, post_fix)\
.field_name = reg_name ## __ ## field_name ## post_fix
DCCG_SFII(OTG, PIXEL_RATE_CNTL, OTG, ADD_PIXEL, 0, mask_sh),\
DCCG_SFII(OTG, PIXEL_RATE_CNTL, OTG, ADD_PIXEL, 1, mask_sh),\
DCCG_SFII(OTG, PIXEL_RATE_CNTL, OTG, DROP_PIXEL, 0, mask_sh),\
- DCCG_SFII(OTG, PIXEL_RATE_CNTL, OTG, DROP_PIXEL, 1, mask_sh),\
- DCCG_SF(DC_MEM_GLOBAL_PWR_REQ_CNTL, DC_MEM_GLOBAL_PWR_REQ_DIS, mask_sh)
+ DCCG_SFII(OTG, PIXEL_RATE_CNTL, OTG, DROP_PIXEL, 1, mask_sh)
type DISPCLK_CHG_FWD_CORR_DISABLE;\
type DISPCLK_FREQ_CHANGE_CNTL;\
type OTG_ADD_PIXEL[MAX_PIPES];\
- type OTG_DROP_PIXEL[MAX_PIPES];\
- type DC_MEM_GLOBAL_PWR_REQ_DIS;
+ type OTG_DROP_PIXEL[MAX_PIPES];
#define DCCG3_REG_FIELD_LIST(type) \
type HDMICHARCLK0_EN;\
void dccg2_init(struct dccg *dccg);
-void dccg2_refclk_setup(struct dccg *dccg);
-
-bool dccg2_is_s0i3_golden_init_wa_done(struct dccg *dccg);
-
-void dccg2_allow_clock_gating(struct dccg *dccg, bool allow);
-
-void dccg2_enable_memory_low_power(struct dccg *dccg, bool enable);
-
struct dccg *dccg2_create(
struct dc_context *ctx,
const struct dccg_registers *regs,
if (!dc->debug.disable_clock_gate) {
/* enable all DCN clock gating */
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->allow_clock_gating)
- dc->res_pool->dccg->funcs->allow_clock_gating(dc->res_pool->dccg, true);
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
+
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
void dcn20_dccg_init(struct dce_hwseq *hws)
{
- struct dc *dc = hws->ctx->dc;
+ /*
+ * set MICROSECOND_TIME_BASE_DIV
+ * 100Mhz refclk -> 0x120264
+ * 27Mhz refclk -> 0x12021b
+ * 48Mhz refclk -> 0x120230
+ *
+ */
+ REG_WRITE(MICROSECOND_TIME_BASE_DIV, 0x120264);
+
+ /*
+ * set MILLISECOND_TIME_BASE_DIV
+ * 100Mhz refclk -> 0x1186a0
+ * 27Mhz refclk -> 0x106978
+ * 48Mhz refclk -> 0x10bb80
+ *
+ */
+ REG_WRITE(MILLISECOND_TIME_BASE_DIV, 0x1186a0);
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->dccg_init)
- dc->res_pool->dccg->funcs->dccg_init(dc->res_pool->dccg);
+ /* This value is dependent on the hardware pipeline delay so set once per SOC */
+ REG_WRITE(DISPCLK_FREQ_CHANGE_CNTL, 0xe01003c);
}
void dcn20_disable_vga(
dcn10_hubbub_global_timer_enable(dc->res_pool->hubbub, true, 2);
- if (hws->funcs.dccg_init)
- hws->funcs.dccg_init(hws);
-
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->refclk_setup)
- dc->res_pool->dccg->funcs->refclk_setup(dc->res_pool->dccg);
+ if (REG(REFCLK_CNTL))
+ REG_WRITE(REFCLK_CNTL, 0);
//
if (!dc->debug.disable_clock_gate) {
/* enable all DCN clock gating */
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->allow_clock_gating)
- dc->res_pool->dccg->funcs->allow_clock_gating(dc->res_pool->dccg, true);
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
+
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
#include "vmid.h"
#include "reg_helper.h"
#include "hw/clk_mgr.h"
-#include "hw/dccg.h"
#include "dc_dmub_srv.h"
#include "abm.h"
#include "link_service.h"
bool dcn21_s0i3_golden_init_wa(struct dc *dc)
{
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->is_s0i3_golden_init_wa_done)
- return !dc->res_pool->dccg->funcs->is_s0i3_golden_init_wa_done(dc->res_pool->dccg);
+ struct dce_hwseq *hws = dc->hwseq;
+ uint32_t value = 0;
- return false;
+ value = REG_READ(MICROSECOND_TIME_BASE_DIV);
+
+ return value != 0x00120464;
}
void dcn21_exit_optimized_pwr_state(
if (!dc->debug.disable_clock_gate) {
/* enable all DCN clock gating */
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->allow_clock_gating)
- dc->res_pool->dccg->funcs->allow_clock_gating(dc->res_pool->dccg, true);
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
+
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
if (!dc->debug.disable_clock_gate) {
/* enable all DCN clock gating */
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->allow_clock_gating)
- dc->res_pool->dccg->funcs->allow_clock_gating(dc->res_pool->dccg, true);
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
+
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
if (!dc->debug.disable_clock_gate) {
/* enable all DCN clock gating */
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->allow_clock_gating)
- dc->res_pool->dccg->funcs->allow_clock_gating(dc->res_pool->dccg, true);
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
+
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
}
if (dc->debug.disable_mem_low_power) {
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->enable_memory_low_power)
- dc->res_pool->dccg->funcs->enable_memory_low_power(dc->res_pool->dccg, false);
+ REG_UPDATE(DC_MEM_GLOBAL_PWR_REQ_CNTL, DC_MEM_GLOBAL_PWR_REQ_DIS, 1);
}
if (!dcb->funcs->is_accelerated_mode(dcb) && dc->res_pool->hubbub->funcs->init_watermarks)
dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub);
if (!dc->debug.disable_clock_gate) {
/* enable all DCN clock gating */
- if (dc->res_pool->dccg && dc->res_pool->dccg->funcs && dc->res_pool->dccg->funcs->allow_clock_gating)
- dc->res_pool->dccg->funcs->allow_clock_gating(dc->res_pool->dccg, true);
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
+
+ REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
}
void (*otg_drop_pixel)(struct dccg *dccg,
uint32_t otg_inst);
void (*dccg_init)(struct dccg *dccg);
- void (*refclk_setup)(struct dccg *dccg); /* Deprecated - for backward compatibility only */
- void (*allow_clock_gating)(struct dccg *dccg, bool allow);
- void (*enable_memory_low_power)(struct dccg *dccg, bool enable);
void (*set_dpstreamclk_root_clock_gating)(
struct dccg *dccg,
int dp_hpo_inst,
void (*dccg_root_gate_disable_control)(struct dccg *dccg, uint32_t pipe_idx, uint32_t disable_clock_gating);
void (*dccg_read_reg_state)(struct dccg *dccg, struct dcn_dccg_reg_state *dccg_reg_state);
void (*dccg_enable_global_fgcg)(struct dccg *dccg, bool enable);
- bool (*is_s0i3_golden_init_wa_done)(struct dccg *dccg);
};
#endif //__DAL_DCCG_H__