intel-agp.c revision ea248bcaadd5bafe4217357e1e511ac55639bcf3
1/* 2 * Intel AGPGART routines. 3 */ 4 5/* 6 * Intel(R) 855GM/852GM and 865G support added by David Dawes 7 * <dawes@tungstengraphics.com>. 8 * 9 * Intel(R) 915G/915GM support added by Alan Hourihane 10 * <alanh@tungstengraphics.com>. 11 */ 12 13#include <linux/module.h> 14#include <linux/pci.h> 15#include <linux/init.h> 16#include <linux/pagemap.h> 17#include <linux/agp_backend.h> 18#include "agp.h" 19 20/* Intel 815 register */ 21#define INTEL_815_APCONT 0x51 22#define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF 23 24/* Intel i820 registers */ 25#define INTEL_I820_RDCR 0x51 26#define INTEL_I820_ERRSTS 0xc8 27 28/* Intel i840 registers */ 29#define INTEL_I840_MCHCFG 0x50 30#define INTEL_I840_ERRSTS 0xc8 31 32/* Intel i850 registers */ 33#define INTEL_I850_MCHCFG 0x50 34#define INTEL_I850_ERRSTS 0xc8 35 36/* intel 915G registers */ 37#define I915_GMADDR 0x18 38#define I915_MMADDR 0x10 39#define I915_PTEADDR 0x1C 40#define I915_GMCH_GMS_STOLEN_48M (0x6 << 4) 41#define I915_GMCH_GMS_STOLEN_64M (0x7 << 4) 42 43 44/* Intel 7505 registers */ 45#define INTEL_I7505_APSIZE 0x74 46#define INTEL_I7505_NCAPID 0x60 47#define INTEL_I7505_NISTAT 0x6c 48#define INTEL_I7505_ATTBASE 0x78 49#define INTEL_I7505_ERRSTS 0x42 50#define INTEL_I7505_AGPCTRL 0x70 51#define INTEL_I7505_MCHCFG 0x50 52 53static struct aper_size_info_fixed intel_i810_sizes[] = 54{ 55 {64, 16384, 4}, 56 /* The 32M mode still requires a 64k gatt */ 57 {32, 8192, 4} 58}; 59 60#define AGP_DCACHE_MEMORY 1 61#define AGP_PHYS_MEMORY 2 62 63static struct gatt_mask intel_i810_masks[] = 64{ 65 {.mask = I810_PTE_VALID, .type = 0}, 66 {.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY}, 67 {.mask = I810_PTE_VALID, .type = 0} 68}; 69 70static struct _intel_i810_private { 71 struct pci_dev *i810_dev; /* device one */ 72 volatile u8 __iomem *registers; 73 int num_dcache_entries; 74} intel_i810_private; 75 76static int intel_i810_fetch_size(void) 77{ 78 u32 smram_miscc; 79 struct aper_size_info_fixed *values; 80 81 pci_read_config_dword(agp_bridge->dev, I810_SMRAM_MISCC, &smram_miscc); 82 values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes); 83 84 if ((smram_miscc & I810_GMS) == I810_GMS_DISABLE) { 85 printk(KERN_WARNING PFX "i810 is disabled\n"); 86 return 0; 87 } 88 if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) == I810_GFX_MEM_WIN_32M) { 89 agp_bridge->previous_size = 90 agp_bridge->current_size = (void *) (values + 1); 91 agp_bridge->aperture_size_idx = 1; 92 return values[1].size; 93 } else { 94 agp_bridge->previous_size = 95 agp_bridge->current_size = (void *) (values); 96 agp_bridge->aperture_size_idx = 0; 97 return values[0].size; 98 } 99 100 return 0; 101} 102 103static int intel_i810_configure(void) 104{ 105 struct aper_size_info_fixed *current_size; 106 u32 temp; 107 int i; 108 109 current_size = A_SIZE_FIX(agp_bridge->current_size); 110 111 pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp); 112 temp &= 0xfff80000; 113 114 intel_i810_private.registers = ioremap(temp, 128 * 4096); 115 if (!intel_i810_private.registers) { 116 printk(KERN_ERR PFX "Unable to remap memory.\n"); 117 return -ENOMEM; 118 } 119 120 if ((readl(intel_i810_private.registers+I810_DRAM_CTL) 121 & I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) { 122 /* This will need to be dynamically assigned */ 123 printk(KERN_INFO PFX "detected 4MB dedicated video ram.\n"); 124 intel_i810_private.num_dcache_entries = 1024; 125 } 126 pci_read_config_dword(intel_i810_private.i810_dev, I810_GMADDR, &temp); 127 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 128 writel(agp_bridge->gatt_bus_addr | I810_PGETBL_ENABLED, intel_i810_private.registers+I810_PGETBL_CTL); 129 readl(intel_i810_private.registers+I810_PGETBL_CTL); /* PCI Posting. */ 130 131 if (agp_bridge->driver->needs_scratch_page) { 132 for (i = 0; i < current_size->num_entries; i++) { 133 writel(agp_bridge->scratch_page, intel_i810_private.registers+I810_PTE_BASE+(i*4)); 134 readl(intel_i810_private.registers+I810_PTE_BASE+(i*4)); /* PCI posting. */ 135 } 136 } 137 global_cache_flush(); 138 return 0; 139} 140 141static void intel_i810_cleanup(void) 142{ 143 writel(0, intel_i810_private.registers+I810_PGETBL_CTL); 144 readl(intel_i810_private.registers); /* PCI Posting. */ 145 iounmap(intel_i810_private.registers); 146} 147 148static void intel_i810_tlbflush(struct agp_memory *mem) 149{ 150 return; 151} 152 153static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode) 154{ 155 return; 156} 157 158/* Exists to support ARGB cursors */ 159static void *i8xx_alloc_pages(void) 160{ 161 struct page * page; 162 163 page = alloc_pages(GFP_KERNEL, 2); 164 if (page == NULL) 165 return NULL; 166 167 if (change_page_attr(page, 4, PAGE_KERNEL_NOCACHE) < 0) { 168 global_flush_tlb(); 169 __free_page(page); 170 return NULL; 171 } 172 global_flush_tlb(); 173 get_page(page); 174 SetPageLocked(page); 175 atomic_inc(&agp_bridge->current_memory_agp); 176 return page_address(page); 177} 178 179static void i8xx_destroy_pages(void *addr) 180{ 181 struct page *page; 182 183 if (addr == NULL) 184 return; 185 186 page = virt_to_page(addr); 187 change_page_attr(page, 4, PAGE_KERNEL); 188 global_flush_tlb(); 189 put_page(page); 190 unlock_page(page); 191 free_pages((unsigned long)addr, 2); 192 atomic_dec(&agp_bridge->current_memory_agp); 193} 194 195static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, 196 int type) 197{ 198 int i, j, num_entries; 199 void *temp; 200 201 temp = agp_bridge->current_size; 202 num_entries = A_SIZE_FIX(temp)->num_entries; 203 204 if ((pg_start + mem->page_count) > num_entries) { 205 return -EINVAL; 206 } 207 for (j = pg_start; j < (pg_start + mem->page_count); j++) { 208 if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) 209 return -EBUSY; 210 } 211 212 if (type != 0 || mem->type != 0) { 213 if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) { 214 /* special insert */ 215 global_cache_flush(); 216 for (i = pg_start; i < (pg_start + mem->page_count); i++) { 217 writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4)); 218 readl(intel_i810_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ 219 } 220 global_cache_flush(); 221 agp_bridge->driver->tlb_flush(mem); 222 return 0; 223 } 224 if((type == AGP_PHYS_MEMORY) && (mem->type == AGP_PHYS_MEMORY)) 225 goto insert; 226 return -EINVAL; 227 } 228 229insert: 230 global_cache_flush(); 231 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { 232 writel(agp_bridge->driver->mask_memory(agp_bridge, 233 mem->memory[i], mem->type), 234 intel_i810_private.registers+I810_PTE_BASE+(j*4)); 235 readl(intel_i810_private.registers+I810_PTE_BASE+(j*4)); /* PCI Posting. */ 236 } 237 global_cache_flush(); 238 239 agp_bridge->driver->tlb_flush(mem); 240 return 0; 241} 242 243static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start, 244 int type) 245{ 246 int i; 247 248 for (i = pg_start; i < (mem->page_count + pg_start); i++) { 249 writel(agp_bridge->scratch_page, intel_i810_private.registers+I810_PTE_BASE+(i*4)); 250 readl(intel_i810_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ 251 } 252 253 global_cache_flush(); 254 agp_bridge->driver->tlb_flush(mem); 255 return 0; 256} 257 258/* 259 * The i810/i830 requires a physical address to program its mouse 260 * pointer into hardware. 261 * However the Xserver still writes to it through the agp aperture. 262 */ 263static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type) 264{ 265 struct agp_memory *new; 266 void *addr; 267 268 if (pg_count != 1 && pg_count != 4) 269 return NULL; 270 271 switch (pg_count) { 272 case 1: addr = agp_bridge->driver->agp_alloc_page(agp_bridge); 273 break; 274 case 4: 275 /* kludge to get 4 physical pages for ARGB cursor */ 276 addr = i8xx_alloc_pages(); 277 break; 278 default: 279 return NULL; 280 } 281 282 if (addr == NULL) 283 return NULL; 284 285 new = agp_create_memory(pg_count); 286 if (new == NULL) 287 return NULL; 288 289 new->memory[0] = virt_to_gart(addr); 290 if (pg_count == 4) { 291 /* kludge to get 4 physical pages for ARGB cursor */ 292 new->memory[1] = new->memory[0] + PAGE_SIZE; 293 new->memory[2] = new->memory[1] + PAGE_SIZE; 294 new->memory[3] = new->memory[2] + PAGE_SIZE; 295 } 296 new->page_count = pg_count; 297 new->num_scratch_pages = pg_count; 298 new->type = AGP_PHYS_MEMORY; 299 new->physical = new->memory[0]; 300 return new; 301} 302 303static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type) 304{ 305 struct agp_memory *new; 306 307 if (type == AGP_DCACHE_MEMORY) { 308 if (pg_count != intel_i810_private.num_dcache_entries) 309 return NULL; 310 311 new = agp_create_memory(1); 312 if (new == NULL) 313 return NULL; 314 315 new->type = AGP_DCACHE_MEMORY; 316 new->page_count = pg_count; 317 new->num_scratch_pages = 0; 318 vfree(new->memory); 319 return new; 320 } 321 if (type == AGP_PHYS_MEMORY) 322 return alloc_agpphysmem_i8xx(pg_count, type); 323 324 return NULL; 325} 326 327static void intel_i810_free_by_type(struct agp_memory *curr) 328{ 329 agp_free_key(curr->key); 330 if(curr->type == AGP_PHYS_MEMORY) { 331 if (curr->page_count == 4) 332 i8xx_destroy_pages(gart_to_virt(curr->memory[0])); 333 else 334 agp_bridge->driver->agp_destroy_page( 335 gart_to_virt(curr->memory[0])); 336 vfree(curr->memory); 337 } 338 kfree(curr); 339} 340 341static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge, 342 unsigned long addr, int type) 343{ 344 /* Type checking must be done elsewhere */ 345 return addr | bridge->driver->masks[type].mask; 346} 347 348static struct aper_size_info_fixed intel_i830_sizes[] = 349{ 350 {128, 32768, 5}, 351 /* The 64M mode still requires a 128k gatt */ 352 {64, 16384, 5}, 353 {256, 65536, 6}, 354}; 355 356static struct _intel_i830_private { 357 struct pci_dev *i830_dev; /* device one */ 358 volatile u8 __iomem *registers; 359 volatile u32 __iomem *gtt; /* I915G */ 360 int gtt_entries; 361} intel_i830_private; 362 363static void intel_i830_init_gtt_entries(void) 364{ 365 u16 gmch_ctrl; 366 int gtt_entries; 367 u8 rdct; 368 int local = 0; 369 static const int ddt[4] = { 0, 16, 32, 64 }; 370 int size; 371 372 pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl); 373 374 /* We obtain the size of the GTT, which is also stored (for some 375 * reason) at the top of stolen memory. Then we add 4KB to that 376 * for the video BIOS popup, which is also stored in there. */ 377 size = agp_bridge->driver->fetch_size() + 4; 378 379 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB || 380 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) { 381 switch (gmch_ctrl & I830_GMCH_GMS_MASK) { 382 case I830_GMCH_GMS_STOLEN_512: 383 gtt_entries = KB(512) - KB(size); 384 break; 385 case I830_GMCH_GMS_STOLEN_1024: 386 gtt_entries = MB(1) - KB(size); 387 break; 388 case I830_GMCH_GMS_STOLEN_8192: 389 gtt_entries = MB(8) - KB(size); 390 break; 391 case I830_GMCH_GMS_LOCAL: 392 rdct = readb(intel_i830_private.registers+I830_RDRAM_CHANNEL_TYPE); 393 gtt_entries = (I830_RDRAM_ND(rdct) + 1) * 394 MB(ddt[I830_RDRAM_DDT(rdct)]); 395 local = 1; 396 break; 397 default: 398 gtt_entries = 0; 399 break; 400 } 401 } else { 402 switch (gmch_ctrl & I830_GMCH_GMS_MASK) { 403 case I855_GMCH_GMS_STOLEN_1M: 404 gtt_entries = MB(1) - KB(size); 405 break; 406 case I855_GMCH_GMS_STOLEN_4M: 407 gtt_entries = MB(4) - KB(size); 408 break; 409 case I855_GMCH_GMS_STOLEN_8M: 410 gtt_entries = MB(8) - KB(size); 411 break; 412 case I855_GMCH_GMS_STOLEN_16M: 413 gtt_entries = MB(16) - KB(size); 414 break; 415 case I855_GMCH_GMS_STOLEN_32M: 416 gtt_entries = MB(32) - KB(size); 417 break; 418 case I915_GMCH_GMS_STOLEN_48M: 419 /* Check it's really I915G */ 420 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB || 421 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB || 422 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB) 423 gtt_entries = MB(48) - KB(size); 424 else 425 gtt_entries = 0; 426 break; 427 case I915_GMCH_GMS_STOLEN_64M: 428 /* Check it's really I915G */ 429 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB || 430 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB || 431 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB) 432 gtt_entries = MB(64) - KB(size); 433 else 434 gtt_entries = 0; 435 default: 436 gtt_entries = 0; 437 break; 438 } 439 } 440 if (gtt_entries > 0) 441 printk(KERN_INFO PFX "Detected %dK %s memory.\n", 442 gtt_entries / KB(1), local ? "local" : "stolen"); 443 else 444 printk(KERN_INFO PFX 445 "No pre-allocated video memory detected.\n"); 446 gtt_entries /= KB(4); 447 448 intel_i830_private.gtt_entries = gtt_entries; 449} 450 451/* The intel i830 automatically initializes the agp aperture during POST. 452 * Use the memory already set aside for in the GTT. 453 */ 454static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge) 455{ 456 int page_order; 457 struct aper_size_info_fixed *size; 458 int num_entries; 459 u32 temp; 460 461 size = agp_bridge->current_size; 462 page_order = size->page_order; 463 num_entries = size->num_entries; 464 agp_bridge->gatt_table_real = NULL; 465 466 pci_read_config_dword(intel_i830_private.i830_dev,I810_MMADDR,&temp); 467 temp &= 0xfff80000; 468 469 intel_i830_private.registers = ioremap(temp,128 * 4096); 470 if (!intel_i830_private.registers) 471 return -ENOMEM; 472 473 temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000; 474 global_cache_flush(); /* FIXME: ?? */ 475 476 /* we have to call this as early as possible after the MMIO base address is known */ 477 intel_i830_init_gtt_entries(); 478 479 agp_bridge->gatt_table = NULL; 480 481 agp_bridge->gatt_bus_addr = temp; 482 483 return 0; 484} 485 486/* Return the gatt table to a sane state. Use the top of stolen 487 * memory for the GTT. 488 */ 489static int intel_i830_free_gatt_table(struct agp_bridge_data *bridge) 490{ 491 return 0; 492} 493 494static int intel_i830_fetch_size(void) 495{ 496 u16 gmch_ctrl; 497 struct aper_size_info_fixed *values; 498 499 values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes); 500 501 if (agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82830_HB && 502 agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82845G_HB) { 503 /* 855GM/852GM/865G has 128MB aperture size */ 504 agp_bridge->previous_size = agp_bridge->current_size = (void *) values; 505 agp_bridge->aperture_size_idx = 0; 506 return values[0].size; 507 } 508 509 pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl); 510 511 if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) { 512 agp_bridge->previous_size = agp_bridge->current_size = (void *) values; 513 agp_bridge->aperture_size_idx = 0; 514 return values[0].size; 515 } else { 516 agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + 1); 517 agp_bridge->aperture_size_idx = 1; 518 return values[1].size; 519 } 520 521 return 0; 522} 523 524static int intel_i830_configure(void) 525{ 526 struct aper_size_info_fixed *current_size; 527 u32 temp; 528 u16 gmch_ctrl; 529 int i; 530 531 current_size = A_SIZE_FIX(agp_bridge->current_size); 532 533 pci_read_config_dword(intel_i830_private.i830_dev,I810_GMADDR,&temp); 534 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 535 536 pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl); 537 gmch_ctrl |= I830_GMCH_ENABLED; 538 pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl); 539 540 writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL); 541 readl(intel_i830_private.registers+I810_PGETBL_CTL); /* PCI Posting. */ 542 543 if (agp_bridge->driver->needs_scratch_page) { 544 for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) { 545 writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4)); 546 readl(intel_i830_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ 547 } 548 } 549 550 global_cache_flush(); 551 return 0; 552} 553 554static void intel_i830_cleanup(void) 555{ 556 iounmap(intel_i830_private.registers); 557} 558 559static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int type) 560{ 561 int i,j,num_entries; 562 void *temp; 563 564 temp = agp_bridge->current_size; 565 num_entries = A_SIZE_FIX(temp)->num_entries; 566 567 if (pg_start < intel_i830_private.gtt_entries) { 568 printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n", 569 pg_start,intel_i830_private.gtt_entries); 570 571 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n"); 572 return -EINVAL; 573 } 574 575 if ((pg_start + mem->page_count) > num_entries) 576 return -EINVAL; 577 578 /* The i830 can't check the GTT for entries since its read only, 579 * depend on the caller to make the correct offset decisions. 580 */ 581 582 if ((type != 0 && type != AGP_PHYS_MEMORY) || 583 (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) 584 return -EINVAL; 585 586 global_cache_flush(); /* FIXME: Necessary ?*/ 587 588 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { 589 writel(agp_bridge->driver->mask_memory(agp_bridge, 590 mem->memory[i], mem->type), 591 intel_i830_private.registers+I810_PTE_BASE+(j*4)); 592 readl(intel_i830_private.registers+I810_PTE_BASE+(j*4)); /* PCI Posting. */ 593 } 594 595 global_cache_flush(); 596 agp_bridge->driver->tlb_flush(mem); 597 return 0; 598} 599 600static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start, 601 int type) 602{ 603 int i; 604 605 global_cache_flush(); 606 607 if (pg_start < intel_i830_private.gtt_entries) { 608 printk (KERN_INFO PFX "Trying to disable local/stolen memory\n"); 609 return -EINVAL; 610 } 611 612 for (i = pg_start; i < (mem->page_count + pg_start); i++) { 613 writel(agp_bridge->scratch_page, intel_i830_private.registers+I810_PTE_BASE+(i*4)); 614 readl(intel_i830_private.registers+I810_PTE_BASE+(i*4)); /* PCI Posting. */ 615 } 616 617 global_cache_flush(); 618 agp_bridge->driver->tlb_flush(mem); 619 return 0; 620} 621 622static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type) 623{ 624 if (type == AGP_PHYS_MEMORY) 625 return alloc_agpphysmem_i8xx(pg_count, type); 626 627 /* always return NULL for other allocation types for now */ 628 return NULL; 629} 630 631static int intel_i915_configure(void) 632{ 633 struct aper_size_info_fixed *current_size; 634 u32 temp; 635 u16 gmch_ctrl; 636 int i; 637 638 current_size = A_SIZE_FIX(agp_bridge->current_size); 639 640 pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp); 641 642 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 643 644 pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl); 645 gmch_ctrl |= I830_GMCH_ENABLED; 646 pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl); 647 648 writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_i830_private.registers+I810_PGETBL_CTL); 649 readl(intel_i830_private.registers+I810_PGETBL_CTL); /* PCI Posting. */ 650 651 if (agp_bridge->driver->needs_scratch_page) { 652 for (i = intel_i830_private.gtt_entries; i < current_size->num_entries; i++) { 653 writel(agp_bridge->scratch_page, intel_i830_private.gtt+i); 654 readl(intel_i830_private.gtt+i); /* PCI Posting. */ 655 } 656 } 657 658 global_cache_flush(); 659 return 0; 660} 661 662static void intel_i915_cleanup(void) 663{ 664 iounmap(intel_i830_private.gtt); 665 iounmap(intel_i830_private.registers); 666} 667 668static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start, 669 int type) 670{ 671 int i,j,num_entries; 672 void *temp; 673 674 temp = agp_bridge->current_size; 675 num_entries = A_SIZE_FIX(temp)->num_entries; 676 677 if (pg_start < intel_i830_private.gtt_entries) { 678 printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_i830_private.gtt_entries == 0x%.8x\n", 679 pg_start,intel_i830_private.gtt_entries); 680 681 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n"); 682 return -EINVAL; 683 } 684 685 if ((pg_start + mem->page_count) > num_entries) 686 return -EINVAL; 687 688 /* The i830 can't check the GTT for entries since its read only, 689 * depend on the caller to make the correct offset decisions. 690 */ 691 692 if ((type != 0 && type != AGP_PHYS_MEMORY) || 693 (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) 694 return -EINVAL; 695 696 global_cache_flush(); 697 698 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { 699 writel(agp_bridge->driver->mask_memory(agp_bridge, 700 mem->memory[i], mem->type), intel_i830_private.gtt+j); 701 readl(intel_i830_private.gtt+j); /* PCI Posting. */ 702 } 703 704 global_cache_flush(); 705 agp_bridge->driver->tlb_flush(mem); 706 return 0; 707} 708 709static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start, 710 int type) 711{ 712 int i; 713 714 global_cache_flush(); 715 716 if (pg_start < intel_i830_private.gtt_entries) { 717 printk (KERN_INFO PFX "Trying to disable local/stolen memory\n"); 718 return -EINVAL; 719 } 720 721 for (i = pg_start; i < (mem->page_count + pg_start); i++) { 722 writel(agp_bridge->scratch_page, intel_i830_private.gtt+i); 723 readl(intel_i830_private.gtt+i); 724 } 725 726 global_cache_flush(); 727 agp_bridge->driver->tlb_flush(mem); 728 return 0; 729} 730 731static int intel_i915_fetch_size(void) 732{ 733 struct aper_size_info_fixed *values; 734 u32 temp, offset = 0; 735 736#define I915_256MB_ADDRESS_MASK (1<<27) 737 738 values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes); 739 740 pci_read_config_dword(intel_i830_private.i830_dev, I915_GMADDR, &temp); 741 if (temp & I915_256MB_ADDRESS_MASK) 742 offset = 0; /* 128MB aperture */ 743 else 744 offset = 2; /* 256MB aperture */ 745 agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset); 746 return values[offset].size; 747} 748 749/* The intel i915 automatically initializes the agp aperture during POST. 750 * Use the memory already set aside for in the GTT. 751 */ 752static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge) 753{ 754 int page_order; 755 struct aper_size_info_fixed *size; 756 int num_entries; 757 u32 temp, temp2; 758 759 size = agp_bridge->current_size; 760 page_order = size->page_order; 761 num_entries = size->num_entries; 762 agp_bridge->gatt_table_real = NULL; 763 764 pci_read_config_dword(intel_i830_private.i830_dev, I915_MMADDR, &temp); 765 pci_read_config_dword(intel_i830_private.i830_dev, I915_PTEADDR,&temp2); 766 767 intel_i830_private.gtt = ioremap(temp2, 256 * 1024); 768 if (!intel_i830_private.gtt) 769 return -ENOMEM; 770 771 temp &= 0xfff80000; 772 773 intel_i830_private.registers = ioremap(temp,128 * 4096); 774 if (!intel_i830_private.registers) 775 return -ENOMEM; 776 777 temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000; 778 global_cache_flush(); /* FIXME: ? */ 779 780 /* we have to call this as early as possible after the MMIO base address is known */ 781 intel_i830_init_gtt_entries(); 782 783 agp_bridge->gatt_table = NULL; 784 785 agp_bridge->gatt_bus_addr = temp; 786 787 return 0; 788} 789 790static int intel_fetch_size(void) 791{ 792 int i; 793 u16 temp; 794 struct aper_size_info_16 *values; 795 796 pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp); 797 values = A_SIZE_16(agp_bridge->driver->aperture_sizes); 798 799 for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 800 if (temp == values[i].size_value) { 801 agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i); 802 agp_bridge->aperture_size_idx = i; 803 return values[i].size; 804 } 805 } 806 807 return 0; 808} 809 810static int __intel_8xx_fetch_size(u8 temp) 811{ 812 int i; 813 struct aper_size_info_8 *values; 814 815 values = A_SIZE_8(agp_bridge->driver->aperture_sizes); 816 817 for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 818 if (temp == values[i].size_value) { 819 agp_bridge->previous_size = 820 agp_bridge->current_size = (void *) (values + i); 821 agp_bridge->aperture_size_idx = i; 822 return values[i].size; 823 } 824 } 825 return 0; 826} 827 828static int intel_8xx_fetch_size(void) 829{ 830 u8 temp; 831 832 pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp); 833 return __intel_8xx_fetch_size(temp); 834} 835 836static int intel_815_fetch_size(void) 837{ 838 u8 temp; 839 840 /* Intel 815 chipsets have a _weird_ APSIZE register with only 841 * one non-reserved bit, so mask the others out ... */ 842 pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp); 843 temp &= (1 << 3); 844 845 return __intel_8xx_fetch_size(temp); 846} 847 848static void intel_tlbflush(struct agp_memory *mem) 849{ 850 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200); 851 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); 852} 853 854 855static void intel_8xx_tlbflush(struct agp_memory *mem) 856{ 857 u32 temp; 858 pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp); 859 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7)); 860 pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp); 861 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7)); 862} 863 864 865static void intel_cleanup(void) 866{ 867 u16 temp; 868 struct aper_size_info_16 *previous_size; 869 870 previous_size = A_SIZE_16(agp_bridge->previous_size); 871 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp); 872 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9)); 873 pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value); 874} 875 876 877static void intel_8xx_cleanup(void) 878{ 879 u16 temp; 880 struct aper_size_info_8 *previous_size; 881 882 previous_size = A_SIZE_8(agp_bridge->previous_size); 883 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp); 884 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9)); 885 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value); 886} 887 888 889static int intel_configure(void) 890{ 891 u32 temp; 892 u16 temp2; 893 struct aper_size_info_16 *current_size; 894 895 current_size = A_SIZE_16(agp_bridge->current_size); 896 897 /* aperture size */ 898 pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 899 900 /* address to map to */ 901 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 902 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 903 904 /* attbase - aperture base */ 905 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 906 907 /* agpctrl */ 908 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); 909 910 /* paccfg/nbxcfg */ 911 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2); 912 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, 913 (temp2 & ~(1 << 10)) | (1 << 9)); 914 /* clear any possible error conditions */ 915 pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7); 916 return 0; 917} 918 919static int intel_815_configure(void) 920{ 921 u32 temp, addr; 922 u8 temp2; 923 struct aper_size_info_8 *current_size; 924 925 /* attbase - aperture base */ 926 /* the Intel 815 chipset spec. says that bits 29-31 in the 927 * ATTBASE register are reserved -> try not to write them */ 928 if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) { 929 printk (KERN_EMERG PFX "gatt bus addr too high"); 930 return -EINVAL; 931 } 932 933 current_size = A_SIZE_8(agp_bridge->current_size); 934 935 /* aperture size */ 936 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, 937 current_size->size_value); 938 939 /* address to map to */ 940 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 941 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 942 943 pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr); 944 addr &= INTEL_815_ATTBASE_MASK; 945 addr |= agp_bridge->gatt_bus_addr; 946 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr); 947 948 /* agpctrl */ 949 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 950 951 /* apcont */ 952 pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2); 953 pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1)); 954 955 /* clear any possible error conditions */ 956 /* Oddness : this chipset seems to have no ERRSTS register ! */ 957 return 0; 958} 959 960static void intel_820_tlbflush(struct agp_memory *mem) 961{ 962 return; 963} 964 965static void intel_820_cleanup(void) 966{ 967 u8 temp; 968 struct aper_size_info_8 *previous_size; 969 970 previous_size = A_SIZE_8(agp_bridge->previous_size); 971 pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp); 972 pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, 973 temp & ~(1 << 1)); 974 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, 975 previous_size->size_value); 976} 977 978 979static int intel_820_configure(void) 980{ 981 u32 temp; 982 u8 temp2; 983 struct aper_size_info_8 *current_size; 984 985 current_size = A_SIZE_8(agp_bridge->current_size); 986 987 /* aperture size */ 988 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 989 990 /* address to map to */ 991 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 992 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 993 994 /* attbase - aperture base */ 995 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 996 997 /* agpctrl */ 998 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 999 1000 /* global enable aperture access */ 1001 /* This flag is not accessed through MCHCFG register as in */ 1002 /* i850 chipset. */ 1003 pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2); 1004 pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1)); 1005 /* clear any possible AGP-related error conditions */ 1006 pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c); 1007 return 0; 1008} 1009 1010static int intel_840_configure(void) 1011{ 1012 u32 temp; 1013 u16 temp2; 1014 struct aper_size_info_8 *current_size; 1015 1016 current_size = A_SIZE_8(agp_bridge->current_size); 1017 1018 /* aperture size */ 1019 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 1020 1021 /* address to map to */ 1022 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1023 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1024 1025 /* attbase - aperture base */ 1026 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 1027 1028 /* agpctrl */ 1029 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 1030 1031 /* mcgcfg */ 1032 pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2); 1033 pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9)); 1034 /* clear any possible error conditions */ 1035 pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000); 1036 return 0; 1037} 1038 1039static int intel_845_configure(void) 1040{ 1041 u32 temp; 1042 u8 temp2; 1043 struct aper_size_info_8 *current_size; 1044 1045 current_size = A_SIZE_8(agp_bridge->current_size); 1046 1047 /* aperture size */ 1048 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 1049 1050 if (agp_bridge->apbase_config != 0) { 1051 pci_write_config_dword(agp_bridge->dev, AGP_APBASE, 1052 agp_bridge->apbase_config); 1053 } else { 1054 /* address to map to */ 1055 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1056 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1057 agp_bridge->apbase_config = temp; 1058 } 1059 1060 /* attbase - aperture base */ 1061 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 1062 1063 /* agpctrl */ 1064 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 1065 1066 /* agpm */ 1067 pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2); 1068 pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1)); 1069 /* clear any possible error conditions */ 1070 pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c); 1071 return 0; 1072} 1073 1074static int intel_850_configure(void) 1075{ 1076 u32 temp; 1077 u16 temp2; 1078 struct aper_size_info_8 *current_size; 1079 1080 current_size = A_SIZE_8(agp_bridge->current_size); 1081 1082 /* aperture size */ 1083 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 1084 1085 /* address to map to */ 1086 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1087 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1088 1089 /* attbase - aperture base */ 1090 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 1091 1092 /* agpctrl */ 1093 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 1094 1095 /* mcgcfg */ 1096 pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2); 1097 pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9)); 1098 /* clear any possible AGP-related error conditions */ 1099 pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c); 1100 return 0; 1101} 1102 1103static int intel_860_configure(void) 1104{ 1105 u32 temp; 1106 u16 temp2; 1107 struct aper_size_info_8 *current_size; 1108 1109 current_size = A_SIZE_8(agp_bridge->current_size); 1110 1111 /* aperture size */ 1112 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 1113 1114 /* address to map to */ 1115 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1116 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1117 1118 /* attbase - aperture base */ 1119 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 1120 1121 /* agpctrl */ 1122 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 1123 1124 /* mcgcfg */ 1125 pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2); 1126 pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9)); 1127 /* clear any possible AGP-related error conditions */ 1128 pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700); 1129 return 0; 1130} 1131 1132static int intel_830mp_configure(void) 1133{ 1134 u32 temp; 1135 u16 temp2; 1136 struct aper_size_info_8 *current_size; 1137 1138 current_size = A_SIZE_8(agp_bridge->current_size); 1139 1140 /* aperture size */ 1141 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 1142 1143 /* address to map to */ 1144 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1145 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1146 1147 /* attbase - aperture base */ 1148 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 1149 1150 /* agpctrl */ 1151 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 1152 1153 /* gmch */ 1154 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2); 1155 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9)); 1156 /* clear any possible AGP-related error conditions */ 1157 pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c); 1158 return 0; 1159} 1160 1161static int intel_7505_configure(void) 1162{ 1163 u32 temp; 1164 u16 temp2; 1165 struct aper_size_info_8 *current_size; 1166 1167 current_size = A_SIZE_8(agp_bridge->current_size); 1168 1169 /* aperture size */ 1170 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 1171 1172 /* address to map to */ 1173 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1174 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1175 1176 /* attbase - aperture base */ 1177 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 1178 1179 /* agpctrl */ 1180 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 1181 1182 /* mchcfg */ 1183 pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2); 1184 pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9)); 1185 1186 return 0; 1187} 1188 1189/* Setup function */ 1190static struct gatt_mask intel_generic_masks[] = 1191{ 1192 {.mask = 0x00000017, .type = 0} 1193}; 1194 1195static struct aper_size_info_8 intel_815_sizes[2] = 1196{ 1197 {64, 16384, 4, 0}, 1198 {32, 8192, 3, 8}, 1199}; 1200 1201static struct aper_size_info_8 intel_8xx_sizes[7] = 1202{ 1203 {256, 65536, 6, 0}, 1204 {128, 32768, 5, 32}, 1205 {64, 16384, 4, 48}, 1206 {32, 8192, 3, 56}, 1207 {16, 4096, 2, 60}, 1208 {8, 2048, 1, 62}, 1209 {4, 1024, 0, 63} 1210}; 1211 1212static struct aper_size_info_16 intel_generic_sizes[7] = 1213{ 1214 {256, 65536, 6, 0}, 1215 {128, 32768, 5, 32}, 1216 {64, 16384, 4, 48}, 1217 {32, 8192, 3, 56}, 1218 {16, 4096, 2, 60}, 1219 {8, 2048, 1, 62}, 1220 {4, 1024, 0, 63} 1221}; 1222 1223static struct aper_size_info_8 intel_830mp_sizes[4] = 1224{ 1225 {256, 65536, 6, 0}, 1226 {128, 32768, 5, 32}, 1227 {64, 16384, 4, 48}, 1228 {32, 8192, 3, 56} 1229}; 1230 1231static struct agp_bridge_driver intel_generic_driver = { 1232 .owner = THIS_MODULE, 1233 .aperture_sizes = intel_generic_sizes, 1234 .size_type = U16_APER_SIZE, 1235 .num_aperture_sizes = 7, 1236 .configure = intel_configure, 1237 .fetch_size = intel_fetch_size, 1238 .cleanup = intel_cleanup, 1239 .tlb_flush = intel_tlbflush, 1240 .mask_memory = agp_generic_mask_memory, 1241 .masks = intel_generic_masks, 1242 .agp_enable = agp_generic_enable, 1243 .cache_flush = global_cache_flush, 1244 .create_gatt_table = agp_generic_create_gatt_table, 1245 .free_gatt_table = agp_generic_free_gatt_table, 1246 .insert_memory = agp_generic_insert_memory, 1247 .remove_memory = agp_generic_remove_memory, 1248 .alloc_by_type = agp_generic_alloc_by_type, 1249 .free_by_type = agp_generic_free_by_type, 1250 .agp_alloc_page = agp_generic_alloc_page, 1251 .agp_destroy_page = agp_generic_destroy_page, 1252}; 1253 1254static struct agp_bridge_driver intel_810_driver = { 1255 .owner = THIS_MODULE, 1256 .aperture_sizes = intel_i810_sizes, 1257 .size_type = FIXED_APER_SIZE, 1258 .num_aperture_sizes = 2, 1259 .needs_scratch_page = TRUE, 1260 .configure = intel_i810_configure, 1261 .fetch_size = intel_i810_fetch_size, 1262 .cleanup = intel_i810_cleanup, 1263 .tlb_flush = intel_i810_tlbflush, 1264 .mask_memory = intel_i810_mask_memory, 1265 .masks = intel_i810_masks, 1266 .agp_enable = intel_i810_agp_enable, 1267 .cache_flush = global_cache_flush, 1268 .create_gatt_table = agp_generic_create_gatt_table, 1269 .free_gatt_table = agp_generic_free_gatt_table, 1270 .insert_memory = intel_i810_insert_entries, 1271 .remove_memory = intel_i810_remove_entries, 1272 .alloc_by_type = intel_i810_alloc_by_type, 1273 .free_by_type = intel_i810_free_by_type, 1274 .agp_alloc_page = agp_generic_alloc_page, 1275 .agp_destroy_page = agp_generic_destroy_page, 1276}; 1277 1278static struct agp_bridge_driver intel_815_driver = { 1279 .owner = THIS_MODULE, 1280 .aperture_sizes = intel_815_sizes, 1281 .size_type = U8_APER_SIZE, 1282 .num_aperture_sizes = 2, 1283 .configure = intel_815_configure, 1284 .fetch_size = intel_815_fetch_size, 1285 .cleanup = intel_8xx_cleanup, 1286 .tlb_flush = intel_8xx_tlbflush, 1287 .mask_memory = agp_generic_mask_memory, 1288 .masks = intel_generic_masks, 1289 .agp_enable = agp_generic_enable, 1290 .cache_flush = global_cache_flush, 1291 .create_gatt_table = agp_generic_create_gatt_table, 1292 .free_gatt_table = agp_generic_free_gatt_table, 1293 .insert_memory = agp_generic_insert_memory, 1294 .remove_memory = agp_generic_remove_memory, 1295 .alloc_by_type = agp_generic_alloc_by_type, 1296 .free_by_type = agp_generic_free_by_type, 1297 .agp_alloc_page = agp_generic_alloc_page, 1298 .agp_destroy_page = agp_generic_destroy_page, 1299}; 1300 1301static struct agp_bridge_driver intel_830_driver = { 1302 .owner = THIS_MODULE, 1303 .aperture_sizes = intel_i830_sizes, 1304 .size_type = FIXED_APER_SIZE, 1305 .num_aperture_sizes = 3, 1306 .needs_scratch_page = TRUE, 1307 .configure = intel_i830_configure, 1308 .fetch_size = intel_i830_fetch_size, 1309 .cleanup = intel_i830_cleanup, 1310 .tlb_flush = intel_i810_tlbflush, 1311 .mask_memory = intel_i810_mask_memory, 1312 .masks = intel_i810_masks, 1313 .agp_enable = intel_i810_agp_enable, 1314 .cache_flush = global_cache_flush, 1315 .create_gatt_table = intel_i830_create_gatt_table, 1316 .free_gatt_table = intel_i830_free_gatt_table, 1317 .insert_memory = intel_i830_insert_entries, 1318 .remove_memory = intel_i830_remove_entries, 1319 .alloc_by_type = intel_i830_alloc_by_type, 1320 .free_by_type = intel_i810_free_by_type, 1321 .agp_alloc_page = agp_generic_alloc_page, 1322 .agp_destroy_page = agp_generic_destroy_page, 1323}; 1324 1325static struct agp_bridge_driver intel_820_driver = { 1326 .owner = THIS_MODULE, 1327 .aperture_sizes = intel_8xx_sizes, 1328 .size_type = U8_APER_SIZE, 1329 .num_aperture_sizes = 7, 1330 .configure = intel_820_configure, 1331 .fetch_size = intel_8xx_fetch_size, 1332 .cleanup = intel_820_cleanup, 1333 .tlb_flush = intel_820_tlbflush, 1334 .mask_memory = agp_generic_mask_memory, 1335 .masks = intel_generic_masks, 1336 .agp_enable = agp_generic_enable, 1337 .cache_flush = global_cache_flush, 1338 .create_gatt_table = agp_generic_create_gatt_table, 1339 .free_gatt_table = agp_generic_free_gatt_table, 1340 .insert_memory = agp_generic_insert_memory, 1341 .remove_memory = agp_generic_remove_memory, 1342 .alloc_by_type = agp_generic_alloc_by_type, 1343 .free_by_type = agp_generic_free_by_type, 1344 .agp_alloc_page = agp_generic_alloc_page, 1345 .agp_destroy_page = agp_generic_destroy_page, 1346}; 1347 1348static struct agp_bridge_driver intel_830mp_driver = { 1349 .owner = THIS_MODULE, 1350 .aperture_sizes = intel_830mp_sizes, 1351 .size_type = U8_APER_SIZE, 1352 .num_aperture_sizes = 4, 1353 .configure = intel_830mp_configure, 1354 .fetch_size = intel_8xx_fetch_size, 1355 .cleanup = intel_8xx_cleanup, 1356 .tlb_flush = intel_8xx_tlbflush, 1357 .mask_memory = agp_generic_mask_memory, 1358 .masks = intel_generic_masks, 1359 .agp_enable = agp_generic_enable, 1360 .cache_flush = global_cache_flush, 1361 .create_gatt_table = agp_generic_create_gatt_table, 1362 .free_gatt_table = agp_generic_free_gatt_table, 1363 .insert_memory = agp_generic_insert_memory, 1364 .remove_memory = agp_generic_remove_memory, 1365 .alloc_by_type = agp_generic_alloc_by_type, 1366 .free_by_type = agp_generic_free_by_type, 1367 .agp_alloc_page = agp_generic_alloc_page, 1368 .agp_destroy_page = agp_generic_destroy_page, 1369}; 1370 1371static struct agp_bridge_driver intel_840_driver = { 1372 .owner = THIS_MODULE, 1373 .aperture_sizes = intel_8xx_sizes, 1374 .size_type = U8_APER_SIZE, 1375 .num_aperture_sizes = 7, 1376 .configure = intel_840_configure, 1377 .fetch_size = intel_8xx_fetch_size, 1378 .cleanup = intel_8xx_cleanup, 1379 .tlb_flush = intel_8xx_tlbflush, 1380 .mask_memory = agp_generic_mask_memory, 1381 .masks = intel_generic_masks, 1382 .agp_enable = agp_generic_enable, 1383 .cache_flush = global_cache_flush, 1384 .create_gatt_table = agp_generic_create_gatt_table, 1385 .free_gatt_table = agp_generic_free_gatt_table, 1386 .insert_memory = agp_generic_insert_memory, 1387 .remove_memory = agp_generic_remove_memory, 1388 .alloc_by_type = agp_generic_alloc_by_type, 1389 .free_by_type = agp_generic_free_by_type, 1390 .agp_alloc_page = agp_generic_alloc_page, 1391 .agp_destroy_page = agp_generic_destroy_page, 1392}; 1393 1394static struct agp_bridge_driver intel_845_driver = { 1395 .owner = THIS_MODULE, 1396 .aperture_sizes = intel_8xx_sizes, 1397 .size_type = U8_APER_SIZE, 1398 .num_aperture_sizes = 7, 1399 .configure = intel_845_configure, 1400 .fetch_size = intel_8xx_fetch_size, 1401 .cleanup = intel_8xx_cleanup, 1402 .tlb_flush = intel_8xx_tlbflush, 1403 .mask_memory = agp_generic_mask_memory, 1404 .masks = intel_generic_masks, 1405 .agp_enable = agp_generic_enable, 1406 .cache_flush = global_cache_flush, 1407 .create_gatt_table = agp_generic_create_gatt_table, 1408 .free_gatt_table = agp_generic_free_gatt_table, 1409 .insert_memory = agp_generic_insert_memory, 1410 .remove_memory = agp_generic_remove_memory, 1411 .alloc_by_type = agp_generic_alloc_by_type, 1412 .free_by_type = agp_generic_free_by_type, 1413 .agp_alloc_page = agp_generic_alloc_page, 1414 .agp_destroy_page = agp_generic_destroy_page, 1415}; 1416 1417static struct agp_bridge_driver intel_850_driver = { 1418 .owner = THIS_MODULE, 1419 .aperture_sizes = intel_8xx_sizes, 1420 .size_type = U8_APER_SIZE, 1421 .num_aperture_sizes = 7, 1422 .configure = intel_850_configure, 1423 .fetch_size = intel_8xx_fetch_size, 1424 .cleanup = intel_8xx_cleanup, 1425 .tlb_flush = intel_8xx_tlbflush, 1426 .mask_memory = agp_generic_mask_memory, 1427 .masks = intel_generic_masks, 1428 .agp_enable = agp_generic_enable, 1429 .cache_flush = global_cache_flush, 1430 .create_gatt_table = agp_generic_create_gatt_table, 1431 .free_gatt_table = agp_generic_free_gatt_table, 1432 .insert_memory = agp_generic_insert_memory, 1433 .remove_memory = agp_generic_remove_memory, 1434 .alloc_by_type = agp_generic_alloc_by_type, 1435 .free_by_type = agp_generic_free_by_type, 1436 .agp_alloc_page = agp_generic_alloc_page, 1437 .agp_destroy_page = agp_generic_destroy_page, 1438}; 1439 1440static struct agp_bridge_driver intel_860_driver = { 1441 .owner = THIS_MODULE, 1442 .aperture_sizes = intel_8xx_sizes, 1443 .size_type = U8_APER_SIZE, 1444 .num_aperture_sizes = 7, 1445 .configure = intel_860_configure, 1446 .fetch_size = intel_8xx_fetch_size, 1447 .cleanup = intel_8xx_cleanup, 1448 .tlb_flush = intel_8xx_tlbflush, 1449 .mask_memory = agp_generic_mask_memory, 1450 .masks = intel_generic_masks, 1451 .agp_enable = agp_generic_enable, 1452 .cache_flush = global_cache_flush, 1453 .create_gatt_table = agp_generic_create_gatt_table, 1454 .free_gatt_table = agp_generic_free_gatt_table, 1455 .insert_memory = agp_generic_insert_memory, 1456 .remove_memory = agp_generic_remove_memory, 1457 .alloc_by_type = agp_generic_alloc_by_type, 1458 .free_by_type = agp_generic_free_by_type, 1459 .agp_alloc_page = agp_generic_alloc_page, 1460 .agp_destroy_page = agp_generic_destroy_page, 1461}; 1462 1463static struct agp_bridge_driver intel_915_driver = { 1464 .owner = THIS_MODULE, 1465 .aperture_sizes = intel_i830_sizes, 1466 .size_type = FIXED_APER_SIZE, 1467 .num_aperture_sizes = 3, 1468 .needs_scratch_page = TRUE, 1469 .configure = intel_i915_configure, 1470 .fetch_size = intel_i915_fetch_size, 1471 .cleanup = intel_i915_cleanup, 1472 .tlb_flush = intel_i810_tlbflush, 1473 .mask_memory = intel_i810_mask_memory, 1474 .masks = intel_i810_masks, 1475 .agp_enable = intel_i810_agp_enable, 1476 .cache_flush = global_cache_flush, 1477 .create_gatt_table = intel_i915_create_gatt_table, 1478 .free_gatt_table = intel_i830_free_gatt_table, 1479 .insert_memory = intel_i915_insert_entries, 1480 .remove_memory = intel_i915_remove_entries, 1481 .alloc_by_type = intel_i830_alloc_by_type, 1482 .free_by_type = intel_i810_free_by_type, 1483 .agp_alloc_page = agp_generic_alloc_page, 1484 .agp_destroy_page = agp_generic_destroy_page, 1485}; 1486 1487 1488static struct agp_bridge_driver intel_7505_driver = { 1489 .owner = THIS_MODULE, 1490 .aperture_sizes = intel_8xx_sizes, 1491 .size_type = U8_APER_SIZE, 1492 .num_aperture_sizes = 7, 1493 .configure = intel_7505_configure, 1494 .fetch_size = intel_8xx_fetch_size, 1495 .cleanup = intel_8xx_cleanup, 1496 .tlb_flush = intel_8xx_tlbflush, 1497 .mask_memory = agp_generic_mask_memory, 1498 .masks = intel_generic_masks, 1499 .agp_enable = agp_generic_enable, 1500 .cache_flush = global_cache_flush, 1501 .create_gatt_table = agp_generic_create_gatt_table, 1502 .free_gatt_table = agp_generic_free_gatt_table, 1503 .insert_memory = agp_generic_insert_memory, 1504 .remove_memory = agp_generic_remove_memory, 1505 .alloc_by_type = agp_generic_alloc_by_type, 1506 .free_by_type = agp_generic_free_by_type, 1507 .agp_alloc_page = agp_generic_alloc_page, 1508 .agp_destroy_page = agp_generic_destroy_page, 1509}; 1510 1511static int find_i810(u16 device) 1512{ 1513 struct pci_dev *i810_dev; 1514 1515 i810_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL); 1516 if (!i810_dev) 1517 return 0; 1518 intel_i810_private.i810_dev = i810_dev; 1519 return 1; 1520} 1521 1522static int find_i830(u16 device) 1523{ 1524 struct pci_dev *i830_dev; 1525 1526 i830_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL); 1527 if (i830_dev && PCI_FUNC(i830_dev->devfn) != 0) { 1528 i830_dev = pci_get_device(PCI_VENDOR_ID_INTEL, 1529 device, i830_dev); 1530 } 1531 1532 if (!i830_dev) 1533 return 0; 1534 1535 intel_i830_private.i830_dev = i830_dev; 1536 return 1; 1537} 1538 1539static int __devinit agp_intel_probe(struct pci_dev *pdev, 1540 const struct pci_device_id *ent) 1541{ 1542 struct agp_bridge_data *bridge; 1543 char *name = "(unknown)"; 1544 u8 cap_ptr = 0; 1545 struct resource *r; 1546 1547 cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 1548 1549 bridge = agp_alloc_bridge(); 1550 if (!bridge) 1551 return -ENOMEM; 1552 1553 switch (pdev->device) { 1554 case PCI_DEVICE_ID_INTEL_82443LX_0: 1555 bridge->driver = &intel_generic_driver; 1556 name = "440LX"; 1557 break; 1558 case PCI_DEVICE_ID_INTEL_82443BX_0: 1559 bridge->driver = &intel_generic_driver; 1560 name = "440BX"; 1561 break; 1562 case PCI_DEVICE_ID_INTEL_82443GX_0: 1563 bridge->driver = &intel_generic_driver; 1564 name = "440GX"; 1565 break; 1566 case PCI_DEVICE_ID_INTEL_82810_MC1: 1567 name = "i810"; 1568 if (!find_i810(PCI_DEVICE_ID_INTEL_82810_IG1)) 1569 goto fail; 1570 bridge->driver = &intel_810_driver; 1571 break; 1572 case PCI_DEVICE_ID_INTEL_82810_MC3: 1573 name = "i810 DC100"; 1574 if (!find_i810(PCI_DEVICE_ID_INTEL_82810_IG3)) 1575 goto fail; 1576 bridge->driver = &intel_810_driver; 1577 break; 1578 case PCI_DEVICE_ID_INTEL_82810E_MC: 1579 name = "i810 E"; 1580 if (!find_i810(PCI_DEVICE_ID_INTEL_82810E_IG)) 1581 goto fail; 1582 bridge->driver = &intel_810_driver; 1583 break; 1584 case PCI_DEVICE_ID_INTEL_82815_MC: 1585 /* 1586 * The i815 can operate either as an i810 style 1587 * integrated device, or as an AGP4X motherboard. 1588 */ 1589 if (find_i810(PCI_DEVICE_ID_INTEL_82815_CGC)) 1590 bridge->driver = &intel_810_driver; 1591 else 1592 bridge->driver = &intel_815_driver; 1593 name = "i815"; 1594 break; 1595 case PCI_DEVICE_ID_INTEL_82820_HB: 1596 case PCI_DEVICE_ID_INTEL_82820_UP_HB: 1597 bridge->driver = &intel_820_driver; 1598 name = "i820"; 1599 break; 1600 case PCI_DEVICE_ID_INTEL_82830_HB: 1601 if (find_i830(PCI_DEVICE_ID_INTEL_82830_CGC)) { 1602 bridge->driver = &intel_830_driver; 1603 } else { 1604 bridge->driver = &intel_830mp_driver; 1605 } 1606 name = "830M"; 1607 break; 1608 case PCI_DEVICE_ID_INTEL_82840_HB: 1609 bridge->driver = &intel_840_driver; 1610 name = "i840"; 1611 break; 1612 case PCI_DEVICE_ID_INTEL_82845_HB: 1613 bridge->driver = &intel_845_driver; 1614 name = "i845"; 1615 break; 1616 case PCI_DEVICE_ID_INTEL_82845G_HB: 1617 if (find_i830(PCI_DEVICE_ID_INTEL_82845G_IG)) { 1618 bridge->driver = &intel_830_driver; 1619 } else { 1620 bridge->driver = &intel_845_driver; 1621 } 1622 name = "845G"; 1623 break; 1624 case PCI_DEVICE_ID_INTEL_82850_HB: 1625 bridge->driver = &intel_850_driver; 1626 name = "i850"; 1627 break; 1628 case PCI_DEVICE_ID_INTEL_82855PM_HB: 1629 bridge->driver = &intel_845_driver; 1630 name = "855PM"; 1631 break; 1632 case PCI_DEVICE_ID_INTEL_82855GM_HB: 1633 if (find_i830(PCI_DEVICE_ID_INTEL_82855GM_IG)) { 1634 bridge->driver = &intel_830_driver; 1635 name = "855"; 1636 } else { 1637 bridge->driver = &intel_845_driver; 1638 name = "855GM"; 1639 } 1640 break; 1641 case PCI_DEVICE_ID_INTEL_82860_HB: 1642 bridge->driver = &intel_860_driver; 1643 name = "i860"; 1644 break; 1645 case PCI_DEVICE_ID_INTEL_82865_HB: 1646 if (find_i830(PCI_DEVICE_ID_INTEL_82865_IG)) { 1647 bridge->driver = &intel_830_driver; 1648 } else { 1649 bridge->driver = &intel_845_driver; 1650 } 1651 name = "865"; 1652 break; 1653 case PCI_DEVICE_ID_INTEL_82875_HB: 1654 bridge->driver = &intel_845_driver; 1655 name = "i875"; 1656 break; 1657 case PCI_DEVICE_ID_INTEL_82915G_HB: 1658 if (find_i830(PCI_DEVICE_ID_INTEL_82915G_IG)) { 1659 bridge->driver = &intel_915_driver; 1660 } else { 1661 bridge->driver = &intel_845_driver; 1662 } 1663 name = "915G"; 1664 break; 1665 case PCI_DEVICE_ID_INTEL_82915GM_HB: 1666 if (find_i830(PCI_DEVICE_ID_INTEL_82915GM_IG)) { 1667 bridge->driver = &intel_915_driver; 1668 } else { 1669 bridge->driver = &intel_845_driver; 1670 } 1671 name = "915GM"; 1672 break; 1673 case PCI_DEVICE_ID_INTEL_82945G_HB: 1674 if (find_i830(PCI_DEVICE_ID_INTEL_82945G_IG)) { 1675 bridge->driver = &intel_915_driver; 1676 } else { 1677 bridge->driver = &intel_845_driver; 1678 } 1679 name = "945G"; 1680 break; 1681 case PCI_DEVICE_ID_INTEL_7505_0: 1682 bridge->driver = &intel_7505_driver; 1683 name = "E7505"; 1684 break; 1685 case PCI_DEVICE_ID_INTEL_7205_0: 1686 bridge->driver = &intel_7505_driver; 1687 name = "E7205"; 1688 break; 1689 default: 1690 if (cap_ptr) 1691 printk(KERN_WARNING PFX "Unsupported Intel chipset (device id: %04x)\n", 1692 pdev->device); 1693 agp_put_bridge(bridge); 1694 return -ENODEV; 1695 }; 1696 1697 bridge->dev = pdev; 1698 bridge->capndx = cap_ptr; 1699 1700 if (bridge->driver == &intel_810_driver) 1701 bridge->dev_private_data = &intel_i810_private; 1702 else if (bridge->driver == &intel_830_driver) 1703 bridge->dev_private_data = &intel_i830_private; 1704 1705 printk(KERN_INFO PFX "Detected an Intel %s Chipset.\n", name); 1706 1707 /* 1708 * The following fixes the case where the BIOS has "forgotten" to 1709 * provide an address range for the GART. 1710 * 20030610 - hamish@zot.org 1711 */ 1712 r = &pdev->resource[0]; 1713 if (!r->start && r->end) { 1714 if(pci_assign_resource(pdev, 0)) { 1715 printk(KERN_ERR PFX "could not assign resource 0\n"); 1716 agp_put_bridge(bridge); 1717 return -ENODEV; 1718 } 1719 } 1720 1721 /* 1722 * If the device has not been properly setup, the following will catch 1723 * the problem and should stop the system from crashing. 1724 * 20030610 - hamish@zot.org 1725 */ 1726 if (pci_enable_device(pdev)) { 1727 printk(KERN_ERR PFX "Unable to Enable PCI device\n"); 1728 agp_put_bridge(bridge); 1729 return -ENODEV; 1730 } 1731 1732 /* Fill in the mode register */ 1733 if (cap_ptr) { 1734 pci_read_config_dword(pdev, 1735 bridge->capndx+PCI_AGP_STATUS, 1736 &bridge->mode); 1737 } 1738 1739 pci_set_drvdata(pdev, bridge); 1740 return agp_add_bridge(bridge); 1741 1742fail: 1743 printk(KERN_ERR PFX "Detected an Intel %s chipset, " 1744 "but could not find the secondary device.\n", name); 1745 agp_put_bridge(bridge); 1746 return -ENODEV; 1747} 1748 1749static void __devexit agp_intel_remove(struct pci_dev *pdev) 1750{ 1751 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 1752 1753 agp_remove_bridge(bridge); 1754 1755 if (intel_i810_private.i810_dev) 1756 pci_dev_put(intel_i810_private.i810_dev); 1757 if (intel_i830_private.i830_dev) 1758 pci_dev_put(intel_i830_private.i830_dev); 1759 1760 agp_put_bridge(bridge); 1761} 1762 1763static int agp_intel_resume(struct pci_dev *pdev) 1764{ 1765 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 1766 1767 pci_restore_state(pdev); 1768 1769 if (bridge->driver == &intel_generic_driver) 1770 intel_configure(); 1771 else if (bridge->driver == &intel_850_driver) 1772 intel_850_configure(); 1773 else if (bridge->driver == &intel_845_driver) 1774 intel_845_configure(); 1775 else if (bridge->driver == &intel_830mp_driver) 1776 intel_830mp_configure(); 1777 else if (bridge->driver == &intel_915_driver) 1778 intel_i915_configure(); 1779 else if (bridge->driver == &intel_830_driver) 1780 intel_i830_configure(); 1781 else if (bridge->driver == &intel_810_driver) 1782 intel_i810_configure(); 1783 1784 return 0; 1785} 1786 1787static struct pci_device_id agp_intel_pci_table[] = { 1788#define ID(x) \ 1789 { \ 1790 .class = (PCI_CLASS_BRIDGE_HOST << 8), \ 1791 .class_mask = ~0, \ 1792 .vendor = PCI_VENDOR_ID_INTEL, \ 1793 .device = x, \ 1794 .subvendor = PCI_ANY_ID, \ 1795 .subdevice = PCI_ANY_ID, \ 1796 } 1797 ID(PCI_DEVICE_ID_INTEL_82443LX_0), 1798 ID(PCI_DEVICE_ID_INTEL_82443BX_0), 1799 ID(PCI_DEVICE_ID_INTEL_82443GX_0), 1800 ID(PCI_DEVICE_ID_INTEL_82810_MC1), 1801 ID(PCI_DEVICE_ID_INTEL_82810_MC3), 1802 ID(PCI_DEVICE_ID_INTEL_82810E_MC), 1803 ID(PCI_DEVICE_ID_INTEL_82815_MC), 1804 ID(PCI_DEVICE_ID_INTEL_82820_HB), 1805 ID(PCI_DEVICE_ID_INTEL_82820_UP_HB), 1806 ID(PCI_DEVICE_ID_INTEL_82830_HB), 1807 ID(PCI_DEVICE_ID_INTEL_82840_HB), 1808 ID(PCI_DEVICE_ID_INTEL_82845_HB), 1809 ID(PCI_DEVICE_ID_INTEL_82845G_HB), 1810 ID(PCI_DEVICE_ID_INTEL_82850_HB), 1811 ID(PCI_DEVICE_ID_INTEL_82855PM_HB), 1812 ID(PCI_DEVICE_ID_INTEL_82855GM_HB), 1813 ID(PCI_DEVICE_ID_INTEL_82860_HB), 1814 ID(PCI_DEVICE_ID_INTEL_82865_HB), 1815 ID(PCI_DEVICE_ID_INTEL_82875_HB), 1816 ID(PCI_DEVICE_ID_INTEL_7505_0), 1817 ID(PCI_DEVICE_ID_INTEL_7205_0), 1818 ID(PCI_DEVICE_ID_INTEL_82915G_HB), 1819 ID(PCI_DEVICE_ID_INTEL_82915GM_HB), 1820 ID(PCI_DEVICE_ID_INTEL_82945G_HB), 1821 { } 1822}; 1823 1824MODULE_DEVICE_TABLE(pci, agp_intel_pci_table); 1825 1826static struct pci_driver agp_intel_pci_driver = { 1827 .owner = THIS_MODULE, 1828 .name = "agpgart-intel", 1829 .id_table = agp_intel_pci_table, 1830 .probe = agp_intel_probe, 1831 .remove = __devexit_p(agp_intel_remove), 1832 .resume = agp_intel_resume, 1833}; 1834 1835static int __init agp_intel_init(void) 1836{ 1837 if (agp_off) 1838 return -EINVAL; 1839 return pci_register_driver(&agp_intel_pci_driver); 1840} 1841 1842static void __exit agp_intel_cleanup(void) 1843{ 1844 pci_unregister_driver(&agp_intel_pci_driver); 1845} 1846 1847module_init(agp_intel_init); 1848module_exit(agp_intel_cleanup); 1849 1850MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>"); 1851MODULE_LICENSE("GPL and additional rights"); 1852