Home | History | Annotate | Download | only in kernel_space
      1 /*
      2  *
      3  *   Copyright (c) International Business Machines  Corp., 2001
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /*
     21  * Remember that you want to seperate your header
     22  * files between what is needed in kernel space
     23  * only, and what will also be needed by a user
     24  * space program that is using this module. For
     25  * that reason keep all structures that will need
     26  * kernel space pointers in a seperate header file
     27  * from where ioctl flags aer kept
     28  *
     29  * author: Kai Zhao
     30  * date:   08/25/2003
     31  *
     32  */
     33 
     34 struct ltpmod_user {
     35 
     36 //put any pointers in here that might be needed by other ioctl calls
     37 
     38 };
     39 typedef struct ltpmod_user ltpmod_user_t;
     40 static struct agp_bridge_data	*tmp_bridge = NULL;
     41 //static struct agp_memory	*tmp_agp_memory = NULL;
     42 
     43 
     44 
     45 
     46 
     47 #include <asm/agp.h>	// for flush_agp_cache()
     48 
     49 #define PFX "agpgart: "
     50 
     51 extern struct agp_bridge_data *agp_bridge;
     52 
     53 enum aper_size_type {
     54 	U8_APER_SIZE,
     55 	U16_APER_SIZE,
     56 	U32_APER_SIZE,
     57 	LVL2_APER_SIZE,
     58 	FIXED_APER_SIZE
     59 };
     60 
     61 struct gatt_mask {
     62 	unsigned long mask;
     63 	u32 type;
     64 	// totally device specific, for integrated chipsets that
     65 	// might have different types of memory masks.  For other
     66 	// devices this will probably be ignored
     67 };
     68 
     69 struct aper_size_info_8 {
     70 	int size;
     71 	int num_entries;
     72 	int page_order;
     73 	u8 size_value;
     74 };
     75 
     76 struct aper_size_info_16 {
     77 	int size;
     78 	int num_entries;
     79 	int page_order;
     80 	u16 size_value;
     81 };
     82 
     83 struct aper_size_info_32 {
     84 	int size;
     85 	int num_entries;
     86 	int page_order;
     87 	u32 size_value;
     88 };
     89 
     90 struct aper_size_info_lvl2 {
     91 	int size;
     92 	int num_entries;
     93 	u32 size_value;
     94 };
     95 
     96 struct aper_size_info_fixed {
     97 	int size;
     98 	int num_entries;
     99 	int page_order;
    100 };
    101 
    102 struct agp_bridge_driver {
    103 	struct module *owner;
    104 	void *aperture_sizes;
    105 	int num_aperture_sizes;
    106 	enum aper_size_type size_type;
    107 	int cant_use_aperture;
    108 	int needs_scratch_page;
    109 	struct gatt_mask *masks;
    110 	int (*fetch_size)(void);
    111 	int (*configure)(void);
    112 	void (*agp_enable)(u32);
    113 	void (*cleanup)(void);
    114 	void (*tlb_flush)(struct agp_memory *);
    115 	unsigned long (*mask_memory)(unsigned long, int);
    116 	void (*cache_flush)(void);
    117 	int (*create_gatt_table)(void);
    118 	int (*free_gatt_table)(void);
    119 	int (*insert_memory)(struct agp_memory *, off_t, int);
    120 	int (*remove_memory)(struct agp_memory *, off_t, int);
    121 	struct agp_memory *(*alloc_by_type) (size_t, int);
    122 	void (*free_by_type)(struct agp_memory *);
    123 	void *(*agp_alloc_page)(void);
    124 	void (*agp_destroy_page)(void *);
    125 };
    126 
    127 struct agp_bridge_data {
    128 	struct agp_version *version;
    129 	struct agp_bridge_driver *driver;
    130 	struct vm_operations_struct *vm_ops;
    131 	void *previous_size;
    132 	void *current_size;
    133 	void *dev_private_data;
    134 	struct pci_dev *dev;
    135 	u32 *gatt_table;
    136 	u32 *gatt_table_real;
    137 	unsigned long scratch_page;
    138 	unsigned long scratch_page_real;
    139 	unsigned long gart_bus_addr;
    140 	unsigned long gatt_bus_addr;
    141 	u32 mode;
    142 	enum chipset_type type;
    143 	unsigned long *key_list;
    144 	atomic_t current_memory_agp;
    145 	atomic_t agp_in_use;
    146 	int max_memory_agp;	// in number of pages
    147 	int aperture_size_idx;
    148 	int capndx;
    149 	char major_version;
    150 	char minor_version;
    151 };
    152 
    153 #define OUTREG64(mmap, addr, val)	__raw_writeq((val), (mmap)+(addr))
    154 #define OUTREG32(mmap, addr, val)	__raw_writel((val), (mmap)+(addr))
    155 #define OUTREG16(mmap, addr, val)	__raw_writew((val), (mmap)+(addr))
    156 #define OUTREG8(mmap, addr, val)	__raw_writeb((val), (mmap)+(addr))
    157 
    158 #define INREG64(mmap, addr)		__raw_readq((mmap)+(addr))
    159 #define INREG32(mmap, addr)		__raw_readl((mmap)+(addr))
    160 #define INREG16(mmap, addr)		__raw_readw((mmap)+(addr))
    161 #define INREG8(mmap, addr)		__raw_readb((mmap)+(addr))
    162 
    163 #define KB(x)	((x) * 1024)
    164 #define MB(x)	(KB (KB (x)))
    165 #define GB(x)	(MB (KB (x)))
    166 
    167 #define A_SIZE_8(x)	((struct aper_size_info_8 *) x)
    168 #define A_SIZE_16(x)	((struct aper_size_info_16 *) x)
    169 #define A_SIZE_32(x)	((struct aper_size_info_32 *) x)
    170 #define A_SIZE_LVL2(x)	((struct aper_size_info_lvl2 *) x)
    171 #define A_SIZE_FIX(x)	((struct aper_size_info_fixed *) x)
    172 #define A_IDX8(bridge)	(A_SIZE_8((bridge)->driver->aperture_sizes) + i)
    173 #define A_IDX16(bridge)	(A_SIZE_16((bridge)->driver->aperture_sizes) + i)
    174 #define A_IDX32(bridge)	(A_SIZE_32((bridge)->driver->aperture_sizes) + i)
    175 #define MAXKEY		(4096 * 32)
    176 
    177 #define PGE_EMPTY(b, p)	(!(p) || (p) == (unsigned long) (b)->scratch_page)
    178 
    179 // intel register
    180 #define INTEL_APBASE	0x10
    181 #define INTEL_APSIZE	0xb4
    182 #define INTEL_ATTBASE	0xb8
    183 #define INTEL_AGPCTRL	0xb0
    184 #define INTEL_NBXCFG	0x50
    185 #define INTEL_ERRSTS	0x91
    186 
    187 // Intel 460GX Registers
    188 #define INTEL_I460_APBASE		0x10
    189 #define INTEL_I460_BAPBASE		0x98
    190 #define INTEL_I460_GXBCTL		0xa0
    191 #define INTEL_I460_AGPSIZ		0xa2
    192 #define INTEL_I460_ATTBASE		0xfe200000
    193 #define INTEL_I460_GATT_VALID		(1UL << 24)
    194 #define INTEL_I460_GATT_COHERENT	(1UL << 25)
    195 
    196 // intel i830 registers
    197 #define I830_GMCH_CTRL			0x52
    198 #define I830_GMCH_ENABLED		0x4
    199 #define I830_GMCH_MEM_MASK		0x1
    200 #define I830_GMCH_MEM_64M		0x1
    201 #define I830_GMCH_MEM_128M		0
    202 #define I830_GMCH_GMS_MASK		0x70
    203 #define I830_GMCH_GMS_DISABLED		0x00
    204 #define I830_GMCH_GMS_LOCAL		0x10
    205 #define I830_GMCH_GMS_STOLEN_512	0x20
    206 #define I830_GMCH_GMS_STOLEN_1024	0x30
    207 #define I830_GMCH_GMS_STOLEN_8192	0x40
    208 #define I830_RDRAM_CHANNEL_TYPE		0x03010
    209 #define I830_RDRAM_ND(x)		(((x) & 0x20) >> 5)
    210 #define I830_RDRAM_DDT(x)		(((x) & 0x18) >> 3)
    211 
    212 // This one is for I830MP w. an external graphic card
    213 #define INTEL_I830_ERRSTS	0x92
    214 
    215 // Intel 855GM/852GM registers
    216 #define I855_GMCH_GMS_STOLEN_0M		0x0
    217 #define I855_GMCH_GMS_STOLEN_1M		(0x1 << 4)
    218 #define I855_GMCH_GMS_STOLEN_4M		(0x2 << 4)
    219 #define I855_GMCH_GMS_STOLEN_8M		(0x3 << 4)
    220 #define I855_GMCH_GMS_STOLEN_16M	(0x4 << 4)
    221 #define I855_GMCH_GMS_STOLEN_32M	(0x5 << 4)
    222 #define I85X_CAPID			0x44
    223 #define I85X_VARIANT_MASK		0x7
    224 #define I85X_VARIANT_SHIFT		5
    225 #define I855_GME			0x0
    226 #define I855_GM				0x4
    227 #define I852_GME			0x2
    228 #define I852_GM				0x5
    229 
    230 // intel 815 register
    231 #define INTEL_815_APCONT	0x51
    232 #define INTEL_815_ATTBASE_MASK	~0x1FFFFFFF
    233 
    234 // intel i820 registers
    235 #define INTEL_I820_RDCR		0x51
    236 #define INTEL_I820_ERRSTS	0xc8
    237 
    238 // intel i840 registers
    239 #define INTEL_I840_MCHCFG	0x50
    240 #define INTEL_I840_ERRSTS	0xc8
    241 
    242 // intel i845 registers
    243 #define INTEL_I845_AGPM		0x51
    244 #define INTEL_I845_ERRSTS	0xc8
    245 
    246 // intel i850 registers
    247 #define INTEL_I850_MCHCFG	0x50
    248 #define INTEL_I850_ERRSTS	0xc8
    249 
    250 // intel i860 registers
    251 #define INTEL_I860_MCHCFG	0x50
    252 #define INTEL_I860_ERRSTS	0xc8
    253 
    254 // intel i810 registers
    255 #define I810_GMADDR		0x10
    256 #define I810_MMADDR		0x14
    257 #define I810_PTE_BASE		0x10000
    258 #define I810_PTE_MAIN_UNCACHED	0x00000000
    259 #define I810_PTE_LOCAL		0x00000002
    260 #define I810_PTE_VALID		0x00000001
    261 #define I810_SMRAM_MISCC	0x70
    262 #define I810_GFX_MEM_WIN_SIZE	0x00010000
    263 #define I810_GFX_MEM_WIN_32M	0x00010000
    264 #define I810_GMS		0x000000c0
    265 #define I810_GMS_DISABLE	0x00000000
    266 #define I810_PGETBL_CTL		0x2020
    267 #define I810_PGETBL_ENABLED	0x00000001
    268 #define I810_DRAM_CTL		0x3000
    269 #define I810_DRAM_ROW_0		0x00000001
    270 #define I810_DRAM_ROW_0_SDRAM	0x00000001
    271 
    272 // Intel 7505 registers
    273 #define INTEL_I7505_NAPBASELO	0x10
    274 #define INTEL_I7505_APSIZE	0x74
    275 #define INTEL_I7505_NCAPID	0x60
    276 #define INTEL_I7505_NISTAT	0x6c
    277 #define INTEL_I7505_ATTBASE	0x78
    278 #define INTEL_I7505_ERRSTS	0x42
    279 #define INTEL_I7505_AGPCTRL	0x70
    280 #define INTEL_I7505_MCHCFG	0x50
    281 
    282 // VIA register
    283 #define VIA_APBASE	0x10
    284 #define VIA_GARTCTRL	0x80
    285 #define VIA_APSIZE	0x84
    286 #define VIA_ATTBASE	0x88
    287 
    288 // VIA KT400
    289 #define VIA_AGP3_GARTCTRL	0x90
    290 #define VIA_AGP3_APSIZE	0x94
    291 #define VIA_AGP3_ATTBASE	0x98
    292 #define VIA_AGPSEL	0xfd
    293 
    294 // SiS registers
    295 #define SIS_APBASE	0x10
    296 #define SIS_ATTBASE	0x90
    297 #define SIS_APSIZE	0x94
    298 #define SIS_TLBCNTRL	0x97
    299 #define SIS_TLBFLUSH	0x98
    300 
    301 // AMD registers
    302 #define AMD_APBASE	0x10
    303 #define AMD_MMBASE	0x14
    304 #define AMD_APSIZE	0xac
    305 #define AMD_MODECNTL	0xb0
    306 #define AMD_MODECNTL2	0xb2
    307 #define AMD_GARTENABLE	0x02	// In mmio region (16-bit register)
    308 #define AMD_ATTBASE	0x04	// In mmio region (32-bit register)
    309 #define AMD_TLBFLUSH	0x0c	// In mmio region (32-bit register)
    310 #define AMD_CACHEENTRY	0x10	// In mmio region (32-bit register)
    311 
    312 #define AMD_8151_APSIZE	0xb4
    313 #define AMD_8151_GARTBLOCK	0xb8
    314 
    315 #define AMD_X86_64_GARTAPERTURECTL	0x90
    316 #define AMD_X86_64_GARTAPERTUREBASE	0x94
    317 #define AMD_X86_64_GARTTABLEBASE	0x98
    318 #define AMD_X86_64_GARTCACHECTL		0x9c
    319 #define AMD_X86_64_GARTEN	1<<0
    320 
    321 #define AMD_8151_VMAPERTURE		0x10
    322 #define AMD_8151_AGP_CTL		0xb0
    323 #define AMD_8151_APERTURESIZE	0xb4
    324 #define AMD_8151_GARTPTR		0xb8
    325 #define AMD_8151_GTLBEN	1<<7
    326 #define AMD_8151_APEREN	1<<8
    327 
    328 // ALi registers
    329 #define ALI_APBASE			0x10
    330 #define ALI_AGPCTRL			0xb8
    331 #define ALI_ATTBASE			0xbc
    332 #define ALI_TLBCTRL			0xc0
    333 #define ALI_TAGCTRL			0xc4
    334 #define ALI_CACHE_FLUSH_CTRL		0xD0
    335 #define ALI_CACHE_FLUSH_ADDR_MASK	0xFFFFF000
    336 #define ALI_CACHE_FLUSH_EN		0x100
    337 
    338 // Serverworks Registers
    339 #define SVWRKS_APSIZE		0x10
    340 #define SVWRKS_SIZE_MASK	0xfe000000
    341 
    342 #define SVWRKS_MMBASE		0x14
    343 #define SVWRKS_CACHING		0x4b
    344 #define SVWRKS_FEATURE		0x68
    345 
    346 // func 1 registers
    347 #define SVWRKS_AGP_ENABLE	0x60
    348 #define SVWRKS_COMMAND		0x04
    349 
    350 // Memory mapped registers
    351 #define SVWRKS_GART_CACHE	0x02
    352 #define SVWRKS_GATTBASE		0x04
    353 #define SVWRKS_TLBFLUSH		0x10
    354 #define SVWRKS_POSTFLUSH	0x14
    355 #define SVWRKS_DIRFLUSH		0x0c
    356 
    357 // HP ZX1 SBA registers
    358 #define HP_ZX1_CTRL		0x200
    359 #define HP_ZX1_IBASE		0x300
    360 #define HP_ZX1_IMASK		0x308
    361 #define HP_ZX1_PCOM		0x310
    362 #define HP_ZX1_TCNFG		0x318
    363 #define HP_ZX1_PDIR_BASE	0x320
    364 #define HP_ZX1_CACHE_FLUSH	0x428
    365 
    366 struct agp_device_ids {
    367 	unsigned short device_id; // first, to make table easier to read
    368 	enum chipset_type chipset;
    369 	const char *chipset_name;
    370 	int (*chipset_setup) (struct pci_dev *pdev);	// used to override generic
    371 };
    372 
    373 // Driver registration
    374 struct agp_bridge_data *agp_alloc_bridge(void);
    375 void agp_put_bridge(struct agp_bridge_data *bridge);
    376 int agp_add_bridge(struct agp_bridge_data *bridge);
    377 void agp_remove_bridge(struct agp_bridge_data *bridge);
    378 
    379 // Frontend routines.
    380 int agp_frontend_initialize(void);
    381 void agp_frontend_cleanup(void);
    382 
    383 // Generic routines.
    384 void agp_generic_enable(u32 mode);
    385 int agp_generic_create_gatt_table(void);
    386 int agp_generic_free_gatt_table(void);
    387 struct agp_memory *agp_create_memory(int scratch_pages);
    388 int agp_generic_insert_memory(struct agp_memory *mem, off_t pg_start, int type);
    389 int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type);
    390 struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type);
    391 void agp_generic_free_by_type(struct agp_memory *curr);
    392 void *agp_generic_alloc_page(void);
    393 void agp_generic_destroy_page(void *addr);
    394 void agp_free_key(int key);
    395 int agp_num_entries(void);
    396 u32 agp_collect_device_status(u32 mode, u32 command);
    397 void agp_device_command(u32 command, int agp_v3);
    398 int agp_3_5_enable(struct agp_bridge_data *bridge);
    399 void global_cache_flush(void);
    400 void get_agp_version(struct agp_bridge_data *bridge);
    401 unsigned long agp_generic_mask_memory(unsigned long addr, int type);
    402 
    403 // Standard agp registers
    404 #define AGPSTAT			0x4
    405 #define AGPCMD			0x8
    406 #define AGPNISTAT		0xc
    407 #define AGPNEPG			0x16
    408 #define AGPNICMD		0x20
    409 
    410 #define AGP_MAJOR_VERSION_SHIFT	(20)
    411 #define AGP_MINOR_VERSION_SHIFT	(16)
    412 
    413 #define AGPSTAT_RQ_DEPTH	(0xff000000)
    414 
    415 #define AGPSTAT_CAL_MASK	(1<<12|1<<11|1<<10)
    416 #define AGPSTAT_ARQSZ		(1<<15|1<<14|1<<13)
    417 #define AGPSTAT_ARQSZ_SHIFT	13
    418 
    419 #define AGPSTAT_SBA		(1<<9)
    420 #define AGPSTAT_AGP_ENABLE	(1<<8)
    421 #define AGPSTAT_FW		(1<<4)
    422 #define AGPSTAT_MODE_3_0	(1<<3)
    423 
    424 #define AGPSTAT2_1X		(1<<0)
    425 #define AGPSTAT2_2X		(1<<1)
    426 #define AGPSTAT2_4X		(1<<2)
    427 
    428 #define AGPSTAT3_RSVD		(1<<2)
    429 #define AGPSTAT3_8X		(1<<1)
    430 #define AGPSTAT3_4X		(1)
    431 
    432 
    433