drm/amd/display: Add frame alternate 3D & restrict HW packed on dongles
authorDillon Varone <dillon.varone@amd.com>
Mon, 14 Feb 2022 15:47:46 +0000 (10:47 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 2 Mar 2022 23:40:05 +0000 (18:40 -0500)
[WHY?]
Some projectors support frame alternate 3D modes at 120Hz, but DAL3 does
not create timings. Most active DP to HDMI dongles do not translate
infoframes properly to use HW packing stereo mode.

[HOW?]
Create frame alternate 3D timings for displays that support it. Disable HW
packing 3D mode on DP active dongles.

Reviewed-by: Martin Leung <Martin.Leung@amd.com>
Acked-by: Alan Liu <HaoPing.Liu@amd.com>
Signed-off-by: Dillon Varone <dillon.varone@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c

index 27f3fc416448a706d3dca6e9181f6da1fbea651f..045d33375133bdba564458083df6e6137494841e 100644 (file)
@@ -2801,6 +2801,17 @@ static bool dp_active_dongle_validate_timing(
                        return false;
                }
 
+               /* Check 3D format */
+               switch (timing->timing_3d_format) {
+               case TIMING_3D_FORMAT_NONE:
+               case TIMING_3D_FORMAT_FRAME_ALTERNATE:
+                       /*Only frame alternate 3D is supported on active dongle*/
+                       break;
+               default:
+                       /*other 3D formats are not supported due to bad infoframe translation */
+                       return false;
+               }
+
 #if defined(CONFIG_DRM_AMD_DC_DCN)
                if (dongle_caps->dp_hdmi_frl_max_link_bw_in_kbps > 0) { // DP to HDMI FRL converter
                        struct dc_crtc_timing outputTiming = *timing;
index 559aa45f27e7ea7862fb31c3061c7324ffe00ea2..b467c0376027ddf23c0b971587c9deafd325ce97 100644 (file)
@@ -3093,7 +3093,8 @@ static void dcn10_config_stereo_parameters(
 
                flags->PROGRAM_STEREO         = 1;
                flags->PROGRAM_POLARITY       = 1;
-               if (timing_3d_format == TIMING_3D_FORMAT_INBAND_FA ||
+               if (timing_3d_format == TIMING_3D_FORMAT_FRAME_ALTERNATE ||
+                       timing_3d_format == TIMING_3D_FORMAT_INBAND_FA ||
                        timing_3d_format == TIMING_3D_FORMAT_DP_HDMI_INBAND_FA ||
                        timing_3d_format == TIMING_3D_FORMAT_SIDEBAND_FA) {
                        enum display_dongle_type dongle = \
index dc1752e9f461fbe7dbee4f35fdb1fc333a40f7bc..33d74ecd893d7bfdf52fd880dfeb9c43096146e5 100644 (file)
@@ -707,17 +707,6 @@ bool hubp2_program_surface_flip_and_addr(
        REG_UPDATE(VMID_SETTINGS_0,
                        VMID, address->vmid);
 
-       if (address->type == PLN_ADDR_TYPE_GRPH_STEREO) {
-               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, 0x1);
-               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, 0x1);
-
-       } else {
-               // turn off stereo if not in stereo
-               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_MODE_FOR_STEREOSYNC, 0x0);
-               REG_UPDATE(DCSURF_FLIP_CONTROL, SURFACE_FLIP_IN_STEREOSYNC, 0x0);
-       }
-
-
 
        /* HW automatically latch rest of address register on write to
         * DCSURF_PRIMARY_SURFACE_ADDRESS if SURFACE_UPDATE_LOCK is not used