[resend patch 2.6.10-rc3 2/3] agpgart: allow multiple backends to be initialized

From: Mike Werner
Date: Wed Dec 22 2004 - 20:46:54 EST


This patch adds support for initializing and addressing multiple AGP
bridges using the agpgart driver. In particular, it extends agp_acquire
and agp_allocate_memory so that different bridges can be acquired
and memory allocated within a specific AGP aperature.

Signed-off-by: Mike Werner <werner@xxxxxxx>

# This is a BitKeeper generated diff -Nru style patch.
#
# Add drm support for new multiple agp bridge agpgart api
#
diff -Nru a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
--- a/drivers/char/drm/drmP.h 2004-12-17 12:12:56 -08:00
+++ b/drivers/char/drm/drmP.h 2004-12-17 12:12:56 -08:00
@@ -481,6 +481,7 @@
DRM_AGP_KERN agp_info; /**< AGP device information */
drm_agp_mem_t *memory; /**< memory entries */
unsigned long mode; /**< AGP mode */
+ struct agp_bridge_data *bridge;
int enabled; /**< whether the AGP bus as been enabled */
int acquired; /**< whether the AGP device has been acquired */
unsigned long base;
@@ -778,7 +779,7 @@
drm_device_t *dev);
extern void DRM(ioremapfree)(void *pt, unsigned long size, drm_device_t *dev);

-extern DRM_AGP_MEM *DRM(alloc_agp)(int pages, u32 type);
+extern DRM_AGP_MEM *DRM(alloc_agp)(struct agp_bridge_data *bridge, int pages, u32 type);
extern int DRM(free_agp)(DRM_AGP_MEM *handle, int pages);
extern int DRM(bind_agp)(DRM_AGP_MEM *handle, unsigned int start);
extern int DRM(unbind_agp)(DRM_AGP_MEM *handle);
@@ -896,11 +897,11 @@
extern void DRM(vbl_send_signals)( drm_device_t *dev );

/* AGP/GART support (drm_agpsupport.h) */
-extern drm_agp_head_t *DRM(agp_init)(void);
+extern drm_agp_head_t *DRM(agp_init)(drm_device_t *dev);
extern void DRM(agp_uninit)(void);
extern int DRM(agp_acquire)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
-extern void DRM(agp_do_release)(void);
+extern void DRM(agp_do_release)(drm_device_t *dev);
extern int DRM(agp_release)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
extern int DRM(agp_enable)(struct inode *inode, struct file *filp,
@@ -915,7 +916,7 @@
unsigned int cmd, unsigned long arg);
extern int DRM(agp_bind)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
-extern DRM_AGP_MEM *DRM(agp_allocate_memory)(size_t pages, u32 type);
+extern DRM_AGP_MEM *DRM(agp_allocate_memory)(struct agp_bridge_data *bridge, size_t pages, u32 type);
extern int DRM(agp_free_memory)(DRM_AGP_MEM *handle);
extern int DRM(agp_bind_memory)(DRM_AGP_MEM *handle, off_t start);
extern int DRM(agp_unbind_memory)(DRM_AGP_MEM *handle);
diff -Nru a/drivers/char/drm/drm_agpsupport.h b/drivers/char/drm/drm_agpsupport.h
--- a/drivers/char/drm/drm_agpsupport.h 2004-12-17 12:12:56 -08:00
+++ b/drivers/char/drm/drm_agpsupport.h 2004-12-17 12:12:56 -08:00
@@ -100,7 +100,7 @@
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
- int retcode;
+

if (!dev->agp)
return -ENODEV;
@@ -108,8 +108,8 @@
return -EBUSY;
if (!drm_agp->acquire)
return -EINVAL;
- if ((retcode = drm_agp->acquire()))
- return retcode;
+ if (!(dev->agp->bridge = drm_agp->acquire(dev->pdev)))
+ return -ENODEV;
dev->agp->acquired = 1;
return 0;
}
@@ -133,7 +133,7 @@

if (!dev->agp || !dev->agp->acquired || !drm_agp->release)
return -EINVAL;
- drm_agp->release();
+ drm_agp->release(dev->agp->bridge);
dev->agp->acquired = 0;
return 0;

@@ -144,10 +144,10 @@
*
* Calls drm_agp->release().
*/
-void DRM(agp_do_release)(void)
+void DRM(agp_do_release)(drm_device_t *dev)
{
if (drm_agp->release)
- drm_agp->release();
+ drm_agp->release(dev->agp->bridge);
}

/**
@@ -176,7 +176,7 @@
return -EFAULT;

dev->agp->mode = mode.mode;
- drm_agp->enable(mode.mode);
+ drm_agp->enable(dev->agp->bridge, mode.mode);
dev->agp->base = dev->agp->agp_info.aper_base;
dev->agp->enabled = 1;
return 0;
@@ -218,7 +218,7 @@
pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE;
type = (u32) request.type;

- if (!(memory = DRM(alloc_agp)(pages, type))) {
+ if (!(memory = DRM(alloc_agp)(dev->agp->bridge, pages, type))) {
DRM(free)(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
return -ENOMEM;
}
@@ -395,16 +395,24 @@
* via the inter_module_* functions. Creates and initializes a drm_agp_head
* structure.
*/
-drm_agp_head_t *DRM(agp_init)(void)
+drm_agp_head_t *DRM(agp_init)(drm_device_t *dev)
{
drm_agp_head_t *head = NULL;

drm_agp = DRM_AGP_GET;
- if (drm_agp) {
+ if (!drm_agp)
+ DRM_ERROR("DRM_AGP_GET returned NULL\n");
+ else
+ {
if (!(head = DRM(alloc)(sizeof(*head), DRM_MEM_AGPLISTS)))
return NULL;
memset((void *)head, 0, sizeof(*head));
- drm_agp->copy_info(&head->agp_info);
+ if (!(head->bridge = drm_agp->acquire(dev->pdev))) {
+ DRM(free)(head, sizeof(*head), DRM_MEM_AGPLISTS);
+ return NULL;
+ }
+ drm_agp->copy_info(head->bridge, &head->agp_info);
+ drm_agp->release(head->bridge);
if (head->agp_info.chipset == NOT_SUPPORTED) {
DRM(free)(head, sizeof(*head), DRM_MEM_AGPLISTS);
return NULL;
@@ -433,11 +441,11 @@
}

/** Calls drm_agp->allocate_memory() */
-DRM_AGP_MEM *DRM(agp_allocate_memory)(size_t pages, u32 type)
+DRM_AGP_MEM *DRM(agp_allocate_memory)(struct agp_bridge_data *bridge, size_t pages, u32 type)
{
if (!drm_agp->allocate_memory)
return NULL;
- return drm_agp->allocate_memory(pages, type);
+ return drm_agp->allocate_memory(bridge, pages, type);
}

/** Calls drm_agp->free_memory() */
diff -Nru a/drivers/char/drm/drm_drv.h b/drivers/char/drm/drm_drv.h
--- a/drivers/char/drm/drm_drv.h 2004-12-17 12:12:56 -08:00
+++ b/drivers/char/drm/drm_drv.h 2004-12-17 12:12:56 -08:00
@@ -318,7 +318,7 @@
}
dev->agp->memory = NULL;

- if ( dev->agp->acquired ) DRM(agp_do_release)();
+ if ( dev->agp->acquired ) DRM(agp_do_release)( dev);

dev->agp->acquired = 0;
dev->agp->enabled = 0;
@@ -490,7 +490,7 @@

if (drm_core_has_AGP(dev))
{
- dev->agp = DRM(agp_init)();
+ dev->agp = DRM(agp_init)(dev);
if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP) && (dev->agp == NULL)) {
DRM_ERROR( "Cannot initialize the agpgart module.\n" );
DRM(stub_unregister)(dev->minor);
diff -Nru a/drivers/char/drm/drm_memory.h b/drivers/char/drm/drm_memory.h
--- a/drivers/char/drm/drm_memory.h 2004-12-17 12:12:56 -08:00
+++ b/drivers/char/drm/drm_memory.h 2004-12-17 12:12:56 -08:00
@@ -343,9 +343,9 @@

#if __OS_HAS_AGP
/** Wrapper around agp_allocate_memory() */
-DRM_AGP_MEM *DRM(alloc_agp)(int pages, u32 type)
+DRM_AGP_MEM *DRM(alloc_agp)(struct agp_bridge_data *bridge, int pages, u32 type)
{
- return DRM(agp_allocate_memory)(pages, type);
+ return DRM(agp_allocate_memory)(bridge, pages, type);
}

/** Wrapper around agp_free_memory() */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/