Commit 1c7059e4 authored by Maarten Maathuis's avatar Maarten Maathuis Committed by Ben Skeggs

drm/nouveau: better alignment of bo sizes and use roundup instead of ALIGN

- Aligning to block size should ensure that the extra size is enough.
- Using roundup, because not all sizes are powers of two.
Signed-off-by: default avatarMaarten Maathuis <madman2003@gmail.com>
parent 111b459a
...@@ -73,6 +73,7 @@ nouveau_bo_fixup_align(struct drm_device *dev, ...@@ -73,6 +73,7 @@ nouveau_bo_fixup_align(struct drm_device *dev,
case 0x4800: case 0x4800:
case 0x7a00: case 0x7a00:
if (dev_priv->chipset >= 0xA0) { if (dev_priv->chipset >= 0xA0) {
*size = roundup(*size, 28672);
/* This is based on high end cards with 448 bits /* This is based on high end cards with 448 bits
* memory bus, could be different elsewhere.*/ * memory bus, could be different elsewhere.*/
*size += 6 * 28672; *size += 6 * 28672;
...@@ -80,9 +81,11 @@ nouveau_bo_fixup_align(struct drm_device *dev, ...@@ -80,9 +81,11 @@ nouveau_bo_fixup_align(struct drm_device *dev,
* but we must also align to page size. */ * but we must also align to page size. */
*align = 2 * 8 * 28672; *align = 2 * 8 * 28672;
} else if (dev_priv->chipset >= 0x90) { } else if (dev_priv->chipset >= 0x90) {
*size = roundup(*size, 16384);
*size += 3 * 16384; *size += 3 * 16384;
*align = 12 * 16384; *align = 12 * 16384;
} else { } else {
*size = roundup(*size, 8192);
*size += 3 * 8192; *size += 3 * 8192;
/* 12 * 8192 is the actual alignment requirement /* 12 * 8192 is the actual alignment requirement
* but we must also align to page size. */ * but we must also align to page size. */
...@@ -114,10 +117,11 @@ nouveau_bo_fixup_align(struct drm_device *dev, ...@@ -114,10 +117,11 @@ nouveau_bo_fixup_align(struct drm_device *dev,
} }
} }
*size = ALIGN(*size, PAGE_SIZE); /* ALIGN works only on powers of two. */
*size = roundup(*size, PAGE_SIZE);
if (dev_priv->card_type == NV_50) { if (dev_priv->card_type == NV_50) {
*size = ALIGN(*size, 65536); *size = roundup(*size, 65536);
*align = max(65536, *align); *align = max(65536, *align);
} }
} }
......
...@@ -212,11 +212,11 @@ nouveau_fbcon_create(struct drm_device *dev, uint32_t fb_width, ...@@ -212,11 +212,11 @@ nouveau_fbcon_create(struct drm_device *dev, uint32_t fb_width,
mode_cmd.bpp = surface_bpp; mode_cmd.bpp = surface_bpp;
mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3); mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3);
mode_cmd.pitch = ALIGN(mode_cmd.pitch, 256); mode_cmd.pitch = roundup(mode_cmd.pitch, 256);
mode_cmd.depth = surface_depth; mode_cmd.depth = surface_depth;
size = mode_cmd.pitch * mode_cmd.height; size = mode_cmd.pitch * mode_cmd.height;
size = ALIGN(size, PAGE_SIZE); size = roundup(size, PAGE_SIZE);
ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM, ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM,
0, 0x0000, false, true, &nvbo); 0, 0x0000, false, true, &nvbo);
......
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