diff options
author | Vitaly Prosyak <vitaly.prosyak@amd.com> | 2017-03-31 16:25:04 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 17:23:51 -0400 |
commit | ab3c179893fd44953008d1b1442973ecb1bb5c7e (patch) | |
tree | dffd0b4f65b0cd03b91a1274081fb16a1be15e3e /drivers/gpu/drm/amd/display | |
parent | 81c509633aa93442d58b895f773892b3e8d936cf (diff) |
drm/amd/display: Add support for programming stereo sync
Signed-off-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display')
6 files changed, 49 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_opp.h b/drivers/gpu/drm/amd/display/dc/dce/dce_opp.h index 03ce9ba50b64..e5045d21a05c 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_opp.h +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_opp.h | |||
@@ -174,7 +174,8 @@ enum dce110_opp_reg_type { | |||
174 | OPP_SF(DCFE_MEM_PWR_CTRL, DCP_LUT_MEM_PWR_DIS, mask_sh),\ | 174 | OPP_SF(DCFE_MEM_PWR_CTRL, DCP_LUT_MEM_PWR_DIS, mask_sh),\ |
175 | OPP_SF(DCFE_MEM_PWR_STATUS, DCP_REGAMMA_MEM_PWR_STATE, mask_sh),\ | 175 | OPP_SF(DCFE_MEM_PWR_STATUS, DCP_REGAMMA_MEM_PWR_STATE, mask_sh),\ |
176 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ | 176 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ |
177 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh) | 177 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh),\ |
178 | OPP_SF(FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, mask_sh) | ||
178 | 179 | ||
179 | #define OPP_COMMON_MASK_SH_LIST_DCE_100(mask_sh)\ | 180 | #define OPP_COMMON_MASK_SH_LIST_DCE_100(mask_sh)\ |
180 | OPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh),\ | 181 | OPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh),\ |
@@ -182,7 +183,8 @@ enum dce110_opp_reg_type { | |||
182 | OPP_SF(DCFE_MEM_PWR_CTRL, DCP_LUT_MEM_PWR_DIS, mask_sh),\ | 183 | OPP_SF(DCFE_MEM_PWR_CTRL, DCP_LUT_MEM_PWR_DIS, mask_sh),\ |
183 | OPP_SF(DCFE_MEM_PWR_STATUS, DCP_REGAMMA_MEM_PWR_STATE, mask_sh),\ | 184 | OPP_SF(DCFE_MEM_PWR_STATUS, DCP_REGAMMA_MEM_PWR_STATE, mask_sh),\ |
184 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ | 185 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ |
185 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh) | 186 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh),\ |
187 | OPP_SF(FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, mask_sh) | ||
186 | 188 | ||
187 | #define OPP_COMMON_MASK_SH_LIST_DCE_112(mask_sh)\ | 189 | #define OPP_COMMON_MASK_SH_LIST_DCE_112(mask_sh)\ |
188 | OPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh),\ | 190 | OPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh),\ |
@@ -195,7 +197,8 @@ enum dce110_opp_reg_type { | |||
195 | OPP_SF(FMT_CONTROL, FMT_420_PIXEL_PHASE_LOCKED, mask_sh),\ | 197 | OPP_SF(FMT_CONTROL, FMT_420_PIXEL_PHASE_LOCKED, mask_sh),\ |
196 | OPP_SF(FMT_CONTROL, FMT_CBCR_BIT_REDUCTION_BYPASS, mask_sh),\ | 198 | OPP_SF(FMT_CONTROL, FMT_CBCR_BIT_REDUCTION_BYPASS, mask_sh),\ |
197 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ | 199 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ |
198 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh) | 200 | OPP_SF(FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh),\ |
201 | OPP_SF(FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, mask_sh) | ||
199 | 202 | ||
200 | #define OPP_COMMON_MASK_SH_LIST_DCE_80(mask_sh)\ | 203 | #define OPP_COMMON_MASK_SH_LIST_DCE_80(mask_sh)\ |
201 | OPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh),\ | 204 | OPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh),\ |
@@ -244,6 +247,7 @@ enum dce110_opp_reg_type { | |||
244 | OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TEMPORAL_DITHER_EN, mask_sh),\ | 247 | OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TEMPORAL_DITHER_EN, mask_sh),\ |
245 | OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ | 248 | OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh),\ |
246 | OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh),\ | 249 | OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh),\ |
250 | OPP_SF(FMT0_FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, mask_sh),\ | ||
247 | OPP_SF(FMT0_FMT_DITHER_RAND_R_SEED, FMT_RAND_R_SEED, mask_sh),\ | 251 | OPP_SF(FMT0_FMT_DITHER_RAND_R_SEED, FMT_RAND_R_SEED, mask_sh),\ |
248 | OPP_SF(FMT0_FMT_DITHER_RAND_G_SEED, FMT_RAND_G_SEED, mask_sh),\ | 252 | OPP_SF(FMT0_FMT_DITHER_RAND_G_SEED, FMT_RAND_G_SEED, mask_sh),\ |
249 | OPP_SF(FMT0_FMT_DITHER_RAND_B_SEED, FMT_RAND_B_SEED, mask_sh),\ | 253 | OPP_SF(FMT0_FMT_DITHER_RAND_B_SEED, FMT_RAND_B_SEED, mask_sh),\ |
@@ -308,6 +312,7 @@ enum dce110_opp_reg_type { | |||
308 | type FMT_RGB_RANDOM_ENABLE; \ | 312 | type FMT_RGB_RANDOM_ENABLE; \ |
309 | type FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX; \ | 313 | type FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX; \ |
310 | type FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP; \ | 314 | type FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP; \ |
315 | type FMT_STEREOSYNC_OVERRIDE; \ | ||
311 | type FMT_RAND_R_SEED; \ | 316 | type FMT_RAND_R_SEED; \ |
312 | type FMT_RAND_G_SEED; \ | 317 | type FMT_RAND_G_SEED; \ |
313 | type FMT_RAND_B_SEED; \ | 318 | type FMT_RAND_B_SEED; \ |
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c index f3e1a293351f..9713def6e481 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c | |||
@@ -1286,6 +1286,17 @@ void dce110_se_hdmi_audio_disable( | |||
1286 | dce110_se_enable_audio_clock(enc, false); | 1286 | dce110_se_enable_audio_clock(enc, false); |
1287 | } | 1287 | } |
1288 | 1288 | ||
1289 | |||
1290 | static void setup_stereo_sync( | ||
1291 | struct stream_encoder *enc, | ||
1292 | int tg_inst, bool enable) | ||
1293 | { | ||
1294 | struct dce110_stream_encoder *enc110 = DCE110STRENC_FROM_STRENC(enc); | ||
1295 | REG_UPDATE(DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, tg_inst); | ||
1296 | REG_UPDATE(DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, !enable); | ||
1297 | } | ||
1298 | |||
1299 | |||
1289 | static const struct stream_encoder_funcs dce110_str_enc_funcs = { | 1300 | static const struct stream_encoder_funcs dce110_str_enc_funcs = { |
1290 | .dp_set_stream_attribute = | 1301 | .dp_set_stream_attribute = |
1291 | dce110_stream_encoder_dp_set_stream_attribute, | 1302 | dce110_stream_encoder_dp_set_stream_attribute, |
@@ -1316,6 +1327,7 @@ static const struct stream_encoder_funcs dce110_str_enc_funcs = { | |||
1316 | 1327 | ||
1317 | .hdmi_audio_setup = dce110_se_hdmi_audio_setup, | 1328 | .hdmi_audio_setup = dce110_se_hdmi_audio_setup, |
1318 | .hdmi_audio_disable = dce110_se_hdmi_audio_disable, | 1329 | .hdmi_audio_disable = dce110_se_hdmi_audio_disable, |
1330 | .setup_stereo_sync = setup_stereo_sync, | ||
1319 | }; | 1331 | }; |
1320 | 1332 | ||
1321 | bool dce110_stream_encoder_construct( | 1333 | bool dce110_stream_encoder_construct( |
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h index c2f4050fc6dc..850e12a8db61 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h | |||
@@ -151,6 +151,8 @@ | |||
151 | SE_SF(DP_VID_N, DP_VID_N, mask_sh),\ | 151 | SE_SF(DP_VID_N, DP_VID_N, mask_sh),\ |
152 | SE_SF(DP_VID_M, DP_VID_M, mask_sh),\ | 152 | SE_SF(DP_VID_M, DP_VID_M, mask_sh),\ |
153 | SE_SF(DIG_FE_CNTL, DIG_START, mask_sh),\ | 153 | SE_SF(DIG_FE_CNTL, DIG_START, mask_sh),\ |
154 | SE_SF(DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\ | ||
155 | SE_SF(DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\ | ||
154 | SE_SF(AFMT_AUDIO_SRC_CONTROL, AFMT_AUDIO_SRC_SELECT, mask_sh),\ | 156 | SE_SF(AFMT_AUDIO_SRC_CONTROL, AFMT_AUDIO_SRC_SELECT, mask_sh),\ |
155 | SE_SF(AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_CHANNEL_ENABLE, mask_sh),\ | 157 | SE_SF(AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_CHANNEL_ENABLE, mask_sh),\ |
156 | SE_SF(HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_PACKETS_PER_LINE, mask_sh),\ | 158 | SE_SF(HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_PACKETS_PER_LINE, mask_sh),\ |
@@ -265,7 +267,9 @@ | |||
265 | SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\ | 267 | SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\ |
266 | SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\ | 268 | SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\ |
267 | SE_SF(DIG0_DIG_FE_CNTL, TMDS_PIXEL_ENCODING, mask_sh),\ | 269 | SE_SF(DIG0_DIG_FE_CNTL, TMDS_PIXEL_ENCODING, mask_sh),\ |
268 | SE_SF(DIG0_DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh) | 270 | SE_SF(DIG0_DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh),\ |
271 | SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\ | ||
272 | SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh) | ||
269 | 273 | ||
270 | #define SE_COMMON_MASK_SH_LIST_SOC(mask_sh)\ | 274 | #define SE_COMMON_MASK_SH_LIST_SOC(mask_sh)\ |
271 | SE_COMMON_MASK_SH_LIST_SOC_BASE(mask_sh) | 275 | SE_COMMON_MASK_SH_LIST_SOC_BASE(mask_sh) |
@@ -281,7 +285,9 @@ | |||
281 | SE_SF(HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\ | 285 | SE_SF(HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\ |
282 | SE_SF(HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\ | 286 | SE_SF(HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\ |
283 | SE_SF(DIG_FE_CNTL, TMDS_PIXEL_ENCODING, mask_sh),\ | 287 | SE_SF(DIG_FE_CNTL, TMDS_PIXEL_ENCODING, mask_sh),\ |
284 | SE_SF(DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh) | 288 | SE_SF(DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh),\ |
289 | SE_SF(DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\ | ||
290 | SE_SF(DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh) | ||
285 | 291 | ||
286 | #define SE_COMMON_MASK_SH_LIST_DCE112(mask_sh)\ | 292 | #define SE_COMMON_MASK_SH_LIST_DCE112(mask_sh)\ |
287 | SE_COMMON_MASK_SH_LIST_DCE_COMMON(mask_sh),\ | 293 | SE_COMMON_MASK_SH_LIST_DCE_COMMON(mask_sh),\ |
@@ -416,6 +422,8 @@ struct dce_stream_encoder_shift { | |||
416 | uint8_t AFMT_AUDIO_CLOCK_EN; | 422 | uint8_t AFMT_AUDIO_CLOCK_EN; |
417 | uint8_t TMDS_PIXEL_ENCODING; | 423 | uint8_t TMDS_PIXEL_ENCODING; |
418 | uint8_t TMDS_COLOR_FORMAT; | 424 | uint8_t TMDS_COLOR_FORMAT; |
425 | uint8_t DIG_STEREOSYNC_SELECT; | ||
426 | uint8_t DIG_STEREOSYNC_GATE_EN; | ||
419 | uint8_t DP_DB_DISABLE; | 427 | uint8_t DP_DB_DISABLE; |
420 | uint8_t DP_MSA_MISC0; | 428 | uint8_t DP_MSA_MISC0; |
421 | uint8_t DP_MSA_HTOTAL; | 429 | uint8_t DP_MSA_HTOTAL; |
@@ -543,6 +551,8 @@ struct dce_stream_encoder_mask { | |||
543 | uint32_t AFMT_AUDIO_SAMPLE_SEND; | 551 | uint32_t AFMT_AUDIO_SAMPLE_SEND; |
544 | uint32_t AFMT_AUDIO_CLOCK_EN; | 552 | uint32_t AFMT_AUDIO_CLOCK_EN; |
545 | uint32_t TMDS_PIXEL_ENCODING; | 553 | uint32_t TMDS_PIXEL_ENCODING; |
554 | uint32_t DIG_STEREOSYNC_SELECT; | ||
555 | uint32_t DIG_STEREOSYNC_GATE_EN; | ||
546 | uint32_t TMDS_COLOR_FORMAT; | 556 | uint32_t TMDS_COLOR_FORMAT; |
547 | uint32_t DP_DB_DISABLE; | 557 | uint32_t DP_DB_DISABLE; |
548 | uint32_t DP_MSA_MISC0; | 558 | uint32_t DP_MSA_MISC0; |
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index 1401331080c5..6bf03d680314 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | |||
@@ -1056,6 +1056,13 @@ static enum dc_status apply_single_controller_ctx_to_hw( | |||
1056 | stream->sink->link->link_enc, | 1056 | stream->sink->link->link_enc, |
1057 | pipe_ctx->stream->signal); | 1057 | pipe_ctx->stream->signal); |
1058 | 1058 | ||
1059 | if (pipe_ctx->stream->signal != SIGNAL_TYPE_VIRTUAL) | ||
1060 | pipe_ctx->stream_enc->funcs->setup_stereo_sync( | ||
1061 | pipe_ctx->stream_enc, | ||
1062 | pipe_ctx->tg->inst, | ||
1063 | stream->public.timing.timing_3d_format != TIMING_3D_FORMAT_NONE); | ||
1064 | |||
1065 | |||
1059 | /*vbios crtc_source_selection and encoder_setup will override fmt_C*/ | 1066 | /*vbios crtc_source_selection and encoder_setup will override fmt_C*/ |
1060 | pipe_ctx->opp->funcs->opp_program_fmt( | 1067 | pipe_ctx->opp->funcs->opp_program_fmt( |
1061 | pipe_ctx->opp, | 1068 | pipe_ctx->opp, |
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h index e01b831a7e7f..521bd21eb5df 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/opp.h | |||
@@ -316,6 +316,11 @@ struct opp_funcs { | |||
316 | struct hw_adjustment_range *range); | 316 | struct hw_adjustment_range *range); |
317 | 317 | ||
318 | void (*opp_destroy)(struct output_pixel_processor **opp); | 318 | void (*opp_destroy)(struct output_pixel_processor **opp); |
319 | |||
320 | void (*opp_set_stereo_polarity)( | ||
321 | struct output_pixel_processor *opp, | ||
322 | bool enable, | ||
323 | bool rightEyePolarity); | ||
319 | }; | 324 | }; |
320 | 325 | ||
321 | #endif | 326 | #endif |
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h index 674bebfe3bd2..9fb27bd360ac 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h | |||
@@ -118,6 +118,11 @@ struct stream_encoder_funcs { | |||
118 | 118 | ||
119 | void (*hdmi_audio_disable) ( | 119 | void (*hdmi_audio_disable) ( |
120 | struct stream_encoder *enc); | 120 | struct stream_encoder *enc); |
121 | |||
122 | void (*setup_stereo_sync) ( | ||
123 | struct stream_encoder *enc, | ||
124 | int tg_inst, | ||
125 | bool enable); | ||
121 | }; | 126 | }; |
122 | 127 | ||
123 | #endif /* STREAM_ENCODER_H_ */ | 128 | #endif /* STREAM_ENCODER_H_ */ |