Commit 470e2ca5 authored by Bayan Zabihiyan's avatar Bayan Zabihiyan Committed by Alex Deucher

drm/amd/display: Expose OTG_V_TOTAL_MID for HW Diags

[Why]
Existing HW Features, HW Diags test requested that the
registers be exposed.

[How]
Add V_TOTAL_MID to existing DC structures.
Make sure values are passed down throughout DC
Add Register definition.
Program the additional registers
Add additional Logic for V_TOTAL_CONTROL.
Signed-off-by: default avatarBayan Zabihiyan <bayan.zabihiyan@amd.com>
Reviewed-by: default avatarCharlene Liu <Charlene.Liu@amd.com>
Acked-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b1a47f53
...@@ -291,7 +291,9 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc, ...@@ -291,7 +291,9 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
dc->hwss.set_drr(&pipe, dc->hwss.set_drr(&pipe,
1, 1,
adjust->v_total_min, adjust->v_total_min,
adjust->v_total_max); adjust->v_total_max,
adjust->v_total_mid,
adjust->v_total_mid_frame_num);
ret = true; ret = true;
} }
......
...@@ -757,6 +757,8 @@ struct crtc_trigger_info { ...@@ -757,6 +757,8 @@ struct crtc_trigger_info {
struct dc_crtc_timing_adjust { struct dc_crtc_timing_adjust {
uint32_t v_total_min; uint32_t v_total_min;
uint32_t v_total_max; uint32_t v_total_max;
uint32_t v_total_mid;
uint32_t v_total_mid_frame_num;
}; };
#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
......
...@@ -1719,7 +1719,8 @@ void dce110_set_safe_displaymarks( ...@@ -1719,7 +1719,8 @@ void dce110_set_safe_displaymarks(
******************************************************************************/ ******************************************************************************/
static void set_drr(struct pipe_ctx **pipe_ctx, static void set_drr(struct pipe_ctx **pipe_ctx,
int num_pipes, int vmin, int vmax) int num_pipes, unsigned int vmin, unsigned int vmax,
unsigned int vmid, unsigned int vmid_frame_number)
{ {
int i = 0; int i = 0;
struct drr_params params = {0}; struct drr_params params = {0};
......
...@@ -2747,7 +2747,8 @@ static void dcn10_optimize_bandwidth( ...@@ -2747,7 +2747,8 @@ static void dcn10_optimize_bandwidth(
} }
static void dcn10_set_drr(struct pipe_ctx **pipe_ctx, static void dcn10_set_drr(struct pipe_ctx **pipe_ctx,
int num_pipes, int vmin, int vmax) int num_pipes, unsigned int vmin, unsigned int vmax,
unsigned int vmid, unsigned int vmid_frame_number)
{ {
int i = 0; int i = 0;
struct drr_params params = {0}; struct drr_params params = {0};
...@@ -2756,6 +2757,8 @@ static void dcn10_set_drr(struct pipe_ctx **pipe_ctx, ...@@ -2756,6 +2757,8 @@ static void dcn10_set_drr(struct pipe_ctx **pipe_ctx,
params.vertical_total_max = vmax; params.vertical_total_max = vmax;
params.vertical_total_min = vmin; params.vertical_total_min = vmin;
params.vertical_total_mid = vmid;
params.vertical_total_mid_frame_num = vmid_frame_number;
/* TODO: If multiple pipes are to be supported, you need /* TODO: If multiple pipes are to be supported, you need
* some GSL stuff. Static screen triggers may be programmed differently * some GSL stuff. Static screen triggers may be programmed differently
......
...@@ -850,6 +850,18 @@ void optc1_set_drr( ...@@ -850,6 +850,18 @@ void optc1_set_drr(
params->vertical_total_max > 0 && params->vertical_total_max > 0 &&
params->vertical_total_min > 0) { params->vertical_total_min > 0) {
if (params->vertical_total_mid != 0) {
REG_SET(OTG_V_TOTAL_MID, 0,
OTG_V_TOTAL_MID, params->vertical_total_mid - 1);
REG_UPDATE_2(OTG_V_TOTAL_CONTROL,
OTG_VTOTAL_MID_REPLACING_MAX_EN, 1,
OTG_VTOTAL_MID_FRAME_NUM,
(uint8_t)params->vertical_total_mid_frame_num);
}
REG_SET(OTG_V_TOTAL_MAX, 0, REG_SET(OTG_V_TOTAL_MAX, 0,
OTG_V_TOTAL_MAX, params->vertical_total_max - 1); OTG_V_TOTAL_MAX, params->vertical_total_max - 1);
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
SRI(OTG_3D_STRUCTURE_CONTROL, OTG, inst),\ SRI(OTG_3D_STRUCTURE_CONTROL, OTG, inst),\
SRI(OTG_STEREO_STATUS, OTG, inst),\ SRI(OTG_STEREO_STATUS, OTG, inst),\
SRI(OTG_V_TOTAL_MAX, OTG, inst),\ SRI(OTG_V_TOTAL_MAX, OTG, inst),\
SRI(OTG_V_TOTAL_MID, OTG, inst),\
SRI(OTG_V_TOTAL_MIN, OTG, inst),\ SRI(OTG_V_TOTAL_MIN, OTG, inst),\
SRI(OTG_V_TOTAL_CONTROL, OTG, inst),\ SRI(OTG_V_TOTAL_CONTROL, OTG, inst),\
SRI(OTG_TRIGA_CNTL, OTG, inst),\ SRI(OTG_TRIGA_CNTL, OTG, inst),\
...@@ -125,6 +126,7 @@ struct dcn_optc_registers { ...@@ -125,6 +126,7 @@ struct dcn_optc_registers {
uint32_t OTG_3D_STRUCTURE_CONTROL; uint32_t OTG_3D_STRUCTURE_CONTROL;
uint32_t OTG_STEREO_STATUS; uint32_t OTG_STEREO_STATUS;
uint32_t OTG_V_TOTAL_MAX; uint32_t OTG_V_TOTAL_MAX;
uint32_t OTG_V_TOTAL_MID;
uint32_t OTG_V_TOTAL_MIN; uint32_t OTG_V_TOTAL_MIN;
uint32_t OTG_V_TOTAL_CONTROL; uint32_t OTG_V_TOTAL_CONTROL;
uint32_t OTG_TRIGA_CNTL; uint32_t OTG_TRIGA_CNTL;
...@@ -214,12 +216,15 @@ struct dcn_optc_registers { ...@@ -214,12 +216,15 @@ struct dcn_optc_registers {
SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_V_UPDATE_MODE, mask_sh),\ SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_V_UPDATE_MODE, mask_sh),\
SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_STEREO_SEL_OVR, mask_sh),\ SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_STEREO_SEL_OVR, mask_sh),\
SF(OTG0_OTG_V_TOTAL_MAX, OTG_V_TOTAL_MAX, mask_sh),\ SF(OTG0_OTG_V_TOTAL_MAX, OTG_V_TOTAL_MAX, mask_sh),\
SF(OTG0_OTG_V_TOTAL_MID, OTG_V_TOTAL_MID, mask_sh),\
SF(OTG0_OTG_V_TOTAL_MIN, OTG_V_TOTAL_MIN, mask_sh),\ SF(OTG0_OTG_V_TOTAL_MIN, OTG_V_TOTAL_MIN, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_V_TOTAL_MIN_SEL, mask_sh),\ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_V_TOTAL_MIN_SEL, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_V_TOTAL_MAX_SEL, mask_sh),\ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_V_TOTAL_MAX_SEL, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_FORCE_LOCK_ON_EVENT, mask_sh),\ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_FORCE_LOCK_ON_EVENT, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_SET_V_TOTAL_MIN_MASK_EN, mask_sh),\ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_SET_V_TOTAL_MIN_MASK_EN, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_SET_V_TOTAL_MIN_MASK, mask_sh),\ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_SET_V_TOTAL_MIN_MASK, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_VTOTAL_MID_REPLACING_MAX_EN, mask_sh),\
SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_VTOTAL_MID_FRAME_NUM, mask_sh),\
SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_CLEAR, mask_sh),\ SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_CLEAR, mask_sh),\
SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_MODE, mask_sh),\ SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_MODE, mask_sh),\
SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_OCCURRED, mask_sh),\ SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_OCCURRED, mask_sh),\
...@@ -348,9 +353,12 @@ struct dcn_optc_registers { ...@@ -348,9 +353,12 @@ struct dcn_optc_registers {
type OTG_3D_STRUCTURE_V_UPDATE_MODE;\ type OTG_3D_STRUCTURE_V_UPDATE_MODE;\
type OTG_3D_STRUCTURE_STEREO_SEL_OVR;\ type OTG_3D_STRUCTURE_STEREO_SEL_OVR;\
type OTG_V_TOTAL_MAX;\ type OTG_V_TOTAL_MAX;\
type OTG_V_TOTAL_MID;\
type OTG_V_TOTAL_MIN;\ type OTG_V_TOTAL_MIN;\
type OTG_V_TOTAL_MIN_SEL;\ type OTG_V_TOTAL_MIN_SEL;\
type OTG_V_TOTAL_MAX_SEL;\ type OTG_V_TOTAL_MAX_SEL;\
type OTG_VTOTAL_MID_REPLACING_MAX_EN;\
type OTG_VTOTAL_MID_FRAME_NUM;\
type OTG_FORCE_LOCK_ON_EVENT;\ type OTG_FORCE_LOCK_ON_EVENT;\
type OTG_SET_V_TOTAL_MIN_MASK_EN;\ type OTG_SET_V_TOTAL_MIN_MASK_EN;\
type OTG_SET_V_TOTAL_MIN_MASK;\ type OTG_SET_V_TOTAL_MIN_MASK;\
......
...@@ -597,6 +597,8 @@ enum dc_status dcn20_enable_stream_timing( ...@@ -597,6 +597,8 @@ enum dc_status dcn20_enable_stream_timing(
params.vertical_total_min = stream->adjust.v_total_min; params.vertical_total_min = stream->adjust.v_total_min;
params.vertical_total_max = stream->adjust.v_total_max; params.vertical_total_max = stream->adjust.v_total_max;
params.vertical_total_mid = stream->adjust.v_total_mid;
params.vertical_total_mid_frame_num = stream->adjust.v_total_mid_frame_num;
if (pipe_ctx->stream_res.tg->funcs->set_drr) if (pipe_ctx->stream_res.tg->funcs->set_drr)
pipe_ctx->stream_res.tg->funcs->set_drr( pipe_ctx->stream_res.tg->funcs->set_drr(
pipe_ctx->stream_res.tg, &params); pipe_ctx->stream_res.tg, &params);
......
...@@ -59,6 +59,8 @@ struct gsl_params { ...@@ -59,6 +59,8 @@ struct gsl_params {
struct drr_params { struct drr_params {
uint32_t vertical_total_min; uint32_t vertical_total_min;
uint32_t vertical_total_max; uint32_t vertical_total_max;
uint32_t vertical_total_mid;
uint32_t vertical_total_mid_frame_num;
bool immediate_flip; bool immediate_flip;
}; };
......
...@@ -237,7 +237,8 @@ struct hw_sequencer_funcs { ...@@ -237,7 +237,8 @@ struct hw_sequencer_funcs {
#endif #endif
void (*set_drr)(struct pipe_ctx **pipe_ctx, int num_pipes, void (*set_drr)(struct pipe_ctx **pipe_ctx, int num_pipes,
int vmin, int vmax); unsigned int vmin, unsigned int vmax,
unsigned int vmid, unsigned int vmid_frame_number);
void (*get_position)(struct pipe_ctx **pipe_ctx, int num_pipes, void (*get_position)(struct pipe_ctx **pipe_ctx, int num_pipes,
struct crtc_position *position); struct crtc_position *position);
......
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