2005-04-17 02:20:36 +04:00
/**
2006-01-02 13:32:48 +03:00
* \ file drm_agpsupport . c
2005-04-17 02:20:36 +04:00
* DRM support for AGP / GART backend
2005-09-25 08:28:13 +04:00
*
2005-04-17 02:20:36 +04:00
* \ author Rickard E . ( Rik ) Faith < faith @ valinux . com >
* \ author Gareth Hughes < gareth @ valinux . com >
*/
/*
* Copyright 1999 Precision Insight , Inc . , Cedar Park , Texas .
* Copyright 2000 VA Linux Systems , Inc . , Sunnyvale , California .
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* VA LINUX SYSTEMS AND / OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*/
# include "drmP.h"
# include <linux/module.h>
# if __OS_HAS_AGP
2009-01-15 12:16:25 +03:00
# include <asm/agp.h>
2005-04-17 02:20:36 +04:00
/**
2005-07-10 10:56:52 +04:00
* Get AGP information .
2005-04-17 02:20:36 +04:00
*
* \ param inode device inode .
2007-08-25 14:23:09 +04:00
* \ param file_priv DRM file private .
2005-04-17 02:20:36 +04:00
* \ param cmd command .
* \ param arg pointer to a ( output ) drm_agp_info structure .
* \ return zero on success or a negative number on failure .
*
* Verifies the AGP device has been initialized and acquired and fills in the
* drm_agp_info structure with the information in drm_agp_head : : agp_info .
*/
2007-07-11 09:53:27 +04:00
int drm_agp_info ( struct drm_device * dev , struct drm_agp_info * info )
2005-04-17 02:20:36 +04:00
{
2005-09-25 08:28:13 +04:00
DRM_AGP_KERN * kern ;
2005-04-17 02:20:36 +04:00
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
2005-09-25 08:28:13 +04:00
kern = & dev - > agp - > agp_info ;
2005-07-10 10:56:52 +04:00
info - > agp_version_major = kern - > version . major ;
info - > agp_version_minor = kern - > version . minor ;
2005-09-25 08:28:13 +04:00
info - > mode = kern - > mode ;
info - > aperture_base = kern - > aper_base ;
info - > aperture_size = kern - > aper_size * 1024 * 1024 ;
info - > memory_allowed = kern - > max_memory < < PAGE_SHIFT ;
info - > memory_used = kern - > current_memory < < PAGE_SHIFT ;
info - > id_vendor = kern - > device - > vendor ;
info - > id_device = kern - > device - > device ;
2005-07-10 10:56:52 +04:00
return 0 ;
}
2005-09-25 08:28:13 +04:00
2005-07-10 10:56:52 +04:00
EXPORT_SYMBOL ( drm_agp_info ) ;
2007-09-03 06:06:45 +04:00
int drm_agp_info_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
2005-07-10 10:56:52 +04:00
{
2007-09-03 06:06:45 +04:00
struct drm_agp_info * info = data ;
2005-07-10 10:56:52 +04:00
int err ;
2007-09-03 06:06:45 +04:00
err = drm_agp_info ( dev , info ) ;
2005-07-10 10:56:52 +04:00
if ( err )
return err ;
2005-09-25 08:28:13 +04:00
2005-04-17 02:20:36 +04:00
return 0 ;
}
/**
2005-07-10 10:56:52 +04:00
* Acquire the AGP device .
2005-04-17 02:20:36 +04:00
*
2006-01-02 13:32:48 +03:00
* \ param dev DRM device that is to acquire AGP .
2005-09-25 08:28:13 +04:00
* \ return zero on success or a negative number on failure .
2005-04-17 02:20:36 +04:00
*
* Verifies the AGP device hasn ' t been acquired before and calls
2005-07-10 10:56:52 +04:00
* \ c agp_backend_acquire .
2005-04-17 02:20:36 +04:00
*/
2007-07-11 09:53:27 +04:00
int drm_agp_acquire ( struct drm_device * dev )
2005-04-17 02:20:36 +04:00
{
if ( ! dev - > agp )
return - ENODEV ;
if ( dev - > agp - > acquired )
return - EBUSY ;
if ( ! ( dev - > agp - > bridge = agp_backend_acquire ( dev - > pdev ) ) )
return - ENODEV ;
dev - > agp - > acquired = 1 ;
return 0 ;
}
2005-09-25 08:28:13 +04:00
2005-07-10 10:56:52 +04:00
EXPORT_SYMBOL ( drm_agp_acquire ) ;
2005-04-17 02:20:36 +04:00
/**
2005-07-10 10:56:52 +04:00
* Acquire the AGP device ( ioctl ) .
2005-04-17 02:20:36 +04:00
*
* \ param inode device inode .
2007-08-25 14:23:09 +04:00
* \ param file_priv DRM file private .
2005-04-17 02:20:36 +04:00
* \ param cmd command .
* \ param arg user argument .
* \ return zero on success or a negative number on failure .
*
2005-07-10 10:56:52 +04:00
* Verifies the AGP device hasn ' t been acquired before and calls
* \ c agp_backend_acquire .
2005-04-17 02:20:36 +04:00
*/
2007-09-03 06:06:45 +04:00
int drm_agp_acquire_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
2005-04-17 02:20:36 +04:00
{
2008-04-21 10:47:32 +04:00
return drm_agp_acquire ( ( struct drm_device * ) file_priv - > minor - > dev ) ;
2005-07-10 10:56:52 +04:00
}
2005-04-17 02:20:36 +04:00
2005-07-10 10:56:52 +04:00
/**
* Release the AGP device .
*
2006-01-02 13:32:48 +03:00
* \ param dev DRM device that is to release AGP .
2005-07-10 10:56:52 +04:00
* \ return zero on success or a negative number on failure .
*
* Verifies the AGP device has been acquired and calls \ c agp_backend_release .
*/
2007-07-11 09:53:27 +04:00
int drm_agp_release ( struct drm_device * dev )
2005-07-10 10:56:52 +04:00
{
2005-04-17 02:20:36 +04:00
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
agp_backend_release ( dev - > agp - > bridge ) ;
dev - > agp - > acquired = 0 ;
return 0 ;
}
2005-07-10 10:56:52 +04:00
EXPORT_SYMBOL ( drm_agp_release ) ;
2005-04-17 02:20:36 +04:00
2007-09-03 06:06:45 +04:00
int drm_agp_release_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
2005-04-17 02:20:36 +04:00
{
2005-07-10 10:56:52 +04:00
return drm_agp_release ( dev ) ;
2005-04-17 02:20:36 +04:00
}
/**
* Enable the AGP bus .
2005-09-25 08:28:13 +04:00
*
2005-07-10 10:56:52 +04:00
* \ param dev DRM device that has previously acquired AGP .
* \ param mode Requested AGP mode .
2005-04-17 02:20:36 +04:00
* \ return zero on success or a negative number on failure .
*
* Verifies the AGP device has been acquired but not enabled , and calls
2005-07-10 10:56:52 +04:00
* \ c agp_enable .
2005-04-17 02:20:36 +04:00
*/
2007-07-11 09:53:27 +04:00
int drm_agp_enable ( struct drm_device * dev , struct drm_agp_mode mode )
2005-04-17 02:20:36 +04:00
{
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
2005-09-25 08:28:13 +04:00
dev - > agp - > mode = mode . mode ;
2005-04-17 02:20:36 +04:00
agp_enable ( dev - > agp - > bridge , mode . mode ) ;
dev - > agp - > enabled = 1 ;
return 0 ;
}
2005-09-25 08:28:13 +04:00
2005-07-10 10:56:52 +04:00
EXPORT_SYMBOL ( drm_agp_enable ) ;
2007-09-03 06:06:45 +04:00
int drm_agp_enable_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
2005-07-10 10:56:52 +04:00
{
2007-09-03 06:06:45 +04:00
struct drm_agp_mode * mode = data ;
2005-07-10 10:56:52 +04:00
2007-09-03 06:06:45 +04:00
return drm_agp_enable ( dev , * mode ) ;
2005-07-10 10:56:52 +04:00
}
2005-04-17 02:20:36 +04:00
/**
* Allocate AGP memory .
*
* \ param inode device inode .
2007-08-25 14:23:09 +04:00
* \ param file_priv file private pointer .
2005-04-17 02:20:36 +04:00
* \ param cmd command .
* \ param arg pointer to a drm_agp_buffer structure .
* \ return zero on success or a negative number on failure .
2005-09-25 08:28:13 +04:00
*
2005-04-17 02:20:36 +04:00
* Verifies the AGP device is present and has been acquired , allocates the
* memory via alloc_agp ( ) and creates a drm_agp_mem entry for it .
*/
2007-07-11 09:53:27 +04:00
int drm_agp_alloc ( struct drm_device * dev , struct drm_agp_buffer * request )
2005-04-17 02:20:36 +04:00
{
2007-07-11 10:53:40 +04:00
struct drm_agp_mem * entry ;
2005-09-25 08:28:13 +04:00
DRM_AGP_MEM * memory ;
unsigned long pages ;
u32 type ;
2005-04-17 02:20:36 +04:00
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
if ( ! ( entry = drm_alloc ( sizeof ( * entry ) , DRM_MEM_AGPLISTS ) ) )
return - ENOMEM ;
2005-09-25 08:28:13 +04:00
memset ( entry , 0 , sizeof ( * entry ) ) ;
2005-04-17 02:20:36 +04:00
2005-11-11 14:33:39 +03:00
pages = ( request - > size + PAGE_SIZE - 1 ) / PAGE_SIZE ;
type = ( u32 ) request - > type ;
2005-07-10 12:17:42 +04:00
if ( ! ( memory = drm_alloc_agp ( dev , pages , type ) ) ) {
2005-04-17 02:20:36 +04:00
drm_free ( entry , sizeof ( * entry ) , DRM_MEM_AGPLISTS ) ;
return - ENOMEM ;
}
2005-09-25 08:28:13 +04:00
entry - > handle = ( unsigned long ) memory - > key + 1 ;
entry - > memory = memory ;
entry - > bound = 0 ;
entry - > pages = pages ;
2007-05-25 23:01:51 +04:00
list_add ( & entry - > head , & dev - > agp - > memory ) ;
2005-04-17 02:20:36 +04:00
2005-11-11 14:33:39 +03:00
request - > handle = entry - > handle ;
request - > physical = memory - > physical ;
return 0 ;
}
EXPORT_SYMBOL ( drm_agp_alloc ) ;
2007-09-03 06:06:45 +04:00
int drm_agp_alloc_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
{
struct drm_agp_buffer * request = data ;
2005-11-11 14:33:39 +03:00
2007-09-03 06:06:45 +04:00
return drm_agp_alloc ( dev , request ) ;
2005-04-17 02:20:36 +04:00
}
/**
* Search for the AGP memory entry associated with a handle .
*
* \ param dev DRM device structure .
* \ param handle AGP memory handle .
* \ return pointer to the drm_agp_mem structure associated with \ p handle .
2005-09-25 08:28:13 +04:00
*
2005-04-17 02:20:36 +04:00
* Walks through drm_agp_head : : memory until finding a matching handle .
*/
2007-07-11 10:53:40 +04:00
static struct drm_agp_mem * drm_agp_lookup_entry ( struct drm_device * dev ,
2005-09-25 08:28:13 +04:00
unsigned long handle )
2005-04-17 02:20:36 +04:00
{
2007-07-11 10:53:40 +04:00
struct drm_agp_mem * entry ;
2005-04-17 02:20:36 +04:00
2007-05-25 23:01:51 +04:00
list_for_each_entry ( entry , & dev - > agp - > memory , head ) {
2005-04-17 02:20:36 +04:00
if ( entry - > handle = = handle )
return entry ;
}
return NULL ;
}
/**
* Unbind AGP memory from the GATT ( ioctl ) .
*
* \ param inode device inode .
2007-08-25 14:23:09 +04:00
* \ param file_priv DRM file private .
2005-04-17 02:20:36 +04:00
* \ param cmd command .
* \ param arg pointer to a drm_agp_binding structure .
* \ return zero on success or a negative number on failure .
*
* Verifies the AGP device is present and acquired , looks - up the AGP memory
* entry and passes it to the unbind_agp ( ) function .
*/
2007-07-11 09:53:27 +04:00
int drm_agp_unbind ( struct drm_device * dev , struct drm_agp_binding * request )
2005-04-17 02:20:36 +04:00
{
2007-07-11 10:53:40 +04:00
struct drm_agp_mem * entry ;
2005-04-17 02:20:36 +04:00
int ret ;
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
2005-11-11 14:33:39 +03:00
if ( ! ( entry = drm_agp_lookup_entry ( dev , request - > handle ) ) )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
if ( ! entry - > bound )
return - EINVAL ;
ret = drm_unbind_agp ( entry - > memory ) ;
if ( ret = = 0 )
2005-09-25 08:28:13 +04:00
entry - > bound = 0 ;
2005-04-17 02:20:36 +04:00
return ret ;
}
2005-11-11 14:33:39 +03:00
EXPORT_SYMBOL ( drm_agp_unbind ) ;
2007-09-03 06:06:45 +04:00
int drm_agp_unbind_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
{
struct drm_agp_binding * request = data ;
2005-11-11 14:33:39 +03:00
2007-09-03 06:06:45 +04:00
return drm_agp_unbind ( dev , request ) ;
2005-11-11 14:33:39 +03:00
}
2005-04-17 02:20:36 +04:00
/**
* Bind AGP memory into the GATT ( ioctl )
*
* \ param inode device inode .
2007-08-25 14:23:09 +04:00
* \ param file_priv DRM file private .
2005-04-17 02:20:36 +04:00
* \ param cmd command .
* \ param arg pointer to a drm_agp_binding structure .
* \ return zero on success or a negative number on failure .
*
* Verifies the AGP device is present and has been acquired and that no memory
* is currently bound into the GATT . Looks - up the AGP memory entry and passes
* it to bind_agp ( ) function .
*/
2007-07-11 09:53:27 +04:00
int drm_agp_bind ( struct drm_device * dev , struct drm_agp_binding * request )
2005-04-17 02:20:36 +04:00
{
2007-07-11 10:53:40 +04:00
struct drm_agp_mem * entry ;
2005-09-25 08:28:13 +04:00
int retcode ;
int page ;
2005-04-17 02:20:36 +04:00
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
2005-11-11 14:33:39 +03:00
if ( ! ( entry = drm_agp_lookup_entry ( dev , request - > handle ) ) )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
if ( entry - > bound )
return - EINVAL ;
2005-11-11 14:33:39 +03:00
page = ( request - > offset + PAGE_SIZE - 1 ) / PAGE_SIZE ;
2005-04-17 02:20:36 +04:00
if ( ( retcode = drm_bind_agp ( entry - > memory , page ) ) )
return retcode ;
entry - > bound = dev - > agp - > base + ( page < < PAGE_SHIFT ) ;
DRM_DEBUG ( " base = 0x%lx entry->bound = 0x%lx \n " ,
dev - > agp - > base , entry - > bound ) ;
return 0 ;
}
2005-11-11 14:33:39 +03:00
EXPORT_SYMBOL ( drm_agp_bind ) ;
2007-09-03 06:06:45 +04:00
int drm_agp_bind_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
{
struct drm_agp_binding * request = data ;
2005-11-11 14:33:39 +03:00
2007-09-03 06:06:45 +04:00
return drm_agp_bind ( dev , request ) ;
2005-11-11 14:33:39 +03:00
}
2005-04-17 02:20:36 +04:00
/**
* Free AGP memory ( ioctl ) .
*
* \ param inode device inode .
2007-08-25 14:23:09 +04:00
* \ param file_priv DRM file private .
2005-04-17 02:20:36 +04:00
* \ param cmd command .
* \ param arg pointer to a drm_agp_buffer structure .
* \ return zero on success or a negative number on failure .
*
* Verifies the AGP device is present and has been acquired and looks up the
* AGP memory entry . If the memory it ' s currently bound , unbind it via
* unbind_agp ( ) . Frees it via free_agp ( ) as well as the entry itself
* and unlinks from the doubly linked list it ' s inserted in .
*/
2007-07-11 09:53:27 +04:00
int drm_agp_free ( struct drm_device * dev , struct drm_agp_buffer * request )
2005-04-17 02:20:36 +04:00
{
2007-07-11 10:53:40 +04:00
struct drm_agp_mem * entry ;
2005-04-17 02:20:36 +04:00
if ( ! dev - > agp | | ! dev - > agp - > acquired )
return - EINVAL ;
2005-11-11 14:33:39 +03:00
if ( ! ( entry = drm_agp_lookup_entry ( dev , request - > handle ) ) )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
if ( entry - > bound )
drm_unbind_agp ( entry - > memory ) ;
2007-05-25 23:01:51 +04:00
list_del ( & entry - > head ) ;
2005-04-17 02:20:36 +04:00
drm_free_agp ( entry - > memory , entry - > pages ) ;
drm_free ( entry , sizeof ( * entry ) , DRM_MEM_AGPLISTS ) ;
return 0 ;
}
2005-11-11 14:33:39 +03:00
EXPORT_SYMBOL ( drm_agp_free ) ;
2007-09-03 06:06:45 +04:00
int drm_agp_free_ioctl ( struct drm_device * dev , void * data ,
struct drm_file * file_priv )
{
struct drm_agp_buffer * request = data ;
return drm_agp_free ( dev , request ) ;
2005-11-11 14:33:39 +03:00
}
2005-04-17 02:20:36 +04:00
/**
* Initialize the AGP resources .
*
* \ return pointer to a drm_agp_head structure .
*
2006-01-02 13:32:48 +03:00
* Gets the drm_agp_t structure which is made available by the agpgart module
* via the inter_module_ * functions . Creates and initializes a drm_agp_head
* structure .
2005-04-17 02:20:36 +04:00
*/
2007-07-11 10:53:40 +04:00
struct drm_agp_head * drm_agp_init ( struct drm_device * dev )
2005-04-17 02:20:36 +04:00
{
2007-07-11 10:53:40 +04:00
struct drm_agp_head * head = NULL ;
2005-04-17 02:20:36 +04:00
if ( ! ( head = drm_alloc ( sizeof ( * head ) , DRM_MEM_AGPLISTS ) ) )
return NULL ;
memset ( ( void * ) head , 0 , sizeof ( * head ) ) ;
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 ) ;
}
if ( head - > agp_info . chipset = = NOT_SUPPORTED ) {
drm_free ( head , sizeof ( * head ) , DRM_MEM_AGPLISTS ) ;
return NULL ;
}
2007-05-25 23:01:51 +04:00
INIT_LIST_HEAD ( & head - > memory ) ;
2005-04-17 02:20:36 +04:00
head - > cant_use_aperture = head - > agp_info . cant_use_aperture ;
head - > page_mask = head - > agp_info . page_mask ;
2007-11-22 09:40:37 +03:00
head - > base = head - > agp_info . aper_base ;
2005-04-17 02:20:36 +04:00
return head ;
}
/** Calls agp_allocate_memory() */
2005-09-25 08:28:13 +04:00
DRM_AGP_MEM * drm_agp_allocate_memory ( struct agp_bridge_data * bridge ,
size_t pages , u32 type )
2005-04-17 02:20:36 +04:00
{
return agp_allocate_memory ( bridge , pages , type ) ;
}
/** Calls agp_free_memory() */
2005-09-25 08:28:13 +04:00
int drm_agp_free_memory ( DRM_AGP_MEM * handle )
2005-04-17 02:20:36 +04:00
{
if ( ! handle )
return 0 ;
agp_free_memory ( handle ) ;
return 1 ;
}
/** Calls agp_bind_memory() */
2005-09-25 08:28:13 +04:00
int drm_agp_bind_memory ( DRM_AGP_MEM * handle , off_t start )
2005-04-17 02:20:36 +04:00
{
if ( ! handle )
return - EINVAL ;
return agp_bind_memory ( handle , start ) ;
}
2005-09-25 08:28:13 +04:00
2005-04-17 02:20:36 +04:00
/** Calls agp_unbind_memory() */
2005-09-25 08:28:13 +04:00
int drm_agp_unbind_memory ( DRM_AGP_MEM * handle )
2005-04-17 02:20:36 +04:00
{
if ( ! handle )
return - EINVAL ;
return agp_unbind_memory ( handle ) ;
}
2008-07-30 23:06:12 +04:00
/**
* Binds a collection of pages into AGP memory at the given offset , returning
* the AGP memory structure containing them .
*
* No reference is held on the pages during this time - - it is up to the
* caller to handle that .
*/
DRM_AGP_MEM *
drm_agp_bind_pages ( struct drm_device * dev ,
struct page * * pages ,
unsigned long num_pages ,
2008-10-15 06:55:10 +04:00
uint32_t gtt_offset ,
u32 type )
2008-07-30 23:06:12 +04:00
{
DRM_AGP_MEM * mem ;
int ret , i ;
DRM_DEBUG ( " \n " ) ;
mem = drm_agp_allocate_memory ( dev - > agp - > bridge , num_pages ,
2008-10-15 06:55:10 +04:00
type ) ;
2008-07-30 23:06:12 +04:00
if ( mem = = NULL ) {
DRM_ERROR ( " Failed to allocate memory for %ld pages \n " ,
num_pages ) ;
return NULL ;
}
for ( i = 0 ; i < num_pages ; i + + )
mem - > memory [ i ] = phys_to_gart ( page_to_phys ( pages [ i ] ) ) ;
mem - > page_count = num_pages ;
mem - > is_flushed = true ;
ret = drm_agp_bind_memory ( mem , gtt_offset / PAGE_SIZE ) ;
if ( ret ! = 0 ) {
DRM_ERROR ( " Failed to bind AGP memory: %d \n " , ret ) ;
agp_free_memory ( mem ) ;
return NULL ;
}
return mem ;
}
EXPORT_SYMBOL ( drm_agp_bind_pages ) ;
void drm_agp_chipset_flush ( struct drm_device * dev )
{
agp_flush_chipset ( dev - > agp - > bridge ) ;
}
EXPORT_SYMBOL ( drm_agp_chipset_flush ) ;
# endif /* __OS_HAS_AGP */