Replace calls to the drm_format_*() helper functions with direct use of
the drm_format_info structure. This improves efficiency by removing
duplicate lookups.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 drivers/gpu/drm/drm_crtc.c          | 100 +++++-------------------------------
 drivers/gpu/drm/drm_fb_cma_helper.c |  23 +++++----
 2 files changed, 25 insertions(+), 98 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index e5369529af06..73fa7f2a1a04 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -3173,108 +3173,32 @@ int drm_mode_addfb(struct drm_device *dev,
        return 0;
 }

-static int format_check(const struct drm_mode_fb_cmd2 *r)
-{
-       uint32_t format = r->pixel_format & ~DRM_FORMAT_BIG_ENDIAN;
-
-       switch (format) {
-       case DRM_FORMAT_C8:
-       case DRM_FORMAT_RGB332:
-       case DRM_FORMAT_BGR233:
-       case DRM_FORMAT_XRGB4444:
-       case DRM_FORMAT_XBGR4444:
-       case DRM_FORMAT_RGBX4444:
-       case DRM_FORMAT_BGRX4444:
-       case DRM_FORMAT_ARGB4444:
-       case DRM_FORMAT_ABGR4444:
-       case DRM_FORMAT_RGBA4444:
-       case DRM_FORMAT_BGRA4444:
-       case DRM_FORMAT_XRGB1555:
-       case DRM_FORMAT_XBGR1555:
-       case DRM_FORMAT_RGBX5551:
-       case DRM_FORMAT_BGRX5551:
-       case DRM_FORMAT_ARGB1555:
-       case DRM_FORMAT_ABGR1555:
-       case DRM_FORMAT_RGBA5551:
-       case DRM_FORMAT_BGRA5551:
-       case DRM_FORMAT_RGB565:
-       case DRM_FORMAT_BGR565:
-       case DRM_FORMAT_RGB888:
-       case DRM_FORMAT_BGR888:
-       case DRM_FORMAT_XRGB8888:
-       case DRM_FORMAT_XBGR8888:
-       case DRM_FORMAT_RGBX8888:
-       case DRM_FORMAT_BGRX8888:
-       case DRM_FORMAT_ARGB8888:
-       case DRM_FORMAT_ABGR8888:
-       case DRM_FORMAT_RGBA8888:
-       case DRM_FORMAT_BGRA8888:
-       case DRM_FORMAT_XRGB2101010:
-       case DRM_FORMAT_XBGR2101010:
-       case DRM_FORMAT_RGBX1010102:
-       case DRM_FORMAT_BGRX1010102:
-       case DRM_FORMAT_ARGB2101010:
-       case DRM_FORMAT_ABGR2101010:
-       case DRM_FORMAT_RGBA1010102:
-       case DRM_FORMAT_BGRA1010102:
-       case DRM_FORMAT_YUYV:
-       case DRM_FORMAT_YVYU:
-       case DRM_FORMAT_UYVY:
-       case DRM_FORMAT_VYUY:
-       case DRM_FORMAT_AYUV:
-       case DRM_FORMAT_NV12:
-       case DRM_FORMAT_NV21:
-       case DRM_FORMAT_NV16:
-       case DRM_FORMAT_NV61:
-       case DRM_FORMAT_NV24:
-       case DRM_FORMAT_NV42:
-       case DRM_FORMAT_YUV410:
-       case DRM_FORMAT_YVU410:
-       case DRM_FORMAT_YUV411:
-       case DRM_FORMAT_YVU411:
-       case DRM_FORMAT_YUV420:
-       case DRM_FORMAT_YVU420:
-       case DRM_FORMAT_YUV422:
-       case DRM_FORMAT_YVU422:
-       case DRM_FORMAT_YUV444:
-       case DRM_FORMAT_YVU444:
-               return 0;
-       default:
-               DRM_DEBUG_KMS("invalid pixel format %s\n",
-                             drm_get_format_name(r->pixel_format));
-               return -EINVAL;
-       }
-}
-
 static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
 {
-       int ret, hsub, vsub, num_planes, i;
+       const struct drm_format_info *info;
+       int i;

-       ret = format_check(r);
-       if (ret) {
+       info = drm_format_info(r->pixel_format & ~DRM_FORMAT_BIG_ENDIAN);
+       if (!info) {
                DRM_DEBUG_KMS("bad framebuffer format %s\n",
                              drm_get_format_name(r->pixel_format));
-               return ret;
+               return -EINVAL;
        }

-       hsub = drm_format_horz_chroma_subsampling(r->pixel_format);
-       vsub = drm_format_vert_chroma_subsampling(r->pixel_format);
-       num_planes = drm_format_num_planes(r->pixel_format);
-
-       if (r->width == 0 || r->width % hsub) {
+       if (r->width == 0 || r->width % info->hsub) {
                DRM_DEBUG_KMS("bad framebuffer width %u\n", r->width);
                return -EINVAL;
        }

-       if (r->height == 0 || r->height % vsub) {
+       if (r->height == 0 || r->height % info->vsub) {
                DRM_DEBUG_KMS("bad framebuffer height %u\n", r->height);
                return -EINVAL;
        }

-       for (i = 0; i < num_planes; i++) {
-               unsigned int width = r->width / (i != 0 ? hsub : 1);
-               unsigned int height = r->height / (i != 0 ? vsub : 1);
-               unsigned int cpp = drm_format_plane_cpp(r->pixel_format, i);
+       for (i = 0; i < info->num_planes; i++) {
+               unsigned int width = r->width / (i != 0 ? info->hsub : 1);
+               unsigned int height = r->height / (i != 0 ? info->vsub : 1);
+               unsigned int cpp = info->cpp[i];

                if (!r->handles[i]) {
                        DRM_DEBUG_KMS("no buffer object handle for plane %d\n", 
i);
@@ -3317,7 +3241,7 @@ static int framebuffer_check(const struct 
drm_mode_fb_cmd2 *r)
                }
        }

-       for (i = num_planes; i < 4; i++) {
+       for (i = info->num_planes; i < 4; i++) {
                if (r->modifier[i]) {
                        DRM_DEBUG_KMS("non-zero modifier for unused plane 
%d\n", i);
                        return -EINVAL;
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c 
b/drivers/gpu/drm/drm_fb_cma_helper.c
index 5075fae3c4e2..81525a23e4b7 100644
--- a/drivers/gpu/drm/drm_fb_cma_helper.c
+++ b/drivers/gpu/drm/drm_fb_cma_helper.c
@@ -171,20 +171,20 @@ struct drm_framebuffer 
*drm_fb_cma_create_with_funcs(struct drm_device *dev,
        struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
        const struct drm_framebuffer_funcs *funcs)
 {
+       const struct drm_format_info *info;
        struct drm_fb_cma *fb_cma;
        struct drm_gem_cma_object *objs[4];
        struct drm_gem_object *obj;
-       unsigned int hsub;
-       unsigned int vsub;
        int ret;
        int i;

-       hsub = drm_format_horz_chroma_subsampling(mode_cmd->pixel_format);
-       vsub = drm_format_vert_chroma_subsampling(mode_cmd->pixel_format);
+       info = drm_format_info(mode_cmd->pixel_format);
+       if (!info)
+               return -EINVAL;

-       for (i = 0; i < drm_format_num_planes(mode_cmd->pixel_format); i++) {
-               unsigned int width = mode_cmd->width / (i ? hsub : 1);
-               unsigned int height = mode_cmd->height / (i ? vsub : 1);
+       for (i = 0; i < info->num_planes; i++) {
+               unsigned int width = mode_cmd->width / (i ? info->hsub : 1);
+               unsigned int height = mode_cmd->height / (i ? info->vsub : 1);
                unsigned int min_size;

                obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
@@ -195,7 +195,7 @@ struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct 
drm_device *dev,
                }

                min_size = (height - 1) * mode_cmd->pitches[i]
-                        + width * drm_format_plane_cpp(mode_cmd->pixel_format, 
i)
+                        + width * info->cpp[i]
                         + mode_cmd->offsets[i];

                if (obj->size < min_size) {
@@ -265,12 +265,15 @@ EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_obj);
 static void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m)
 {
        struct drm_fb_cma *fb_cma = to_fb_cma(fb);
-       int i, n = drm_format_num_planes(fb->pixel_format);
+       const struct drm_format_info *info;
+       int i;

        seq_printf(m, "fb: %dx%d@%4.4s\n", fb->width, fb->height,
                        (char *)&fb->pixel_format);

-       for (i = 0; i < n; i++) {
+       info = drm_format_info(fb->pixel_format);
+
+       for (i = 0; i < info->num_planes; i++) {
                seq_printf(m, "   %d: offset=%d pitch=%d, obj: ",
                                i, fb->offsets[i], fb->pitches[i]);
                drm_gem_cma_describe(fb_cma->obj[i], m);
-- 
Regards,

Laurent Pinchart

Reply via email to