drm/fourcc: Pass the format_info pointer to drm_format_plane_cpp
authorMaxime Ripard <maxime.ripard@bootlin.com>
Thu, 16 May 2019 10:31:49 +0000 (12:31 +0200)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Mon, 20 May 2019 11:33:46 +0000 (13:33 +0200)
So far, the drm_format_plane_cpp function was operating on the format's
fourcc and was doing a lookup to retrieve the drm_format_info structure and
return the cpp.

However, this is inefficient since in most cases, we will have the
drm_format_info pointer already available so we shouldn't have to perform a
new lookup. Some drm_fourcc functions also already operate on the
drm_format_info pointer for that reason, so the API is quite inconsistent
there.

Let's follow the latter pattern and remove the extra lookup while being a
bit more consistent. In order to be extra consistent, also rename that
function to drm_format_info_plane_cpp and to a static function in the
header to match the current policy.

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Link: https://patchwork.freedesktop.org/patch/msgid/32aa13e53dbc98a90207fd290aa8e79f785fb11e.1558002671.git-series.maxime.ripard@bootlin.com
18 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
drivers/gpu/drm/arm/malidp_hw.c
drivers/gpu/drm/arm/malidp_planes.c
drivers/gpu/drm/drm_client.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_format_helper.c
drivers/gpu/drm/drm_fourcc.c
drivers/gpu/drm/i915/intel_sprite.c
drivers/gpu/drm/mediatek/mtk_drm_fb.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/radeon/radeon_fb.c
drivers/gpu/drm/rockchip/rockchip_drm_fb.c
drivers/gpu/drm/stm/ltdc.c
drivers/gpu/drm/tegra/fb.c
drivers/gpu/drm/zte/zx_plane.c
include/drm/drm_fourcc.h

index e4760921883923a7d4f9669e8235e8dd28a63d8d..06e73a343724ab42deb19c9f2235dd307cd82ae6 100644 (file)
@@ -121,6 +121,8 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
                                         struct drm_mode_fb_cmd2 *mode_cmd,
                                         struct drm_gem_object **gobj_p)
 {
+       const struct drm_format_info *info = drm_get_format_info(dev,
+                                                                mode_cmd);
        struct amdgpu_device *adev = rfbdev->adev;
        struct drm_gem_object *gobj = NULL;
        struct amdgpu_bo *abo = NULL;
@@ -131,7 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
        int height = mode_cmd->height;
        u32 cpp;
 
-       cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0);
+       cpp = drm_format_info_plane_cpp(info, 0);
 
        /* need to align pitch with crtc limits */
        mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width, cpp,
