Commit a7e3658e authored by Yongqiang Sun's avatar Yongqiang Sun Committed by Alex Deucher

drm/amd/display: Change dmcu init sequence for dmcub loading dmcu FW.

[Why]
DMCU isn't intiliazed properly by dmcub loading due to dmcub initialize
sequence.

[How]
Change dmcu init sequece to meet dmcub initilize.
Signed-off-by: default avatarYongqiang Sun <yongqiang.sun@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: default avatarHersen Wu <hersenxs.wu@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 7c008829
No related merge requests found
...@@ -59,6 +59,12 @@ ...@@ -59,6 +59,12 @@
#define MCP_BL_SET_PWM_FRAC 0x6A /* Enable or disable Fractional PWM */ #define MCP_BL_SET_PWM_FRAC 0x6A /* Enable or disable Fractional PWM */
#define MASTER_COMM_CNTL_REG__MASTER_COMM_INTERRUPT_MASK 0x00000001L #define MASTER_COMM_CNTL_REG__MASTER_COMM_INTERRUPT_MASK 0x00000001L
// PSP FW version
#define mmMP0_SMN_C2PMSG_58 0x1607A
//Register access policy version
#define mmMP0_SMN_C2PMSG_91 0x1609B
static bool dce_dmcu_init(struct dmcu *dmcu) static bool dce_dmcu_init(struct dmcu *dmcu)
{ {
// Do nothing // Do nothing
...@@ -373,6 +379,7 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu) ...@@ -373,6 +379,7 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu)
const struct dc_config *config = &dmcu->ctx->dc->config; const struct dc_config *config = &dmcu->ctx->dc->config;
bool status = false; bool status = false;
PERF_TRACE();
/* Definition of DC_DMCU_SCRATCH /* Definition of DC_DMCU_SCRATCH
* 0 : firmare not loaded * 0 : firmare not loaded
* 1 : PSP load DMCU FW but not initialized * 1 : PSP load DMCU FW but not initialized
...@@ -429,9 +436,23 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu) ...@@ -429,9 +436,23 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu)
break; break;
} }
PERF_TRACE();
return status; return status;
} }
#if defined(CONFIG_DRM_AMD_DC_DCN2_1)
static bool dcn21_dmcu_init(struct dmcu *dmcu)
{
struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu);
uint32_t dmcub_psp_version = REG_READ(DMCUB_SCRATCH15);
if (dmcu->auto_load_dmcu && dmcub_psp_version == 0) {
return false;
}
return dcn10_dmcu_init(dmcu);
}
#endif
static bool dcn10_dmcu_load_iram(struct dmcu *dmcu, static bool dcn10_dmcu_load_iram(struct dmcu *dmcu,
unsigned int start_offset, unsigned int start_offset,
...@@ -818,6 +839,21 @@ static const struct dmcu_funcs dcn20_funcs = { ...@@ -818,6 +839,21 @@ static const struct dmcu_funcs dcn20_funcs = {
}; };
#endif #endif
#if defined(CONFIG_DRM_AMD_DC_DCN2_1)
static const struct dmcu_funcs dcn21_funcs = {
.dmcu_init = dcn21_dmcu_init,
.load_iram = dcn10_dmcu_load_iram,
.set_psr_enable = dcn10_dmcu_set_psr_enable,
.setup_psr = dcn10_dmcu_setup_psr,
.get_psr_state = dcn10_get_dmcu_psr_state,
.set_psr_wait_loop = dcn10_psr_wait_loop,
.get_psr_wait_loop = dcn10_get_psr_wait_loop,
.is_dmcu_initialized = dcn10_is_dmcu_initialized,
.lock_phy = dcn20_lock_phy,
.unlock_phy = dcn20_unlock_phy
};
#endif
static void dce_dmcu_construct( static void dce_dmcu_construct(
struct dce_dmcu *dmcu_dce, struct dce_dmcu *dmcu_dce,
struct dc_context *ctx, struct dc_context *ctx,
...@@ -836,6 +872,26 @@ static void dce_dmcu_construct( ...@@ -836,6 +872,26 @@ static void dce_dmcu_construct(
dmcu_dce->dmcu_mask = dmcu_mask; dmcu_dce->dmcu_mask = dmcu_mask;
} }
#if defined(CONFIG_DRM_AMD_DC_DCN2_1)
static void dcn21_dmcu_construct(
struct dce_dmcu *dmcu_dce,
struct dc_context *ctx,
const struct dce_dmcu_registers *regs,
const struct dce_dmcu_shift *dmcu_shift,
const struct dce_dmcu_mask *dmcu_mask)
{
uint32_t psp_version = 0;
dce_dmcu_construct(dmcu_dce, ctx, regs, dmcu_shift, dmcu_mask);
if (!IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) {
psp_version = dm_read_reg(ctx, mmMP0_SMN_C2PMSG_58);
dmcu_dce->base.auto_load_dmcu = (psp_version > 0x00110029);
dmcu_dce->base.psp_version = psp_version;
}
}
#endif
struct dmcu *dce_dmcu_create( struct dmcu *dce_dmcu_create(
struct dc_context *ctx, struct dc_context *ctx,
const struct dce_dmcu_registers *regs, const struct dce_dmcu_registers *regs,
...@@ -903,6 +959,29 @@ struct dmcu *dcn20_dmcu_create( ...@@ -903,6 +959,29 @@ struct dmcu *dcn20_dmcu_create(
} }
#endif #endif
#if defined(CONFIG_DRM_AMD_DC_DCN2_1)
struct dmcu *dcn21_dmcu_create(
struct dc_context *ctx,
const struct dce_dmcu_registers *regs,
const struct dce_dmcu_shift *dmcu_shift,
const struct dce_dmcu_mask *dmcu_mask)
{
struct dce_dmcu *dmcu_dce = kzalloc(sizeof(*dmcu_dce), GFP_KERNEL);
if (dmcu_dce == NULL) {
BREAK_TO_DEBUGGER();
return NULL;
}
dcn21_dmcu_construct(
dmcu_dce, ctx, regs, dmcu_shift, dmcu_mask);
dmcu_dce->base.funcs = &dcn21_funcs;
return &dmcu_dce->base;
}
#endif
void dce_dmcu_destroy(struct dmcu **dmcu) void dce_dmcu_destroy(struct dmcu **dmcu)
{ {
struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(*dmcu); struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(*dmcu);
......
...@@ -71,6 +71,10 @@ ...@@ -71,6 +71,10 @@
DMCU_COMMON_REG_LIST_DCE_BASE(), \ DMCU_COMMON_REG_LIST_DCE_BASE(), \
SR(DMU_MEM_PWR_CNTL) SR(DMU_MEM_PWR_CNTL)
#define DMCU_DCN20_REG_LIST()\
DMCU_DCN10_REG_LIST(), \
SR(DMCUB_SCRATCH15)
#define DMCU_SF(reg_name, field_name, post_fix)\ #define DMCU_SF(reg_name, field_name, post_fix)\
.field_name = reg_name ## __ ## field_name ## post_fix .field_name = reg_name ## __ ## field_name ## post_fix
...@@ -175,6 +179,7 @@ struct dce_dmcu_registers { ...@@ -175,6 +179,7 @@ struct dce_dmcu_registers {
uint32_t DMCU_INTERRUPT_TO_UC_EN_MASK; uint32_t DMCU_INTERRUPT_TO_UC_EN_MASK;
uint32_t SMU_INTERRUPT_CONTROL; uint32_t SMU_INTERRUPT_CONTROL;
uint32_t DC_DMCU_SCRATCH; uint32_t DC_DMCU_SCRATCH;
uint32_t DMCUB_SCRATCH15;
}; };
struct dce_dmcu { struct dce_dmcu {
...@@ -269,6 +274,14 @@ struct dmcu *dcn20_dmcu_create( ...@@ -269,6 +274,14 @@ struct dmcu *dcn20_dmcu_create(
const struct dce_dmcu_mask *dmcu_mask); const struct dce_dmcu_mask *dmcu_mask);
#endif #endif
#if defined(CONFIG_DRM_AMD_DC_DCN2_1)
struct dmcu *dcn21_dmcu_create(
struct dc_context *ctx,
const struct dce_dmcu_registers *regs,
const struct dce_dmcu_shift *dmcu_shift,
const struct dce_dmcu_mask *dmcu_mask);
#endif
void dce_dmcu_destroy(struct dmcu **dmcu); void dce_dmcu_destroy(struct dmcu **dmcu);
static const uint32_t abm_gain_stepsize = 0x0060; static const uint32_t abm_gain_stepsize = 0x0060;
......
...@@ -1285,7 +1285,7 @@ static void dcn10_init_hw(struct dc *dc) ...@@ -1285,7 +1285,7 @@ static void dcn10_init_hw(struct dc *dc)
abm->funcs->abm_init(abm); abm->funcs->abm_init(abm);
} }
if (dmcu != NULL) if (dmcu != NULL && !dmcu->auto_load_dmcu)
dmcu->funcs->dmcu_init(dmcu); dmcu->funcs->dmcu_init(dmcu);
if (abm != NULL && dmcu != NULL) if (abm != NULL && dmcu != NULL)
......
...@@ -350,7 +350,7 @@ static const struct bios_registers bios_regs = { ...@@ -350,7 +350,7 @@ static const struct bios_registers bios_regs = {
}; };
static const struct dce_dmcu_registers dmcu_regs = { static const struct dce_dmcu_registers dmcu_regs = {
DMCU_DCN10_REG_LIST() DMCU_DCN20_REG_LIST()
}; };
static const struct dce_dmcu_shift dmcu_shift = { static const struct dce_dmcu_shift dmcu_shift = {
...@@ -1727,7 +1727,7 @@ static bool construct( ...@@ -1727,7 +1727,7 @@ static bool construct(
goto create_fail; goto create_fail;
} }
pool->base.dmcu = dcn20_dmcu_create(ctx, pool->base.dmcu = dcn21_dmcu_create(ctx,
&dmcu_regs, &dmcu_regs,
&dmcu_shift, &dmcu_shift,
&dmcu_mask); &dmcu_mask);
......
...@@ -52,6 +52,8 @@ struct dmcu { ...@@ -52,6 +52,8 @@ struct dmcu {
enum dmcu_state dmcu_state; enum dmcu_state dmcu_state;
struct dmcu_version dmcu_version; struct dmcu_version dmcu_version;
unsigned int cached_wait_loop_number; unsigned int cached_wait_loop_number;
uint32_t psp_version;
bool auto_load_dmcu;
}; };
struct dmcu_funcs { struct dmcu_funcs {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment