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 <[EMAIL PROTECTED]>

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


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to