]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915: Pass drm_format_info into plane->max_stride()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 7 Nov 2025 18:11:19 +0000 (20:11 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 12 Nov 2025 20:57:56 +0000 (22:57 +0200)
Pass the format info into plane->max_stride() from the
caller instead of doing yet another drm_format_info()
lookup on the spot.

drm_format_info() is both rather expensive, and technically
incorrect since it doesn't return the correct format info
for compressed formats (though that doesn't actually matter
for the current .max_stride() implementations since they
are just interested in the cpp value).

Most callers already have the format info available. The
only exception is intel_dumb_fb_max_stride() where we shall
use the actually correct drm_get_format_info() variant.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/20251107181126.5743-3-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/i9xx_plane.c
drivers/gpu/drm/i915/display/i9xx_plane.h
drivers/gpu/drm/i915/display/intel_cursor.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display.h
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_fb.c
drivers/gpu/drm/i915/display/intel_sprite.c
drivers/gpu/drm/i915/display/skl_universal_plane.c

index 6e39d7f2e0c29078c5e3374c4bdccbb1319ea13a..b962d9f78b2cbe0ddd3158167c072670c34e2419 100644 (file)
@@ -754,10 +754,9 @@ static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
 
 static unsigned int
 hsw_primary_max_stride(struct intel_plane *plane,
-                      u32 pixel_format, u64 modifier,
-                      unsigned int rotation)
+                      const struct drm_format_info *info,
+                      u64 modifier, unsigned int rotation)
 {
-       const struct drm_format_info *info = drm_format_info(pixel_format);
        int cpp = info->cpp[0];
 
        /* Limit to 8k pixels to guarantee OFFSET.x doesn't get too big. */
@@ -766,10 +765,9 @@ hsw_primary_max_stride(struct intel_plane *plane,
 
 static unsigned int
 ilk_primary_max_stride(struct intel_plane *plane,
-                      u32 pixel_format, u64 modifier,
-                      unsigned int rotation)
+                      const struct drm_format_info *info,
+                      u64 modifier, unsigned int rotation)
 {
-       const struct drm_format_info *info = drm_format_info(pixel_format);
        int cpp = info->cpp[0];
 
        /* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */
@@ -781,10 +779,9 @@ ilk_primary_max_stride(struct intel_plane *plane,
 
 unsigned int
 i965_plane_max_stride(struct intel_plane *plane,
-                     u32 pixel_format, u64 modifier,
-                     unsigned int rotation)
+                     const struct drm_format_info *info,
+                     u64 modifier, unsigned int rotation)
 {
-       const struct drm_format_info *info = drm_format_info(pixel_format);
        int cpp = info->cpp[0];
 
        /* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */
@@ -796,8 +793,8 @@ i965_plane_max_stride(struct intel_plane *plane,
 
 static unsigned int
 i915_plane_max_stride(struct intel_plane *plane,
-                     u32 pixel_format, u64 modifier,
-                     unsigned int rotation)
+                     const struct drm_format_info *info,
+                     u64 modifier, unsigned int rotation)
 {
        if (modifier == I915_FORMAT_MOD_X_TILED)
                return 8 * 1024;
@@ -807,8 +804,8 @@ i915_plane_max_stride(struct intel_plane *plane,
 
 static unsigned int
 i8xx_plane_max_stride(struct intel_plane *plane,
-                     u32 pixel_format, u64 modifier,
-                     unsigned int rotation)
+                     const struct drm_format_info *info,
+                     u64 modifier, unsigned int rotation)
 {
        if (plane->i9xx_plane == PLANE_C)
                return 4 * 1024;
index 565dab751301e20dbcb619a9eb959ddab12f75e3..ec78bf4dd35eecc7e53b5e3b57ee9c2d609036e1 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/types.h>
 
 enum pipe;
+struct drm_format_info;
 struct drm_framebuffer;
 struct intel_crtc;
 struct intel_display;
@@ -18,8 +19,8 @@ struct intel_plane_state;
 
 #ifdef I915
 unsigned int i965_plane_max_stride(struct intel_plane *plane,
-                                  u32 pixel_format, u64 modifier,
-                                  unsigned int rotation);
+                                  const struct drm_format_info *info,
+                                  u64 modifier, unsigned int rotation);
 unsigned int vlv_plane_min_alignment(struct intel_plane *plane,
                                     const struct drm_framebuffer *fb,
                                     int colot_plane);
index 7aa14348aa6d4daffa4c895ac7ccf16957f1b744..0367e6fc8de7700c1124f5b3fe984de748f63809 100644 (file)
@@ -182,8 +182,8 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
 
 static unsigned int
 i845_cursor_max_stride(struct intel_plane *plane,
-                      u32 pixel_format, u64 modifier,
-                      unsigned int rotation)
+                      const struct drm_format_info *info,
+                      u64 modifier, unsigned int rotation)
 {
        return 2048;
 }
@@ -343,8 +343,8 @@ static bool i845_cursor_get_hw_state(struct intel_plane *plane,
 
 static unsigned int
 i9xx_cursor_max_stride(struct intel_plane *plane,
-                      u32 pixel_format, u64 modifier,
-                      unsigned int rotation)
+                      const struct drm_format_info *info,
+                      u64 modifier, unsigned int rotation)
 {
        return plane->base.dev->mode_config.cursor_width * 4;
 }
index 6e1ed075cbeaee6c4622523f9b2f0c6299664f7c..069967114bd992ed92e39318ec5c9d48c00458ad 100644 (file)
@@ -548,7 +548,8 @@ void intel_disable_transcoder(const struct intel_crtc_state *old_crtc_state)
 }
 
 u32 intel_plane_fb_max_stride(struct intel_display *display,
-                             u32 pixel_format, u64 modifier)
+                             const struct drm_format_info *info,
+                             u64 modifier)
 {
        struct intel_crtc *crtc;
        struct intel_plane *plane;
@@ -564,7 +565,7 @@ u32 intel_plane_fb_max_stride(struct intel_display *display,
 
        plane = to_intel_plane(crtc->base.primary);
 
-       return plane->max_stride(plane, pixel_format, modifier,
+       return plane->max_stride(plane, info, modifier,
                                 DRM_MODE_ROTATE_0);
 }
 
@@ -576,7 +577,9 @@ u32 intel_dumb_fb_max_stride(struct drm_device *drm,
        if (!HAS_DISPLAY(display))
                return 0;
 
-       return intel_plane_fb_max_stride(display, pixel_format, modifier);
+       return intel_plane_fb_max_stride(display,
+                                        drm_get_format_info(drm, pixel_format, modifier),
+                                        modifier);
 }
 
 void intel_set_plane_visible(struct intel_crtc_state *crtc_state,
index 9e3fe0bcf62ef48dbf94b4e70c24e3a7ff56d220..bcc6ccb69d2b5fbf7dd1f228e07bcc718ae0b1ad 100644 (file)
@@ -34,6 +34,7 @@ struct drm_atomic_state;
 struct drm_device;
 struct drm_display_mode;
 struct drm_encoder;
+struct drm_format_info;
 struct drm_modeset_acquire_ctx;
 struct intel_atomic_state;
 struct intel_crtc;
@@ -403,7 +404,8 @@ void intel_link_compute_m_n(u16 bpp, int nlanes,
                            int bw_overhead,
                            struct intel_link_m_n *m_n);
 u32 intel_plane_fb_max_stride(struct intel_display *display,
-                             u32 pixel_format, u64 modifier);
+                             const struct drm_format_info *info,
+                             u64 modifier);
 u32 intel_dumb_fb_max_stride(struct drm_device *drm,
                             u32 pixel_format, u64 modifier);
 enum drm_mode_status
index 00600134bda0aacf3cb7d7cc731d503ebfae3741..dd39e6caa82e67025a22cec50cf01b2dad2c0898 100644 (file)
@@ -1564,8 +1564,8 @@ struct intel_plane {
                                      const struct drm_framebuffer *fb,
                                      int color_plane);
        unsigned int (*max_stride)(struct intel_plane *plane,
-                                  u32 pixel_format, u64 modifier,
-                                  unsigned int rotation);
+                                  const struct drm_format_info *info,
+                                  u64 modifier, unsigned int rotation);
        bool (*can_async_flip)(u64 modifier);
        /* Write all non-self arming plane registers */
        void (*update_noarm)(struct intel_dsb *dsb,
index 19e3dc008caf37af7854e7030ed95deeebd9c0dc..2eddccb1bc9e37ba6a64570bb602d1eee9c11fa0 100644 (file)
@@ -1326,7 +1326,7 @@ static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state)
         * unclear in Bspec, for now no checking.
         */
        stride = intel_fb_pitch(fb, 0, rotation);
-       max_stride = plane->max_stride(plane, fb->base.format->format,
+       max_stride = plane->max_stride(plane, fb->base.format,
                                       fb->base.modifier, rotation);
 
        return stride > max_stride;
@@ -1972,7 +1972,8 @@ void intel_add_fb_offsets(int *x, int *y,
 
 static
 u32 intel_fb_max_stride(struct intel_display *display,
-                       u32 pixel_format, u64 modifier)
+                       const struct drm_format_info *info,
+                       u64 modifier)
 {
        /*
         * Arbitrary limit for gen4+ chosen to match the
@@ -1982,7 +1983,7 @@ u32 intel_fb_max_stride(struct intel_display *display,
         */
        if (DISPLAY_VER(display) < 4 || intel_fb_is_ccs_modifier(modifier) ||
            intel_fb_modifier_uses_dpt(display, modifier))
-               return intel_plane_fb_max_stride(display, pixel_format, modifier);
+               return intel_plane_fb_max_stride(display, info, modifier);
        else if (DISPLAY_VER(display) >= 7)
                return 256 * 1024;
        else
@@ -1997,7 +1998,7 @@ intel_fb_stride_alignment(const struct drm_framebuffer *fb, int color_plane)
 
        if (is_surface_linear(fb, color_plane)) {
                unsigned int max_stride = intel_plane_fb_max_stride(display,
-                                                                   fb->format->format,
+                                                                   fb->format,
                                                                    fb->modifier);
 
                /*
@@ -2055,7 +2056,7 @@ static int intel_plane_check_stride(const struct intel_plane_state *plane_state)
 
        /* FIXME other color planes? */
        stride = plane_state->view.color_plane[0].mapping_stride;
-       max_stride = plane->max_stride(plane, fb->format->format,
+       max_stride = plane->max_stride(plane, fb->format,
                                       fb->modifier, rotation);
 
        if (stride > max_stride) {
@@ -2243,8 +2244,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
                goto err_bo_framebuffer_fini;
        }
 
-       max_stride = intel_fb_max_stride(display, mode_cmd->pixel_format,
-                                        mode_cmd->modifier[0]);
+       max_stride = intel_fb_max_stride(display, info, mode_cmd->modifier[0]);
        if (mode_cmd->pitches[0] > max_stride) {
                drm_dbg_kms(display->drm,
                            "%s pitch (%u) must be at most %d\n",
index 60f1d9ed181e819749c8e5deb4dba70e7e27eea7..69b6873a6044a6060747f085adb35d93fefd8ed5 100644 (file)
@@ -958,10 +958,9 @@ static int g4x_sprite_min_cdclk(const struct intel_crtc_state *crtc_state,
 
 static unsigned int
 g4x_sprite_max_stride(struct intel_plane *plane,
-                     u32 pixel_format, u64 modifier,
-                     unsigned int rotation)
+                     const struct drm_format_info *info,
+                     u64 modifier, unsigned int rotation)
 {
-       const struct drm_format_info *info = drm_format_info(pixel_format);
        int cpp = info->cpp[0];
 
        /* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */
@@ -973,10 +972,9 @@ g4x_sprite_max_stride(struct intel_plane *plane,
 
 static unsigned int
 hsw_sprite_max_stride(struct intel_plane *plane,
-                     u32 pixel_format, u64 modifier,
-                     unsigned int rotation)
+                     const struct drm_format_info *info,
+                     u64 modifier, unsigned int rotation)
 {
-       const struct drm_format_info *info = drm_format_info(pixel_format);
        int cpp = info->cpp[0];
 
        /* Limit to 8k pixels to guarantee OFFSET.x doesn't get too big. */
index bc55fafe9ce38006284f16aa339b2133cb3bae3b..0823ab38d1b7bfa1bf3d61698d1de9d8bd478151 100644 (file)
@@ -465,12 +465,11 @@ static int icl_plane_max_height(const struct drm_framebuffer *fb,
 
 static unsigned int
 plane_max_stride(struct intel_plane *plane,
-                u32 pixel_format, u64 modifier,
-                unsigned int rotation,
+                const struct drm_format_info *info,
+                u64 modifier, unsigned int rotation,
                 unsigned int max_pixels,
                 unsigned int max_bytes)
 {
-       const struct drm_format_info *info = drm_format_info(pixel_format);
        int cpp = info->cpp[0];
 
        if (drm_rotation_90_or_270(rotation))
@@ -481,26 +480,26 @@ plane_max_stride(struct intel_plane *plane,
 
 static unsigned int
 adl_plane_max_stride(struct intel_plane *plane,
-                    u32 pixel_format, u64 modifier,
-                    unsigned int rotation)
+                    const struct drm_format_info *info,
+                    u64 modifier, unsigned int rotation)
 {
        unsigned int max_pixels = 65536; /* PLANE_OFFSET limit */
        unsigned int max_bytes = 128 * 1024;
 
-       return plane_max_stride(plane, pixel_format,
+       return plane_max_stride(plane, info,
                                modifier, rotation,
                                max_pixels, max_bytes);
 }
 
 static unsigned int
 skl_plane_max_stride(struct intel_plane *plane,
-                    u32 pixel_format, u64 modifier,
-                    unsigned int rotation)
+                    const struct drm_format_info *info,
+                    u64 modifier, unsigned int rotation)
 {
        unsigned int max_pixels = 8192; /* PLANE_OFFSET limit */
        unsigned int max_bytes = 32 * 1024;
 
-       return plane_max_stride(plane, pixel_format,
+       return plane_max_stride(plane, info,
                                modifier, rotation,
                                max_pixels, max_bytes);
 }