Commit 98707327 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/vram: Support scanline alignment for dumb buffers

Adding the pitch alignment as an argument to
drm_gem_vram_fill_create_dumb() allows to align scanlines to certain
offsets. A value of 0 disables scanline pitches.

v3:
	* only do power-of-2 test if pitch_align given; fails otherwise
	* mgag200: call drm_gem_vram_fill_create_dumb() with pitch_align
v2:
	* split of patch from related hibmc changes
	* test if scanline pitch is power of 2
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: default avatarSam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191203083819.6643-4-tzimmermann@suse.de
parent 3e10d2ff
...@@ -485,6 +485,7 @@ EXPORT_SYMBOL(drm_gem_vram_vunmap); ...@@ -485,6 +485,7 @@ EXPORT_SYMBOL(drm_gem_vram_vunmap);
* @dev: the DRM device * @dev: the DRM device
* @bdev: the TTM BO device managing the buffer object * @bdev: the TTM BO device managing the buffer object
* @pg_align: the buffer's alignment in multiples of the page size * @pg_align: the buffer's alignment in multiples of the page size
* @pitch_align: the scanline's alignment in powers of 2
* @interruptible: sleep interruptible if waiting for memory * @interruptible: sleep interruptible if waiting for memory
* @args: the arguments as provided to \ * @args: the arguments as provided to \
&struct drm_driver.dumb_create &struct drm_driver.dumb_create
...@@ -502,6 +503,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file, ...@@ -502,6 +503,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file,
struct drm_device *dev, struct drm_device *dev,
struct ttm_bo_device *bdev, struct ttm_bo_device *bdev,
unsigned long pg_align, unsigned long pg_align,
unsigned long pitch_align,
bool interruptible, bool interruptible,
struct drm_mode_create_dumb *args) struct drm_mode_create_dumb *args)
{ {
...@@ -510,7 +512,12 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file, ...@@ -510,7 +512,12 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file,
int ret; int ret;
u32 handle; u32 handle;
pitch = args->width * ((args->bpp + 7) / 8); pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
if (pitch_align) {
if (WARN_ON_ONCE(!is_power_of_2(pitch_align)))
return -EINVAL;
pitch = ALIGN(pitch, pitch_align);
}
size = pitch * args->height; size = pitch * args->height;
size = roundup(size, PAGE_SIZE); size = roundup(size, PAGE_SIZE);
...@@ -612,8 +619,8 @@ int drm_gem_vram_driver_dumb_create(struct drm_file *file, ...@@ -612,8 +619,8 @@ int drm_gem_vram_driver_dumb_create(struct drm_file *file,
if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized")) if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized"))
return -EINVAL; return -EINVAL;
return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev, 0, return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev,
false, args); 0, 0, false, args);
} }
EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create); EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create);
......
...@@ -121,7 +121,7 @@ int mgag200_driver_dumb_create(struct drm_file *file, ...@@ -121,7 +121,7 @@ int mgag200_driver_dumb_create(struct drm_file *file,
pg_align = PFN_UP(mdev->mc.vram_size); pg_align = PFN_UP(mdev->mc.vram_size);
return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev, return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev,
pg_align, false, args); pg_align, 0, false, args);
} }
static struct drm_driver driver = { static struct drm_driver driver = {
......
...@@ -112,6 +112,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file, ...@@ -112,6 +112,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file,
struct drm_device *dev, struct drm_device *dev,
struct ttm_bo_device *bdev, struct ttm_bo_device *bdev,
unsigned long pg_align, unsigned long pg_align,
unsigned long pitch_align,
bool interruptible, bool interruptible,
struct drm_mode_create_dumb *args); struct drm_mode_create_dumb *args);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment