intel-agp.c (28664B)
1/* 2 * Intel AGPGART routines. 3 */ 4 5#include <linux/module.h> 6#include <linux/pci.h> 7#include <linux/slab.h> 8#include <linux/init.h> 9#include <linux/kernel.h> 10#include <linux/pagemap.h> 11#include <linux/agp_backend.h> 12#include <asm/smp.h> 13#include "agp.h" 14#include "intel-agp.h" 15#include <drm/intel-gtt.h> 16 17static int intel_fetch_size(void) 18{ 19 int i; 20 u16 temp; 21 struct aper_size_info_16 *values; 22 23 pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp); 24 values = A_SIZE_16(agp_bridge->driver->aperture_sizes); 25 26 for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 27 if (temp == values[i].size_value) { 28 agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i); 29 agp_bridge->aperture_size_idx = i; 30 return values[i].size; 31 } 32 } 33 34 return 0; 35} 36 37static int __intel_8xx_fetch_size(u8 temp) 38{ 39 int i; 40 struct aper_size_info_8 *values; 41 42 values = A_SIZE_8(agp_bridge->driver->aperture_sizes); 43 44 for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 45 if (temp == values[i].size_value) { 46 agp_bridge->previous_size = 47 agp_bridge->current_size = (void *) (values + i); 48 agp_bridge->aperture_size_idx = i; 49 return values[i].size; 50 } 51 } 52 return 0; 53} 54 55static int intel_8xx_fetch_size(void) 56{ 57 u8 temp; 58 59 pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp); 60 return __intel_8xx_fetch_size(temp); 61} 62 63static int intel_815_fetch_size(void) 64{ 65 u8 temp; 66 67 /* Intel 815 chipsets have a _weird_ APSIZE register with only 68 * one non-reserved bit, so mask the others out ... */ 69 pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp); 70 temp &= (1 << 3); 71 72 return __intel_8xx_fetch_size(temp); 73} 74 75static void intel_tlbflush(struct agp_memory *mem) 76{ 77 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200); 78 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); 79} 80 81 82static void intel_8xx_tlbflush(struct agp_memory *mem) 83{ 84 u32 temp; 85 pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp); 86 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7)); 87 pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp); 88 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7)); 89} 90 91 92static void intel_cleanup(void) 93{ 94 u16 temp; 95 struct aper_size_info_16 *previous_size; 96 97 previous_size = A_SIZE_16(agp_bridge->previous_size); 98 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp); 99 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9)); 100 pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value); 101} 102 103 104static void intel_8xx_cleanup(void) 105{ 106 u16 temp; 107 struct aper_size_info_8 *previous_size; 108 109 previous_size = A_SIZE_8(agp_bridge->previous_size); 110 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp); 111 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9)); 112 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value); 113} 114 115 116static int intel_configure(void) 117{ 118 u16 temp2; 119 struct aper_size_info_16 *current_size; 120 121 current_size = A_SIZE_16(agp_bridge->current_size); 122 123 /* aperture size */ 124 pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 125 126 /* address to map to */ 127 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 128 AGP_APERTURE_BAR); 129 130 /* attbase - aperture base */ 131 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 132 133 /* agpctrl */ 134 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); 135 136 /* paccfg/nbxcfg */ 137 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2); 138 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, 139 (temp2 & ~(1 << 10)) | (1 << 9)); 140 /* clear any possible error conditions */ 141 pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7); 142 return 0; 143} 144 145static int intel_815_configure(void) 146{ 147 u32 addr; 148 u8 temp2; 149 struct aper_size_info_8 *current_size; 150 151 /* attbase - aperture base */ 152 /* the Intel 815 chipset spec. says that bits 29-31 in the 153 * ATTBASE register are reserved -> try not to write them */ 154 if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) { 155 dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high"); 156 return -EINVAL; 157 } 158 159 current_size = A_SIZE_8(agp_bridge->current_size); 160 161 /* aperture size */ 162 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, 163 current_size->size_value); 164 165 /* address to map to */ 166 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 167 AGP_APERTURE_BAR); 168 169 pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr); 170 addr &= INTEL_815_ATTBASE_MASK; 171 addr |= agp_bridge->gatt_bus_addr; 172 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr); 173 174 /* agpctrl */ 175 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 176 177 /* apcont */ 178 pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2); 179 pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1)); 180 181 /* clear any possible error conditions */ 182 /* Oddness : this chipset seems to have no ERRSTS register ! */ 183 return 0; 184} 185 186static void intel_820_tlbflush(struct agp_memory *mem) 187{ 188 return; 189} 190 191static void intel_820_cleanup(void) 192{ 193 u8 temp; 194 struct aper_size_info_8 *previous_size; 195 196 previous_size = A_SIZE_8(agp_bridge->previous_size); 197 pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp); 198 pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, 199 temp & ~(1 << 1)); 200 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, 201 previous_size->size_value); 202} 203 204 205static int intel_820_configure(void) 206{ 207 u8 temp2; 208 struct aper_size_info_8 *current_size; 209 210 current_size = A_SIZE_8(agp_bridge->current_size); 211 212 /* aperture size */ 213 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 214 215 /* address to map to */ 216 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 217 AGP_APERTURE_BAR); 218 219 /* attbase - aperture base */ 220 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 221 222 /* agpctrl */ 223 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 224 225 /* global enable aperture access */ 226 /* This flag is not accessed through MCHCFG register as in */ 227 /* i850 chipset. */ 228 pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2); 229 pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1)); 230 /* clear any possible AGP-related error conditions */ 231 pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c); 232 return 0; 233} 234 235static int intel_840_configure(void) 236{ 237 u16 temp2; 238 struct aper_size_info_8 *current_size; 239 240 current_size = A_SIZE_8(agp_bridge->current_size); 241 242 /* aperture size */ 243 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 244 245 /* address to map to */ 246 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 247 AGP_APERTURE_BAR); 248 249 /* attbase - aperture base */ 250 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 251 252 /* agpctrl */ 253 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 254 255 /* mcgcfg */ 256 pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2); 257 pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9)); 258 /* clear any possible error conditions */ 259 pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000); 260 return 0; 261} 262 263static int intel_845_configure(void) 264{ 265 u8 temp2; 266 struct aper_size_info_8 *current_size; 267 268 current_size = A_SIZE_8(agp_bridge->current_size); 269 270 /* aperture size */ 271 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 272 273 if (agp_bridge->apbase_config != 0) { 274 pci_write_config_dword(agp_bridge->dev, AGP_APBASE, 275 agp_bridge->apbase_config); 276 } else { 277 /* address to map to */ 278 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 279 AGP_APERTURE_BAR); 280 agp_bridge->apbase_config = agp_bridge->gart_bus_addr; 281 } 282 283 /* attbase - aperture base */ 284 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 285 286 /* agpctrl */ 287 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 288 289 /* agpm */ 290 pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2); 291 pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1)); 292 /* clear any possible error conditions */ 293 pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c); 294 return 0; 295} 296 297static int intel_850_configure(void) 298{ 299 u16 temp2; 300 struct aper_size_info_8 *current_size; 301 302 current_size = A_SIZE_8(agp_bridge->current_size); 303 304 /* aperture size */ 305 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 306 307 /* address to map to */ 308 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 309 AGP_APERTURE_BAR); 310 311 /* attbase - aperture base */ 312 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 313 314 /* agpctrl */ 315 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 316 317 /* mcgcfg */ 318 pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2); 319 pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9)); 320 /* clear any possible AGP-related error conditions */ 321 pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c); 322 return 0; 323} 324 325static int intel_860_configure(void) 326{ 327 u16 temp2; 328 struct aper_size_info_8 *current_size; 329 330 current_size = A_SIZE_8(agp_bridge->current_size); 331 332 /* aperture size */ 333 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 334 335 /* address to map to */ 336 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 337 AGP_APERTURE_BAR); 338 339 /* attbase - aperture base */ 340 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 341 342 /* agpctrl */ 343 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 344 345 /* mcgcfg */ 346 pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2); 347 pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9)); 348 /* clear any possible AGP-related error conditions */ 349 pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700); 350 return 0; 351} 352 353static int intel_830mp_configure(void) 354{ 355 u16 temp2; 356 struct aper_size_info_8 *current_size; 357 358 current_size = A_SIZE_8(agp_bridge->current_size); 359 360 /* aperture size */ 361 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 362 363 /* address to map to */ 364 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 365 AGP_APERTURE_BAR); 366 367 /* attbase - aperture base */ 368 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 369 370 /* agpctrl */ 371 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 372 373 /* gmch */ 374 pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2); 375 pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9)); 376 /* clear any possible AGP-related error conditions */ 377 pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c); 378 return 0; 379} 380 381static int intel_7505_configure(void) 382{ 383 u16 temp2; 384 struct aper_size_info_8 *current_size; 385 386 current_size = A_SIZE_8(agp_bridge->current_size); 387 388 /* aperture size */ 389 pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 390 391 /* address to map to */ 392 agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 393 AGP_APERTURE_BAR); 394 395 /* attbase - aperture base */ 396 pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 397 398 /* agpctrl */ 399 pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 400 401 /* mchcfg */ 402 pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2); 403 pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9)); 404 405 return 0; 406} 407 408/* Setup function */ 409static const struct gatt_mask intel_generic_masks[] = 410{ 411 {.mask = 0x00000017, .type = 0} 412}; 413 414static const struct aper_size_info_8 intel_815_sizes[2] = 415{ 416 {64, 16384, 4, 0}, 417 {32, 8192, 3, 8}, 418}; 419 420static const struct aper_size_info_8 intel_8xx_sizes[7] = 421{ 422 {256, 65536, 6, 0}, 423 {128, 32768, 5, 32}, 424 {64, 16384, 4, 48}, 425 {32, 8192, 3, 56}, 426 {16, 4096, 2, 60}, 427 {8, 2048, 1, 62}, 428 {4, 1024, 0, 63} 429}; 430 431static const struct aper_size_info_16 intel_generic_sizes[7] = 432{ 433 {256, 65536, 6, 0}, 434 {128, 32768, 5, 32}, 435 {64, 16384, 4, 48}, 436 {32, 8192, 3, 56}, 437 {16, 4096, 2, 60}, 438 {8, 2048, 1, 62}, 439 {4, 1024, 0, 63} 440}; 441 442static const struct aper_size_info_8 intel_830mp_sizes[4] = 443{ 444 {256, 65536, 6, 0}, 445 {128, 32768, 5, 32}, 446 {64, 16384, 4, 48}, 447 {32, 8192, 3, 56} 448}; 449 450static const struct agp_bridge_driver intel_generic_driver = { 451 .owner = THIS_MODULE, 452 .aperture_sizes = intel_generic_sizes, 453 .size_type = U16_APER_SIZE, 454 .num_aperture_sizes = 7, 455 .needs_scratch_page = true, 456 .configure = intel_configure, 457 .fetch_size = intel_fetch_size, 458 .cleanup = intel_cleanup, 459 .tlb_flush = intel_tlbflush, 460 .mask_memory = agp_generic_mask_memory, 461 .masks = intel_generic_masks, 462 .agp_enable = agp_generic_enable, 463 .cache_flush = global_cache_flush, 464 .create_gatt_table = agp_generic_create_gatt_table, 465 .free_gatt_table = agp_generic_free_gatt_table, 466 .insert_memory = agp_generic_insert_memory, 467 .remove_memory = agp_generic_remove_memory, 468 .alloc_by_type = agp_generic_alloc_by_type, 469 .free_by_type = agp_generic_free_by_type, 470 .agp_alloc_page = agp_generic_alloc_page, 471 .agp_alloc_pages = agp_generic_alloc_pages, 472 .agp_destroy_page = agp_generic_destroy_page, 473 .agp_destroy_pages = agp_generic_destroy_pages, 474 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 475}; 476 477static const struct agp_bridge_driver intel_815_driver = { 478 .owner = THIS_MODULE, 479 .aperture_sizes = intel_815_sizes, 480 .size_type = U8_APER_SIZE, 481 .num_aperture_sizes = 2, 482 .needs_scratch_page = true, 483 .configure = intel_815_configure, 484 .fetch_size = intel_815_fetch_size, 485 .cleanup = intel_8xx_cleanup, 486 .tlb_flush = intel_8xx_tlbflush, 487 .mask_memory = agp_generic_mask_memory, 488 .masks = intel_generic_masks, 489 .agp_enable = agp_generic_enable, 490 .cache_flush = global_cache_flush, 491 .create_gatt_table = agp_generic_create_gatt_table, 492 .free_gatt_table = agp_generic_free_gatt_table, 493 .insert_memory = agp_generic_insert_memory, 494 .remove_memory = agp_generic_remove_memory, 495 .alloc_by_type = agp_generic_alloc_by_type, 496 .free_by_type = agp_generic_free_by_type, 497 .agp_alloc_page = agp_generic_alloc_page, 498 .agp_alloc_pages = agp_generic_alloc_pages, 499 .agp_destroy_page = agp_generic_destroy_page, 500 .agp_destroy_pages = agp_generic_destroy_pages, 501 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 502}; 503 504static const struct agp_bridge_driver intel_820_driver = { 505 .owner = THIS_MODULE, 506 .aperture_sizes = intel_8xx_sizes, 507 .size_type = U8_APER_SIZE, 508 .num_aperture_sizes = 7, 509 .needs_scratch_page = true, 510 .configure = intel_820_configure, 511 .fetch_size = intel_8xx_fetch_size, 512 .cleanup = intel_820_cleanup, 513 .tlb_flush = intel_820_tlbflush, 514 .mask_memory = agp_generic_mask_memory, 515 .masks = intel_generic_masks, 516 .agp_enable = agp_generic_enable, 517 .cache_flush = global_cache_flush, 518 .create_gatt_table = agp_generic_create_gatt_table, 519 .free_gatt_table = agp_generic_free_gatt_table, 520 .insert_memory = agp_generic_insert_memory, 521 .remove_memory = agp_generic_remove_memory, 522 .alloc_by_type = agp_generic_alloc_by_type, 523 .free_by_type = agp_generic_free_by_type, 524 .agp_alloc_page = agp_generic_alloc_page, 525 .agp_alloc_pages = agp_generic_alloc_pages, 526 .agp_destroy_page = agp_generic_destroy_page, 527 .agp_destroy_pages = agp_generic_destroy_pages, 528 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 529}; 530 531static const struct agp_bridge_driver intel_830mp_driver = { 532 .owner = THIS_MODULE, 533 .aperture_sizes = intel_830mp_sizes, 534 .size_type = U8_APER_SIZE, 535 .num_aperture_sizes = 4, 536 .needs_scratch_page = true, 537 .configure = intel_830mp_configure, 538 .fetch_size = intel_8xx_fetch_size, 539 .cleanup = intel_8xx_cleanup, 540 .tlb_flush = intel_8xx_tlbflush, 541 .mask_memory = agp_generic_mask_memory, 542 .masks = intel_generic_masks, 543 .agp_enable = agp_generic_enable, 544 .cache_flush = global_cache_flush, 545 .create_gatt_table = agp_generic_create_gatt_table, 546 .free_gatt_table = agp_generic_free_gatt_table, 547 .insert_memory = agp_generic_insert_memory, 548 .remove_memory = agp_generic_remove_memory, 549 .alloc_by_type = agp_generic_alloc_by_type, 550 .free_by_type = agp_generic_free_by_type, 551 .agp_alloc_page = agp_generic_alloc_page, 552 .agp_alloc_pages = agp_generic_alloc_pages, 553 .agp_destroy_page = agp_generic_destroy_page, 554 .agp_destroy_pages = agp_generic_destroy_pages, 555 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 556}; 557 558static const struct agp_bridge_driver intel_840_driver = { 559 .owner = THIS_MODULE, 560 .aperture_sizes = intel_8xx_sizes, 561 .size_type = U8_APER_SIZE, 562 .num_aperture_sizes = 7, 563 .needs_scratch_page = true, 564 .configure = intel_840_configure, 565 .fetch_size = intel_8xx_fetch_size, 566 .cleanup = intel_8xx_cleanup, 567 .tlb_flush = intel_8xx_tlbflush, 568 .mask_memory = agp_generic_mask_memory, 569 .masks = intel_generic_masks, 570 .agp_enable = agp_generic_enable, 571 .cache_flush = global_cache_flush, 572 .create_gatt_table = agp_generic_create_gatt_table, 573 .free_gatt_table = agp_generic_free_gatt_table, 574 .insert_memory = agp_generic_insert_memory, 575 .remove_memory = agp_generic_remove_memory, 576 .alloc_by_type = agp_generic_alloc_by_type, 577 .free_by_type = agp_generic_free_by_type, 578 .agp_alloc_page = agp_generic_alloc_page, 579 .agp_alloc_pages = agp_generic_alloc_pages, 580 .agp_destroy_page = agp_generic_destroy_page, 581 .agp_destroy_pages = agp_generic_destroy_pages, 582 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 583}; 584 585static const struct agp_bridge_driver intel_845_driver = { 586 .owner = THIS_MODULE, 587 .aperture_sizes = intel_8xx_sizes, 588 .size_type = U8_APER_SIZE, 589 .num_aperture_sizes = 7, 590 .needs_scratch_page = true, 591 .configure = intel_845_configure, 592 .fetch_size = intel_8xx_fetch_size, 593 .cleanup = intel_8xx_cleanup, 594 .tlb_flush = intel_8xx_tlbflush, 595 .mask_memory = agp_generic_mask_memory, 596 .masks = intel_generic_masks, 597 .agp_enable = agp_generic_enable, 598 .cache_flush = global_cache_flush, 599 .create_gatt_table = agp_generic_create_gatt_table, 600 .free_gatt_table = agp_generic_free_gatt_table, 601 .insert_memory = agp_generic_insert_memory, 602 .remove_memory = agp_generic_remove_memory, 603 .alloc_by_type = agp_generic_alloc_by_type, 604 .free_by_type = agp_generic_free_by_type, 605 .agp_alloc_page = agp_generic_alloc_page, 606 .agp_alloc_pages = agp_generic_alloc_pages, 607 .agp_destroy_page = agp_generic_destroy_page, 608 .agp_destroy_pages = agp_generic_destroy_pages, 609 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 610}; 611 612static const struct agp_bridge_driver intel_850_driver = { 613 .owner = THIS_MODULE, 614 .aperture_sizes = intel_8xx_sizes, 615 .size_type = U8_APER_SIZE, 616 .num_aperture_sizes = 7, 617 .needs_scratch_page = true, 618 .configure = intel_850_configure, 619 .fetch_size = intel_8xx_fetch_size, 620 .cleanup = intel_8xx_cleanup, 621 .tlb_flush = intel_8xx_tlbflush, 622 .mask_memory = agp_generic_mask_memory, 623 .masks = intel_generic_masks, 624 .agp_enable = agp_generic_enable, 625 .cache_flush = global_cache_flush, 626 .create_gatt_table = agp_generic_create_gatt_table, 627 .free_gatt_table = agp_generic_free_gatt_table, 628 .insert_memory = agp_generic_insert_memory, 629 .remove_memory = agp_generic_remove_memory, 630 .alloc_by_type = agp_generic_alloc_by_type, 631 .free_by_type = agp_generic_free_by_type, 632 .agp_alloc_page = agp_generic_alloc_page, 633 .agp_alloc_pages = agp_generic_alloc_pages, 634 .agp_destroy_page = agp_generic_destroy_page, 635 .agp_destroy_pages = agp_generic_destroy_pages, 636 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 637}; 638 639static const struct agp_bridge_driver intel_860_driver = { 640 .owner = THIS_MODULE, 641 .aperture_sizes = intel_8xx_sizes, 642 .size_type = U8_APER_SIZE, 643 .num_aperture_sizes = 7, 644 .needs_scratch_page = true, 645 .configure = intel_860_configure, 646 .fetch_size = intel_8xx_fetch_size, 647 .cleanup = intel_8xx_cleanup, 648 .tlb_flush = intel_8xx_tlbflush, 649 .mask_memory = agp_generic_mask_memory, 650 .masks = intel_generic_masks, 651 .agp_enable = agp_generic_enable, 652 .cache_flush = global_cache_flush, 653 .create_gatt_table = agp_generic_create_gatt_table, 654 .free_gatt_table = agp_generic_free_gatt_table, 655 .insert_memory = agp_generic_insert_memory, 656 .remove_memory = agp_generic_remove_memory, 657 .alloc_by_type = agp_generic_alloc_by_type, 658 .free_by_type = agp_generic_free_by_type, 659 .agp_alloc_page = agp_generic_alloc_page, 660 .agp_alloc_pages = agp_generic_alloc_pages, 661 .agp_destroy_page = agp_generic_destroy_page, 662 .agp_destroy_pages = agp_generic_destroy_pages, 663 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 664}; 665 666static const struct agp_bridge_driver intel_7505_driver = { 667 .owner = THIS_MODULE, 668 .aperture_sizes = intel_8xx_sizes, 669 .size_type = U8_APER_SIZE, 670 .num_aperture_sizes = 7, 671 .needs_scratch_page = true, 672 .configure = intel_7505_configure, 673 .fetch_size = intel_8xx_fetch_size, 674 .cleanup = intel_8xx_cleanup, 675 .tlb_flush = intel_8xx_tlbflush, 676 .mask_memory = agp_generic_mask_memory, 677 .masks = intel_generic_masks, 678 .agp_enable = agp_generic_enable, 679 .cache_flush = global_cache_flush, 680 .create_gatt_table = agp_generic_create_gatt_table, 681 .free_gatt_table = agp_generic_free_gatt_table, 682 .insert_memory = agp_generic_insert_memory, 683 .remove_memory = agp_generic_remove_memory, 684 .alloc_by_type = agp_generic_alloc_by_type, 685 .free_by_type = agp_generic_free_by_type, 686 .agp_alloc_page = agp_generic_alloc_page, 687 .agp_alloc_pages = agp_generic_alloc_pages, 688 .agp_destroy_page = agp_generic_destroy_page, 689 .agp_destroy_pages = agp_generic_destroy_pages, 690 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 691}; 692 693/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of 694 * driver and gmch_driver must be non-null, and find_gmch will determine 695 * which one should be used if a gmch_chip_id is present. 696 */ 697static const struct intel_agp_driver_description { 698 unsigned int chip_id; 699 char *name; 700 const struct agp_bridge_driver *driver; 701} intel_agp_chipsets[] = { 702 { PCI_DEVICE_ID_INTEL_82443LX_0, "440LX", &intel_generic_driver }, 703 { PCI_DEVICE_ID_INTEL_82443BX_0, "440BX", &intel_generic_driver }, 704 { PCI_DEVICE_ID_INTEL_82443GX_0, "440GX", &intel_generic_driver }, 705 { PCI_DEVICE_ID_INTEL_82815_MC, "i815", &intel_815_driver }, 706 { PCI_DEVICE_ID_INTEL_82820_HB, "i820", &intel_820_driver }, 707 { PCI_DEVICE_ID_INTEL_82820_UP_HB, "i820", &intel_820_driver }, 708 { PCI_DEVICE_ID_INTEL_82830_HB, "830M", &intel_830mp_driver }, 709 { PCI_DEVICE_ID_INTEL_82840_HB, "i840", &intel_840_driver }, 710 { PCI_DEVICE_ID_INTEL_82845_HB, "i845", &intel_845_driver }, 711 { PCI_DEVICE_ID_INTEL_82845G_HB, "845G", &intel_845_driver }, 712 { PCI_DEVICE_ID_INTEL_82850_HB, "i850", &intel_850_driver }, 713 { PCI_DEVICE_ID_INTEL_82854_HB, "854", &intel_845_driver }, 714 { PCI_DEVICE_ID_INTEL_82855PM_HB, "855PM", &intel_845_driver }, 715 { PCI_DEVICE_ID_INTEL_82855GM_HB, "855GM", &intel_845_driver }, 716 { PCI_DEVICE_ID_INTEL_82860_HB, "i860", &intel_860_driver }, 717 { PCI_DEVICE_ID_INTEL_82865_HB, "865", &intel_845_driver }, 718 { PCI_DEVICE_ID_INTEL_82875_HB, "i875", &intel_845_driver }, 719 { PCI_DEVICE_ID_INTEL_7505_0, "E7505", &intel_7505_driver }, 720 { PCI_DEVICE_ID_INTEL_7205_0, "E7205", &intel_7505_driver }, 721 { 0, NULL, NULL } 722}; 723 724static int agp_intel_probe(struct pci_dev *pdev, 725 const struct pci_device_id *ent) 726{ 727 struct agp_bridge_data *bridge; 728 u8 cap_ptr = 0; 729 struct resource *r; 730 int i, err; 731 732 cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 733 734 bridge = agp_alloc_bridge(); 735 if (!bridge) 736 return -ENOMEM; 737 738 bridge->capndx = cap_ptr; 739 740 if (intel_gmch_probe(pdev, NULL, bridge)) 741 goto found_gmch; 742 743 for (i = 0; intel_agp_chipsets[i].name != NULL; i++) { 744 /* In case that multiple models of gfx chip may 745 stand on same host bridge type, this can be 746 sure we detect the right IGD. */ 747 if (pdev->device == intel_agp_chipsets[i].chip_id) { 748 bridge->driver = intel_agp_chipsets[i].driver; 749 break; 750 } 751 } 752 753 if (!bridge->driver) { 754 if (cap_ptr) 755 dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n", 756 pdev->vendor, pdev->device); 757 agp_put_bridge(bridge); 758 return -ENODEV; 759 } 760 761 bridge->dev = pdev; 762 bridge->dev_private_data = NULL; 763 764 dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name); 765 766 /* 767 * The following fixes the case where the BIOS has "forgotten" to 768 * provide an address range for the GART. 769 * 20030610 - hamish@zot.org 770 * This happens before pci_enable_device() intentionally; 771 * calling pci_enable_device() before assigning the resource 772 * will result in the GART being disabled on machines with such 773 * BIOSs (the GART ends up with a BAR starting at 0, which 774 * conflicts a lot of other devices). 775 */ 776 r = &pdev->resource[0]; 777 if (!r->start && r->end) { 778 if (pci_assign_resource(pdev, 0)) { 779 dev_err(&pdev->dev, "can't assign resource 0\n"); 780 agp_put_bridge(bridge); 781 return -ENODEV; 782 } 783 } 784 785 /* 786 * If the device has not been properly setup, the following will catch 787 * the problem and should stop the system from crashing. 788 * 20030610 - hamish@zot.org 789 */ 790 if (pci_enable_device(pdev)) { 791 dev_err(&pdev->dev, "can't enable PCI device\n"); 792 agp_put_bridge(bridge); 793 return -ENODEV; 794 } 795 796 /* Fill in the mode register */ 797 if (cap_ptr) { 798 pci_read_config_dword(pdev, 799 bridge->capndx+PCI_AGP_STATUS, 800 &bridge->mode); 801 } 802 803found_gmch: 804 pci_set_drvdata(pdev, bridge); 805 err = agp_add_bridge(bridge); 806 return err; 807} 808 809static void agp_intel_remove(struct pci_dev *pdev) 810{ 811 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 812 813 agp_remove_bridge(bridge); 814 815 intel_gmch_remove(); 816 817 agp_put_bridge(bridge); 818} 819 820#ifdef CONFIG_PM 821static int agp_intel_resume(struct pci_dev *pdev) 822{ 823 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 824 825 bridge->driver->configure(); 826 827 return 0; 828} 829#endif 830 831static const struct pci_device_id agp_intel_pci_table[] = { 832#define ID(x) \ 833 { \ 834 .class = (PCI_CLASS_BRIDGE_HOST << 8), \ 835 .class_mask = ~0, \ 836 .vendor = PCI_VENDOR_ID_INTEL, \ 837 .device = x, \ 838 .subvendor = PCI_ANY_ID, \ 839 .subdevice = PCI_ANY_ID, \ 840 } 841 ID(PCI_DEVICE_ID_INTEL_82441), /* for HAS2 support */ 842 ID(PCI_DEVICE_ID_INTEL_82443LX_0), 843 ID(PCI_DEVICE_ID_INTEL_82443BX_0), 844 ID(PCI_DEVICE_ID_INTEL_82443GX_0), 845 ID(PCI_DEVICE_ID_INTEL_82810_MC1), 846 ID(PCI_DEVICE_ID_INTEL_82810_MC3), 847 ID(PCI_DEVICE_ID_INTEL_82810E_MC), 848 ID(PCI_DEVICE_ID_INTEL_82815_MC), 849 ID(PCI_DEVICE_ID_INTEL_82820_HB), 850 ID(PCI_DEVICE_ID_INTEL_82820_UP_HB), 851 ID(PCI_DEVICE_ID_INTEL_82830_HB), 852 ID(PCI_DEVICE_ID_INTEL_82840_HB), 853 ID(PCI_DEVICE_ID_INTEL_82845_HB), 854 ID(PCI_DEVICE_ID_INTEL_82845G_HB), 855 ID(PCI_DEVICE_ID_INTEL_82850_HB), 856 ID(PCI_DEVICE_ID_INTEL_82854_HB), 857 ID(PCI_DEVICE_ID_INTEL_82855PM_HB), 858 ID(PCI_DEVICE_ID_INTEL_82855GM_HB), 859 ID(PCI_DEVICE_ID_INTEL_82860_HB), 860 ID(PCI_DEVICE_ID_INTEL_82865_HB), 861 ID(PCI_DEVICE_ID_INTEL_82875_HB), 862 ID(PCI_DEVICE_ID_INTEL_7505_0), 863 ID(PCI_DEVICE_ID_INTEL_7205_0), 864 ID(PCI_DEVICE_ID_INTEL_E7221_HB), 865 ID(PCI_DEVICE_ID_INTEL_82915G_HB), 866 ID(PCI_DEVICE_ID_INTEL_82915GM_HB), 867 ID(PCI_DEVICE_ID_INTEL_82945G_HB), 868 ID(PCI_DEVICE_ID_INTEL_82945GM_HB), 869 ID(PCI_DEVICE_ID_INTEL_82945GME_HB), 870 ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB), 871 ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB), 872 ID(PCI_DEVICE_ID_INTEL_82946GZ_HB), 873 ID(PCI_DEVICE_ID_INTEL_82G35_HB), 874 ID(PCI_DEVICE_ID_INTEL_82965Q_HB), 875 ID(PCI_DEVICE_ID_INTEL_82965G_HB), 876 ID(PCI_DEVICE_ID_INTEL_82965GM_HB), 877 ID(PCI_DEVICE_ID_INTEL_82965GME_HB), 878 ID(PCI_DEVICE_ID_INTEL_G33_HB), 879 ID(PCI_DEVICE_ID_INTEL_Q35_HB), 880 ID(PCI_DEVICE_ID_INTEL_Q33_HB), 881 ID(PCI_DEVICE_ID_INTEL_GM45_HB), 882 ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB), 883 ID(PCI_DEVICE_ID_INTEL_Q45_HB), 884 ID(PCI_DEVICE_ID_INTEL_G45_HB), 885 ID(PCI_DEVICE_ID_INTEL_G41_HB), 886 ID(PCI_DEVICE_ID_INTEL_B43_HB), 887 ID(PCI_DEVICE_ID_INTEL_B43_1_HB), 888 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB), 889 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB), 890 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB), 891 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB), 892 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB), 893 { } 894}; 895 896MODULE_DEVICE_TABLE(pci, agp_intel_pci_table); 897 898static struct pci_driver agp_intel_pci_driver = { 899 .name = "agpgart-intel", 900 .id_table = agp_intel_pci_table, 901 .probe = agp_intel_probe, 902 .remove = agp_intel_remove, 903#ifdef CONFIG_PM 904 .resume = agp_intel_resume, 905#endif 906}; 907 908static int __init agp_intel_init(void) 909{ 910 if (agp_off) 911 return -EINVAL; 912 return pci_register_driver(&agp_intel_pci_driver); 913} 914 915static void __exit agp_intel_cleanup(void) 916{ 917 pci_unregister_driver(&agp_intel_pci_driver); 918} 919 920module_init(agp_intel_init); 921module_exit(agp_intel_cleanup); 922 923MODULE_AUTHOR("Dave Jones, Various @Intel"); 924MODULE_LICENSE("GPL and additional rights");