drm/amd/display: Force enable pstate on driver unload
[Why] During driver unload, it is expected that p-state switching is supported. If it's not supported, PMFW will hang due to a forced p-state switch. Even if the current timing does not support p-state normally, we still want to force allow because the worst that can happen is underflow. This will match Navi10 behaviour. [How] - new hubbub func to control the force pstate register - force allow when releasing display ownership - registers are inaccessible after due to m_cgs.hwNotAvailable - explicitly disable force signal during hw_init - if driver is disabled and re-enabled, register not cleared otherwise Also, remove DCN3 part of dcn10_init_hw, we will not be going back to it. Signed-off-by: Joshua Aberback <joshua.aberback@amd.com> Reviewed-by: Jun Lei <Jun.Lei@amd.com> Acked-by: Eryk Brol <eryk.brol@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
fe984cb3dd
commit
3e19095534
@@ -3097,4 +3097,11 @@ bool dc_is_plane_eligible_for_idle_optimizaitons(struct dc *dc,
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* cleanup on driver unload */
|
||||||
|
void dc_hardware_release(struct dc *dc)
|
||||||
|
{
|
||||||
|
if (dc->hwss.hardware_release)
|
||||||
|
dc->hwss.hardware_release(dc);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1267,6 +1267,9 @@ void dc_unlock_memory_clock_frequency(struct dc *dc);
|
|||||||
*/
|
*/
|
||||||
void dc_lock_memory_clock_frequency(struct dc *dc);
|
void dc_lock_memory_clock_frequency(struct dc *dc);
|
||||||
|
|
||||||
|
/* cleanup on driver unload */
|
||||||
|
void dc_hardware_release(struct dc *dc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool dc_set_psr_allow_active(struct dc *dc, bool enable);
|
bool dc_set_psr_allow_active(struct dc *dc, bool enable);
|
||||||
|
|||||||
@@ -1434,12 +1434,6 @@ void dcn10_init_hw(struct dc *dc)
|
|||||||
|
|
||||||
if (dc->clk_mgr->funcs->notify_wm_ranges)
|
if (dc->clk_mgr->funcs->notify_wm_ranges)
|
||||||
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
|
dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
|
||||||
|
|
||||||
#ifdef CONFIG_DRM_AMD_DC_DCN3_0
|
|
||||||
if (dc->clk_mgr->funcs->set_hard_max_memclk)
|
|
||||||
dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In headless boot cases, DIG may be turned
|
/* In headless boot cases, DIG may be turned
|
||||||
|
|||||||
@@ -622,6 +622,10 @@ void dcn30_init_hw(struct dc *dc)
|
|||||||
|
|
||||||
if (dc->clk_mgr->funcs->set_hard_max_memclk)
|
if (dc->clk_mgr->funcs->set_hard_max_memclk)
|
||||||
dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr);
|
dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr);
|
||||||
|
|
||||||
|
if (dc->res_pool->hubbub->funcs->force_pstate_change_control)
|
||||||
|
dc->res_pool->hubbub->funcs->force_pstate_change_control(
|
||||||
|
dc->res_pool->hubbub, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcn30_set_avmute(struct pipe_ctx *pipe_ctx, bool enable)
|
void dcn30_set_avmute(struct pipe_ctx *pipe_ctx, bool enable)
|
||||||
@@ -711,3 +715,12 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dcn30_hardware_release(struct dc *dc)
|
||||||
|
{
|
||||||
|
/* if pstate unsupported, force it supported */
|
||||||
|
if (!dc->clk_mgr->clks.p_state_change_support &&
|
||||||
|
dc->res_pool->hubbub->funcs->force_pstate_change_control)
|
||||||
|
dc->res_pool->hubbub->funcs->force_pstate_change_control(
|
||||||
|
dc->res_pool->hubbub, true, true);
|
||||||
|
}
|
||||||
|
|||||||
@@ -67,4 +67,6 @@ void dcn30_program_dmdata_engine(struct pipe_ctx *pipe_ctx);
|
|||||||
|
|
||||||
bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable);
|
bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable);
|
||||||
|
|
||||||
|
void dcn30_hardware_release(struct dc *dc);
|
||||||
|
|
||||||
#endif /* __DC_HWSS_DCN30_H__ */
|
#endif /* __DC_HWSS_DCN30_H__ */
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ static const struct hw_sequencer_funcs dcn30_funcs = {
|
|||||||
.apply_idle_power_optimizations = dcn30_apply_idle_power_optimizations,
|
.apply_idle_power_optimizations = dcn30_apply_idle_power_optimizations,
|
||||||
.set_backlight_level = dcn21_set_backlight_level,
|
.set_backlight_level = dcn21_set_backlight_level,
|
||||||
.set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
|
.set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
|
||||||
|
.hardware_release = dcn30_hardware_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hwseq_private_funcs dcn30_private_funcs = {
|
static const struct hwseq_private_funcs dcn30_private_funcs = {
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ struct dpp;
|
|||||||
struct dce_hwseq;
|
struct dce_hwseq;
|
||||||
|
|
||||||
struct hw_sequencer_funcs {
|
struct hw_sequencer_funcs {
|
||||||
|
#ifdef CONFIG_DRM_AMD_DC_DCN3_0
|
||||||
|
void (*hardware_release)(struct dc *dc);
|
||||||
|
#endif
|
||||||
/* Embedded Display Related */
|
/* Embedded Display Related */
|
||||||
void (*edp_power_control)(struct dc_link *link, bool enable);
|
void (*edp_power_control)(struct dc_link *link, bool enable);
|
||||||
void (*edp_wait_for_hpd_ready)(struct dc_link *link, bool power_up);
|
void (*edp_wait_for_hpd_ready)(struct dc_link *link, bool power_up);
|
||||||
|
|||||||
Reference in New Issue
Block a user