drm: Remove users of drm_format_(horz|vert)_chroma_subsampling
authorMaxime Ripard <maxime.ripard@bootlin.com>
Thu, 16 May 2019 10:31:48 +0000 (12:31 +0200)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Mon, 20 May 2019 11:33:11 +0000 (13:33 +0200)
drm_format_horz_chroma_subsampling and drm_format_vert_chroma_subsampling
are basically a lookup in the drm_format_info table plus an access to the
hsub and vsub fields of the appropriate entry.

Most drivers are using this function while having access to the entry
already, which means that we will perform an unnecessary lookup. Removing
the call to these functions is therefore more efficient.

Some drivers will not have access to that entry in the function, but in
this case the overhead is minimal (we just have to call drm_format_info()
to perform the lookup) and we can even avoid multiple, inefficient lookups
in some places that need multiple fields from the drm_format_info
structure.

This is amplified by the fact that most of the time the callers will have
to retrieve both the vsub and hsub fields, meaning that they would perform
twice the lookup.

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Link: https://patchwork.freedesktop.org/patch/msgid/6b3cceb8161e2c1d40c2681de99202328b0a8abc.1558002671.git-series.maxime.ripard@bootlin.com
13 files changed:
drivers/gpu/drm/arm/malidp_planes.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
drivers/gpu/drm/drm_fourcc.c
drivers/gpu/drm/imx/ipuv3-plane.c
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/rockchip/rockchip_drm_fb.c
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/tegra/fb.c
drivers/gpu/drm/vc4/vc4_plane.c
include/drm/drm_fourcc.h

index d42e0ea9a303c2a3d263e88e96395e76d8713751..8f89813d08c10f1f041e32df5c88599fd3a59bbf 100644 (file)
@@ -233,8 +233,7 @@ bool malidp_format_mod_supported(struct drm_device *drm,
                        }
                }
 
