drm/amd/display: Add new set_fc_enable to struct dwbc_funcs
authorAlex Hung <alex.hung@amd.com>
Fri, 1 Dec 2023 13:25:38 +0000 (06:25 -0700)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Dec 2023 20:22:35 +0000 (15:22 -0500)
[WHAT]
Add a function to enable and disable DWB's frame captures.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dwb.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dwb.h
drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h

index 0d98918bf0fc4138a2aebedf4690753970e89535..1b9d9495f76de939be2eea742ba611341170ad8d 100644 (file)
@@ -130,6 +130,28 @@ bool dwb3_disable(struct dwbc *dwbc)
        return true;
 }
 
+void dwb3_set_fc_enable(struct dwbc *dwbc, enum dwb_frame_capture_enable enable)
+{
+       struct dcn30_dwbc *dwbc30 = TO_DCN30_DWBC(dwbc);
+       unsigned int pre_locked;
+
+       REG_GET(DWB_UPDATE_CTRL, DWB_UPDATE_LOCK, &pre_locked);
+
+       /* Lock DWB registers */
+       if (pre_locked == 0)
+               REG_UPDATE(DWB_UPDATE_CTRL, DWB_UPDATE_LOCK, 1);
+
+       /* Disable FC */
+       REG_UPDATE(FC_MODE_CTRL, FC_FRAME_CAPTURE_EN, enable);
+
+       /* Unlock DWB registers */
+       if (pre_locked == 0)
+               REG_UPDATE(DWB_UPDATE_CTRL, DWB_UPDATE_LOCK, 0);
+
+       DC_LOG_DWB("%s dwb3_fc_disabled at inst = %d", __func__, dwbc->inst);
+}
+
+
 bool dwb3_update(struct dwbc *dwbc, struct dc_dwb_params *params)
 {
        struct dcn30_dwbc *dwbc30 = TO_DCN30_DWBC(dwbc);
@@ -226,6 +248,7 @@ static const struct dwbc_funcs dcn30_dwbc_funcs = {
        .disable                = dwb3_disable,
        .update                 = dwb3_update,
        .is_enabled             = dwb3_is_enabled,
+       .set_fc_enable          = dwb3_set_fc_enable,
        .set_stereo             = dwb3_set_stereo,
        .set_new_content        = dwb3_set_new_content,
        .dwb_program_output_csc = NULL,
index a5d1b81e768dd842ea115225eb823c658d26d68a..332634b76aacdad95c3fdcf7865bc3a8f67c08c6 100644 (file)
@@ -877,6 +877,8 @@ bool dwb3_update(struct dwbc *dwbc, struct dc_dwb_params *params);
 
 bool dwb3_is_enabled(struct dwbc *dwbc);
 
+void dwb3_set_fc_enable(struct dwbc *dwbc, enum dwb_frame_capture_enable enable);
+
 void dwb3_set_stereo(struct dwbc *dwbc,
        struct dwb_stereo_params *stereo_params);
 
index 86b711dcc78586dde55280e4da3ed377396f4fc4..729ca0064e94d57aa8dc81354edce94bb1395bd3 100644 (file)
@@ -188,6 +188,10 @@ struct dwbc_funcs {
        bool (*is_enabled)(
                struct dwbc *dwbc);
 
+       void (*set_fc_enable)(
+               struct dwbc *dwbc,
+               enum dwb_frame_capture_enable enable);
+
        void (*set_stereo)(
                struct dwbc *dwbc,
                struct dwb_stereo_params *stereo_params);