[Nouveau] [PATCH 4/4] nouveau: clean up nouveau_mem_alloc function
Pekka J Enberg
penberg at cs.helsinki.fi
Sun Mar 9 09:37:12 PDT 2008
From: Pekka Enberg <penberg at cs.helsinki.fi>
Convert the macros in nouveau_mem_alloc() to nouveau_mem_alloc_agp(),
nouveau_mem_alloc_fb(), and nouveau_mem_alloc_pci() functions that use a new
generic __nouveau_mem_alloc() function to allocate and map memory.
Signed-off-by: Pekka Enberg <penberg at cs.helsinki.fi>
---
shared-core/nouveau_mem.c | 174 ++++++++++++++++++++++++++++++----------------
1 file changed, 117 insertions(+), 57 deletions(-)
Index: drm/shared-core/nouveau_mem.c
===================================================================
--- drm.orig/shared-core/nouveau_mem.c
+++ drm/shared-core/nouveau_mem.c
@@ -567,13 +567,91 @@ static int nouveau_addmap_agp(struct drm
return nouveau_addmap(dev, block, block->start, type);
}
+static struct mem_block *
+__nouveau_mem_alloc(struct drm_device *dev, int type, struct mem_block *heap,
+ uint64_t size, int alignment, int flags,
+ struct drm_file *file_priv)
+{
+ struct mem_block *block;
+ int err;
+
+ block = nouveau_mem_alloc_block(heap, size, alignment, file_priv);
+ if (!block)
+ return NULL;
+ block->flags = type;
+
+ /*
+ * Does the block need mapping?
+ */
+ if (!(flags & NOUVEAU_MEM_MAPPED))
+ return block;
+
+ switch (type) {
+ case NOUVEAU_MEM_AGP:
+ err = nouveau_addmap_agp(dev, block);
+ break;
+ case NOUVEAU_MEM_FB:
+ err = nouveau_addmap_fb(dev, block);
+ break;
+ case NOUVEAU_MEM_PCI:
+ err = nouveau_addmap_pci(dev, block);
+ break;
+ default:
+ err = -EINVAL;
+ break;
+ };
+ if (err)
+ goto error;
+
+ return block;
+error:
+ nouveau_mem_free_block(block);
+ return NULL;
+}
+
+static struct mem_block *
+nouveau_mem_alloc_pci(struct drm_device *dev, uint64_t size, int alignment,
+ int flags, struct drm_file *file_priv)
+{
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+ return __nouveau_mem_alloc(dev, NOUVEAU_MEM_PCI, dev_priv->pci_heap,
+ size, alignment, flags, file_priv);
+}
+
+static struct mem_block *
+nouveau_mem_alloc_agp(struct drm_device *dev, uint64_t size, int alignment,
+ int flags, struct drm_file *file_priv)
+{
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+ return __nouveau_mem_alloc(dev, NOUVEAU_MEM_AGP, dev_priv->agp_heap,
+ size, alignment, flags, file_priv);
+}
+
+static struct mem_block *
+nouveau_mem_alloc_fb(struct drm_device *dev, uint64_t size, int alignment,
+ int flags, struct drm_file *file_priv)
+{
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
+ struct mem_block *block;
+
+ if (!(flags & NOUVEAU_MEM_MAPPED)) {
+ block = __nouveau_mem_alloc(dev, NOUVEAU_MEM_FB,
+ dev_priv->fb_nomap_heap, size,
+ alignment, flags, file_priv);
+ if (block)
+ return block;
+ }
+ return __nouveau_mem_alloc(dev, NOUVEAU_MEM_FB, dev_priv->fb_heap,
+ size, alignment, flags, file_priv);
+}
+
struct mem_block* nouveau_mem_alloc(struct drm_device *dev, int alignment,
uint64_t size, int flags,
struct drm_file *file_priv)
{
struct mem_block *block;
- int type;
- struct drm_nouveau_private *dev_priv = dev->dev_private;
/*
* Make things easier on ourselves: all allocations are page-aligned.
@@ -594,67 +672,49 @@ struct mem_block* nouveau_mem_alloc(stru
if (size & (~PAGE_MASK))
size = ((size/PAGE_SIZE) + 1) * PAGE_SIZE;
+ if (flags & NOUVEAU_MEM_FB) {
+ block = nouveau_mem_alloc_fb(dev, size, alignment, flags,
+ file_priv);
+ if (block)
+ goto out;
+ }
-#define NOUVEAU_MEM_ALLOC_AGP {\
- type=NOUVEAU_MEM_AGP;\
- block = nouveau_mem_alloc_block(dev_priv->agp_heap, size,\
- alignment, file_priv); \
- if (block) goto alloc_ok;\
- }
-
-#define NOUVEAU_MEM_ALLOC_PCI {\
- type = NOUVEAU_MEM_PCI;\
- block = nouveau_mem_alloc_block(dev_priv->pci_heap, size, \
- alignment, file_priv); \
- if ( block ) goto alloc_ok;\
- }
-
-#define NOUVEAU_MEM_ALLOC_FB {\
- type=NOUVEAU_MEM_FB;\
- if (!(flags&NOUVEAU_MEM_MAPPED)) {\
- block = nouveau_mem_alloc_block(dev_priv->fb_nomap_heap,\
- size, alignment, \
- file_priv); \
- if (block) goto alloc_ok;\
- }\
- block = nouveau_mem_alloc_block(dev_priv->fb_heap, size,\
- alignment, file_priv);\
- if (block) goto alloc_ok;\
- }
-
-
- if (flags&NOUVEAU_MEM_FB) NOUVEAU_MEM_ALLOC_FB
- if (flags&NOUVEAU_MEM_AGP) NOUVEAU_MEM_ALLOC_AGP
- if (flags&NOUVEAU_MEM_PCI) NOUVEAU_MEM_ALLOC_PCI
- if (flags&NOUVEAU_MEM_FB_ACCEPTABLE) NOUVEAU_MEM_ALLOC_FB
- if (flags&NOUVEAU_MEM_AGP_ACCEPTABLE) NOUVEAU_MEM_ALLOC_AGP
- if (flags&NOUVEAU_MEM_PCI_ACCEPTABLE) NOUVEAU_MEM_ALLOC_PCI
-
+ if (flags & NOUVEAU_MEM_AGP) {
+ block = nouveau_mem_alloc_agp(dev, size, alignment, flags,
+ file_priv);
+ if (block)
+ goto out;
+ }
- return NULL;
+ if (flags & NOUVEAU_MEM_PCI) {
+ block = nouveau_mem_alloc_pci(dev, size, alignment, flags,
+ file_priv);
+ if (block)
+ goto out;
+ }
-alloc_ok:
- block->flags=type;
+ if (flags & NOUVEAU_MEM_FB_ACCEPTABLE) {
+ block = nouveau_mem_alloc_fb(dev, size, alignment, flags,
+ file_priv);
+ if (block)
+ goto out;
+ }
- if (flags&NOUVEAU_MEM_MAPPED)
- {
- int ret = 0;
-
- if (type == NOUVEAU_MEM_AGP)
- ret = nouveau_addmap_agp(dev, block);
- else if (type == NOUVEAU_MEM_FB)
- ret = nouveau_addmap_fb(dev, block);
- else if (type == NOUVEAU_MEM_PCI)
- ret = nouveau_addmap_pci(dev, block);
-
- if (ret) {
- nouveau_mem_free_block(block);
- return NULL;
- }
+ if (flags & NOUVEAU_MEM_AGP_ACCEPTABLE) {
+ block = nouveau_mem_alloc_agp(dev, size, alignment, flags,
+ file_priv);
+ if (block)
+ goto out;
}
- DRM_DEBUG("allocated %lld bytes at 0x%llx type=0x%08x\n", block->size, block->start, block->flags);
- return block;
+ if (flags & NOUVEAU_MEM_PCI_ACCEPTABLE)
+ block = nouveau_mem_alloc_pci(dev, size, alignment, flags,
+ file_priv);
+out:
+ if (block)
+ DRM_DEBUG("allocated %lld bytes at 0x%llx type=0x%08x\n",
+ block->size, block->start, block->flags);
+ return block;
}
void nouveau_mem_free(struct drm_device* dev, struct mem_block* block)
More information about the Nouveau
mailing list