-               if ((drm_format_horz_chroma_subsampling(format) != 1) ||
-                   (drm_format_vert_chroma_subsampling(format) != 1)) {
+               if ((info->hsub != 1) || (info->vsub != 1)) {
                        if (!(format == DRM_FORMAT_YUV420_10BIT &&
                              (map->features & MALIDP_DEVICE_AFBC_YUV_420_10_SUPPORT_SPLIT))) {
                                DRM_DEBUG_KMS("Formats which are sub-sampled should never be split\n");
@@ -244,8 +243,7 @@ bool malidp_format_mod_supported(struct drm_device *drm,
        }
 
        if (modifier & AFBC_CBR) {
-               if ((drm_format_horz_chroma_subsampling(format) == 1) ||
-                   (drm_format_vert_chroma_subsampling(format) == 1)) {
+               if ((info->hsub == 1) || (info->vsub == 1)) {
                        DRM_DEBUG_KMS("Formats which are not sub-sampled should not have CBR set\n");
                        return false;
                }
index e836e2de35ce8bd240ce7db48ffa6adf13c96f4e..fdd607ad27feefd50fd244f379fc1ed052b2bc06 100644 (file)
@@ -603,8 +603,6 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
        const struct drm_display_mode *mode;
        struct drm_crtc_state *crtc_state;
        unsigned int tmp;
-       int hsub = 1;
-       int vsub = 1;
        int ret;
        int i;
 
@@ -642,13 +640,10 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
        if (state->nplanes > ATMEL_HLCDC_LAYER_MAX_PLANES)
                return -EINVAL;
 
-       hsub = drm_format_horz_chroma_subsampling(fb->format->format);
-       vsub = drm_format_vert_chroma_subsampling(fb->format->format);
-
        for (i = 0; i < state->nplanes; i++) {
                unsigned int offset = 0;
-               int xdiv = i ? hsub : 1;
-               int ydiv = i ? vsub : 1;
+               int xdiv = i ? fb->format->hsub : 1;
+               int ydiv = i ? fb->format->vsub : 1;
 
                state->bpp[i] = fb->format->cpp[i];
                if (!state->bpp[i])
index 873c0001d8c8ee2309d399bb6a2df0847a0d1799..e4a2c8372c8b3026bb41ed50b41453d7efc97f40 100644 (file)
@@ -352,40 +352,6 @@ int drm_format_plane_cpp(uint32_t format, int plane)
 }
 EXPORT_SYMBOL(drm_format_plane_cpp);
 
-/**
- * drm_format_horz_chroma_subsampling - get the horizontal chroma subsampling factor
- * @format: pixel format (DRM_FORMAT_*)
- *
- * Returns:
- * The horizontal chroma subsampling factor for the
- * specified pixel format.
- */
-int drm_format_horz_chroma_subsampling(uint32_t format)
-{
-       const struct drm_format_info *info;
-
-       info = drm_format_info(format);
-       return info ? info->hsub : 1;
-}
-EXPORT_SYMBOL(drm_format_horz_chroma_subsampling);
-
-/**
- * drm_format_vert_chroma_subsampling - get the vertical chroma subsampling factor
- * @format: pixel format (DRM_FORMAT_*)
- *
- * Returns:
- * The vertical chroma subsampling factor for the
- * specified pixel format.
- */
-int drm_format_vert_chroma_subsampling(uint32_t format)
-{
-       const struct drm_format_info *info;
-
-       info = drm_format_info(format);
-       return info ? info->vsub : 1;
-}
-EXPORT_SYMBOL(drm_format_vert_chroma_subsampling);
-
 /**
  * drm_format_plane_width - width of the plane given the first plane
  * @width: width of the first plane
index d7a727a6e3d72c15aa37539bcbda1b051b944d86..8f101a0763e3829910a2fac33df5d0790dca7c24 100644 (file)
@@ -115,8 +115,8 @@ drm_plane_state_to_ubo(struct drm_plane_state *state)
        cma_obj = drm_fb_cma_get_gem_obj(fb, 1);
        BUG_ON(!cma_obj);
 
-       x /= drm_format_horz_chroma_subsampling(fb->format->format);
-       y /= drm_format_vert_chroma_subsampling(fb->format->format);
+       x /= fb->format->hsub;
+       y /= fb->format->vsub;
 
        return cma_obj->paddr + fb->offsets[1] + fb->pitches[1] * y +
               fb->format->cpp[1] * x - eba;
@@ -134,8 +134,8 @@ drm_plane_state_to_vbo(struct drm_plane_state *state)
        cma_obj = drm_fb_cma_get_gem_obj(fb, 2);
        BUG_ON(!cma_obj);
 
-       x /= drm_format_horz_chroma_subsampling(fb->format->format);
-       y /= drm_format_vert_chroma_subsampling(fb->format->format);
+       x /= fb->format->hsub;
+       y /= fb->format->vsub;
 
        return cma_obj->paddr + fb->offsets[2] + fb->pitches[2] * y +
               fb->format->cpp[2] * x - eba;
@@ -352,7 +352,6 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
        struct drm_framebuffer *old_fb = old_state->fb;
        unsigned long eba, ubo, vbo, old_ubo, old_vbo, alpha_eba;
        bool can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
-       int hsub, vsub;
        int ret;
 
        /* Ok to disable */
@@ -471,10 +470,8 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
                 * The x/y offsets must be even in case of horizontal/vertical
                 * chroma subsampling.
                 */
-               hsub = drm_format_horz_chroma_subsampling(fb->format->format);
-               vsub = drm_format_vert_chroma_subsampling(fb->format->format);
-               if (((state->src.x1 >> 16) & (hsub - 1)) ||
-                   ((state->src.y1 >> 16) & (vsub - 1)))
+               if (((state->src.x1 >> 16) & (fb->format->hsub - 1)) ||
+                   ((state->src.y1 >> 16) & (fb->format->vsub - 1)))
                        return -EINVAL;
                break;
        case DRM_FORMAT_RGB565_A8:
index da1f727d74957ada5271779b4e5d526331ea4804..7994de952353e94482d81b60481db78167ad87ce 100644 (file)
@@ -557,14 +557,9 @@ static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,
                struct dpu_plane_state *pstate,
                const struct dpu_format *fmt, bool color_fill)
 {
-       uint32_t chroma_subsmpl_h, chroma_subsmpl_v;
+       const struct drm_format_info *info = drm_format_info(fmt->base.pixel_format);
 
        /* don't chroma subsample if decimating */
-       chroma_subsmpl_h =
-               drm_format_horz_chroma_subsampling(fmt->base.pixel_format);
-       chroma_subsmpl_v =
-               drm_format_vert_chroma_subsampling(fmt->base.pixel_format);
-
        /* update scaler. calculate default config for QSEED3 */
        _dpu_plane_setup_scaler3(pdpu, pstate,
                        drm_rect_width(&pdpu->pipe_cfg.src_rect),
@@ -572,7 +567,7 @@ static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,
                        drm_rect_width(&pdpu->pipe_cfg.dst_rect),
                        drm_rect_height(&pdpu->pipe_cfg.dst_rect),
                        &pstate->scaler3_cfg, fmt,
-                       chroma_subsmpl_h, chroma_subsmpl_v);
+                       info->hsub, info->vsub);
 }
 
 /**
index be13140967b4e8a294263ed2632673aee73368b0..9d9fb6c5fd68ab1046f93c039e1a5bea9ef6a047 100644 (file)
@@ -650,10 +650,10 @@ static int calc_scalex_steps(struct drm_plane *plane,
                uint32_t pixel_format, uint32_t src, uint32_t dest,
                uint32_t phasex_steps[COMP_MAX])
 {
+       const struct drm_format_info *info = drm_format_info(pixel_format);
        struct mdp5_kms *mdp5_kms = get_kms(plane);
        struct device *dev = mdp5_kms->dev->dev;
        uint32_t phasex_step;
-       unsigned int hsub;
        int ret;
 
        ret = calc_phase_step(src, dest, &phasex_step);
@@ -662,11 +662,9 @@ static int calc_scalex_steps(struct drm_plane *plane,
                return ret;
        }
 
-       hsub = drm_format_horz_chroma_subsampling(pixel_format);
-
        phasex_steps[COMP_0]   = phasex_step;
        phasex_steps[COMP_3]   = phasex_step;
-       phasex_steps[COMP_1_2] = phasex_step / hsub;
+       phasex_steps[COMP_1_2] = phasex_step / info->hsub;
 
        return 0;
 }
@@ -675,10 +673,10 @@ static int calc_scaley_steps(struct drm_plane *plane,
                uint32_t pixel_format, uint32_t src, uint32_t dest,
                uint32_t phasey_steps[COMP_MAX])
 {
+       const struct drm_format_info *info = drm_format_info(pixel_format);
        struct mdp5_kms *mdp5_kms = get_kms(plane);
        struct device *dev = mdp5_kms->dev->dev;
        uint32_t phasey_step;
-       unsigned int vsub;
        int ret;
 
        ret = calc_phase_step(src, dest, &phasey_step);
@@ -687,11 +685,9 @@ static int calc_scaley_steps(struct drm_plane *plane,
                return ret;
        }
 
-       vsub = drm_format_vert_chroma_subsampling(pixel_format);
-
        phasey_steps[COMP_0]   = phasey_step;
        phasey_steps[COMP_3]   = phasey_step;
-       phasey_steps[COMP_1_2] = phasey_step / vsub;
+       phasey_steps[COMP_1_2] = phasey_step / info->vsub;
 
        return 0;
 }
@@ -699,8 +695,9 @@ static int calc_scaley_steps(struct drm_plane *plane,
 static uint32_t get_scale_config(const struct mdp_format *format,
                uint32_t src, uint32_t dst, bool horz)
 {
+       const struct drm_format_info *info = drm_format_info(format->base.pixel_format);
        bool scaling = format->is_yuv ? true : (src != dst);
-       uint32_t sub, pix_fmt = format->base.pixel_format;
+       uint32_t sub;
        uint32_t ya_filter, uv_filter;
        bool yuv = format->is_yuv;
 
@@ -708,8 +705,7 @@ static uint32_t get_scale_config(const struct mdp_format *format,
                return 0;
 
        if (yuv) {
-               sub = horz ? drm_format_horz_chroma_subsampling(pix_fmt) :
-                            drm_format_vert_chroma_subsampling(pix_fmt);
+               sub = horz ? info->hsub : info->vsub;
                uv_filter = ((src / sub) <= dst) ?
                                   SCALE_FILTER_BIL : SCALE_FILTER_PCMN;
        }
@@ -754,7 +750,7 @@ static void mdp5_write_pixel_ext(struct mdp5_kms *mdp5_kms, enum mdp5_pipe pipe,
        uint32_t src_w, int pe_left[COMP_MAX], int pe_right[COMP_MAX],
        uint32_t src_h, int pe_top[COMP_MAX], int pe_bottom[COMP_MAX])
 {
-       uint32_t pix_fmt = format->base.pixel_format;
+       const struct drm_format_info *info = drm_format_info(format->base.pixel_format);
        uint32_t lr, tb, req;
        int i;
 
@@ -763,8 +759,8 @@ static void mdp5_write_pixel_ext(struct mdp5_kms *mdp5_kms, enum mdp5_pipe pipe,
                uint32_t roi_h = src_h;
 
                if (format->is_yuv && i == COMP_1_2) {
-                       roi_w /= drm_format_horz_chroma_subsampling(pix_fmt);
-                       roi_h /= drm_format_vert_chroma_subsampling(pix_fmt);
+                       roi_w /= info->hsub;
+                       roi_h /= info->vsub;
                }
 
                lr  = (pe_left[i] >= 0) ?
index 72ab8d89efa4924beff467a0cfb883659332c049..b30b2f4efc60ee8c4dfda193cfed501069561b07 100644 (file)
@@ -135,7 +135,7 @@ uint32_t mdp5_smp_calculate(struct mdp5_smp *smp,
        uint32_t blkcfg = 0;
 
        nplanes = info->num_planes;
-       hsub = drm_format_horz_chroma_subsampling(fmt);
+       hsub = info->hsub;
 
        /* different if BWC (compressed framebuffer?) enabled: */
        nlines = 2;
index 432beddafb9e9faf61a980350578dddc56f00cb5..f69c0afd6ec6414e78cf6f459f1587b8c2fdcddb 100644 (file)
@@ -145,16 +145,12 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
        struct drm_framebuffer *fb;
        const struct msm_format *format;
        int ret, i, n;
-       unsigned int hsub, vsub;
 
        DBG("create framebuffer: dev=%p, mode_cmd=%p (%dx%d@%4.4s)",
                        dev, mode_cmd, mode_cmd->width, mode_cmd->height,
                        (char *)&mode_cmd->pixel_format);
 
        n = info->num_planes;
-       hsub = drm_format_horz_chroma_subsampling(mode_cmd->pixel_format);
-       vsub = drm_format_vert_chroma_subsampling(mode_cmd->pixel_format);
-
        format = kms->funcs->get_format(kms, mode_cmd->pixel_format,
                        mode_cmd->modifier[0]);
        if (!format) {
@@ -180,8 +176,8 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
        }
 
        for (i = 0; i < n; i++) {
-               unsigned int width = mode_cmd->width / (i ? hsub : 1);
-               unsigned int height = mode_cmd->height / (i ? vsub : 1);
+               unsigned int width = mode_cmd->width / (i ? info->hsub : 1);
+               unsigned int height = mode_cmd->height / (i ? info->vsub : 1);
                unsigned int min_size;
 
                min_size = (height - 1) * mode_cmd->pitches[i]
index 606d176d5d968edbd8684c522b77814cec647129..c318fae2858130c894aec26520cadf8be202ad75 100644 (file)
@@ -79,18 +79,13 @@ rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
        struct drm_framebuffer *fb;
        struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
        struct drm_gem_object *obj;
-       unsigned int hsub;
-       unsigned int vsub;
        int num_planes = min_t(int, info->num_planes, ROCKCHIP_MAX_FB_BUFFER);
        int ret;
        int i;
 
-       hsub = drm_format_horz_chroma_subsampling(mode_cmd->pixel_format);
-       vsub = drm_format_vert_chroma_subsampling(mode_cmd->pixel_format);
-
        for (i = 0; i < num_planes; i++) {
-               unsigned int width = mode_cmd->width / (i ? hsub : 1);
-               unsigned int height = mode_cmd->height / (i ? vsub : 1);
+               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]);
index c709f64b6f804b42cad1bfc417d60ac114ccfebe..4189ca17f3818723d89183dcaaf6f77db163e9ca 100644 (file)
@@ -320,11 +320,9 @@ static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win,
        uint16_t yrgb_hor_scl_mode, yrgb_ver_scl_mode;
        uint16_t cbcr_hor_scl_mode = SCALE_NONE;
        uint16_t cbcr_ver_scl_mode = SCALE_NONE;
-       int hsub = drm_format_horz_chroma_subsampling(info->format);
-       int vsub = drm_format_vert_chroma_subsampling(info->format);
        bool is_yuv = false;
-       uint16_t cbcr_src_w = src_w / hsub;
-       uint16_t cbcr_src_h = src_h / vsub;
+       uint16_t cbcr_src_w = src_w / info->hsub;
+       uint16_t cbcr_src_h = src_h / info->vsub;
        uint16_t vsu_mode;
        uint16_t lb_mode;
        uint32_t val;
@@ -828,8 +826,8 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
                    (state->rotation & DRM_MODE_REFLECT_X) ? 1 : 0);
 
        if (is_yuv) {
-               int hsub = drm_format_horz_chroma_subsampling(fb->format->format);
-               int vsub = drm_format_vert_chroma_subsampling(fb->format->format);
+               int hsub = fb->format->hsub;
+               int vsub = fb->format->vsub;
                int bpp = fb->format->cpp[1];
 
                uv_obj = fb->obj[1];
index da0747e317b7f7ec2f8f456a2f566a90f2e85f41..94fb75089d87a122a4e99d952ec7c798eca4158f 100644 (file)
@@ -132,18 +132,15 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
                                        const struct drm_mode_fb_cmd2 *cmd)
 {
        const struct drm_format_info *info = drm_get_format_info(drm, cmd);
-       unsigned int hsub, vsub, i;
        struct tegra_bo *planes[4];
        struct drm_gem_object *gem;
        struct drm_framebuffer *fb;
+       unsigned int i;
        int err;
 
-       hsub = drm_format_horz_chroma_subsampling(cmd->pixel_format);
-       vsub = drm_format_vert_chroma_subsampling(cmd->pixel_format);
-
        for (i = 0; i < info->num_planes; i++) {
-               unsigned int width = cmd->width / (i ? hsub : 1);
-               unsigned int height = cmd->height / (i ? vsub : 1);
+               unsigned int width = cmd->width / (i ? info->hsub : 1);
+               unsigned int height = cmd->height / (i ? info->vsub : 1);
                unsigned int size, bpp;
 
                gem = drm_gem_object_lookup(file, cmd->handles[i]);
index e3c0a350cb779ab66dc30575389e8242de597165..be2274924b342a07d576285fc6291472c0ede7c7 100644 (file)
@@ -310,10 +310,10 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
        struct drm_framebuffer *fb = state->fb;
        struct drm_gem_cma_object *bo = drm_fb_cma_get_gem_obj(fb, 0);
        u32 subpixel_src_mask = (1 << 16) - 1;
-       u32 format = fb->format->format;
        int num_planes = fb->format->num_planes;
        struct drm_crtc_state *crtc_state;
-       u32 h_subsample, v_subsample;
+       u32 h_subsample = fb->format->hsub;
+       u32 v_subsample = fb->format->vsub;
        int i, ret;
 
        crtc_state = drm_atomic_get_existing_crtc_state(state->state,
@@ -328,9 +328,6 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
        if (ret)
                return ret;
 
-       h_subsample = drm_format_horz_chroma_subsampling(format);
-       v_subsample = drm_format_vert_chroma_subsampling(format);
-
        for (i = 0; i < num_planes; i++)
                vc4_state->offsets[i] = bo->paddr + fb->offsets[i];
 
@@ -593,7 +590,8 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
        const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
        u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier);
        int num_planes = fb->format->num_planes;
-       u32 h_subsample, v_subsample;
+       u32 h_subsample = fb->format->hsub;
+       u32 v_subsample = fb->format->vsub;
        bool mix_plane_alpha;
        bool covers_screen;
        u32 scl0, scl1, pitch0;
@@ -623,9 +621,6 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
                scl1 = vc4_get_scl_field(state, 0);
        }
 
-       h_subsample = drm_format_horz_chroma_subsampling(format->drm);
-       v_subsample = drm_format_vert_chroma_subsampling(format->drm);
-
        rotation = drm_rotation_simplify(state->rotation,
                                         DRM_MODE_ROTATE_0 |
                                         DRM_MODE_REFLECT_X |
index 41779b327d9117ac0e692183e0da603f56e3b578..eeec449d6c6a8e520f334c04c640d6c7d717c127 100644 (file)
@@ -269,8 +269,6 @@ 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_horz_chroma_subsampling(uint32_t format);
-int drm_format_vert_chroma_subsampling(uint32_t format);
 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,