agpgart: allow multiple backends to be initialized
PATCH RESEND 2/3 agpgart: allow multiple backends to be initialized
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 #
drivers/char/drm/drmP.h +5 -4
@@ -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);
drivers/char/drm/drm_agpsupport.h +21 -13
@@ -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() */
drivers/char/drm/drm_drv.h +2 -2
@@ -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);
drivers/char/drm/drm_memory.h +2 -2
@@ -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() */