summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2007-08-06 17:27:15 -0700
committerIan Romanick <idr@us.ibm.com>2007-08-06 17:27:15 -0700
commitf7ba02b7458823627097a2320bf9befa84fc9c76 (patch)
treebc04994f289611ed53737b37b9391b6b4ea36dae
parent6718198897ef9e275506d3fcb497641e1b09d3b1 (diff)
Unify infrastructure for freeing on-card / GART memory.
-rw-r--r--linux-core/xgi_cmdlist.c4
-rw-r--r--linux-core/xgi_drv.h9
-rw-r--r--linux-core/xgi_fb.c15
-rw-r--r--linux-core/xgi_pcie.c19
4 files changed, 15 insertions, 32 deletions
diff --git a/linux-core/xgi_cmdlist.c b/linux-core/xgi_cmdlist.c
index 33155827..e1653021 100644
--- a/linux-core/xgi_cmdlist.c
+++ b/linux-core/xgi_cmdlist.c
@@ -202,7 +202,9 @@ void xgi_cmdlist_cleanup(struct xgi_info * info)
xgi_waitfor_pci_idle(info);
}
- xgi_pcie_free(info, info->cmdring.ring_gart_base, NULL);
+ xgi_free(info, (XGI_MEMLOC_NON_LOCAL
+ | info->cmdring.ring_gart_base),
+ NULL);
info->cmdring.ring_hw_base = 0;
info->cmdring.ring_offset = 0;
info->cmdring.size = 0;
diff --git a/linux-core/xgi_drv.h b/linux-core/xgi_drv.h
index 79276b70..a7740ceb 100644
--- a/linux-core/xgi_drv.h
+++ b/linux-core/xgi_drv.h
@@ -38,7 +38,7 @@
#define DRIVER_MAJOR 0
#define DRIVER_MINOR 10
-#define DRIVER_PATCHLEVEL 4
+#define DRIVER_PATCHLEVEL 5
#include "xgi_cmdlist.h"
#include "xgi_drm.h"
@@ -89,8 +89,6 @@ struct xgi_info {
};
extern struct kmem_cache *xgi_mem_block_cache;
-extern int xgi_mem_free(struct xgi_mem_heap * heap, unsigned long offset,
- struct drm_file * filp);
extern int xgi_mem_heap_init(struct xgi_mem_heap * heap, unsigned int start,
unsigned int end);
extern void xgi_mem_heap_cleanup(struct xgi_mem_heap * heap);
@@ -100,15 +98,12 @@ extern int xgi_fb_heap_init(struct xgi_info * info);
extern int xgi_alloc(struct xgi_info * info, struct xgi_mem_alloc * alloc,
struct drm_file * filp);
-extern int xgi_fb_free(struct xgi_info * info, unsigned long offset,
+extern int xgi_free(struct xgi_info * info, unsigned long index,
struct drm_file * filp);
extern int xgi_pcie_heap_init(struct xgi_info * info);
extern void xgi_pcie_lut_cleanup(struct xgi_info * info);
-extern int xgi_pcie_free(struct xgi_info * info, unsigned long offset,
- struct drm_file * filp);
-
extern void *xgi_find_pcie_virt(struct xgi_info * info, u32 address);
extern void xgi_free_all(struct xgi_info *, struct xgi_mem_heap *,
diff --git a/linux-core/xgi_fb.c b/linux-core/xgi_fb.c
index f8341a67..26e6fc4e 100644
--- a/linux-core/xgi_fb.c
+++ b/linux-core/xgi_fb.c
@@ -169,8 +169,8 @@ static struct xgi_mem_block *xgi_mem_alloc(struct xgi_mem_heap * heap,
return (used_block);
}
-int xgi_mem_free(struct xgi_mem_heap * heap, unsigned long offset,
- struct drm_file * filp)
+static int xgi_mem_free(struct xgi_mem_heap * heap, unsigned long offset,
+ struct drm_file * filp)
{
struct xgi_mem_block *used_block = NULL, *block;
struct xgi_mem_block *prev, *next;
@@ -287,13 +287,16 @@ int xgi_fb_alloc_ioctl(struct drm_device * dev, void * data,
}
-int xgi_fb_free(struct xgi_info * info, unsigned long offset,
- struct drm_file * filp)
+int xgi_free(struct xgi_info * info, unsigned long index,
+ struct drm_file * filp)
{
int err = 0;
+ const unsigned heap = index & 0x03;
mutex_lock(&info->dev->struct_mutex);
- err = xgi_mem_free(&info->fb_heap, offset, filp);
+ err = xgi_mem_free((heap == XGI_MEMLOC_NON_LOCAL)
+ ? &info->pcie_heap : &info->fb_heap,
+ (index & ~0x03), filp);
mutex_unlock(&info->dev->struct_mutex);
return err;
@@ -305,7 +308,7 @@ int xgi_fb_free_ioctl(struct drm_device * dev, void * data,
{
struct xgi_info *info = dev->dev_private;
- return xgi_fb_free(info, *(u32 *) data, filp);
+ return xgi_free(info, XGI_MEMLOC_LOCAL | *(u32 *) data, filp);
}
diff --git a/linux-core/xgi_pcie.c b/linux-core/xgi_pcie.c
index b2edf3b1..281223b3 100644
--- a/linux-core/xgi_pcie.c
+++ b/linux-core/xgi_pcie.c
@@ -152,29 +152,12 @@ int xgi_pcie_alloc_ioctl(struct drm_device * dev, void * data,
}
-int xgi_pcie_free(struct xgi_info * info, unsigned long offset,
- struct drm_file * filp)
-{
- int err;
-
- mutex_lock(&info->dev->struct_mutex);
- err = xgi_mem_free(&info->pcie_heap, offset, filp);
- mutex_unlock(&info->dev->struct_mutex);
-
- if (err) {
- DRM_ERROR("xgi_pcie_free() failed at base 0x%lx\n", offset);
- }
-
- return err;
-}
-
-
int xgi_pcie_free_ioctl(struct drm_device * dev, void * data,
struct drm_file * filp)
{
struct xgi_info *info = dev->dev_private;
- return xgi_pcie_free(info, *(u32 *) data, filp);
+ return xgi_free(info, XGI_MEMLOC_NON_LOCAL | *(u32 *) data, filp);
}