drm/i915/lnl: possibility to enable FBC on first three planes
authorVinod Govindapillai <vinod.govindapillai@intel.com>
Fri, 22 Sep 2023 13:30:02 +0000 (16:30 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 3 Oct 2023 12:52:59 +0000 (15:52 +0300)
In LNL onwards, FBC can be associated to the first three planes.
FBC will be enabled on planes first come first served basis
until the userspace can select one of these FBC capable planes
explicitly.

v2:
 - avoid fbc->state.plane check in intel_fbc_check_plane (Ville)
 - simplify plane binding register writes (Matt)
 - Update the subject to reflect that fbc can be enabled only in
   the first three planes (Matt)

v3:
 - use icl_is_hdr_plane(), use wrapper macro for plane binding
   register access, comments update and patch split (Ville)

v4:
 - update to the plane binding register access macro

Bspec: 69560
Signed-off-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230922133003.150578-2-vinod.govindapillai@intel.com
drivers/gpu/drm/i915/display/intel_fbc.c
drivers/gpu/drm/i915/display/skl_universal_plane.c
drivers/gpu/drm/i915/i915_reg.h

index 1cb9eec2964032c4565f7a455ccb7742d29e1013..0f1dd8729bf1aafb003c8adffea670413ec5ec89 100644 (file)
@@ -593,6 +593,9 @@ static u32 ivb_dpfc_ctl(struct intel_fbc *fbc)
        if (IS_IVYBRIDGE(i915))
                dpfc_ctl |= DPFC_CTL_PLANE_IVB(fbc_state->plane->i9xx_plane);
 
+       if (DISPLAY_VER(i915) >= 20)
+               dpfc_ctl |= DPFC_CTL_PLANE_BINDING(fbc_state->plane->id);
+
        if (fbc_state->fence_id >= 0)
                dpfc_ctl |= DPFC_CTL_FENCE_EN_IVB;
 
index b1f9adae190d3dc035bb99973a1fd24cbe263899..9cbf4686df1d2a301ff644ea4b83cada56fe6883 100644 (file)
@@ -1942,13 +1942,16 @@ static enum intel_fbc_id skl_fbc_id_for_pipe(enum pipe pipe)
        return pipe - PIPE_A + INTEL_FBC_A;
 }
 
-static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv,
+static bool skl_plane_has_fbc(struct drm_i915_private *i915,
                              enum intel_fbc_id fbc_id, enum plane_id plane_id)
 {
-       if ((DISPLAY_RUNTIME_INFO(dev_priv)->fbc_mask & BIT(fbc_id)) == 0)
+       if ((DISPLAY_RUNTIME_INFO(i915)->fbc_mask & BIT(fbc_id)) == 0)
                return false;
 
-       return plane_id == PLANE_PRIMARY;
+       if (DISPLAY_VER(i915) >= 20)
+               return icl_is_hdr_plane(i915, plane_id);
+       else
+               return plane_id == PLANE_PRIMARY;
 }
 
 static struct intel_fbc *skl_plane_fbc(struct drm_i915_private *dev_priv,
index e0ea2dc135560a09eb44d4402f4dc02add2625b3..1a9ca1e530bc47cecd409c9fc75c14c2067afc9a 100644 (file)
 #define   DPFC_CTL_PLANE_IVB(i9xx_plane)       REG_FIELD_PREP(DPFC_CTL_PLANE_MASK_IVB, (i9xx_plane))
 #define   DPFC_CTL_FENCE_EN_IVB                        REG_BIT(28) /* ivb+ */
 #define   DPFC_CTL_PERSISTENT_MODE             REG_BIT(25) /* g4x-snb */
+#define   DPFC_CTL_PLANE_BINDING_MASK          REG_GENMASK(12, 11) /* lnl+ */
+#define   DPFC_CTL_PLANE_BINDING(plane_id)     REG_FIELD_PREP(DPFC_CTL_PLANE_BINDING_MASK, (plane_id))
 #define   DPFC_CTL_FALSE_COLOR                 REG_BIT(10) /* ivb+ */
 #define   DPFC_CTL_SR_EN                       REG_BIT(10) /* g4x only */
 #define   DPFC_CTL_SR_EXIT_DIS                 REG_BIT(9) /* g4x only */