mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
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: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Sui Jingfeng <sui.jingfeng@linux.dev> Cc: Sui Jingfeng <sui.jingfeng@linux.dev> Link: https://lore.kernel.org/r/20250821081918.79786-12-tzimmermann@suse.de
This commit is contained in:
parent
b1d0e470f8
commit
5d03809440
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user