2008-10-23 09:26:29 +04:00
# ifndef _ASM_X86_GART_H
# define _ASM_X86_GART_H
2007-10-24 14:49:47 +04:00
2008-05-20 18:27:17 +04:00
# include <asm/e820.h>
2008-06-10 02:10:48 +04:00
extern void set_up_gart_resume ( u32 , u32 ) ;
2008-07-10 03:27:49 +04:00
2007-10-24 14:49:47 +04:00
extern int fallback_aper_order ;
extern int fallback_aper_force ;
extern int fix_aperture ;
2008-04-08 12:49:03 +04:00
/* PTE bits. */
# define GPTE_VALID 1
# define GPTE_COHERENT 2
/* Aperture control register bits. */
# define GARTEN (1<<0)
# define DISGARTCPU (1<<4)
# define DISGARTIO (1<<5)
2010-09-03 20:39:40 +04:00
# define DISTLBWALKPRB (1<<6)
2008-04-08 12:49:03 +04:00
/* GART cache control register bits. */
# define INVGART (1<<0)
# define GARTPTEERR (1<<1)
/* K8 On-cpu GART registers */
# define AMD64_GARTAPERTURECTL 0x90
# define AMD64_GARTAPERTUREBASE 0x94
# define AMD64_GARTTABLEBASE 0x98
# define AMD64_GARTCACHECTL 0x9c
2008-11-27 20:39:15 +03:00
# ifdef CONFIG_GART_IOMMU
extern int gart_iommu_aperture ;
extern int gart_iommu_aperture_allowed ;
extern int gart_iommu_aperture_disabled ;
extern void early_gart_iommu_check ( void ) ;
2009-11-10 13:46:14 +03:00
extern int gart_iommu_init ( void ) ;
2008-11-27 20:39:15 +03:00
extern void __init gart_parse_options ( char * ) ;
2010-08-26 21:57:57 +04:00
extern int gart_iommu_hole_init ( void ) ;
2008-11-27 20:39:15 +03:00
# else
# define gart_iommu_aperture 0
# define gart_iommu_aperture_allowed 0
# define gart_iommu_aperture_disabled 1
static inline void early_gart_iommu_check ( void )
{
}
static inline void gart_parse_options ( char * options )
{
}
2010-08-26 21:57:57 +04:00
static inline int gart_iommu_hole_init ( void )
2008-11-27 20:39:15 +03:00
{
2010-08-26 21:57:57 +04:00
return - ENODEV ;
2008-11-27 20:39:15 +03:00
}
# endif
2008-09-25 14:13:53 +04:00
extern int agp_amd64_init ( void ) ;
2010-09-03 20:39:40 +04:00
static inline void gart_set_size_and_enable ( struct pci_dev * dev , u32 order )
{
u32 ctl ;
/*
* Don ' t enable translation but enable GART IO and CPU accesses .
* Also , set DISTLBWALKPRB since GART tables memory is UC .
*/
2011-04-18 17:45:45 +04:00
ctl = order < < 1 ;
2010-09-03 20:39:40 +04:00
pci_write_config_dword ( dev , AMD64_GARTAPERTURECTL , ctl ) ;
}
2008-04-15 14:43:57 +04:00
static inline void enable_gart_translation ( struct pci_dev * dev , u64 addr )
{
u32 tmp , ctl ;
2011-04-18 17:45:44 +04:00
/* address of the mappings table */
addr > > = 12 ;
tmp = ( u32 ) addr < < 4 ;
tmp & = ~ 0xf ;
pci_write_config_dword ( dev , AMD64_GARTTABLEBASE , tmp ) ;
/* Enable GART translation for this hammer. */
pci_read_config_dword ( dev , AMD64_GARTAPERTURECTL , & ctl ) ;
2011-04-18 17:45:45 +04:00
ctl | = GARTEN | DISTLBWALKPRB ;
2011-04-18 17:45:44 +04:00
ctl & = ~ ( DISGARTCPU | DISGARTIO ) ;
pci_write_config_dword ( dev , AMD64_GARTAPERTURECTL , ctl ) ;
2008-04-15 14:43:57 +04:00
}
2008-05-20 18:27:17 +04:00
static inline int aperture_valid ( u64 aper_base , u32 aper_size , u32 min_size )
{
if ( ! aper_base )
return 0 ;
if ( aper_base + aper_size > 0x100000000ULL ) {
2008-09-29 22:52:03 +04:00
printk ( KERN_INFO " Aperture beyond 4GB. Ignoring. \n " ) ;
2008-05-20 18:27:17 +04:00
return 0 ;
}
if ( e820_any_mapped ( aper_base , aper_base + aper_size , E820_RAM ) ) {
2008-09-29 22:52:03 +04:00
printk ( KERN_INFO " Aperture pointing to e820 RAM. Ignoring. \n " ) ;
2008-05-20 18:27:17 +04:00
return 0 ;
}
if ( aper_size < min_size ) {
2008-09-29 22:52:03 +04:00
printk ( KERN_INFO " Aperture too small (%d MB) than (%d MB) \n " ,
2008-05-20 18:27:17 +04:00
aper_size > > 20 , min_size > > 20 ) ;
return 0 ;
}
return 1 ;
}
2008-10-23 09:26:29 +04:00
# endif /* _ASM_X86_GART_H */