diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2012-07-11 06:28:19 (GMT) |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-10-03 03:12:48 (GMT) |
commit | 496734bf0391f38c196e16dbbfaaeda8e6ec5845 (patch) | |
tree | eaf17ad25eb57a101d1265a452f6b399882d9919 /drivers/gpu/drm/nouveau/core/subdev/fb | |
parent | 5a5c7432bbbd2e318dff107b4ff960ab543a7cef (diff) | |
download | linux-fsl-qoriq-496734bf0391f38c196e16dbbfaaeda8e6ec5845.tar.xz |
drm/nouveau/core: add support for reverse mm allocations
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/core/subdev/fb')
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/fb/nv50_vram.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/fb/nvc0_vram.c | 13 |
2 files changed, 22 insertions, 9 deletions
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/nv50_vram.c b/drivers/gpu/drm/nouveau/core/subdev/fb/nv50_vram.c index 029274b..84b99b6 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/nv50_vram.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/nv50_vram.c @@ -65,7 +65,7 @@ nv50_vram_del(struct drm_device *dev, struct nouveau_mem **pmem) this = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry); list_del(&this->rl_entry); - nouveau_mm_put(mm, this); + nouveau_mm_free(mm, &this); } if (mem->tag) { @@ -78,7 +78,7 @@ nv50_vram_del(struct drm_device *dev, struct nouveau_mem **pmem) } int -nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc, +nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 ncmin, u32 memtype, struct nouveau_mem **pmem) { struct drm_nouveau_private *dev_priv = dev->dev_private; @@ -87,13 +87,14 @@ nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc, struct nouveau_mem *mem; int comp = (memtype & 0x300) >> 8; int type = (memtype & 0x07f); + int back = (memtype & 0x800); int ret; - if (!types[type]) - return -EINVAL; size >>= 12; align >>= 12; - size_nc >>= 12; + ncmin >>= 12; + if (!ncmin) + ncmin = size; mem = kzalloc(sizeof(*mem), GFP_KERNEL); if (!mem) @@ -119,8 +120,13 @@ nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc, mem->memtype = (comp << 7) | type; mem->size = size; + type = types[type]; do { - ret = nouveau_mm_get(mm, types[type], size, size_nc, align, &r); + if (back) + ret = nouveau_mm_tail(mm, type, size, ncmin, align, &r); + else + ret = nouveau_mm_head(mm, type, size, ncmin, align, &r); + if (ret) { mutex_unlock(&mm->mutex); nv50_vram_del(dev, &mem); diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0_vram.c b/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0_vram.c index 8bb86e5..f363234 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0_vram.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0_vram.c @@ -58,17 +58,21 @@ nvc0_vram_flags_valid(struct drm_device *dev, u32 tile_flags) int nvc0_vram_new(struct drm_device *dev, u64 size, u32 align, u32 ncmin, - u32 type, struct nouveau_mem **pmem) + u32 memtype, struct nouveau_mem **pmem) { struct drm_nouveau_private *dev_priv = dev->dev_private; struct nouveau_mm *mm = &dev_priv->engine.vram.mm; struct nouveau_mm_node *r; struct nouveau_mem *mem; + int type = (memtype & 0x0ff); + int back = (memtype & 0x800); int ret; size >>= 12; align >>= 12; ncmin >>= 12; + if (!ncmin) + ncmin = size; mem = kzalloc(sizeof(*mem), GFP_KERNEL); if (!mem) @@ -76,12 +80,15 @@ nvc0_vram_new(struct drm_device *dev, u64 size, u32 align, u32 ncmin, INIT_LIST_HEAD(&mem->regions); mem->dev = dev_priv->dev; - mem->memtype = (type & 0xff); + mem->memtype = type; mem->size = size; mutex_lock(&mm->mutex); do { - ret = nouveau_mm_get(mm, 1, size, ncmin, align, &r); + if (back) + ret = nouveau_mm_tail(mm, 1, size, ncmin, align, &r); + else + ret = nouveau_mm_head(mm, 1, size, ncmin, align, &r); if (ret) { mutex_unlock(&mm->mutex); nv50_vram_del(dev, &mem); |