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
This commit is contained in:
Родитель
3e10d2ffd2
Коммит
9870732786
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -112,6 +112,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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче