fix up AGP multi-head support for kernel 2.6.12
authorDave Airlie <airlied@linux.ie>
Fri, 25 Mar 2005 09:48:34 +0000 (09:48 +0000)
committerDave Airlie <airlied@linux.ie>
Fri, 25 Mar 2005 09:48:34 +0000 (09:48 +0000)
linux-core/drmP.h
linux-core/drm_agpsupport.c
linux-core/drm_drv.c
linux-core/drm_memory.c
linux-core/drm_stub.c

index d417f97..cdf7e76 100644 (file)
@@ -455,6 +455,9 @@ typedef struct drm_agp_head {
        DRM_AGP_KERN agp_info;          /**< AGP device information */
        drm_agp_mem_t *memory;          /**< memory entries */
        unsigned long mode;             /**< AGP mode */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)
+       struct agp_bridge_data  *bridge;
+#endif
        int enabled;                    /**< whether the AGP bus as been enabled */
        int acquired;                   /**< whether the AGP device has been acquired */
        unsigned long base;
@@ -766,7 +769,11 @@ extern void *drm_calloc(size_t nmemb, size_t size, int area);
 extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area);
 extern unsigned long drm_alloc_pages(int order, int area);
 extern void drm_free_pages(unsigned long address, int order, int area);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
 extern DRM_AGP_MEM *drm_alloc_agp(int pages, u32 type);
+#else
+extern DRM_AGP_MEM *drm_alloc_agp(struct agp_bridge_data *bridge, int pages, u32 type);
+#endif
 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);
@@ -891,10 +898,10 @@ extern int drm_vblank_wait(drm_device_t * dev, unsigned int *vbl_seq);
 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 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,
@@ -909,7 +916,11 @@ extern int drm_agp_unbind(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
 extern int drm_agp_bind(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
 extern DRM_AGP_MEM *drm_agp_allocate_memory(size_t pages, u32 type);
+#else
+extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type);
+#endif
 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);
index ff64949..fcbe56a 100644 (file)
@@ -92,7 +92,9 @@ int drm_agp_acquire(struct inode *inode, struct file *filp,
 {
        drm_file_t *priv = filp->private_data;
        drm_device_t *dev = priv->head->dev;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        int retcode;
+#endif
 
        if (!dev->agp)
                return -ENODEV;
@@ -102,8 +104,14 @@ int drm_agp_acquire(struct inode *inode, struct file *filp,
        if (dev->agp->cant_use_aperture)
                return -EINVAL;
 #endif
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        if ((retcode = agp_backend_acquire()))
                return retcode;
+#else
+       if (!(dev->agp->bridge = agp_backend_acquire(dev->pdev)))
+               return -ENODEV;
+#endif
+
        dev->agp->acquired = 1;
        return 0;
 }
@@ -127,7 +135,11 @@ int drm_agp_release(struct inode *inode, struct file *filp,
 
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        agp_backend_release();
+#else
+       agp_backend_release(dev->agp->bridge);
+#endif
        dev->agp->acquired = 0;
        return 0;
 
@@ -138,9 +150,13 @@ int drm_agp_release(struct inode *inode, struct file *filp,
  *
  * Calls agp_backend_release().
  */
-void drm_agp_do_release(void)
+void drm_agp_do_release(drm_device_t *dev)
 {
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        agp_backend_release();
+#else
+       agp_backend_release(dev->agp->bridge);
+#endif
 }
 
 /**
@@ -169,7 +185,11 @@ int drm_agp_enable(struct inode *inode, struct file *filp,
                return -EFAULT;
 
        dev->agp->mode = mode.mode;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        agp_enable(mode.mode);
+#else
+       agp_enable(dev->agp->bridge, mode.mode);
+#endif
        dev->agp->base = dev->agp->agp_info.aper_base;
        dev->agp->enabled = 1;
        return 0;
@@ -210,11 +230,17 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
 
        pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE;
        type = (u32) request.type;
-
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        if (!(memory = drm_alloc_agp(pages, type))) {
                drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
                return -ENOMEM;
        }
+#else
+       if (!(memory = drm_alloc_agp(dev->agp->bridge, pages, type))) {
+               drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
+               return -ENOMEM;
+       }
+#endif
 
        entry->handle = (unsigned long)memory->key + 1;
        entry->memory = memory;
@@ -391,14 +417,29 @@ int drm_agp_free(struct inode *inode, struct file *filp,
  * 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;
 
        if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS)))
                return NULL;
        memset((void *)head, 0, sizeof(*head));
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
        agp_copy_info(&head->agp_info);
+#else
+       head->bridge = agp_find_bridge(dev->pdev);
+       if (!head->bridge) {
+               if (!(head->bridge = agp_backend_acquire(dev->pdev))) {
+                       drm_free(head, sizeof(*head), DRM_MEM_AGPLISTS);
+                       return NULL;
+       }
+               agp_copy_info(head->bridge, &head->agp_info);
+               agp_backend_release(head->bridge);
+       } else {
+               agp_copy_info(head->bridge, &head->agp_info);
+       }
+#endif
        if (head->agp_info.chipset == NOT_SUPPORTED) {
                drm_free(head, sizeof(*head), DRM_MEM_AGPLISTS);
                return NULL;
@@ -410,10 +451,17 @@ drm_agp_head_t *drm_agp_init(void)
 }
 
 /** Calls agp_allocate_memory() */
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
 DRM_AGP_MEM *drm_agp_allocate_memory(size_t pages, u32 type)
 {
        return agp_allocate_memory(pages, type);
 }
+#else
+DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type)
+{
+       return agp_allocate_memory(bridge, pages, type);
+}
+#endif
 
 /** Calls agp_free_memory() */
 int drm_agp_free_memory(DRM_AGP_MEM * handle)
index 4a8c3a1..42ca3c3 100644 (file)
@@ -187,7 +187,7 @@ int drm_takedown(drm_device_t * dev)
                dev->agp->memory = NULL;
 
                if (dev->agp->acquired)
-                       drm_agp_do_release();
+                       drm_agp_do_release(dev);
 
                dev->agp->acquired = 0;
                dev->agp->enabled = 0;
index fcbcb28..55523c6 100644 (file)
@@ -151,10 +151,17 @@ void drm_free_pages(unsigned long address, int order, int area)
 
 #if __OS_HAS_AGP
 /** Wrapper around agp_allocate_memory() */
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
 DRM_AGP_MEM *drm_alloc_agp(int pages, u32 type)
 {
        return drm_agp_allocate_memory(pages, type);
 }
+#else
+DRM_AGP_MEM *drm_alloc_agp(struct agp_bridge_data *bridge, int pages, u32 type)
+{
+       return drm_agp_allocate_memory(bridge, pages, type);
+}
+#endif
 
 /** Wrapper around agp_free_memory() */
 int drm_free_agp(DRM_AGP_MEM * handle, int pages)
index 41dee09..a3cc566 100644 (file)
@@ -99,7 +99,7 @@ static int fill_in_dev(drm_device_t * dev, struct pci_dev *pdev,
                        goto error_out_unreg;
 
        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");