index 8df12e9a33bbc61c57de34e767eb86ccab58332f..1c9e869f4c528be260e7fcf632fd6732911e956b 100644 (file)
@@ -382,7 +382,8 @@ static void malidp500_modeset(struct malidp_hw_device *hwdev, struct videomode *
 
 int malidp_format_get_bpp(u32 fmt)
 {
-       int bpp = drm_format_plane_cpp(fmt, 0) * 8;
+       const struct drm_format_info *info = drm_format_info(fmt);
+       int bpp = drm_format_info_plane_cpp(info, 0) * 8;
 
        if (bpp == 0) {
                switch (fmt) {
index 8f89813d08c10f1f041e32df5c88599fd3a59bbf..361c029883758063b8e2f6235ef1499ccfe61685 100644 (file)
@@ -227,7 +227,7 @@ bool malidp_format_mod_supported(struct drm_device *drm,
 
        if (modifier & AFBC_SPLIT) {
                if (!info->is_yuv) {
-                       if (drm_format_plane_cpp(format, 0) <= 2) {
+                       if (drm_format_info_plane_cpp(info, 0) <= 2) {
                                DRM_DEBUG_KMS("RGB formats <= 16bpp are not supported with SPLIT\n");
                                return false;
                        }
index f20d1dda39611865ef5ebe918dce853222e3d66c..169d8eeaa66262d5f5899617aee55122173809c5 100644 (file)
@@ -243,6 +243,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
 static struct drm_client_buffer *
 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
 {
+       const struct drm_format_info *info = drm_format_info(format);
        struct drm_mode_create_dumb dumb_args = { };
        struct drm_device *dev = client->dev;
        struct drm_client_buffer *buffer;
@@ -258,7 +259,7 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
 
        dumb_args.width = width;
        dumb_args.height = height;
-       dumb_args.bpp = drm_format_plane_cpp(format, 0) * 8;
+       dumb_args.bpp = drm_format_info_plane_cpp(info, 0) * 8;
        ret = drm_mode_create_dumb(dev, &dumb_args, client->file);
        if (ret)
                goto err_delete;
index a52b48fafbd78fe14d7a3ff1d2d41d968614023d..e2d9a6da14a5de96bf676dd57523eeaccf0fd2ce 100644 (file)
@@ -813,7 +813,7 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper,
                                          struct drm_clip_rect *clip)
 {
        struct drm_framebuffer *fb = fb_helper->fb;
-       unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0);
+       unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0);
        size_t offset = clip->y1 * fb->pitches[0] + clip->x1 * cpp;
        void *src = fb_helper->fbdev->screen_buffer + offset;
        void *dst = fb_helper->buffer->vaddr + offset;
index a18da35145b74434eba47420fdf227cd318b1477..8ad66aa1362a6b47b47bb3f97ed4bb66863fb555 100644 (file)
@@ -36,7 +36,7 @@ static unsigned int clip_offset(struct drm_rect *clip,
 void drm_fb_memcpy(void *dst, void *vaddr, struct drm_framebuffer *fb,
                   struct drm_rect *clip)
 {
-       unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0);
+       unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0);
        size_t len = (clip->x2 - clip->x1) * cpp;
        unsigned int y, lines = clip->y2 - clip->y1;
 
@@ -63,7 +63,7 @@ void drm_fb_memcpy_dstclip(void __iomem *dst, void *vaddr,
                           struct drm_framebuffer *fb,
                           struct drm_rect *clip)
 {
-       unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0);
+       unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0);
        unsigned int offset = clip_offset(clip, fb->pitches[0], cpp);
        size_t len = (clip->x2 - clip->x1) * cpp;
        unsigned int y, lines = clip->y2 - clip->y1;
index e4a2c8372c8b3026bb41ed50b41453d7efc97f40..5f63fc74e2659136565a32b5f9acabaa2da36fe8 100644 (file)
@@ -332,26 +332,6 @@ drm_get_format_info(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_get_format_info);
 
-/**
- * drm_format_plane_cpp - determine the bytes per pixel value
- * @format: pixel format (DRM_FORMAT_*)
- * @plane: plane index
- *
- * Returns:
- * The bytes per pixel value for the specified plane.
- */
-int drm_format_plane_cpp(uint32_t format, int plane)
-{
-       const struct drm_format_info *info;
-
-       info = drm_format_info(format);
-       if (!info || plane >= info->num_planes)
-               return 0;
-
-       return info->cpp[plane];
-}
-EXPORT_SYMBOL(drm_format_plane_cpp);
-
 /**
  * drm_format_plane_width - width of the plane given the first plane
  * @width: width of the first plane
index 2913e89280d7b773014854f38f3d836026815465..e35601b1f8787cd80e838a1d48c6dd6d74acbd6d 100644 (file)
@@ -325,7 +325,8 @@ skl_plane_max_stride(struct intel_plane *plane,
                     u32 pixel_format, u64 modifier,
                     unsigned int rotation)
 {
-       int cpp = drm_format_plane_cpp(pixel_format, 0);
+       const struct drm_format_info *info = drm_format_info(pixel_format);
+       int cpp = drm_format_info_plane_cpp(info, 0);
 
        /*
         * "The stride in bytes must not exceed the
index 68fdef8b12bde99ad6176fd96232c3dfc8278f84..0d5334a5a9a74ddf013acc599159fa42195fc8c2 100644 (file)
@@ -104,7 +104,7 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
        if (!gem)
                return ERR_PTR(-ENOENT);
 
-       bpp = drm_format_plane_cpp(cmd->pixel_format, 0);
+       bpp = drm_format_info_plane_cpp(info, 0);
        size = (height - 1) * cmd->pitches[0] + width * bpp;
        size += cmd->offsets[0];
 
index f33d7007e830e56f072883232e32f70f5fcddd11..59b24e0c5070fa861b7466fd155cb73b9e1fcc12 100644 (file)
@@ -782,6 +782,7 @@ static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h)
 
 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc)
 {
+       const struct drm_format_info *info = drm_format_info(DRM_FORMAT_ARGB8888);
        struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
        struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
        struct mdp5_kms *mdp5_kms = get_kms(crtc);
@@ -800,7 +801,7 @@ static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc)
        width = mdp5_crtc->cursor.width;
        height = mdp5_crtc->cursor.height;
 
-       stride = width * drm_format_plane_cpp(DRM_FORMAT_ARGB8888, 0);
+       stride = width * drm_format_info_plane_cpp(info, 0);
 
        get_roi(crtc, &roi_w, &roi_h);
 
index b30b2f4efc60ee8c4dfda193cfed501069561b07..1ca294694597597f3c0e4f0b103b1ab43034a831 100644 (file)
@@ -158,7 +158,7 @@ uint32_t mdp5_smp_calculate(struct mdp5_smp *smp,
        for (i = 0; i < nplanes; i++) {
                int n, fetch_stride, cpp;
 
-               cpp = drm_format_plane_cpp(fmt, i);
+               cpp = drm_format_info_plane_cpp(info, i);
                fetch_stride = width * cpp / (i ? hsub : 1);
 
                n = DIV_ROUND_UP(fetch_stride * nlines, smp->blk_size);
index f69c0afd6ec6414e78cf6f459f1587b8c2fdcddb..29e45f2144b5a991fba269c9b1f370cea3b86cfc 100644 (file)
@@ -181,7 +181,7 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
                unsigned int min_size;
 
                min_size = (height - 1) * mode_cmd->pitches[i]
-                        + width * drm_format_plane_cpp(mode_cmd->pixel_format, i)
+                        + width * drm_format_info_plane_cpp(info, i)
                         + mode_cmd->offsets[i];
 
                if (bos[i]->size < min_size) {
index 1298b84cb1c78d223b96eef44c78ef6e4e65c84a..dbf596fc4339f4e125e2c994ee4e0dcd55380baa 100644 (file)
@@ -125,6 +125,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
                                         struct drm_mode_fb_cmd2 *mode_cmd,
                                         struct drm_gem_object **gobj_p)
 {
+       const struct drm_format_info *info;
        struct radeon_device *rdev = rfbdev->rdev;
        struct drm_gem_object *gobj = NULL;
        struct radeon_bo *rbo = NULL;
@@ -135,7 +136,8 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
        int height = mode_cmd->height;
        u32 cpp;
 
-       cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0);
+       info = drm_get_format_info(rdev->ddev, mode_cmd);
+       cpp = drm_format_info_plane_cpp(info, 0);
 
        /* need to align pitch with crtc limits */
        mode_cmd->pitches[0] = radeon_align_pitch(rdev, mode_cmd->width, cpp,
index c318fae2858130c894aec26520cadf8be202ad75..57873c99ae2981bd3584420a8515c55211cb28de 100644 (file)
@@ -98,7 +98,7 @@ rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
 
                min_size = (height - 1) * mode_cmd->pitches[i] +
                        mode_cmd->offsets[i] +
-                       width * drm_format_plane_cpp(mode_cmd->pixel_format, i);
+                       width * drm_format_info_plane_cpp(info, i);
 
                if (obj->size < min_size) {
                        drm_gem_object_put_unlocked(obj);
index 97912e2c663d4e26f51bd940dd4ddb0ccc35f20e..e7abe54b9746b3ba878b7be0232afea17d8d82ad 100644 (file)
@@ -784,7 +784,7 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
 
        /* Configures the color frame buffer pitch in bytes & line length */
        pitch_in_bytes = fb->pitches[0];
-       line_length = drm_format_plane_cpp(fb->format->format, 0) *
+       line_length = drm_format_info_plane_cpp(fb->format, 0) *
                      (x1 - x0 + 1) + (ldev->caps.bus_width >> 3) - 1;
        val = ((pitch_in_bytes << 16) | line_length);
        reg_update_bits(ldev->regs, LTDC_L1CFBLR + lofs,
index 94fb75089d87a122a4e99d952ec7c798eca4158f..d1042196a30faab0dd0dc65b2623746b16af0475 100644 (file)
@@ -149,7 +149,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
                        goto unreference;
                }
 
-               bpp = drm_format_plane_cpp(cmd->pixel_format, i);
+               bpp = drm_format_info_plane_cpp(info, i);
 
                size = (height - 1) * cmd->pitches[i] +
                       width * bpp + cmd->offsets[i];
index c6a8be4443008e1f0b1ab700df7439af2c370968..d97a4dff515d92bac3f58907986a986b8740fbaf 100644 (file)
@@ -222,7 +222,7 @@ static void zx_vl_plane_atomic_update(struct drm_plane *plane,
                cma_obj = drm_fb_cma_get_gem_obj(fb, i);
                paddr = cma_obj->paddr + fb->offsets[i];
                paddr += src_y * fb->pitches[i];
-               paddr += src_x * drm_format_plane_cpp(format, i);
+               paddr += src_x * drm_format_info_plane_cpp(fb->format, i);
                zx_writel(paddr_reg, paddr);
                paddr_reg += 4;
        }
index eeec449d6c6a8e520f334c04c640d6c7d717c127..6b5a82b31bc46adb3964323329c6d73abfb5514c 100644 (file)
@@ -260,6 +260,23 @@ drm_format_info_is_yuv_sampling_444(const struct drm_format_info *info)
        return info->is_yuv && info->hsub == 1 && info->vsub == 1;
 }
 
+/**
+ * drm_format_info_plane_cpp - determine the bytes per pixel value
+ * @format: pixel format info
+ * @plane: plane index
+ *
+ * Returns:
+ * The bytes per pixel value for the specified plane.
+ */
+static inline
+int drm_format_info_plane_cpp(const struct drm_format_info *info, int plane)
+{
+       if (!info || plane >= info->num_planes)
+               return 0;
+
+       return info->cpp[plane];
+}
+
 const struct drm_format_info *__drm_format_info(u32 format);
 const struct drm_format_info *drm_format_info(u32 format);
 const struct drm_format_info *
@@ -268,7 +285,6 @@ drm_get_format_info(struct drm_device *dev,
 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
 uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
                                     uint32_t bpp, uint32_t depth);
-int drm_format_plane_cpp(uint32_t format, int plane);
 int drm_format_plane_width(int width, uint32_t format, int plane);
 int drm_format_plane_height(int height, uint32_t format, int plane);
 unsigned int drm_format_info_block_width(const struct drm_format_info *info,