public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [resend patch 2.6.10-rc3 2/3] agpgart: allow multiple backends to be initialized
@ 2004-12-23  1:42 Mike Werner
  0 siblings, 0 replies; only message in thread
From: Mike Werner @ 2004-12-23  1:42 UTC (permalink / raw)
  To: akpm, linux-kernel, dri-devel

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@sgi.com>

# 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() */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-12-23  1:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-12-23  1:42 [resend patch 2.6.10-rc3 2/3] agpgart: allow multiple backends to be initialized Mike Werner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox