drm/i915: Simplify CCS and UV plane alignment handling
authorImre Deak <imre.deak@intel.com>
Wed, 21 Apr 2021 17:32:20 +0000 (20:32 +0300)
committerImre Deak <imre.deak@intel.com>
Mon, 26 Apr 2021 14:49:53 +0000 (17:49 +0300)
We can handle the surface alignment of CCS and UV color planes for all
modifiers at one place, so do this. An AUX color plane can be a CCS or a
UV plane, use only the more specific query functions and remove
is_aux_plane() becoming redundant.

While at it add a TODO for linear UV color plane alignments. The spec
requires this to be stride-in-bytes * 64 on all platforms, whereas the
driver uses an alignment of 4k for gen<12 and 256k for gen>=12 for
linear UV planes.

v2:
- Restore previous alignment for linear UV surfaces.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210421173220.3587009-1-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_fb.c
drivers/gpu/drm/i915/display/intel_fb.h

index a10e263..e246e5c 100644 (file)
@@ -973,10 +973,26 @@ unsigned int intel_surf_alignment(const struct drm_framebuffer *fb,
        struct drm_i915_private *dev_priv = to_i915(fb->dev);
 
        /* AUX_DIST needs only 4K alignment */
-       if ((DISPLAY_VER(dev_priv) < 12 && is_aux_plane(fb, color_plane)) ||
-           is_ccs_plane(fb, color_plane))
+       if (is_ccs_plane(fb, color_plane))
                return 4096;
 
+       if (is_semiplanar_uv_plane(fb, color_plane)) {
+               /*
+                * TODO: cross-check wrt. the bspec stride in bytes * 64 bytes
+                * alignment for linear UV planes on all platforms.
+                */
+               if (DISPLAY_VER(dev_priv) >= 12) {
+                       if (fb->modifier == DRM_FORMAT_MOD_LINEAR)
+                               return intel_linear_alignment(dev_priv);
+
+                       return intel_tile_row_size(fb, color_plane);
+               }
+
+               return 4096;
+       }
+
+       drm_WARN_ON(&dev_priv->drm, color_plane != 0);
+
        switch (fb->modifier) {
        case DRM_FORMAT_MOD_LINEAR:
                return intel_linear_alignment(dev_priv);
@@ -985,19 +1001,12 @@ unsigned int intel_surf_alignment(const struct drm_framebuffer *fb,
                        return 256 * 1024;
                return 0;
        case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
-               if (is_semiplanar_uv_plane(fb, color_plane))
-                       return intel_tile_row_size(fb, color_plane);
-               fallthrough;
        case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
        case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC:
                return 16 * 1024;
        case I915_FORMAT_MOD_Y_TILED_CCS:
        case I915_FORMAT_MOD_Yf_TILED_CCS:
        case I915_FORMAT_MOD_Y_TILED:
-               if (DISPLAY_VER(dev_priv) >= 12 &&
-                   is_semiplanar_uv_plane(fb, color_plane))
-                       return intel_tile_row_size(fb, color_plane);
-               fallthrough;
        case I915_FORMAT_MOD_Yf_TILED:
                return 1 * 1024 * 1024;
        default:
index 0ec9ad7..c8aaca3 100644 (file)
@@ -30,14 +30,6 @@ bool is_gen12_ccs_cc_plane(const struct drm_framebuffer *fb, int plane)
               plane == 2;
 }
 
-bool is_aux_plane(const struct drm_framebuffer *fb, int plane)
-{
-       if (is_ccs_modifier(fb->modifier))
-               return is_ccs_plane(fb, plane);
-
-       return plane == 1;
-}
-
 bool is_semiplanar_uv_plane(const struct drm_framebuffer *fb, int color_plane)
 {
        return intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) &&
index 6acf792..13244ec 100644 (file)
@@ -19,7 +19,6 @@ struct intel_plane_state;
 bool is_ccs_plane(const struct drm_framebuffer *fb, int plane);
 bool is_gen12_ccs_plane(const struct drm_framebuffer *fb, int plane);
 bool is_gen12_ccs_cc_plane(const struct drm_framebuffer *fb, int plane);
-bool is_aux_plane(const struct drm_framebuffer *fb, int plane);
 bool is_semiplanar_uv_plane(const struct drm_framebuffer *fb, int color_plane);
 
 bool is_surface_linear(const struct drm_framebuffer *fb, int color_plane);