Commit d5d6340c authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm: Look up the format info earlier



Look up the format info already in drm_internal_framebuffer_create()
so that we can later pass it along to .fb_create(). Currently various
drivers are doing additional lookups in their .fb_create()
implementations, and these lookups are rather expensive now (given
how many different pixel formats we have).

v2: Fix commit msg (Thomas)

Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250701090722.13645-4-ville.syrjala@linux.intel.com
parent 0e7d5874
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -153,18 +153,11 @@ int drm_mode_addfb_ioctl(struct drm_device *dev,
}

static int framebuffer_check(struct drm_device *dev,
			     const struct drm_format_info *info,
			     const struct drm_mode_fb_cmd2 *r)
{
	const struct drm_format_info *info;
	int i;

	/* check if the format is supported at all */
	if (!__drm_format_info(r->pixel_format)) {
		drm_dbg_kms(dev, "bad framebuffer format %p4cc\n",
			    &r->pixel_format);
		return -EINVAL;
	}

	if (r->width == 0) {
		drm_dbg_kms(dev, "bad framebuffer width %u\n", r->width);
		return -EINVAL;
@@ -175,9 +168,6 @@ static int framebuffer_check(struct drm_device *dev,
		return -EINVAL;
	}

	/* now let the driver pick its own format info */
	info = drm_get_format_info(dev, r->pixel_format, r->modifier[0]);

	for (i = 0; i < info->num_planes; i++) {
		unsigned int width = drm_format_info_plane_width(info, r->width, i);
		unsigned int height = drm_format_info_plane_height(info, r->height, i);
@@ -272,6 +262,7 @@ drm_internal_framebuffer_create(struct drm_device *dev,
				struct drm_file *file_priv)
{
	struct drm_mode_config *config = &dev->mode_config;
	const struct drm_format_info *info;
	struct drm_framebuffer *fb;
	int ret;

@@ -297,7 +288,17 @@ drm_internal_framebuffer_create(struct drm_device *dev,
		return ERR_PTR(-EINVAL);
	}

	ret = framebuffer_check(dev, r);
	/* check if the format is supported at all */
	if (!__drm_format_info(r->pixel_format)) {
		drm_dbg_kms(dev, "bad framebuffer format %p4cc\n",
			    &r->pixel_format);
		return ERR_PTR(-EINVAL);
	}

	/* now let the driver pick its own format info */
	info = drm_get_format_info(dev, r->pixel_format, r->modifier[0]);

	ret = framebuffer_check(dev, info, r);
	if (ret)
		return ERR_PTR(ret);