From: Vinod Govindapillai <[email protected]>

To enable FBC for FP16 formats, we need to enable the pixel normalizer
block. Introduce the register definitions and the initial steps for
configuring the pixel normalizer block. In this patch the pixel
normalizer block is kept as disabled. The follow-up patches will handle
configuring the pixel normalizer block for hdr planes for FP16 formats.

Bspec: 69863
Cc: Shekhar Chauhan <[email protected]>
Signed-off-by: Vinod Govindapillai <[email protected]>
Signed-off-by: Gustavo Sousa <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_display_types.h      |  3 +++
 drivers/gpu/drm/i915/display/skl_universal_plane.c      | 15 +++++++++++++++
 drivers/gpu/drm/i915/display/skl_universal_plane_regs.h | 11 +++++++++++
 3 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 5ae66b7444b6..bba03791f0ea 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -679,6 +679,9 @@ struct intel_plane_state {
        /* surface address register */
        u32 surf;
 
+       /* plane pixel normalizer config for Xe3p_LPD+ FBC FP16 */
+       u32 pixel_normalizer;
+
        /*
         * scaler_id
         *    = -1 : not using a scaler
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c 
b/drivers/gpu/drm/i915/display/skl_universal_plane.c
index 9f1111324dab..16a9c141281b 100644
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
@@ -893,6 +893,12 @@ static void skl_write_plane_wm(struct intel_dsb *dsb,
                                   xe3_plane_min_ddb_reg_val(min_ddb, 
interim_ddb));
 }
 
+static void
+xe3p_lpd_plane_check_pixel_normalizer(struct intel_plane_state *plane_state)
+{
+       plane_state->pixel_normalizer = 0;
+}
+
 static void
 skl_plane_disable_arm(struct intel_dsb *dsb,
                      struct intel_plane *plane,
@@ -1671,6 +1677,11 @@ icl_plane_update_arm(struct intel_dsb *dsb,
 
        icl_plane_update_sel_fetch_arm(dsb, plane, crtc_state, plane_state);
 
+       /* Only the HDR planes can have pixel normalizer */
+       if (DISPLAY_VER(display) >= 35 && icl_is_hdr_plane(display, plane_id))
+               intel_de_write_dsb(display, dsb,
+                                  PLANE_PIXEL_NORMALIZE(plane->pipe, 
plane->id),
+                                  plane_state->pixel_normalizer);
        /*
         * The control register self-arms if the plane was previously
         * disabled. Try to make the plane enable atomic by writing
@@ -2385,6 +2396,10 @@ static int skl_plane_check(struct intel_crtc_state 
*crtc_state,
                plane_state->damage = DRM_RECT_INIT(0, 0, 0, 0);
        }
 
+       /* Pixel normalizer for Xe3p_LPD+ */
+       if (DISPLAY_VER(display) >= 35 && icl_is_hdr_plane(display, plane->id))
+               xe3p_lpd_plane_check_pixel_normalizer(plane_state);
+
        plane_state->ctl = skl_plane_ctl(plane_state);
 
        if (DISPLAY_VER(display) >= 10)
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane_regs.h 
b/drivers/gpu/drm/i915/display/skl_universal_plane_regs.h
index 84cf565bd653..11c713f9b237 100644
--- a/drivers/gpu/drm/i915/display/skl_universal_plane_regs.h
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane_regs.h
@@ -456,4 +456,15 @@
                                                                
_SEL_FETCH_PLANE_OFFSET_5_A, _SEL_FETCH_PLANE_OFFSET_5_B, \
                                                                
_SEL_FETCH_PLANE_OFFSET_6_A, _SEL_FETCH_PLANE_OFFSET_6_B)
 
+#define _PLANE_PIXEL_NORMALIZE_1_A             0x701a8
+#define _PLANE_PIXEL_NORMALIZE_2_A             0x702a8
+#define _PLANE_PIXEL_NORMALIZE_1_B             0x711a8
+#define _PLANE_PIXEL_NORMALIZE_2_B             0x712a8
+#define PLANE_PIXEL_NORMALIZE(pipe, plane)     _MMIO_SKL_PLANE((pipe), 
(plane), \
+                                                               
_PLANE_PIXEL_NORMALIZE_1_A, _PLANE_PIXEL_NORMALIZE_1_B, \
+                                                               
_PLANE_PIXEL_NORMALIZE_2_A, _PLANE_PIXEL_NORMALIZE_2_B)
+#define   PLANE_PIXEL_NORMALIZE_ENABLE                 REG_BIT(31)
+#define   PLANE_PIXEL_NORMALIZE_NORM_FACTOR_MASK       REG_GENMASK(15, 0)
+#define   PLANE_PIXEL_NORMALIZE_NORM_FACTOR(val)       
REG_FIELD_PREP(PLANE_PIXEL_NORMALIZE_NORM_FACTOR_MASK, (val))
+
 #endif /* __SKL_UNIVERSAL_PLANE_REGS_H__ */

-- 
2.51.0

Reply via email to