From: Ville Syrjälä <ville.syrj...@linux.intel.com>

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.jakobs...@gmail.com>
Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/gma500/fbdev.c       |  5 ++++-
 drivers/gpu/drm/gma500/framebuffer.c | 14 +++++++-------
 drivers/gpu/drm/gma500/psb_drv.h     |  1 +
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/gma500/fbdev.c b/drivers/gpu/drm/gma500/fbdev.c
index 8edefea2ef59..d32689cb0e23 100644
--- a/drivers/gpu/drm/gma500/fbdev.c
+++ b/drivers/gpu/drm/gma500/fbdev.c
@@ -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;
diff --git a/drivers/gpu/drm/gma500/framebuffer.c 
b/drivers/gpu/drm/gma500/framebuffer.c
index f9ade8361354..e69b537ded6b 100644
--- a/drivers/gpu/drm/gma500/framebuffer.c
+++ b/drivers/gpu/drm/gma500/framebuffer.c
@@ -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);
 
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index 7f77cb2b2751..0b27112ec46f 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -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);
 
-- 
2.49.0

Reply via email to