]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm: Allow the caller to pass in the format info to drm_helper_mode_fill_fb_struct()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 1 Jul 2025 09:07:08 +0000 (12:07 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 16 Jul 2025 17:04:45 +0000 (20:04 +0300)
Soon all drivers should have the format info already available in the
places where they call drm_helper_mode_fill_fb_struct(). Allow it to
be passed along into drm_helper_mode_fill_fb_struct() instead of doing
yet another redundant lookup.

Start by always passing in NULL and still doing the extra lookup.
The actual changes to avoid the lookup will follow.

Done with cocci (with some manual fixups):
@@
identifier dev, fb, mode_cmd;
expression get_format_info;
@@
void drm_helper_mode_fill_fb_struct(struct drm_device *dev,
                                    struct drm_framebuffer *fb,
+                                    const struct drm_format_info *info,
                                    const struct drm_mode_fb_cmd2 *mode_cmd)
{
...
- fb->format = get_format_info;
+ fb->format = info ?: get_format_info;
...
}

@@
identifier dev, fb, mode_cmd;
@@
void drm_helper_mode_fill_fb_struct(struct drm_device *dev,
                                    struct drm_framebuffer *fb,
+                                    const struct drm_format_info *info,
                                    const struct drm_mode_fb_cmd2 *mode_cmd);

@@
expression dev, fb, mode_cmd;
@@
drm_helper_mode_fill_fb_struct(dev, fb
+        ,NULL
       ,mode_cmd);

Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Liviu Dudau <liviu.dudau@arm.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Inki Dae <inki.dae@samsung.com>
Cc: Seung-Woo Kim <sw0312.kim@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Abhinav Kumar <quic_abhinavk@quicinc.com>
Cc: Dmitry Baryshkov <lumag@kernel.org>
Cc: Sean Paul <sean@poorly.run>
Cc: Marijn Suijten <marijn.suijten@somainline.org>
Cc: Lyude Paul <lyude@redhat.com>
Cc: Danilo Krummrich <dakr@kernel.org>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Mikko Perttunen <mperttunen@nvidia.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
Cc: Zack Rusin <zack.rusin@broadcom.com>
Cc: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
Cc: amd-gfx@lists.freedesktop.org
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
Cc: nouveau@lists.freedesktop.org
Cc: linux-tegra@vger.kernel.org
Cc: virtualization@lists.linux.dev
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250701090722.13645-6-ville.syrjala@linux.intel.com
16 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c
drivers/gpu/drm/armada/armada_fb.c
drivers/gpu/drm/drm_gem_framebuffer_helper.c
drivers/gpu/drm/drm_modeset_helper.c
drivers/gpu/drm/exynos/exynos_drm_fb.c
drivers/gpu/drm/gma500/framebuffer.c
drivers/gpu/drm/i915/display/intel_fb.c
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/omapdrm/omap_fb.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/tegra/fb.c
drivers/gpu/drm/virtio/virtgpu_display.c
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
include/drm/drm_modeset_helper.h

index 76cf908cf976b3287d5d9eb008dbb0830ac29c37..866e17fd76fd25bb70089d3ee2e7682c647c02c9 100644 (file)
@@ -1202,7 +1202,7 @@ static int amdgpu_display_gem_fb_verify_and_init(struct drm_device *dev,
        int ret;
 
        rfb->base.obj[0] = obj;
-       drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &rfb->base, NULL, mode_cmd);
        /* Verify that the modifier is supported. */
        if (!drm_any_plane_has_format(dev, mode_cmd->pixel_format,
                                      mode_cmd->modifier[0])) {
index 29b05482f713f360c22cf4d272b5f13a1484530a..acd8e505ebc71c4e673e6594e1b92bd29609bfa5 100644 (file)
@@ -178,7 +178,7 @@ komeda_fb_create(struct drm_device *dev, struct drm_file *file,
                return ERR_PTR(-EINVAL);
        }
 
-       drm_helper_mode_fill_fb_struct(dev, &kfb->base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &kfb->base, NULL, mode_cmd);
 
        if (kfb->base.modifier)
                ret = komeda_fb_afbc_size_check(kfb, file, mode_cmd);
index 597720e229c264bb5b7c99e711bb722e2969f156..7e94ec5bd4f4e9e387d3e8105447924dfd3fa84d 100644 (file)
@@ -64,7 +64,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
        dfb->mod = config;
        dfb->fb.obj[0] = &obj->obj;
 
-       drm_helper_mode_fill_fb_struct(dev, &dfb->fb, mode);
+       drm_helper_mode_fill_fb_struct(dev, &dfb->fb, NULL, mode);
 
        ret = drm_framebuffer_init(dev, &dfb->fb, &armada_fb_funcs);
        if (ret) {
index 7c0d2174dbc9635eb07a545e9109a11c16f2ecea..6fe4094bd0fe60c43ae1e43237ea290ad867d07b 100644 (file)
@@ -75,7 +75,7 @@ drm_gem_fb_init(struct drm_device *dev,
        unsigned int i;
        int ret;
 
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
 
        for (i = 0; i < num_planes; i++)
                fb->obj[i] = obj[i];
index 3fed2d5ab1d6389ad6561a8c6e065c767ece5a44..89ba99970735469d5a4d3c8b3029c0f56f806dbd 100644 (file)
@@ -74,6 +74,7 @@ EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head);
  * drm_helper_mode_fill_fb_struct - fill out framebuffer metadata
  * @dev: DRM device
  * @fb: drm_framebuffer object to fill out
+ * @info: pixel format information
  * @mode_cmd: metadata from the userspace fb creation request
  *
  * This helper can be used in a drivers fb_create callback to pre-fill the fb's
@@ -81,13 +82,14 @@ EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head);
  */
 void drm_helper_mode_fill_fb_struct(struct drm_device *dev,
                                    struct drm_framebuffer *fb,
+                                   const struct drm_format_info *info,
                                    const struct drm_mode_fb_cmd2 *mode_cmd)
 {
        int i;
 
        fb->dev = dev;
-       fb->format = drm_get_format_info(dev, mode_cmd->pixel_format,
-                                        mode_cmd->modifier[0]);
+       fb->format = info ? : drm_get_format_info(dev, mode_cmd->pixel_format,
+                                                 mode_cmd->modifier[0]);
        fb->width = mode_cmd->width;
        fb->height = mode_cmd->height;
        for (i = 0; i < 4; i++) {
index 9ae526825726ca594255febe996114630cd51338..7091d31835ec41043bf3a8fd33256600a5633ea4 100644 (file)
@@ -76,7 +76,7 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
                fb->obj[i] = &exynos_gem[i]->base;
        }
 
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
 
        ret = drm_framebuffer_init(dev, fb, &exynos_drm_fb_funcs);
        if (ret < 0) {
index a4a18ec2dd56661f7560253bb84c258453957d7c..f9ade836135485121217a1feba4b1a1440fd327f 100644 (file)
@@ -47,7 +47,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
        if (mode_cmd->pitches[0] & 63)
                return -EINVAL;
 
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
        fb->obj[0] = obj;
        ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
        if (ret) {
index 96edc791c33bb449af68635d856027eb870262dc..1f5f8c2e9d31501419fbc402d646a81db0a56bdd 100644 (file)
@@ -2254,7 +2254,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
                goto err_frontbuffer_put;
        }
 
-       drm_helper_mode_fill_fb_struct(display->drm, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(display->drm, fb, NULL, mode_cmd);
 
        for (i = 0; i < fb->format->num_planes; i++) {
                unsigned int stride_alignment;
index f151244e8cfb3624bb263031d7b0f2887cdd4e29..a82a657169752114b50cb44abd863c53ed0a36d4 100644 (file)
@@ -227,7 +227,7 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
                msm_fb->base.obj[i] = bos[i];
        }
 
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
 
        ret = drm_framebuffer_init(dev, fb, &msm_framebuffer_funcs);
        if (ret) {
index 1ddd9290152629c3e6cf8de60ea18be9679b4735..e1e542126310395ff1f9fe52e2e02b979b057646 100644 (file)
@@ -321,7 +321,7 @@ nouveau_framebuffer_new(struct drm_device *dev,
        if (!(fb = *pfb = kzalloc(sizeof(*fb), GFP_KERNEL)))
                return -ENOMEM;
 
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
        fb->obj[0] = gem;
 
        ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
index 36afcd1c1fd74108c1f7fed085e691bd456a0263..30c81e2e5d6b354e99803a5373429e6f53687c24 100644 (file)
@@ -440,7 +440,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
                plane->dma_addr  = 0;
        }
 
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
 
        ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
        if (ret) {
index 85b714ac98824165bc47059ea28aa3d3098736dd..b4bf5dfeea2dcd81f864c1c6d84077468be56125 100644 (file)
@@ -1302,7 +1302,7 @@ radeon_framebuffer_init(struct drm_device *dev,
 {
        int ret;
        fb->obj[0] = obj;
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
        ret = drm_framebuffer_init(dev, fb, &radeon_fb_funcs);
        if (ret) {
                fb->obj[0] = NULL;
index 24907573e758df625655d6b0e9adcbc62d7948eb..d359683f5ce62c7494ebe483f1aa2767ad1d825d 100644 (file)
@@ -114,7 +114,7 @@ struct drm_framebuffer *tegra_fb_alloc(struct drm_device *drm,
        if (!fb)
                return ERR_PTR(-ENOMEM);
 
-       drm_helper_mode_fill_fb_struct(drm, fb, mode_cmd);
+       drm_helper_mode_fill_fb_struct(drm, fb, NULL, mode_cmd);
 
        for (i = 0; i < fb->format->num_planes; i++)
                fb->obj[i] = &planes[i]->gem;
index f9a98fbbabd1afd29e695aa6248ec270d05a7cb0..93763b91bab5624e434244a8031630616e91d113 100644 (file)
@@ -73,7 +73,7 @@ virtio_gpu_framebuffer_init(struct drm_device *dev,
 
        vgfb->base.obj[0] = obj;
 
-       drm_helper_mode_fill_fb_struct(dev, &vgfb->base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &vgfb->base, NULL, mode_cmd);
 
        ret = drm_framebuffer_init(dev, &vgfb->base, &virtio_gpu_fb_funcs);
        if (ret) {
index 2d48a28cda9c0284b82744fb196b981838c66101..35965e29e40806e02af4c1e9754341fcd1a62d19 100644 (file)
@@ -548,7 +548,7 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
                goto out_err1;
        }
 
-       drm_helper_mode_fill_fb_struct(dev, &vfbs->base.base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &vfbs->base.base, NULL, mode_cmd);
        memcpy(&vfbs->uo, uo, sizeof(vfbs->uo));
        vmw_user_object_ref(&vfbs->uo);
 
@@ -634,7 +634,7 @@ static int vmw_kms_new_framebuffer_bo(struct vmw_private *dev_priv,
        }
 
        vfbd->base.base.obj[0] = &bo->tbo.base;
-       drm_helper_mode_fill_fb_struct(dev, &vfbd->base.base, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, &vfbd->base.base, NULL, mode_cmd);
        vfbd->base.bo = true;
        vfbd->buffer = vmw_bo_reference(bo);
        *out = &vfbd->base;
index 995fd981cab030f96952a983915285708d3863c8..7e3d4c5a7f66db1f094c9d6f79b7edc8a7750455 100644 (file)
@@ -26,6 +26,7 @@
 struct drm_crtc;
 struct drm_crtc_funcs;
 struct drm_device;
+struct drm_format_info;
 struct drm_framebuffer;
 struct drm_mode_fb_cmd2;
 
@@ -33,6 +34,7 @@ void drm_helper_move_panel_connectors_to_head(struct drm_device *);
 
 void drm_helper_mode_fill_fb_struct(struct drm_device *dev,
                                    struct drm_framebuffer *fb,
+                                   const struct drm_format_info *info,
                                    const struct drm_mode_fb_cmd2 *mode_cmd);
 
 int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,