[PATCH] drm: Don't return unsupported formats in drm_mode_legacy_fb_format

Thomas Zimmermann tzimmermann at suse.de
Mon Mar 11 08:40:25 UTC 2024


Hi,

thanks for the patch.

Am 10.03.24 um 16:28 schrieb Frej Drejhammar:
[...]
>   	size = cmd.pitches[0] * cmd.height;
> diff --git a/drivers/gpu/drm/tiny/ofdrm.c b/drivers/gpu/drm/tiny/ofdrm.c
> index ab89b7fc7bf6..ded868601aea 100644
> --- a/drivers/gpu/drm/tiny/ofdrm.c
> +++ b/drivers/gpu/drm/tiny/ofdrm.c
> @@ -100,14 +100,14 @@ static const struct drm_format_info *display_get_validated_format(struct drm_dev
>   
>   	switch (depth) {
>   	case 8:
> -		format = drm_mode_legacy_fb_format(8, 8);
> +		format = drm_mode_legacy_fb_format(dev, 8, 8);
>   		break;
>   	case 15:
>   	case 16:
> -		format = drm_mode_legacy_fb_format(16, depth);
> +		format = drm_mode_legacy_fb_format(dev, 16, depth);
>   		break;
>   	case 32:
> -		format = drm_mode_legacy_fb_format(32, 24);
> +		format = drm_mode_legacy_fb_format(dev, 32, 24);
>   		break;

This will break ofdrm, which needs the returned value as-is to build its 
internal list of plane formats.

I suggest to switch all fbdev code over to drm_driver_legacy_fb_format 
<https://elixir.bootlin.com/linux/latest/C/ident/drm_driver_legacy_fb_format>() 
first and then modify the format indrm_driver_legacy_fb_format 
<https://elixir.bootlin.com/linux/latest/C/ident/drm_driver_legacy_fb_format>() 
after reading it from drm_fb_legacy_fb_format(). I can help a bit with 
testing the fbdev changes.

Best regards
Thomas


>   	default:
>   		drm_err(dev, "unsupported framebuffer depth %u\n", depth);
> diff --git a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
> index 51ae3561fd0d..a38a8143d632 100644
> --- a/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
> +++ b/drivers/gpu/drm/xe/display/intel_fbdev_fb.c
> @@ -32,7 +32,8 @@ struct drm_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper,
>   
>   	mode_cmd.pitches[0] = ALIGN(mode_cmd.width *
>   				    DIV_ROUND_UP(sizes->surface_bpp, 8), XE_PAGE_SIZE);
> -	mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
> +	mode_cmd.pixel_format = drm_mode_legacy_fb_format(dev,
> +							  sizes->surface_bpp,
>   							  sizes->surface_depth);
>   
>   	size = mode_cmd.pitches[0] * mode_cmd.height;
> diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
> index ccf91daa4307..75d06393a564 100644
> --- a/include/drm/drm_fourcc.h
> +++ b/include/drm/drm_fourcc.h
> @@ -310,7 +310,8 @@ const struct drm_format_info *drm_format_info(u32 format);
>   const struct drm_format_info *
>   drm_get_format_info(struct drm_device *dev,
>   		    const struct drm_mode_fb_cmd2 *mode_cmd);
> -uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
> +uint32_t drm_mode_legacy_fb_format(struct drm_device *dev,
> +				   uint32_t bpp, uint32_t depth);
>   uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
>   				     uint32_t bpp, uint32_t depth);
>   unsigned int drm_format_info_block_width(const struct drm_format_info *info,
>
> base-commit: b9511c6d277c31b13d4f3128eba46f4e0733d734

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)



More information about the dri-devel mailing list