Skip to content

Commit 9870732

Browse files
author
Thomas Zimmermann
committed
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 <[email protected]> Reviewed-by: Daniel Vetter <[email protected]> Acked-by: Sam Ravnborg <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 3e10d2f commit 9870732

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

drivers/gpu/drm/drm_gem_vram_helper.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ EXPORT_SYMBOL(drm_gem_vram_vunmap);
485485
* @dev: the DRM device
486486
* @bdev: the TTM BO device managing the buffer object
487487
* @pg_align: the buffer's alignment in multiples of the page size
488+
* @pitch_align: the scanline's alignment in powers of 2
488489
* @interruptible: sleep interruptible if waiting for memory
489490
* @args: the arguments as provided to \
490491
&struct drm_driver.dumb_create
@@ -502,6 +503,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file,
502503
struct drm_device *dev,
503504
struct ttm_bo_device *bdev,
504505
unsigned long pg_align,
506+
unsigned long pitch_align,
505507
bool interruptible,
506508
struct drm_mode_create_dumb *args)
507509
{
@@ -510,7 +512,12 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file,
510512
int ret;
511513
u32 handle;
512514

513-
pitch = args->width * ((args->bpp + 7) / 8);
515+
pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
516+
if (pitch_align) {
517+
if (WARN_ON_ONCE(!is_power_of_2(pitch_align)))
518+
return -EINVAL;
519+
pitch = ALIGN(pitch, pitch_align);
520+
}
514521
size = pitch * args->height;
515522

516523
size = roundup(size, PAGE_SIZE);
@@ -612,8 +619,8 @@ int drm_gem_vram_driver_dumb_create(struct drm_file *file,
612619
if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized"))
613620
return -EINVAL;
614621

615-
return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev, 0,
616-
false, args);
622+
return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev,
623+
0, 0, false, args);
617624
}
618625
EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create);
619626

drivers/gpu/drm/mgag200/mgag200_drv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ int mgag200_driver_dumb_create(struct drm_file *file,
121121
pg_align = PFN_UP(mdev->mc.vram_size);
122122

123123
return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev,
124-
pg_align, false, args);
124+
pg_align, 0, false, args);
125125
}
126126

127127
static struct drm_driver driver = {

include/drm/drm_gem_vram_helper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ int drm_gem_vram_fill_create_dumb(struct drm_file *file,
112112
struct drm_device *dev,
113113
struct ttm_bo_device *bdev,
114114
unsigned long pg_align,
115+
unsigned long pitch_align,
115116
bool interruptible,
116117
struct drm_mode_create_dumb *args);
117118

0 commit comments

Comments
 (0)