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

drm/gma500: Pass along the format info from .fb_create() to drm_helper_mode_fill_fb_struct()



Plumb the format info from .fb_create() all the way to
drm_helper_mode_fill_fb_struct() to avoid the redundant
lookup.

For the fbdev case a manual drm_get_format_info() lookup
is needed.

Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250701090722.13645-13-ville.syrjala@linux.intel.com
parent d26e8534
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -203,7 +203,10 @@ int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
		return PTR_ERR(backing);
	obj = &backing->base;

	fb = psb_framebuffer_create(dev, &mode_cmd, obj);
	fb = psb_framebuffer_create(dev,
				    drm_get_format_info(dev, mode_cmd.pixel_format,
							mode_cmd.modifier[0]),
				    &mode_cmd, obj);
	if (IS_ERR(fb)) {
		ret = PTR_ERR(fb);
		goto err_drm_gem_object_put;
+7 −7
Original line number Diff line number Diff line
@@ -29,25 +29,23 @@ static const struct drm_framebuffer_funcs psb_fb_funcs = {
 */
static int psb_framebuffer_init(struct drm_device *dev,
					struct drm_framebuffer *fb,
					const struct drm_format_info *info,
					const struct drm_mode_fb_cmd2 *mode_cmd,
					struct drm_gem_object *obj)
{
	const struct drm_format_info *info;
	int ret;

	/*
	 * Reject unknown formats, YUV formats, and formats with more than
	 * 4 bytes per pixel.
	 */
	info = drm_get_format_info(dev, mode_cmd->pixel_format,
				   mode_cmd->modifier[0]);
	if (!info || !info->depth || info->cpp[0] > 4)
	if (!info->depth || info->cpp[0] > 4)
		return -EINVAL;

	if (mode_cmd->pitches[0] & 63)
		return -EINVAL;

	drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
	drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
	fb->obj[0] = obj;
	ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
	if (ret) {
@@ -60,6 +58,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
/**
 *	psb_framebuffer_create	-	create a framebuffer backed by gt
 *	@dev: our DRM device
 *	@info: pixel format information
 *	@mode_cmd: the description of the requested mode
 *	@obj: the backing object
 *
@@ -69,6 +68,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
 *	TODO: review object references
 */
struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
					       const struct drm_format_info *info,
					       const struct drm_mode_fb_cmd2 *mode_cmd,
					       struct drm_gem_object *obj)
{
@@ -79,7 +79,7 @@ struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
	if (!fb)
		return ERR_PTR(-ENOMEM);

	ret = psb_framebuffer_init(dev, fb, mode_cmd, obj);
	ret = psb_framebuffer_init(dev, fb, info, mode_cmd, obj);
	if (ret) {
		kfree(fb);
		return ERR_PTR(ret);
@@ -112,7 +112,7 @@ static struct drm_framebuffer *psb_user_framebuffer_create
		return ERR_PTR(-ENOENT);

	/* Let the core code do all the work */
	fb = psb_framebuffer_create(dev, cmd, obj);
	fb = psb_framebuffer_create(dev, info, cmd, obj);
	if (IS_ERR(fb))
		drm_gem_object_put(obj);

+1 −0
Original line number Diff line number Diff line
@@ -594,6 +594,7 @@ extern void psb_modeset_cleanup(struct drm_device *dev);

/* framebuffer */
struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
					       const struct drm_format_info *info,
					       const struct drm_mode_fb_cmd2 *mode_cmd,
					       struct drm_gem_object *obj);