]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/gma500: Pass along the format info from .fb_create() to drm_helper_mode_fill_fb_s...
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 1 Jul 2025 09:07:15 +0000 (12:07 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 16 Jul 2025 17:08:34 +0000 (20:08 +0300)
Plumb the format info from .fb_create() all the way to
drm_helper_mode_fill_fb_struct() to avoid the redundant
lookup.

For the fbdev case a manual drm_get_format_info() lookup
is needed.

Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250701090722.13645-13-ville.syrjala@linux.intel.com
drivers/gpu/drm/gma500/fbdev.c
drivers/gpu/drm/gma500/framebuffer.c
drivers/gpu/drm/gma500/psb_drv.h

index 8edefea2ef59816d6ac66a6d584915e907379e78..d32689cb0e23d0cbc2cab59965c7b18d400eeb2e 100644 (file)
@@ -203,7 +203,10 @@ int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
                return PTR_ERR(backing);
        obj = &backing->base;
 
-       fb = psb_framebuffer_create(dev, &mode_cmd, obj);
+       fb = psb_framebuffer_create(dev,
+                                   drm_get_format_info(dev, mode_cmd.pixel_format,
+                                                       mode_cmd.modifier[0]),
+                                   &mode_cmd, obj);
        if (IS_ERR(fb)) {
                ret = PTR_ERR(fb);
                goto err_drm_gem_object_put;
index f9ade836135485121217a1feba4b1a1440fd327f..e69b537ded6bedb2052fba779bea095d8bd1ca94 100644 (file)
@@ -29,25 +29,23 @@ static const struct drm_framebuffer_funcs psb_fb_funcs = {
  */
 static int psb_framebuffer_init(struct drm_device *dev,
                                        struct drm_framebuffer *fb,
+                                       const struct drm_format_info *info,
                                        const struct drm_mode_fb_cmd2 *mode_cmd,
                                        struct drm_gem_object *obj)
 {
-       const struct drm_format_info *info;
        int ret;
 
        /*
         * Reject unknown formats, YUV formats, and formats with more than
         * 4 bytes per pixel.
         */
-       info = drm_get_format_info(dev, mode_cmd->pixel_format,
-                                  mode_cmd->modifier[0]);
-       if (!info || !info->depth || info->cpp[0] > 4)
+       if (!info->depth || info->cpp[0] > 4)
                return -EINVAL;
 
        if (mode_cmd->pitches[0] & 63)
                return -EINVAL;
 
-       drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
+       drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
        fb->obj[0] = obj;
        ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
        if (ret) {
@@ -60,6 +58,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
 /**
  *     psb_framebuffer_create  -       create a framebuffer backed by gt
  *     @dev: our DRM device
+ *     @info: pixel format information
  *     @mode_cmd: the description of the requested mode
  *     @obj: the backing object
  *
@@ -69,6 +68,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
  *     TODO: review object references
  */
 struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
+                                              const struct drm_format_info *info,
                                               const struct drm_mode_fb_cmd2 *mode_cmd,
                                               struct drm_gem_object *obj)
 {
@@ -79,7 +79,7 @@ struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
        if (!fb)
                return ERR_PTR(-ENOMEM);
 
-       ret = psb_framebuffer_init(dev, fb, mode_cmd, obj);
+       ret = psb_framebuffer_init(dev, fb, info, mode_cmd, obj);
        if (ret) {
                kfree(fb);
                return ERR_PTR(ret);
@@ -112,7 +112,7 @@ static struct drm_framebuffer *psb_user_framebuffer_create
                return ERR_PTR(-ENOENT);
 
        /* Let the core code do all the work */
-       fb = psb_framebuffer_create(dev, cmd, obj);
+       fb = psb_framebuffer_create(dev, info, cmd, obj);
        if (IS_ERR(fb))
                drm_gem_object_put(obj);
 
index 7f77cb2b27518aa293841b676ad67e162b9ad15d..0b27112ec46fa178e114215f9c6ca427f5b3ce18 100644 (file)
@@ -594,6 +594,7 @@ extern void psb_modeset_cleanup(struct drm_device *dev);
 
 /* framebuffer */
 struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
+                                              const struct drm_format_info *info,
                                               const struct drm_mode_fb_cmd2 *mode_cmd,
                                               struct drm_gem_object *obj);