Commit 5d038094 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

drm/loongson: Compute dumb-buffer sizes with drm_mode_size_dumb()



Call drm_mode_size_dumb() to compute dumb-buffer scanline pitch and
buffer size. Align the pitch according to hardware requirements.

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarSui Jingfeng <sui.jingfeng@linux.dev>
Cc: Sui Jingfeng <sui.jingfeng@linux.dev>
Link: https://lore.kernel.org/r/20250821081918.79786-12-tzimmermann@suse.de
parent b1d0e470
Loading
Loading
Loading
Loading
+8 −21
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/dma-buf.h>

#include <drm/drm_debugfs.h>
#include <drm/drm_dumb_buffers.h>
#include <drm/drm_file.h>
#include <drm/drm_gem.h>
#include <drm/drm_prime.h>
@@ -204,45 +205,31 @@ int lsdc_dumb_create(struct drm_file *file, struct drm_device *ddev,
	const struct lsdc_desc *descp = ldev->descp;
	u32 domain = LSDC_GEM_DOMAIN_VRAM;
	struct drm_gem_object *gobj;
	size_t size;
	u32 pitch;
	u32 handle;
	int ret;

	if (!args->width || !args->height)
		return -EINVAL;

	if (args->bpp != 32 && args->bpp != 16)
		return -EINVAL;

	pitch = args->width * args->bpp / 8;
	pitch = ALIGN(pitch, descp->pitch_align);
	size = pitch * args->height;
	size = ALIGN(size, PAGE_SIZE);
	ret = drm_mode_size_dumb(ddev, args, descp->pitch_align, 0);
	if (ret)
		return ret;

	/* Maximum single bo size allowed is the half vram size available */
	if (size > ldev->vram_size / 2) {
		drm_err(ddev, "Requesting(%zuMiB) failed\n", size >> 20);
	if (args->size > ldev->vram_size / 2) {
		drm_err(ddev, "Requesting(%zuMiB) failed\n", (size_t)(args->size >> PAGE_SHIFT));
		return -ENOMEM;
	}

	gobj = lsdc_gem_object_create(ddev, domain, size, false, NULL, NULL);
	gobj = lsdc_gem_object_create(ddev, domain, args->size, false, NULL, NULL);
	if (IS_ERR(gobj)) {
		drm_err(ddev, "Failed to create gem object\n");
		return PTR_ERR(gobj);
	}

	ret = drm_gem_handle_create(file, gobj, &handle);
	ret = drm_gem_handle_create(file, gobj, &args->handle);

	/* drop reference from allocate, handle holds it now */
	drm_gem_object_put(gobj);
	if (ret)
		return ret;

	args->pitch = pitch;
	args->size = size;
	args->handle = handle;

	return 0;
}