2005-04-17 02:20:36 +04:00
/*
* AGPGART
* Copyright ( C ) 2004 Silicon Graphics , Inc .
* Copyright ( C ) 2002 - 2004 Dave Jones
* Copyright ( C ) 1999 Jeff Hartmann
* Copyright ( C ) 1999 Precision Insight , Inc .
* Copyright ( C ) 1999 Xi Graphics , Inc .
*
* 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 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
2006-02-28 08:54:25 +03:00
* JEFF HARTMANN , OR ANY OTHER CONTRIBUTORS 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
2005-04-17 02:20:36 +04:00
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
*
*/
# ifndef _AGP_BACKEND_PRIV_H
# define _AGP_BACKEND_PRIV_H 1
# include <asm/agp.h> /* for flush_agp_cache() */
# define PFX "agpgart: "
//#define AGP_DEBUG 1
# ifdef AGP_DEBUG
2008-04-30 11:55:10 +04:00
# define DBG(x,y...) printk (KERN_DEBUG PFX "%s: " x "\n", __func__ , ## y)
2005-04-17 02:20:36 +04:00
# else
# define DBG(x,y...) do { } while (0)
# endif
extern struct agp_bridge_data * agp_bridge ;
enum aper_size_type {
U8_APER_SIZE ,
U16_APER_SIZE ,
U32_APER_SIZE ,
LVL2_APER_SIZE ,
FIXED_APER_SIZE
} ;
struct gatt_mask {
unsigned long mask ;
u32 type ;
2006-02-28 08:54:25 +03:00
/* totally device specific, for integrated chipsets that
2005-04-17 02:20:36 +04:00
* might have different types of memory masks . For other
* devices this will probably be ignored */
} ;
2007-10-15 04:19:16 +04:00
# define AGP_PAGE_DESTROY_UNMAP 1
# define AGP_PAGE_DESTROY_FREE 2
2005-04-17 02:20:36 +04:00
struct aper_size_info_8 {
int size ;
int num_entries ;
int page_order ;
u8 size_value ;
} ;
struct aper_size_info_16 {
int size ;
int num_entries ;
int page_order ;
u16 size_value ;
} ;
struct aper_size_info_32 {
int size ;
int num_entries ;
int page_order ;
u32 size_value ;
} ;
struct aper_size_info_lvl2 {
int size ;
int num_entries ;
u32 size_value ;
} ;
struct aper_size_info_fixed {
int size ;
int num_entries ;
int page_order ;
} ;
struct agp_bridge_driver {
struct module * owner ;
2007-02-23 02:41:28 +03:00
const void * aperture_sizes ;
2005-04-17 02:20:36 +04:00
int num_aperture_sizes ;
enum aper_size_type size_type ;
2008-03-27 00:10:02 +03:00
bool cant_use_aperture ;
bool needs_scratch_page ;
2007-02-23 02:41:28 +03:00
const struct gatt_mask * masks ;
2005-04-17 02:20:36 +04:00
int ( * fetch_size ) ( void ) ;
int ( * configure ) ( void ) ;
void ( * agp_enable ) ( struct agp_bridge_data * , u32 ) ;
void ( * cleanup ) ( void ) ;
void ( * tlb_flush ) ( struct agp_memory * ) ;
2009-07-27 13:27:29 +04:00
unsigned long ( * mask_memory ) ( struct agp_bridge_data * , dma_addr_t , int ) ;
2005-04-17 02:20:36 +04:00
void ( * cache_flush ) ( void ) ;
int ( * create_gatt_table ) ( struct agp_bridge_data * ) ;
int ( * free_gatt_table ) ( struct agp_bridge_data * ) ;
int ( * insert_memory ) ( struct agp_memory * , off_t , int ) ;
int ( * remove_memory ) ( struct agp_memory * , off_t , int ) ;
struct agp_memory * ( * alloc_by_type ) ( size_t , int ) ;
void ( * free_by_type ) ( struct agp_memory * ) ;
2009-06-12 08:11:41 +04:00
struct page * ( * agp_alloc_page ) ( struct agp_bridge_data * ) ;
2008-08-21 06:46:11 +04:00
int ( * agp_alloc_pages ) ( struct agp_bridge_data * , struct agp_memory * , size_t ) ;
2009-06-12 08:11:41 +04:00
void ( * agp_destroy_page ) ( struct page * , int flags ) ;
2008-08-21 06:46:17 +04:00
void ( * agp_destroy_pages ) ( struct agp_memory * ) ;
2007-10-29 08:14:03 +03:00
int ( * agp_type_to_mask_type ) ( struct agp_bridge_data * , int ) ;
2005-04-17 02:20:36 +04:00
} ;
struct agp_bridge_data {
2006-08-20 18:48:13 +04:00
const struct agp_version * version ;
2007-02-23 02:41:28 +03:00
const struct agp_bridge_driver * driver ;
2009-09-27 22:29:37 +04:00
const struct vm_operations_struct * vm_ops ;
2005-04-17 02:20:36 +04:00
void * previous_size ;
void * current_size ;
void * dev_private_data ;
struct pci_dev * dev ;
u32 __iomem * gatt_table ;
u32 * gatt_table_real ;
unsigned long scratch_page ;
2009-07-29 11:39:26 +04:00
struct page * scratch_page_page ;
2009-07-23 20:25:49 +04:00
dma_addr_t scratch_page_dma ;
2005-04-17 02:20:36 +04:00
unsigned long gart_bus_addr ;
unsigned long gatt_bus_addr ;
u32 mode ;
enum chipset_type type ;
unsigned long * key_list ;
atomic_t current_memory_agp ;
atomic_t agp_in_use ;
int max_memory_agp ; /* in number of pages */
int aperture_size_idx ;
int capndx ;
int flags ;
char major_version ;
char minor_version ;
struct list_head list ;
2005-07-30 01:03:39 +04:00
u32 apbase_config ;
2008-07-31 09:48:07 +04:00
/* list of agp_memory mapped to the aperture */
struct list_head mapped_list ;
spinlock_t mapped_lock ;
2005-04-17 02:20:36 +04:00
} ;
# define KB(x) ((x) * 1024)
# define MB(x) (KB (KB (x)))
# define GB(x) (MB (KB (x)))
# define A_SIZE_8(x) ((struct aper_size_info_8 *) x)
# define A_SIZE_16(x) ((struct aper_size_info_16 *) x)
# define A_SIZE_32(x) ((struct aper_size_info_32 *) x)
# define A_SIZE_LVL2(x) ((struct aper_size_info_lvl2 *) x)
# define A_SIZE_FIX(x) ((struct aper_size_info_fixed *) x)
# define A_IDX8(bridge) (A_SIZE_8((bridge)->driver->aperture_sizes) + i)
# define A_IDX16(bridge) (A_SIZE_16((bridge)->driver->aperture_sizes) + i)
# define A_IDX32(bridge) (A_SIZE_32((bridge)->driver->aperture_sizes) + i)
# define MAXKEY (4096 * 32)
# define PGE_EMPTY(b, p) (!(p) || (p) == (unsigned long) (b)->scratch_page)
struct agp_device_ids {
unsigned short device_id ; /* first, to make table easier to read */
enum chipset_type chipset ;
const char * chipset_name ;
int ( * chipset_setup ) ( struct pci_dev * pdev ) ; /* used to override generic */
} ;
/* Driver registration */
struct agp_bridge_data * agp_alloc_bridge ( void ) ;
void agp_put_bridge ( struct agp_bridge_data * bridge ) ;
int agp_add_bridge ( struct agp_bridge_data * bridge ) ;
void agp_remove_bridge ( struct agp_bridge_data * bridge ) ;
/* Frontend routines. */
int agp_frontend_initialize ( void ) ;
void agp_frontend_cleanup ( void ) ;
/* Generic routines. */
void agp_generic_enable ( struct agp_bridge_data * bridge , u32 mode ) ;
int agp_generic_create_gatt_table ( struct agp_bridge_data * bridge ) ;
int agp_generic_free_gatt_table ( struct agp_bridge_data * bridge ) ;
struct agp_memory * agp_create_memory ( int scratch_pages ) ;
int agp_generic_insert_memory ( struct agp_memory * mem , off_t pg_start , int type ) ;
int agp_generic_remove_memory ( struct agp_memory * mem , off_t pg_start , int type ) ;
struct agp_memory * agp_generic_alloc_by_type ( size_t page_count , int type ) ;
void agp_generic_free_by_type ( struct agp_memory * curr ) ;
2009-06-12 08:11:41 +04:00
struct page * agp_generic_alloc_page ( struct agp_bridge_data * bridge ) ;
2008-08-21 06:46:11 +04:00
int agp_generic_alloc_pages ( struct agp_bridge_data * agp_bridge ,
struct agp_memory * memory , size_t page_count ) ;
2009-06-12 08:11:41 +04:00
void agp_generic_destroy_page ( struct page * page , int flags ) ;
2008-08-21 06:46:17 +04:00
void agp_generic_destroy_pages ( struct agp_memory * memory ) ;
2005-04-17 02:20:36 +04:00
void agp_free_key ( int key ) ;
int agp_num_entries ( void ) ;
u32 agp_collect_device_status ( struct agp_bridge_data * bridge , u32 mode , u32 command ) ;
2008-03-27 00:10:02 +03:00
void agp_device_command ( u32 command , bool agp_v3 ) ;
2005-04-17 02:20:36 +04:00
int agp_3_5_enable ( struct agp_bridge_data * bridge ) ;
void global_cache_flush ( void ) ;
void get_agp_version ( struct agp_bridge_data * bridge ) ;
unsigned long agp_generic_mask_memory ( struct agp_bridge_data * bridge ,
2009-07-27 13:27:29 +04:00
dma_addr_t phys , int type ) ;
2007-01-23 12:33:43 +03:00
int agp_generic_type_to_mask_type ( struct agp_bridge_data * bridge ,
int type ) ;
2005-04-17 02:20:36 +04:00
struct agp_bridge_data * agp_generic_find_bridge ( struct pci_dev * pdev ) ;
2007-01-23 12:33:43 +03:00
/* generic functions for user-populated AGP memory types */
struct agp_memory * agp_generic_alloc_user ( size_t page_count , int type ) ;
void agp_alloc_page_array ( size_t size , struct agp_memory * mem ) ;
void agp_free_page_array ( struct agp_memory * mem ) ;
2005-04-17 02:20:36 +04:00
/* generic routines for agp>=3 */
int agp3_generic_fetch_size ( void ) ;
void agp3_generic_tlbflush ( struct agp_memory * mem ) ;
int agp3_generic_configure ( void ) ;
void agp3_generic_cleanup ( void ) ;
/* aperture sizes have been standardised since v3 */
# define AGP_GENERIC_SIZES_ENTRIES 11
2007-02-23 02:41:28 +03:00
extern const struct aper_size_info_16 agp3_generic_sizes [ ] ;
2005-04-17 02:20:36 +04:00
extern int agp_off ;
extern int agp_try_unsupported_boot ;
2007-01-30 08:20:31 +03:00
long compat_agp_ioctl ( struct file * file , unsigned int cmd , unsigned long arg ) ;
2011-03-31 05:57:33 +04:00
/* Chipset independent registers (from AGP Spec) */
2005-04-17 02:20:36 +04:00
# define AGP_APBASE 0x10
2014-01-04 05:26:58 +04:00
# define AGP_APERTURE_BAR 0
2005-04-17 02:20:36 +04:00
# define AGPSTAT 0x4
# define AGPCMD 0x8
# define AGPNISTAT 0xc
# define AGPCTRL 0x10
# define AGPAPSIZE 0x14
# define AGPNEPG 0x16
# define AGPGARTLO 0x18
# define AGPGARTHI 0x1c
# define AGPNICMD 0x20
# define AGP_MAJOR_VERSION_SHIFT (20)
# define AGP_MINOR_VERSION_SHIFT (16)
# define AGPSTAT_RQ_DEPTH (0xff000000)
# define AGPSTAT_RQ_DEPTH_SHIFT 24
# define AGPSTAT_CAL_MASK (1<<12|1<<11|1<<10)
# define AGPSTAT_ARQSZ (1<<15|1<<14|1<<13)
# define AGPSTAT_ARQSZ_SHIFT 13
# define AGPSTAT_SBA (1<<9)
# define AGPSTAT_AGP_ENABLE (1<<8)
# define AGPSTAT_FW (1<<4)
# define AGPSTAT_MODE_3_0 (1<<3)
# define AGPSTAT2_1X (1<<0)
# define AGPSTAT2_2X (1<<1)
# define AGPSTAT2_4X (1<<2)
# define AGPSTAT3_RSVD (1<<2)
# define AGPSTAT3_8X (1<<1)
# define AGPSTAT3_4X (1)
# define AGPCTRL_APERENB (1<<8)
# define AGPCTRL_GTLBEN (1<<7)
# define AGP2_RESERVED_MASK 0x00fffcc8
# define AGP3_RESERVED_MASK 0x00ff00c4
# define AGP_ERRATA_FASTWRITES 1<<0
# define AGP_ERRATA_SBA 1<<1
# define AGP_ERRATA_1X 1<<2
# endif /* _AGP_BACKEND_PRIV_H */