aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display
diff options
context:
space:
mode:
authorVitaly Prosyak <vitaly.prosyak@amd.com>2017-03-31 16:25:04 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 17:23:51 -0400
commitab3c179893fd44953008d1b1442973ecb1bb5c7e (patch)
treedffd0b4f65b0cd03b91a1274081fb16a1be15e3e /drivers/gpu/drm/amd/display
parent81c509633aa93442d58b895f773892b3e8d936cf (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')
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_opp.h11
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c12
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h14
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c7
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/opp.h5
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h5
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
1290static 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
1289static const struct stream_encoder_funcs dce110_str_enc_funcs = { 1300static 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
1321bool dce110_stream_encoder_construct( 1333bool 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_ */