diff options
author | Thomas Zimmermann <tzimmermann@suse.de> | 2019-12-03 11:38:17 +0300 |
---|---|---|
committer | Thomas Zimmermann <tzimmermann@suse.de> | 2020-01-06 15:46:03 +0300 |
commit | 987073278624738573a845c85c4b0db6faaf7be0 (patch) | |
tree | 841437d191bcba6491fb4a5cf90e7d118b2d3a2e /drivers/gpu | |
parent | 3e10d2ffd245f996c36f87b0a8027a719e6135c3 (diff) | |
download | linux-987073278624738573a845c85c4b0db6faaf7be0.tar.xz |
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: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191203083819.6643-4-tzimmermann@suse.de
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/drm_gem_vram_helper.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_drv.c | 2 |
2 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c index 666cb4c22bb9..51ee1f7bc730 100644 --- a/drivers/gpu/drm/drm_gem_vram_helper.c +++ b/drivers/gpu/drm/drm_gem_vram_helper.c @@ -485,6 +485,7 @@ EXPORT_SYMBOL(drm_gem_vram_vunmap); * @dev: the DRM device * @bdev: the TTM BO device managing the buffer object * @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 * @args: the arguments as provided to \ &struct drm_driver.dumb_create @@ -502,6 +503,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file, struct drm_device *dev, struct ttm_bo_device *bdev, unsigned long pg_align, + unsigned long pitch_align, bool interruptible, struct drm_mode_create_dumb *args) { @@ -510,7 +512,12 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file, int ret; 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 = roundup(size, PAGE_SIZE); @@ -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")) return -EINVAL; - return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev, 0, - false, args); + return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev, + 0, 0, false, args); } EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create); diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c index 9f4f5f071add..3473e9e9a20d 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.c +++ b/drivers/gpu/drm/mgag200/mgag200_drv.c @@ -121,7 +121,7 @@ int mgag200_driver_dumb_create(struct drm_file *file, pg_align = PFN_UP(mdev->mc.vram_size); 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 = { |