[RFC PATCH 01/20] drm: Remove users of drm_format_num_planes

Paul Kocialkowski paul.kocialkowski at bootlin.com
Wed Mar 20 14:16:37 UTC 2019


Hi,

On Tue, 2019-03-19 at 22:57 +0100, Maxime Ripard wrote:
> drm_format_num_planes() is basically a lookup in the drm_format_info table
> plus an access to the num_planes field 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 drm_format_num_planes 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.

Great, happy to see drm_format_num_planes getting nuked!

Reviewed-by: Paul Kocialkowski <paul.kocialkowski at bootlin.com>

Cheers,

Paul

> Signed-off-by: Maxime Ripard <maxime.ripard at bootlin.com>
> ---
>  drivers/gpu/drm/arm/malidp_mw.c             |  2 +-
>  drivers/gpu/drm/armada/armada_fb.c          |  3 ++-
>  drivers/gpu/drm/drm_fourcc.c                | 16 ----------------
>  drivers/gpu/drm/mediatek/mtk_drm_fb.c       |  6 ++++--
>  drivers/gpu/drm/meson/meson_overlay.c       |  2 +-
>  drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c |  9 ++++++---
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c    |  3 ++-
>  drivers/gpu/drm/msm/msm_fb.c                |  8 ++++++--
>  drivers/gpu/drm/omapdrm/omap_fb.c           |  4 +++-
>  drivers/gpu/drm/rockchip/rockchip_drm_fb.c  |  6 +++---
>  drivers/gpu/drm/tegra/fb.c                  |  3 ++-
>  drivers/gpu/drm/vc4/vc4_plane.c             |  2 +-
>  drivers/gpu/drm/zte/zx_plane.c              |  4 +---
>  include/drm/drm_fourcc.h                    |  1 -
>  14 files changed, 32 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
> index 041a64dc7167..91580b7a3781 100644
> --- a/drivers/gpu/drm/arm/malidp_mw.c
> +++ b/drivers/gpu/drm/arm/malidp_mw.c
> @@ -153,7 +153,7 @@ malidp_mw_encoder_atomic_check(struct drm_encoder *encoder,
>  		return -EINVAL;
>  	}
>  
> -	n_planes = drm_format_num_planes(fb->format->format);
> +	n_planes = fb->format->num_planes;
>  	for (i = 0; i < n_planes; i++) {
>  		struct drm_gem_cma_object *obj = drm_fb_cma_get_gem_obj(fb, i);
>  		/* memory write buffers are never rotated */
> diff --git a/drivers/gpu/drm/armada/armada_fb.c b/drivers/gpu/drm/armada/armada_fb.c
> index 058ac7d9920f..a2f6472eb482 100644
> --- a/drivers/gpu/drm/armada/armada_fb.c
> +++ b/drivers/gpu/drm/armada/armada_fb.c
> @@ -87,6 +87,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
>  struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
>  	struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev, mode);
>  	struct armada_gem_object *obj;
>  	struct armada_framebuffer *dfb;
>  	int ret;
> @@ -97,7 +98,7 @@ struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
>  		mode->pitches[2]);
>  
>  	/* We can only handle a single plane at the moment */
> -	if (drm_format_num_planes(mode->pixel_format) > 1 &&
> +	if (info->num_planes > 1 &&
>  	    (mode->handles[0] != mode->handles[1] ||
>  	     mode->handles[0] != mode->handles[2])) {
>  		ret = -EINVAL;
> diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
> index ba7e19d4336c..22c7fa459f65 100644
> --- a/drivers/gpu/drm/drm_fourcc.c
> +++ b/drivers/gpu/drm/drm_fourcc.c
> @@ -306,22 +306,6 @@ drm_get_format_info(struct drm_device *dev,
>  EXPORT_SYMBOL(drm_get_format_info);
>  
>  /**
> - * drm_format_num_planes - get the number of planes for format
> - * @format: pixel format (DRM_FORMAT_*)
> - *
> - * Returns:
> - * The number of planes used by the specified pixel format.
> - */
> -int drm_format_num_planes(uint32_t format)
> -{
> -	const struct drm_format_info *info;
> -
> -	info = drm_format_info(format);
> -	return info ? info->num_planes : 1;
> -}
> -EXPORT_SYMBOL(drm_format_num_planes);
> -
> -/**
>   * drm_format_plane_cpp - determine the bytes per pixel value
>   * @format: pixel format (DRM_FORMAT_*)
>   * @plane: plane index
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_fb.c b/drivers/gpu/drm/mediatek/mtk_drm_fb.c
> index e20fcaef2851..68fdef8b12bd 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_fb.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_fb.c
> @@ -32,10 +32,11 @@ static struct drm_framebuffer *mtk_drm_framebuffer_init(struct drm_device *dev,
>  					const struct drm_mode_fb_cmd2 *mode,
>  					struct drm_gem_object *obj)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev, mode);
>  	struct drm_framebuffer *fb;
>  	int ret;
>  
> -	if (drm_format_num_planes(mode->pixel_format) != 1)
> +	if (info->num_planes != 1)
>  		return ERR_PTR(-EINVAL);
>  
>  	fb = kzalloc(sizeof(*fb), GFP_KERNEL);
> @@ -88,6 +89,7 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
>  					       struct drm_file *file,
>  					       const struct drm_mode_fb_cmd2 *cmd)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev, cmd);
>  	struct drm_framebuffer *fb;
>  	struct drm_gem_object *gem;
>  	unsigned int width = cmd->width;
> @@ -95,7 +97,7 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
>  	unsigned int size, bpp;
>  	int ret;
>  
> -	if (drm_format_num_planes(cmd->pixel_format) != 1)
> +	if (info->num_planes != 1)
>  		return ERR_PTR(-EINVAL);
>  
>  	gem = drm_gem_object_lookup(file, cmd->handles[0]);
> diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c
> index 691a9fd16b36..8ff15d01a8f9 100644
> --- a/drivers/gpu/drm/meson/meson_overlay.c
> +++ b/drivers/gpu/drm/meson/meson_overlay.c
> @@ -466,7 +466,7 @@ static void meson_overlay_atomic_update(struct drm_plane *plane,
>  	}
>  
>  	/* Update Canvas with buffer address */
> -	priv->viu.vd1_planes = drm_format_num_planes(fb->format->format);
> +	priv->viu.vd1_planes = fb->format->num_planes;
>  
>  	switch (priv->viu.vd1_planes) {
>  	case 3:
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c
> index 0874f0a53bf9..1aed51b49be4 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c
> @@ -1040,10 +1040,11 @@ int dpu_format_check_modified_format(
>  		const struct drm_mode_fb_cmd2 *cmd,
>  		struct drm_gem_object **bos)
>  {
> -	int ret, i, num_base_fmt_planes;
> +	const struct drm_format_info *info;
>  	const struct dpu_format *fmt;
>  	struct dpu_hw_fmt_layout layout;
>  	uint32_t bos_total_size = 0;
> +	int ret, i;
>  
>  	if (!msm_fmt || !cmd || !bos) {
>  		DRM_ERROR("invalid arguments\n");
> @@ -1051,14 +1052,16 @@ int dpu_format_check_modified_format(
>  	}
>  
>  	fmt = to_dpu_format(msm_fmt);
> -	num_base_fmt_planes = drm_format_num_planes(fmt->base.pixel_format);
> +	info = drm_format_info(fmt->base.pixel_format);
> +	if (!info)
> +		return -EINVAL;
>  
>  	ret = dpu_format_get_plane_sizes(fmt, cmd->width, cmd->height,
>  			&layout, cmd->pitches);
>  	if (ret)
>  		return ret;
>  
> -	for (i = 0; i < num_base_fmt_planes; i++) {
> +	for (i = 0; i < info->num_planes; i++) {
>  		if (!bos[i]) {
>  			DRM_ERROR("invalid handle for plane %d\n", i);
>  			return -EINVAL;
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c
> index 6153514db04c..72ab8d89efa4 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c
> @@ -127,13 +127,14 @@ uint32_t mdp5_smp_calculate(struct mdp5_smp *smp,
>  		const struct mdp_format *format,
>  		u32 width, bool hdecim)
>  {
> +	const struct drm_format_info *info = drm_format_info(format->base.pixel_format);
>  	struct mdp5_kms *mdp5_kms = get_kms(smp);
>  	int rev = mdp5_cfg_get_hw_rev(mdp5_kms->cfg);
>  	int i, hsub, nplanes, nlines;
>  	u32 fmt = format->base.pixel_format;
>  	uint32_t blkcfg = 0;
>  
> -	nplanes = drm_format_num_planes(fmt);
> +	nplanes = info->num_planes;
>  	hsub = drm_format_horz_chroma_subsampling(fmt);
>  
>  	/* different if BWC (compressed framebuffer?) enabled: */
> diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
> index 136058978e0f..432beddafb9e 100644
> --- a/drivers/gpu/drm/msm/msm_fb.c
> +++ b/drivers/gpu/drm/msm/msm_fb.c
> @@ -106,9 +106,11 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
>  struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
>  		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev,
> +								 mode_cmd);
>  	struct drm_gem_object *bos[4] = {0};
>  	struct drm_framebuffer *fb;
> -	int ret, i, n = drm_format_num_planes(mode_cmd->pixel_format);
> +	int ret, i, n = info->num_planes;
>  
>  	for (i = 0; i < n; i++) {
>  		bos[i] = drm_gem_object_lookup(file, mode_cmd->handles[i]);
> @@ -135,6 +137,8 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
>  static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
>  		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev,
> +								 mode_cmd);
>  	struct msm_drm_private *priv = dev->dev_private;
>  	struct msm_kms *kms = priv->kms;
>  	struct msm_framebuffer *msm_fb = NULL;
> @@ -147,7 +151,7 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
>  			dev, mode_cmd, mode_cmd->width, mode_cmd->height,
>  			(char *)&mode_cmd->pixel_format);
>  
> -	n = drm_format_num_planes(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);
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
> index 4f8eb9d08f99..cfb641363a32 100644
> --- a/drivers/gpu/drm/omapdrm/omap_fb.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fb.c
> @@ -298,7 +298,9 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
>  struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>  		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
> -	unsigned int num_planes = drm_format_num_planes(mode_cmd->pixel_format);
> +	const struct drm_format_info *info = drm_get_format_info(dev,
> +								 mode_cmd);
> +	unsigned int num_planes = info->num_planes;
>  	struct drm_gem_object *bos[4];
>  	struct drm_framebuffer *fb;
>  	int i;
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> index 97438bbbe389..606d176d5d96 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> @@ -74,19 +74,19 @@ static struct drm_framebuffer *
>  rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>  			const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev,
> +								 mode_cmd);
>  	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;
> +	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);
> -	num_planes = min(drm_format_num_planes(mode_cmd->pixel_format),
> -			 ROCKCHIP_MAX_FB_BUFFER);
>  
>  	for (i = 0; i < num_planes; i++) {
>  		unsigned int width = mode_cmd->width / (i ? hsub : 1);
> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
> index 0a4ce05e00ab..bc8f9afd1b5f 100644
> --- a/drivers/gpu/drm/tegra/fb.c
> +++ b/drivers/gpu/drm/tegra/fb.c
> @@ -131,6 +131,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>  					struct drm_file *file,
>  					const struct drm_mode_fb_cmd2 *cmd)
>  {
> +	const struct drm_format_info *info = drm_get_format_info(dev, cmd);
>  	unsigned int hsub, vsub, i;
>  	struct tegra_bo *planes[4];
>  	struct drm_gem_object *gem;
> @@ -140,7 +141,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>  	hsub = drm_format_horz_chroma_subsampling(cmd->pixel_format);
>  	vsub = drm_format_vert_chroma_subsampling(cmd->pixel_format);
>  
> -	for (i = 0; i < drm_format_num_planes(cmd->pixel_format); i++) {
> +	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 size, bpp;
> diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
> index 1babfeca0c92..138a9ff23b70 100644
> --- a/drivers/gpu/drm/vc4/vc4_plane.c
> +++ b/drivers/gpu/drm/vc4/vc4_plane.c
> @@ -537,7 +537,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
>  	u32 ctl0_offset = vc4_state->dlist_count;
>  	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 = drm_format_num_planes(format->drm);
> +	int num_planes = fb->format->num_planes;
>  	u32 h_subsample, v_subsample;
>  	bool mix_plane_alpha;
>  	bool covers_screen;
> diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
> index 83d236fd893c..c6a8be444300 100644
> --- a/drivers/gpu/drm/zte/zx_plane.c
> +++ b/drivers/gpu/drm/zte/zx_plane.c
> @@ -199,7 +199,6 @@ static void zx_vl_plane_atomic_update(struct drm_plane *plane,
>  	u32 dst_x, dst_y, dst_w, dst_h;
>  	uint32_t format;
>  	int fmt;
> -	int num_planes;
>  	int i;
>  
>  	if (!fb)
> @@ -218,9 +217,8 @@ static void zx_vl_plane_atomic_update(struct drm_plane *plane,
>  	dst_h = drm_rect_height(dst);
>  
>  	/* Set up data address registers for Y, Cb and Cr planes */
> -	num_planes = drm_format_num_planes(format);
>  	paddr_reg = layer + VL_Y;
> -	for (i = 0; i < num_planes; i++) {
> +	for (i = 0; i < fb->format->num_planes; i++) {
>  		cma_obj = drm_fb_cma_get_gem_obj(fb, i);
>  		paddr = cma_obj->paddr + fb->offsets[i];
>  		paddr += src_y * fb->pitches[i];
> diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
> index b3d9d88ab290..41779b327d91 100644
> --- a/include/drm/drm_fourcc.h
> +++ b/include/drm/drm_fourcc.h
> @@ -268,7 +268,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_num_planes(uint32_t format);
>  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);
-- 
Paul Kocialkowski, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com



More information about the dri-devel mailing list