mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 23:54:04 +08:00
drm/amd/display: Enable pflip interrupt upon pipe enable
[Why] pflip interrupt would not be enabled promptly if a pipe is disabled and re-enabled, causing flip_done timeout error during DP compliance tests [How] Enable pflip interrupt upon pipe enablement Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Qingqing Zhuo <qingqing.zhuo@amd.com> Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> Acked-by: Eryk Brol <eryk.brol@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
680174cfd1
commit
7afa0033d6
@ -4725,6 +4725,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev,
|
||||
dc_plane_state->global_alpha_value = plane_info.global_alpha_value;
|
||||
dc_plane_state->dcc = plane_info.dcc;
|
||||
dc_plane_state->layer_index = plane_info.layer_index; // Always returns 0
|
||||
dc_plane_state->flip_int_enabled = true;
|
||||
|
||||
/*
|
||||
* Always set input transfer function, since plane state is refreshed
|
||||
|
@ -887,6 +887,7 @@ struct dc_plane_state {
|
||||
int layer_index;
|
||||
|
||||
union surface_update_flags update_flags;
|
||||
bool flip_int_enabled;
|
||||
/* private to DC core */
|
||||
struct dc_plane_status status;
|
||||
struct dc_context *ctx;
|
||||
|
@ -1257,6 +1257,16 @@ void hubp1_soft_reset(struct hubp *hubp, bool reset)
|
||||
REG_UPDATE(DCHUBP_CNTL, HUBP_DISABLE, reset ? 1 : 0);
|
||||
}
|
||||
|
||||
void hubp1_set_flip_int(struct hubp *hubp)
|
||||
{
|
||||
struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
|
||||
|
||||
REG_UPDATE(DCSURF_SURFACE_FLIP_INTERRUPT,
|
||||
SURFACE_FLIP_INT_MASK, 1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void hubp1_init(struct hubp *hubp)
|
||||
{
|
||||
//do nothing
|
||||
@ -1290,6 +1300,7 @@ static const struct hubp_funcs dcn10_hubp_funcs = {
|
||||
.dmdata_load = NULL,
|
||||
.hubp_soft_reset = hubp1_soft_reset,
|
||||
.hubp_in_blank = hubp1_in_blank,
|
||||
.hubp_set_flip_int = hubp1_set_flip_int,
|
||||
};
|
||||
|
||||
/*****************************************/
|
||||
|
@ -74,6 +74,7 @@
|
||||
SRI(DCSURF_SURFACE_EARLIEST_INUSE_C, HUBPREQ, id),\
|
||||
SRI(DCSURF_SURFACE_EARLIEST_INUSE_HIGH_C, HUBPREQ, id),\
|
||||
SRI(DCSURF_SURFACE_CONTROL, HUBPREQ, id),\
|
||||
SRI(DCSURF_SURFACE_FLIP_INTERRUPT, HUBPREQ, id),\
|
||||
SRI(HUBPRET_CONTROL, HUBPRET, id),\
|
||||
SRI(DCN_EXPANSION_MODE, HUBPREQ, id),\
|
||||
SRI(DCHUBP_REQ_SIZE_CONFIG, HUBP, id),\
|
||||
@ -183,6 +184,7 @@
|
||||
uint32_t DCSURF_SURFACE_EARLIEST_INUSE_C; \
|
||||
uint32_t DCSURF_SURFACE_EARLIEST_INUSE_HIGH_C; \
|
||||
uint32_t DCSURF_SURFACE_CONTROL; \
|
||||
uint32_t DCSURF_SURFACE_FLIP_INTERRUPT; \
|
||||
uint32_t HUBPRET_CONTROL; \
|
||||
uint32_t DCN_EXPANSION_MODE; \
|
||||
uint32_t DCHUBP_REQ_SIZE_CONFIG; \
|
||||
@ -332,6 +334,7 @@
|
||||
HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_META_SURFACE_TMZ_C, mask_sh),\
|
||||
HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_SURFACE_DCC_EN, mask_sh),\
|
||||
HUBP_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, SECONDARY_SURFACE_DCC_IND_64B_BLK, mask_sh),\
|
||||
HUBP_SF(HUBPREQ0_DCSURF_SURFACE_FLIP_INTERRUPT, SURFACE_FLIP_INT_MASK, mask_sh),\
|
||||
HUBP_SF(HUBPRET0_HUBPRET_CONTROL, DET_BUF_PLANE1_BASE_ADDRESS, mask_sh),\
|
||||
HUBP_SF(HUBPRET0_HUBPRET_CONTROL, CROSSBAR_SRC_CB_B, mask_sh),\
|
||||
HUBP_SF(HUBPRET0_HUBPRET_CONTROL, CROSSBAR_SRC_CR_R, mask_sh),\
|
||||
@ -531,6 +534,7 @@
|
||||
type PRIMARY_SURFACE_DCC_IND_64B_BLK;\
|
||||
type SECONDARY_SURFACE_DCC_EN;\
|
||||
type SECONDARY_SURFACE_DCC_IND_64B_BLK;\
|
||||
type SURFACE_FLIP_INT_MASK;\
|
||||
type DET_BUF_PLANE1_BASE_ADDRESS;\
|
||||
type CROSSBAR_SRC_CB_B;\
|
||||
type CROSSBAR_SRC_CR_R;\
|
||||
@ -777,4 +781,6 @@ void hubp1_read_state_common(struct hubp *hubp);
|
||||
bool hubp1_in_blank(struct hubp *hubp);
|
||||
void hubp1_soft_reset(struct hubp *hubp, bool reset);
|
||||
|
||||
void hubp1_set_flip_int(struct hubp *hubp);
|
||||
|
||||
#endif
|
||||
|
@ -2196,6 +2196,13 @@ static void dcn10_enable_plane(
|
||||
if (dc->debug.sanity_checks) {
|
||||
hws->funcs.verify_allow_pstate_change_high(dc);
|
||||
}
|
||||
|
||||
if (!pipe_ctx->top_pipe
|
||||
&& pipe_ctx->plane_state
|
||||
&& pipe_ctx->plane_state->flip_int_enabled
|
||||
&& pipe_ctx->plane_res.hubp->funcs->hubp_set_flip_int)
|
||||
pipe_ctx->plane_res.hubp->funcs->hubp_set_flip_int(pipe_ctx->plane_res.hubp);
|
||||
|
||||
}
|
||||
|
||||
void dcn10_program_gamut_remap(struct pipe_ctx *pipe_ctx)
|
||||
|
@ -1597,6 +1597,7 @@ static struct hubp_funcs dcn20_hubp_funcs = {
|
||||
.validate_dml_output = hubp2_validate_dml_output,
|
||||
.hubp_in_blank = hubp1_in_blank,
|
||||
.hubp_soft_reset = hubp1_soft_reset,
|
||||
.hubp_set_flip_int = hubp1_set_flip_int,
|
||||
};
|
||||
|
||||
|
||||
|
@ -1146,6 +1146,12 @@ void dcn20_enable_plane(
|
||||
pipe_ctx->plane_res.hubp->funcs->hubp_set_vm_system_aperture_settings(pipe_ctx->plane_res.hubp, &apt);
|
||||
}
|
||||
|
||||
if (!pipe_ctx->top_pipe
|
||||
&& pipe_ctx->plane_state
|
||||
&& pipe_ctx->plane_state->flip_int_enabled
|
||||
&& pipe_ctx->plane_res.hubp->funcs->hubp_set_flip_int)
|
||||
pipe_ctx->plane_res.hubp->funcs->hubp_set_flip_int(pipe_ctx->plane_res.hubp);
|
||||
|
||||
// if (dc->debug.sanity_checks) {
|
||||
// dcn10_verify_allow_pstate_change_high(dc);
|
||||
// }
|
||||
|
@ -838,6 +838,7 @@ static struct hubp_funcs dcn21_hubp_funcs = {
|
||||
.hubp_set_flip_control_surface_gsl = hubp2_set_flip_control_surface_gsl,
|
||||
.hubp_init = hubp21_init,
|
||||
.validate_dml_output = hubp21_validate_dml_output,
|
||||
.hubp_set_flip_int = hubp1_set_flip_int,
|
||||
};
|
||||
|
||||
bool hubp21_construct(
|
||||
|
@ -511,6 +511,7 @@ static struct hubp_funcs dcn30_hubp_funcs = {
|
||||
.hubp_init = hubp3_init,
|
||||
.hubp_in_blank = hubp1_in_blank,
|
||||
.hubp_soft_reset = hubp1_soft_reset,
|
||||
.hubp_set_flip_int = hubp1_set_flip_int,
|
||||
};
|
||||
|
||||
bool hubp3_construct(
|
||||
|
@ -191,6 +191,8 @@ struct hubp_funcs {
|
||||
bool (*hubp_in_blank)(struct hubp *hubp);
|
||||
void (*hubp_soft_reset)(struct hubp *hubp, bool reset);
|
||||
|
||||
void (*hubp_set_flip_int)(struct hubp *hubp);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user