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 34struct ltpmod_user { 35 36//put any pointers in here that might be needed by other ioctl calls 37 38}; 39typedef struct ltpmod_user ltpmod_user_t; 40static 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 51extern struct agp_bridge_data *agp_bridge; 52 53enum 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 61struct 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 69struct aper_size_info_8 { 70 int size; 71 int num_entries; 72 int page_order; 73 u8 size_value; 74}; 75 76struct aper_size_info_16 { 77 int size; 78 int num_entries; 79 int page_order; 80 u16 size_value; 81}; 82 83struct aper_size_info_32 { 84 int size; 85 int num_entries; 86 int page_order; 87 u32 size_value; 88}; 89 90struct aper_size_info_lvl2 { 91 int size; 92 int num_entries; 93 u32 size_value; 94}; 95 96struct aper_size_info_fixed { 97 int size; 98 int num_entries; 99 int page_order; 100}; 101 102struct 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 127struct 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 366struct 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 374struct agp_bridge_data *agp_alloc_bridge(void); 375void agp_put_bridge(struct agp_bridge_data *bridge); 376int agp_add_bridge(struct agp_bridge_data *bridge); 377void agp_remove_bridge(struct agp_bridge_data *bridge); 378 379// Frontend routines. 380int agp_frontend_initialize(void); 381void agp_frontend_cleanup(void); 382 383// Generic routines. 384void agp_generic_enable(u32 mode); 385int agp_generic_create_gatt_table(void); 386int agp_generic_free_gatt_table(void); 387struct agp_memory *agp_create_memory(int scratch_pages); 388int agp_generic_insert_memory(struct agp_memory *mem, off_t pg_start, int type); 389int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type); 390struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type); 391void agp_generic_free_by_type(struct agp_memory *curr); 392void *agp_generic_alloc_page(void); 393void agp_generic_destroy_page(void *addr); 394void agp_free_key(int key); 395int agp_num_entries(void); 396u32 agp_collect_device_status(u32 mode, u32 command); 397void agp_device_command(u32 command, int agp_v3); 398int agp_3_5_enable(struct agp_bridge_data *bridge); 399void global_cache_flush(void); 400void get_agp_version(struct agp_bridge_data *bridge); 401unsigned 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