summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/nouveau/core/subdev/fb
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-07-11 06:28:19 (GMT)
committerBen Skeggs <bskeggs@redhat.com>2012-10-03 03:12:48 (GMT)
commit496734bf0391f38c196e16dbbfaaeda8e6ec5845 (patch)
treeeaf17ad25eb57a101d1265a452f6b399882d9919 /drivers/gpu/drm/nouveau/core/subdev/fb
parent5a5c7432bbbd2e318dff107b4ff960ab543a7cef (diff)
downloadlinux-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.c18
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/fb/nvc0_vram.c13
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);