summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2007-07-09 15:59:09 -0700
committerIan Romanick <idr@us.ibm.com>2007-07-09 15:59:09 -0700
commit2f2d8b9688743ac6367bf13c3c023310a257ceb7 (patch)
treeeb129f17d3efbe7a642e8a9a80c5408ad9c117b6
parent86e75b7f7f64643c6ef2c0fef353b38753df8239 (diff)
Merge xgi_mem_req and xgi_mem_alloc into a single type.
These two structures were used as the request and reply for certain ioctls. Having a different type for an ioctl's input and output is just wierd. In addition, each structure contained fields (e.g., pid) that had no business being there. This change requires updates to user-space.
-rw-r--r--linux-core/xgi_cmdlist.c10
-rw-r--r--linux-core/xgi_drv.c7
-rw-r--r--linux-core/xgi_drv.h37
-rw-r--r--linux-core/xgi_fb.c10
-rw-r--r--linux-core/xgi_pcie.c25
5 files changed, 39 insertions, 50 deletions
diff --git a/linux-core/xgi_cmdlist.c b/linux-core/xgi_cmdlist.c
index 04ee6e82..f7730d89 100644
--- a/linux-core/xgi_cmdlist.c
+++ b/linux-core/xgi_cmdlist.c
@@ -42,12 +42,12 @@ static void xgi_cmdlist_reset(void);
int xgi_cmdlist_initialize(struct xgi_info * info, size_t size)
{
- //struct xgi_mem_req mem_req;
- struct xgi_mem_alloc mem_alloc;
+ struct xgi_mem_alloc mem_alloc = {
+ .size = size,
+ .owner = PCIE_2D,
+ };
- //mem_req.size = size;
-
- xgi_pcie_alloc(info, size, PCIE_2D, &mem_alloc);
+ xgi_pcie_alloc(info, &mem_alloc, 0);
if ((mem_alloc.size == 0) && (mem_alloc.hw_addr == 0)) {
return -1;
diff --git a/linux-core/xgi_drv.c b/linux-core/xgi_drv.c
index 081db19e..3608c747 100644
--- a/linux-core/xgi_drv.c
+++ b/linux-core/xgi_drv.c
@@ -894,7 +894,7 @@ int xgi_kern_ioctl(struct inode *inode, struct file *filp,
break;
case XGI_ESC_FB_ALLOC:
XGI_INFO("Jong-xgi_ioctl_fb_alloc \n");
- xgi_fb_alloc(info, (struct xgi_mem_req *)arg_copy, alloc);
+ xgi_fb_alloc(info, alloc, 0);
break;
case XGI_ESC_FB_FREE:
XGI_INFO("Jong-xgi_ioctl_fb_free \n");
@@ -906,8 +906,7 @@ int xgi_kern_ioctl(struct inode *inode, struct file *filp,
break;
case XGI_ESC_PCIE_ALLOC:
XGI_INFO("Jong-xgi_ioctl_pcie_alloc \n");
- xgi_pcie_alloc(info, ((struct xgi_mem_req *) arg_copy)->size,
- ((struct xgi_mem_req *) arg_copy)->owner, alloc);
+ xgi_pcie_alloc(info, alloc, 0);
break;
case XGI_ESC_PCIE_FREE:
XGI_INFO("Jong-xgi_ioctl_pcie_free: bus_addr = 0x%lx \n",
@@ -945,8 +944,6 @@ int xgi_kern_ioctl(struct inode *inode, struct file *filp,
case XGI_ESC_DEBUG_INFO:
XGI_INFO("Jong-xgi_ioctl_restore_registers \n");
xgi_restore_registers(info);
- //xgi_write_pcie_mem(info, (struct xgi_mem_req *) arg_copy);
- //xgi_read_pcie_mem(info, (struct xgi_mem_req *) arg_copy);
break;
case XGI_ESC_SUBMIT_CMDLIST:
XGI_INFO("Jong-xgi_ioctl_submit_cmdlist \n");
diff --git a/linux-core/xgi_drv.h b/linux-core/xgi_drv.h
index 248377aa..361a1e96 100644
--- a/linux-core/xgi_drv.h
+++ b/linux-core/xgi_drv.h
@@ -177,19 +177,23 @@ enum PcieOwner {
};
struct xgi_mem_req {
- enum xgi_mem_location location;
- unsigned long size;
- unsigned long is_front;
- enum PcieOwner owner;
- unsigned long pid;
};
struct xgi_mem_alloc {
- enum xgi_mem_location location;
- unsigned long size;
+ unsigned int location;
+ unsigned int size;
+ unsigned int is_front;
+ unsigned int owner;
+
+ /**
+ * Address of the memory from the graphics hardware's point of view.
+ */
+ u32 hw_addr;
+
+ /**
+ * Physical address of the memory from the processor's point of view.
+ */
unsigned long bus_addr;
- unsigned long hw_addr;
- unsigned long pid;
};
struct xgi_chip_info {
@@ -274,11 +278,11 @@ struct xgi_mem_pid {
#define XGI_IOCTL_POST_VBIOS _IO(XGI_IOCTL_MAGIC, XGI_ESC_POST_VBIOS)
#define XGI_IOCTL_FB_INIT _IO(XGI_IOCTL_MAGIC, XGI_ESC_FB_INIT)
-#define XGI_IOCTL_FB_ALLOC _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_FB_ALLOC, struct xgi_mem_req)
+#define XGI_IOCTL_FB_ALLOC _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_FB_ALLOC, struct xgi_mem_alloc)
#define XGI_IOCTL_FB_FREE _IOW(XGI_IOCTL_MAGIC, XGI_ESC_FB_FREE, unsigned long)
#define XGI_IOCTL_PCIE_INIT _IO(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_INIT)
-#define XGI_IOCTL_PCIE_ALLOC _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_ALLOC, struct xgi_mem_req)
+#define XGI_IOCTL_PCIE_ALLOC _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_ALLOC, struct xgi_mem_alloc)
#define XGI_IOCTL_PCIE_FREE _IOW(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_FREE, unsigned long)
#define XGI_IOCTL_PUT_SCREEN_INFO _IOW(XGI_IOCTL_MAGIC, XGI_ESC_PUT_SCREEN_INFO, struct xgi_screen_info)
@@ -332,25 +336,22 @@ struct xgi_mem_pid {
extern int xgi_fb_heap_init(struct xgi_info * info);
extern void xgi_fb_heap_cleanup(struct xgi_info * info);
-extern void xgi_fb_alloc(struct xgi_info * info, struct xgi_mem_req * req,
- struct xgi_mem_alloc * alloc);
+extern void xgi_fb_alloc(struct xgi_info * info, struct xgi_mem_alloc * alloc,
+ pid_t pid);
extern void xgi_fb_free(struct xgi_info * info, unsigned long offset);
extern void xgi_mem_collect(struct xgi_info * info, unsigned int *pcnt);
extern int xgi_pcie_heap_init(struct xgi_info * info);
extern void xgi_pcie_heap_cleanup(struct xgi_info * info);
-extern void xgi_pcie_alloc(struct xgi_info * info, unsigned long size,
- enum PcieOwner owner, struct xgi_mem_alloc * alloc);
+extern void xgi_pcie_alloc(struct xgi_info * info,
+ struct xgi_mem_alloc * alloc, pid_t pid);
extern void xgi_pcie_free(struct xgi_info * info, unsigned long offset);
extern void xgi_pcie_heap_check(void);
extern struct xgi_pcie_block *xgi_find_pcie_block(struct xgi_info * info,
unsigned long address);
extern void *xgi_find_pcie_virt(struct xgi_info * info, unsigned long address);
-extern void xgi_read_pcie_mem(struct xgi_info * info, struct xgi_mem_req * req);
-extern void xgi_write_pcie_mem(struct xgi_info * info, struct xgi_mem_req * req);
-
extern void xgi_test_rwinkernel(struct xgi_info * info, unsigned long address);
#endif
diff --git a/linux-core/xgi_fb.c b/linux-core/xgi_fb.c
index d7e9285d..ac73b41a 100644
--- a/linux-core/xgi_fb.c
+++ b/linux-core/xgi_fb.c
@@ -41,13 +41,13 @@ static struct xgi_mem_block *xgi_mem_new_node(void);
static struct xgi_mem_block *xgi_mem_alloc(struct xgi_info * info, unsigned long size);
static struct xgi_mem_block *xgi_mem_free(struct xgi_info * info, unsigned long offset);
-void xgi_fb_alloc(struct xgi_info * info,
- struct xgi_mem_req * req, struct xgi_mem_alloc * alloc)
+void xgi_fb_alloc(struct xgi_info * info, struct xgi_mem_alloc * alloc,
+ pid_t pid)
{
struct xgi_mem_block *block;
struct xgi_mem_pid *mempid_block;
- if (req->is_front) {
+ if (alloc->is_front) {
alloc->location = XGI_MEMLOC_LOCAL;
alloc->bus_addr = info->fb.base;
alloc->hw_addr = 0;
@@ -55,7 +55,7 @@ void xgi_fb_alloc(struct xgi_info * info,
("Video RAM allocation on front buffer successfully! \n");
} else {
xgi_down(info->fb_sem);
- block = xgi_mem_alloc(info, req->size);
+ block = xgi_mem_alloc(info, alloc->size);
xgi_up(info->fb_sem);
if (block == NULL) {
@@ -77,7 +77,7 @@ void xgi_fb_alloc(struct xgi_info * info,
kmalloc(sizeof(struct xgi_mem_pid), GFP_KERNEL);
mempid_block->location = XGI_MEMLOC_LOCAL;
mempid_block->bus_addr = alloc->bus_addr;
- mempid_block->pid = alloc->pid;
+ mempid_block->pid = pid;
if (!mempid_block)
XGI_ERROR("mempid_block alloc failed\n");
diff --git a/linux-core/xgi_pcie.c b/linux-core/xgi_pcie.c
index 82111249..0f82e4ec 100644
--- a/linux-core/xgi_pcie.c
+++ b/linux-core/xgi_pcie.c
@@ -764,14 +764,13 @@ static struct xgi_pcie_block *xgi_pcie_mem_free(struct xgi_info * info,
return (used_block);
}
-void xgi_pcie_alloc(struct xgi_info * info, unsigned long size,
- enum PcieOwner owner, struct xgi_mem_alloc * alloc)
+void xgi_pcie_alloc(struct xgi_info * info, struct xgi_mem_alloc * alloc,
+ pid_t pid)
{
struct xgi_pcie_block *block;
- struct xgi_mem_pid *mempid_block;
xgi_down(info->pcie_sem);
- block = xgi_pcie_mem_alloc(info, size, owner);
+ block = xgi_pcie_mem_alloc(info, alloc->size, alloc->owner);
xgi_up(info->pcie_sem);
if (block == NULL) {
@@ -794,17 +793,18 @@ void xgi_pcie_alloc(struct xgi_info * info, unsigned long size,
PCIE_3D request means a opengl process created.
PCIE_3D_TEXTURE request means texture cannot alloc from fb.
*/
- if (owner == PCIE_3D || owner == PCIE_3D_TEXTURE) {
- mempid_block =
+ if ((alloc->owner == PCIE_3D)
+ || (alloc->owner == PCIE_3D_TEXTURE)) {
+ struct xgi_mem_pid *mempid_block =
kmalloc(sizeof(struct xgi_mem_pid), GFP_KERNEL);
if (!mempid_block)
XGI_ERROR("mempid_block alloc failed\n");
mempid_block->location = XGI_MEMLOC_NON_LOCAL;
- if (owner == PCIE_3D)
+ if (alloc->owner == PCIE_3D)
mempid_block->bus_addr = 0xFFFFFFFF; /*xgi_pcie_vertex_block has the address */
else
mempid_block->bus_addr = alloc->bus_addr;
- mempid_block->pid = alloc->pid;
+ mempid_block->pid = pid;
XGI_INFO
("Memory ProcessID add one pcie block pid:%ld successfully! \n",
@@ -944,15 +944,6 @@ void *xgi_find_pcie_virt(struct xgi_info * info, unsigned long address)
return NULL;
}
-void xgi_read_pcie_mem(struct xgi_info * info, struct xgi_mem_req * req)
-{
-
-}
-
-void xgi_write_pcie_mem(struct xgi_info * info, struct xgi_mem_req * req)
-{
-}
-
/*
address -- GE hw address
*/