aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/char/agp
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/char/agp')
-rw-r--r--drivers/char/agp/ali-agp.c7
-rw-r--r--drivers/char/agp/amd-k7-agp.c8
-rw-r--r--drivers/char/agp/amd64-agp.c19
-rw-r--r--drivers/char/agp/ati-agp.c7
-rw-r--r--drivers/char/agp/backend.c15
-rw-r--r--drivers/char/agp/efficeon-agp.c6
-rw-r--r--drivers/char/agp/generic.c12
-rw-r--r--drivers/char/agp/hp-agp.c6
-rw-r--r--drivers/char/agp/i460-agp.c8
-rw-r--r--drivers/char/agp/intel-agp.c21
-rw-r--r--drivers/char/agp/intel-agp.h52
-rw-r--r--drivers/char/agp/intel-gtt.c351
-rw-r--r--drivers/char/agp/nvidia-agp.c6
-rw-r--r--drivers/char/agp/sgi-agp.c10
-rw-r--r--drivers/char/agp/sis-agp.c13
-rw-r--r--drivers/char/agp/sworks-agp.c6
-rw-r--r--drivers/char/agp/uninorth-agp.c8
-rw-r--r--drivers/char/agp/via-agp.c7
18 files changed, 360 insertions, 202 deletions
diff --git a/drivers/char/agp/ali-agp.c b/drivers/char/agp/ali-agp.c
index 443cd6751ca..fd793519ea2 100644
--- a/drivers/char/agp/ali-agp.c
+++ b/drivers/char/agp/ali-agp.c
@@ -249,7 +249,7 @@ static const struct agp_bridge_driver ali_m1541_bridge = {
249}; 249};
250 250
251 251
252static struct agp_device_ids ali_agp_device_ids[] = 252static struct agp_device_ids ali_agp_device_ids[] __devinitdata =
253{ 253{
254 { 254 {
255 .device_id = PCI_DEVICE_ID_AL_M1541, 255 .device_id = PCI_DEVICE_ID_AL_M1541,
@@ -299,7 +299,8 @@ static struct agp_device_ids ali_agp_device_ids[] =
299 { }, /* dummy final entry, always present */ 299 { }, /* dummy final entry, always present */
300}; 300};
301 301
302static int agp_ali_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 302static int __devinit agp_ali_probe(struct pci_dev *pdev,
303 const struct pci_device_id *ent)
303{ 304{
304 struct agp_device_ids *devs = ali_agp_device_ids; 305 struct agp_device_ids *devs = ali_agp_device_ids;
305 struct agp_bridge_data *bridge; 306 struct agp_bridge_data *bridge;
@@ -373,7 +374,7 @@ found:
373 return agp_add_bridge(bridge); 374 return agp_add_bridge(bridge);
374} 375}
375 376
376static void agp_ali_remove(struct pci_dev *pdev) 377static void __devexit agp_ali_remove(struct pci_dev *pdev)
377{ 378{
378 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 379 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
379 380
diff --git a/drivers/char/agp/amd-k7-agp.c b/drivers/char/agp/amd-k7-agp.c
index 779f0ab845a..f7e88787af9 100644
--- a/drivers/char/agp/amd-k7-agp.c
+++ b/drivers/char/agp/amd-k7-agp.c
@@ -388,7 +388,7 @@ static const struct agp_bridge_driver amd_irongate_driver = {
388 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 388 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
389}; 389};
390 390
391static struct agp_device_ids amd_agp_device_ids[] = 391static struct agp_device_ids amd_agp_device_ids[] __devinitdata =
392{ 392{
393 { 393 {
394 .device_id = PCI_DEVICE_ID_AMD_FE_GATE_7006, 394 .device_id = PCI_DEVICE_ID_AMD_FE_GATE_7006,
@@ -405,8 +405,8 @@ static struct agp_device_ids amd_agp_device_ids[] =
405 { }, /* dummy final entry, always present */ 405 { }, /* dummy final entry, always present */
406}; 406};
407 407
408static int agp_amdk7_probe(struct pci_dev *pdev, 408static int __devinit agp_amdk7_probe(struct pci_dev *pdev,
409 const struct pci_device_id *ent) 409 const struct pci_device_id *ent)
410{ 410{
411 struct agp_bridge_data *bridge; 411 struct agp_bridge_data *bridge;
412 u8 cap_ptr; 412 u8 cap_ptr;
@@ -480,7 +480,7 @@ static int agp_amdk7_probe(struct pci_dev *pdev,
480 return agp_add_bridge(bridge); 480 return agp_add_bridge(bridge);
481} 481}
482 482
483static void agp_amdk7_remove(struct pci_dev *pdev) 483static void __devexit agp_amdk7_remove(struct pci_dev *pdev)
484{ 484{
485 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 485 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
486 486
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index d79d692d05b..780498d7658 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -33,7 +33,7 @@
33#define ULI_X86_64_ENU_SCR_REG 0x54 33#define ULI_X86_64_ENU_SCR_REG 0x54
34 34
35static struct resource *aperture_resource; 35static struct resource *aperture_resource;
36static bool __initdata agp_try_unsupported = 1; 36static int __initdata agp_try_unsupported = 1;
37static int agp_bridges_found; 37static int agp_bridges_found;
38 38
39static void amd64_tlbflush(struct agp_memory *temp) 39static void amd64_tlbflush(struct agp_memory *temp)
@@ -240,7 +240,7 @@ static const struct agp_bridge_driver amd_8151_driver = {
240}; 240};
241 241
242/* Some basic sanity checks for the aperture. */ 242/* Some basic sanity checks for the aperture. */
243static int agp_aperture_valid(u64 aper, u32 size) 243static int __devinit agp_aperture_valid(u64 aper, u32 size)
244{ 244{
245 if (!aperture_valid(aper, size, 32*1024*1024)) 245 if (!aperture_valid(aper, size, 32*1024*1024))
246 return 0; 246 return 0;
@@ -267,7 +267,8 @@ static int agp_aperture_valid(u64 aper, u32 size)
267 * to allocate that much memory. But at least error out cleanly instead of 267 * to allocate that much memory. But at least error out cleanly instead of
268 * crashing. 268 * crashing.
269 */ 269 */
270static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap) 270static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
271 u16 cap)
271{ 272{
272 u32 aper_low, aper_hi; 273 u32 aper_low, aper_hi;
273 u64 aper, nb_aper; 274 u64 aper, nb_aper;
@@ -325,7 +326,7 @@ static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap)
325 return 0; 326 return 0;
326} 327}
327 328
328static int cache_nbs(struct pci_dev *pdev, u32 cap_ptr) 329static __devinit int cache_nbs(struct pci_dev *pdev, u32 cap_ptr)
329{ 330{
330 int i; 331 int i;
331 332
@@ -351,7 +352,7 @@ static int cache_nbs(struct pci_dev *pdev, u32 cap_ptr)
351} 352}
352 353
353/* Handle AMD 8151 quirks */ 354/* Handle AMD 8151 quirks */
354static void amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge) 355static void __devinit amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge)
355{ 356{
356 char *revstring; 357 char *revstring;
357 358
@@ -389,7 +390,7 @@ static const struct aper_size_info_32 uli_sizes[7] =
389 {8, 2048, 1, 4}, 390 {8, 2048, 1, 4},
390 {4, 1024, 0, 3} 391 {4, 1024, 0, 3}
391}; 392};
392static int uli_agp_init(struct pci_dev *pdev) 393static int __devinit uli_agp_init(struct pci_dev *pdev)
393{ 394{
394 u32 httfea,baseaddr,enuscr; 395 u32 httfea,baseaddr,enuscr;
395 struct pci_dev *dev1; 396 struct pci_dev *dev1;
@@ -512,8 +513,8 @@ put:
512 return ret; 513 return ret;
513} 514}
514 515
515static int agp_amd64_probe(struct pci_dev *pdev, 516static int __devinit agp_amd64_probe(struct pci_dev *pdev,
516 const struct pci_device_id *ent) 517 const struct pci_device_id *ent)
517{ 518{
518 struct agp_bridge_data *bridge; 519 struct agp_bridge_data *bridge;
519 u8 cap_ptr; 520 u8 cap_ptr;
@@ -578,7 +579,7 @@ static int agp_amd64_probe(struct pci_dev *pdev,
578 return 0; 579 return 0;
579} 580}
580 581
581static void agp_amd64_remove(struct pci_dev *pdev) 582static void __devexit agp_amd64_remove(struct pci_dev *pdev)
582{ 583{
583 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 584 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
584 585
diff --git a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c
index 0628d7b65c7..dc30e224349 100644
--- a/drivers/char/agp/ati-agp.c
+++ b/drivers/char/agp/ati-agp.c
@@ -445,7 +445,7 @@ static const struct agp_bridge_driver ati_generic_bridge = {
445}; 445};
446 446
447 447
448static struct agp_device_ids ati_agp_device_ids[] = 448static struct agp_device_ids ati_agp_device_ids[] __devinitdata =
449{ 449{
450 { 450 {
451 .device_id = PCI_DEVICE_ID_ATI_RS100, 451 .device_id = PCI_DEVICE_ID_ATI_RS100,
@@ -490,7 +490,8 @@ static struct agp_device_ids ati_agp_device_ids[] =
490 { }, /* dummy final entry, always present */ 490 { }, /* dummy final entry, always present */
491}; 491};
492 492
493static int agp_ati_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 493static int __devinit agp_ati_probe(struct pci_dev *pdev,
494 const struct pci_device_id *ent)
494{ 495{
495 struct agp_device_ids *devs = ati_agp_device_ids; 496 struct agp_device_ids *devs = ati_agp_device_ids;
496 struct agp_bridge_data *bridge; 497 struct agp_bridge_data *bridge;
@@ -532,7 +533,7 @@ found:
532 return agp_add_bridge(bridge); 533 return agp_add_bridge(bridge);
533} 534}
534 535
535static void agp_ati_remove(struct pci_dev *pdev) 536static void __devexit agp_ati_remove(struct pci_dev *pdev)
536{ 537{
537 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 538 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
538 539
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
index 317c28ce832..f27d0d0816d 100644
--- a/drivers/char/agp/backend.c
+++ b/drivers/char/agp/backend.c
@@ -171,7 +171,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
171 } 171 }
172 got_gatt = 1; 172 got_gatt = 1;
173 173
174 bridge->key_list = vzalloc(PAGE_SIZE * 4); 174 bridge->key_list = vmalloc(PAGE_SIZE * 4);
175 if (bridge->key_list == NULL) { 175 if (bridge->key_list == NULL) {
176 dev_err(&bridge->dev->dev, 176 dev_err(&bridge->dev->dev,
177 "can't allocate memory for key lists\n"); 177 "can't allocate memory for key lists\n");
@@ -181,6 +181,7 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
181 got_keylist = 1; 181 got_keylist = 1;
182 182
183 /* FIXME vmalloc'd memory not guaranteed contiguous */ 183 /* FIXME vmalloc'd memory not guaranteed contiguous */
184 memset(bridge->key_list, 0, PAGE_SIZE * 4);
184 185
185 if (bridge->driver->configure()) { 186 if (bridge->driver->configure()) {
186 dev_err(&bridge->dev->dev, "error configuring host chipset\n"); 187 dev_err(&bridge->dev->dev, "error configuring host chipset\n");
@@ -194,10 +195,10 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
194 195
195err_out: 196err_out:
196 if (bridge->driver->needs_scratch_page) { 197 if (bridge->driver->needs_scratch_page) {
197 struct page *page = bridge->scratch_page_page; 198 void *va = page_address(bridge->scratch_page_page);
198 199
199 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_UNMAP); 200 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP);
200 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_FREE); 201 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE);
201 } 202 }
202 if (got_gatt) 203 if (got_gatt)
203 bridge->driver->free_gatt_table(bridge); 204 bridge->driver->free_gatt_table(bridge);
@@ -221,10 +222,10 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
221 222
222 if (bridge->driver->agp_destroy_page && 223 if (bridge->driver->agp_destroy_page &&
223 bridge->driver->needs_scratch_page) { 224 bridge->driver->needs_scratch_page) {
224 struct page *page = bridge->scratch_page_page; 225 void *va = page_address(bridge->scratch_page_page);
225 226
226 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_UNMAP); 227 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP);
227 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_FREE); 228 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE);
228 } 229 }
229} 230}
230 231
diff --git a/drivers/char/agp/efficeon-agp.c b/drivers/char/agp/efficeon-agp.c
index 6974d503205..d607f53d8af 100644
--- a/drivers/char/agp/efficeon-agp.c
+++ b/drivers/char/agp/efficeon-agp.c
@@ -343,8 +343,8 @@ static const struct agp_bridge_driver efficeon_driver = {
343 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 343 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
344}; 344};
345 345
346static int agp_efficeon_probe(struct pci_dev *pdev, 346static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
347 const struct pci_device_id *ent) 347 const struct pci_device_id *ent)
348{ 348{
349 struct agp_bridge_data *bridge; 349 struct agp_bridge_data *bridge;
350 u8 cap_ptr; 350 u8 cap_ptr;
@@ -407,7 +407,7 @@ static int agp_efficeon_probe(struct pci_dev *pdev,
407 return agp_add_bridge(bridge); 407 return agp_add_bridge(bridge);
408} 408}
409 409
410static void agp_efficeon_remove(struct pci_dev *pdev) 410static void __devexit agp_efficeon_remove(struct pci_dev *pdev)
411{ 411{
412 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 412 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
413 413
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
index a0df182f6f7..b072648dc3f 100644
--- a/drivers/char/agp/generic.c
+++ b/drivers/char/agp/generic.c
@@ -514,12 +514,12 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
514 switch (*bridge_agpstat & 7) { 514 switch (*bridge_agpstat & 7) {
515 case 4: 515 case 4:
516 *bridge_agpstat |= (AGPSTAT2_2X | AGPSTAT2_1X); 516 *bridge_agpstat |= (AGPSTAT2_2X | AGPSTAT2_1X);
517 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x4 rate. " 517 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x4 rate"
518 "Fixing up support for x2 & x1\n"); 518 "Fixing up support for x2 & x1\n");
519 break; 519 break;
520 case 2: 520 case 2:
521 *bridge_agpstat |= AGPSTAT2_1X; 521 *bridge_agpstat |= AGPSTAT2_1X;
522 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x2 rate. " 522 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x2 rate"
523 "Fixing up support for x1\n"); 523 "Fixing up support for x1\n");
524 break; 524 break;
525 default: 525 default:
@@ -693,7 +693,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
693 *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD); 693 *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
694 *vga_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD); 694 *vga_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
695 } else { 695 } else {
696 printk(KERN_INFO PFX "Fell back to AGPx4 mode because "); 696 printk(KERN_INFO PFX "Fell back to AGPx4 mode because");
697 if (!(*bridge_agpstat & AGPSTAT3_8X)) { 697 if (!(*bridge_agpstat & AGPSTAT3_8X)) {
698 printk(KERN_INFO PFX "bridge couldn't do x8. bridge_agpstat:%x (orig=%x)\n", 698 printk(KERN_INFO PFX "bridge couldn't do x8. bridge_agpstat:%x (orig=%x)\n",
699 *bridge_agpstat, origbridge); 699 *bridge_agpstat, origbridge);
@@ -956,9 +956,9 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge)
956 bridge->driver->cache_flush(); 956 bridge->driver->cache_flush();
957#ifdef CONFIG_X86 957#ifdef CONFIG_X86
958 if (set_memory_uc((unsigned long)table, 1 << page_order)) 958 if (set_memory_uc((unsigned long)table, 1 << page_order))
959 printk(KERN_WARNING "Could not set GATT table memory to UC!\n"); 959 printk(KERN_WARNING "Could not set GATT table memory to UC!");
960 960
961 bridge->gatt_table = (u32 __iomem *)table; 961 bridge->gatt_table = (void *)table;
962#else 962#else
963 bridge->gatt_table = ioremap_nocache(virt_to_phys(table), 963 bridge->gatt_table = ioremap_nocache(virt_to_phys(table),
964 (PAGE_SIZE * (1 << page_order))); 964 (PAGE_SIZE * (1 << page_order)));
@@ -1010,6 +1010,7 @@ int agp_generic_free_gatt_table(struct agp_bridge_data *bridge)
1010 case LVL2_APER_SIZE: 1010 case LVL2_APER_SIZE:
1011 /* The generic routines can't deal with 2 level gatt's */ 1011 /* The generic routines can't deal with 2 level gatt's */
1012 return -EINVAL; 1012 return -EINVAL;
1013 break;
1013 default: 1014 default:
1014 page_order = 0; 1015 page_order = 0;
1015 break; 1016 break;
@@ -1076,6 +1077,7 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
1076 case LVL2_APER_SIZE: 1077 case LVL2_APER_SIZE:
1077 /* The generic routines can't deal with 2 level gatt's */ 1078 /* The generic routines can't deal with 2 level gatt's */
1078 return -EINVAL; 1079 return -EINVAL;
1080 break;
1079 default: 1081 default:
1080 num_entries = 0; 1082 num_entries = 0;
1081 break; 1083 break;
diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c
index 3695773ce7c..056b289a1e8 100644
--- a/drivers/char/agp/hp-agp.c
+++ b/drivers/char/agp/hp-agp.c
@@ -336,8 +336,7 @@ hp_zx1_insert_memory (struct agp_memory *mem, off_t pg_start, int type)
336 off_t j, io_pg_start; 336 off_t j, io_pg_start;
337 int io_pg_count; 337 int io_pg_count;
338 338
339 if (type != mem->type || 339 if (type != 0 || mem->type != 0) {
340 agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type)) {
341 return -EINVAL; 340 return -EINVAL;
342 } 341 }
343 342
@@ -381,8 +380,7 @@ hp_zx1_remove_memory (struct agp_memory *mem, off_t pg_start, int type)
381 struct _hp_private *hp = &hp_private; 380 struct _hp_private *hp = &hp_private;
382 int i, io_pg_start, io_pg_count; 381 int i, io_pg_start, io_pg_count;
383 382
384 if (type != mem->type || 383 if (type != 0 || mem->type != 0) {
385 agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type)) {
386 return -EINVAL; 384 return -EINVAL;
387 } 385 }
388 386
diff --git a/drivers/char/agp/i460-agp.c b/drivers/char/agp/i460-agp.c
index 15b240ea484..75b763cb3ea 100644
--- a/drivers/char/agp/i460-agp.c
+++ b/drivers/char/agp/i460-agp.c
@@ -587,8 +587,8 @@ const struct agp_bridge_driver intel_i460_driver = {
587 .cant_use_aperture = true, 587 .cant_use_aperture = true,
588}; 588};
589 589
590static int agp_intel_i460_probe(struct pci_dev *pdev, 590static int __devinit agp_intel_i460_probe(struct pci_dev *pdev,
591 const struct pci_device_id *ent) 591 const struct pci_device_id *ent)
592{ 592{
593 struct agp_bridge_data *bridge; 593 struct agp_bridge_data *bridge;
594 u8 cap_ptr; 594 u8 cap_ptr;
@@ -611,7 +611,7 @@ static int agp_intel_i460_probe(struct pci_dev *pdev,
611 return agp_add_bridge(bridge); 611 return agp_add_bridge(bridge);
612} 612}
613 613
614static void agp_intel_i460_remove(struct pci_dev *pdev) 614static void __devexit agp_intel_i460_remove(struct pci_dev *pdev)
615{ 615{
616 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 616 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
617 617
@@ -637,7 +637,7 @@ static struct pci_driver agp_intel_i460_pci_driver = {
637 .name = "agpgart-intel-i460", 637 .name = "agpgart-intel-i460",
638 .id_table = agp_intel_i460_pci_table, 638 .id_table = agp_intel_i460_pci_table,
639 .probe = agp_intel_i460_probe, 639 .probe = agp_intel_i460_probe,
640 .remove = agp_intel_i460_remove, 640 .remove = __devexit_p(agp_intel_i460_remove),
641}; 641};
642 642
643static int __init agp_intel_i460_init(void) 643static int __init agp_intel_i460_init(void)
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index a426ee1f57a..b427711be4b 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -12,7 +12,6 @@
12#include <asm/smp.h> 12#include <asm/smp.h>
13#include "agp.h" 13#include "agp.h"
14#include "intel-agp.h" 14#include "intel-agp.h"
15#include <drm/intel-gtt.h>
16 15
17int intel_agp_enabled; 16int intel_agp_enabled;
18EXPORT_SYMBOL(intel_agp_enabled); 17EXPORT_SYMBOL(intel_agp_enabled);
@@ -732,8 +731,8 @@ static const struct intel_agp_driver_description {
732 { 0, NULL, NULL } 731 { 0, NULL, NULL }
733}; 732};
734 733
735static int agp_intel_probe(struct pci_dev *pdev, 734static int __devinit agp_intel_probe(struct pci_dev *pdev,
736 const struct pci_device_id *ent) 735 const struct pci_device_id *ent)
737{ 736{
738 struct agp_bridge_data *bridge; 737 struct agp_bridge_data *bridge;
739 u8 cap_ptr = 0; 738 u8 cap_ptr = 0;
@@ -748,7 +747,7 @@ static int agp_intel_probe(struct pci_dev *pdev,
748 747
749 bridge->capndx = cap_ptr; 748 bridge->capndx = cap_ptr;
750 749
751 if (intel_gmch_probe(pdev, NULL, bridge)) 750 if (intel_gmch_probe(pdev, bridge))
752 goto found_gmch; 751 goto found_gmch;
753 752
754 for (i = 0; intel_agp_chipsets[i].name != NULL; i++) { 753 for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
@@ -819,13 +818,13 @@ found_gmch:
819 return err; 818 return err;
820} 819}
821 820
822static void agp_intel_remove(struct pci_dev *pdev) 821static void __devexit agp_intel_remove(struct pci_dev *pdev)
823{ 822{
824 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 823 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
825 824
826 agp_remove_bridge(bridge); 825 agp_remove_bridge(bridge);
827 826
828 intel_gmch_remove(); 827 intel_gmch_remove(pdev);
829 828
830 agp_put_bridge(bridge); 829 agp_put_bridge(bridge);
831} 830}
@@ -851,7 +850,6 @@ static struct pci_device_id agp_intel_pci_table[] = {
851 .subvendor = PCI_ANY_ID, \ 850 .subvendor = PCI_ANY_ID, \
852 .subdevice = PCI_ANY_ID, \ 851 .subdevice = PCI_ANY_ID, \
853 } 852 }
854 ID(PCI_DEVICE_ID_INTEL_82441), /* for HAS2 support */
855 ID(PCI_DEVICE_ID_INTEL_82443LX_0), 853 ID(PCI_DEVICE_ID_INTEL_82443LX_0),
856 ID(PCI_DEVICE_ID_INTEL_82443BX_0), 854 ID(PCI_DEVICE_ID_INTEL_82443BX_0),
857 ID(PCI_DEVICE_ID_INTEL_82443GX_0), 855 ID(PCI_DEVICE_ID_INTEL_82443GX_0),
@@ -899,10 +897,15 @@ static struct pci_device_id agp_intel_pci_table[] = {
899 ID(PCI_DEVICE_ID_INTEL_B43_HB), 897 ID(PCI_DEVICE_ID_INTEL_B43_HB),
900 ID(PCI_DEVICE_ID_INTEL_B43_1_HB), 898 ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
901 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB), 899 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
902 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
903 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB), 900 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
904 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB), 901 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
905 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB), 902 ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
903 ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB),
904 ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB),
905 ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB),
906 ID(PCI_DEVICE_ID_INTEL_IVYBRIDGE_HB),
907 ID(PCI_DEVICE_ID_INTEL_IVYBRIDGE_M_HB),
908 ID(PCI_DEVICE_ID_INTEL_IVYBRIDGE_S_HB),
906 { } 909 { }
907}; 910};
908 911
@@ -912,7 +915,7 @@ static struct pci_driver agp_intel_pci_driver = {
912 .name = "agpgart-intel", 915 .name = "agpgart-intel",
913 .id_table = agp_intel_pci_table, 916 .id_table = agp_intel_pci_table,
914 .probe = agp_intel_probe, 917 .probe = agp_intel_probe,
915 .remove = agp_intel_remove, 918 .remove = __devexit_p(agp_intel_remove),
916#ifdef CONFIG_PM 919#ifdef CONFIG_PM
917 .resume = agp_intel_resume, 920 .resume = agp_intel_resume,
918#endif 921#endif
diff --git a/drivers/char/agp/intel-agp.h b/drivers/char/agp/intel-agp.h
index 1042c1b9037..5da67f165af 100644
--- a/drivers/char/agp/intel-agp.h
+++ b/drivers/char/agp/intel-agp.h
@@ -62,6 +62,11 @@
62#define I810_PTE_LOCAL 0x00000002 62#define I810_PTE_LOCAL 0x00000002
63#define I810_PTE_VALID 0x00000001 63#define I810_PTE_VALID 0x00000001
64#define I830_PTE_SYSTEM_CACHED 0x00000006 64#define I830_PTE_SYSTEM_CACHED 0x00000006
65/* GT PTE cache control fields */
66#define GEN6_PTE_UNCACHED 0x00000002
67#define GEN6_PTE_LLC 0x00000004
68#define GEN6_PTE_LLC_MLC 0x00000006
69#define GEN6_PTE_GFDT 0x00000008
65 70
66#define I810_SMRAM_MISCC 0x70 71#define I810_SMRAM_MISCC 0x70
67#define I810_GFX_MEM_WIN_SIZE 0x00010000 72#define I810_GFX_MEM_WIN_SIZE 0x00010000
@@ -141,6 +146,29 @@
141#define INTEL_I7505_AGPCTRL 0x70 146#define INTEL_I7505_AGPCTRL 0x70
142#define INTEL_I7505_MCHCFG 0x50 147#define INTEL_I7505_MCHCFG 0x50
143 148
149#define SNB_GMCH_CTRL 0x50
150#define SNB_GMCH_GMS_STOLEN_MASK 0xF8
151#define SNB_GMCH_GMS_STOLEN_32M (1 << 3)
152#define SNB_GMCH_GMS_STOLEN_64M (2 << 3)
153#define SNB_GMCH_GMS_STOLEN_96M (3 << 3)
154#define SNB_GMCH_GMS_STOLEN_128M (4 << 3)
155#define SNB_GMCH_GMS_STOLEN_160M (5 << 3)
156#define SNB_GMCH_GMS_STOLEN_192M (6 << 3)
157#define SNB_GMCH_GMS_STOLEN_224M (7 << 3)
158#define SNB_GMCH_GMS_STOLEN_256M (8 << 3)
159#define SNB_GMCH_GMS_STOLEN_288M (9 << 3)
160#define SNB_GMCH_GMS_STOLEN_320M (0xa << 3)
161#define SNB_GMCH_GMS_STOLEN_352M (0xb << 3)
162#define SNB_GMCH_GMS_STOLEN_384M (0xc << 3)
163#define SNB_GMCH_GMS_STOLEN_416M (0xd << 3)
164#define SNB_GMCH_GMS_STOLEN_448M (0xe << 3)
165#define SNB_GMCH_GMS_STOLEN_480M (0xf << 3)
166#define SNB_GMCH_GMS_STOLEN_512M (0x10 << 3)
167#define SNB_GTT_SIZE_0M (0 << 8)
168#define SNB_GTT_SIZE_1M (1 << 8)
169#define SNB_GTT_SIZE_2M (2 << 8)
170#define SNB_GTT_SIZE_MASK (3 << 8)
171
144/* pci devices ids */ 172/* pci devices ids */
145#define PCI_DEVICE_ID_INTEL_E7221_HB 0x2588 173#define PCI_DEVICE_ID_INTEL_E7221_HB 0x2588
146#define PCI_DEVICE_ID_INTEL_E7221_IG 0x258a 174#define PCI_DEVICE_ID_INTEL_E7221_IG 0x258a
@@ -183,11 +211,31 @@
183#define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30 211#define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30
184#define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32 212#define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32
185#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB 0x0040 213#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB 0x0040
186#define PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB 0x0069
187#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG 0x0042 214#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG 0x0042
188#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB 0x0044 215#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB 0x0044
189#define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062 216#define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062
190#define PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB 0x006a 217#define PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB 0x006a
191#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG 0x0046 218#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG 0x0046
192 219#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB 0x0100 /* Desktop */
220#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT1_IG 0x0102
221#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_IG 0x0112
222#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_PLUS_IG 0x0122
223#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB 0x0104 /* Mobile */
224#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT1_IG 0x0106
225#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_IG 0x0116
226#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_PLUS_IG 0x0126
227#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_HB 0x0108 /* Server */
228#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_IG 0x010A
229#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_HB 0x0150 /* Desktop */
230#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_GT1_IG 0x0152
231#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_GT2_IG 0x0162
232#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_M_HB 0x0154 /* Mobile */
233#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_M_GT1_IG 0x0156
234#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_M_GT2_IG 0x0166
235#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_S_HB 0x0158 /* Server */
236#define PCI_DEVICE_ID_INTEL_IVYBRIDGE_S_GT1_IG 0x015A
237
238int intel_gmch_probe(struct pci_dev *pdev,
239 struct agp_bridge_data *bridge);
240void intel_gmch_remove(struct pci_dev *pdev);
193#endif 241#endif
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
index dbd901e94ea..2774ac1086d 100644
--- a/drivers/char/agp/intel-gtt.c
+++ b/drivers/char/agp/intel-gtt.c
@@ -66,6 +66,7 @@ static struct _intel_private {
66 struct pci_dev *bridge_dev; 66 struct pci_dev *bridge_dev;
67 u8 __iomem *registers; 67 u8 __iomem *registers;
68 phys_addr_t gtt_bus_addr; 68 phys_addr_t gtt_bus_addr;
69 phys_addr_t gma_bus_addr;
69 u32 PGETBL_save; 70 u32 PGETBL_save;
70 u32 __iomem *gtt; /* I915G */ 71 u32 __iomem *gtt; /* I915G */
71 bool clear_fake_agp; /* on first access via agp, fill with scratch */ 72 bool clear_fake_agp; /* on first access via agp, fill with scratch */
@@ -75,7 +76,7 @@ static struct _intel_private {
75 struct resource ifp_resource; 76 struct resource ifp_resource;
76 int resource_valid; 77 int resource_valid;
77 struct page *scratch_page; 78 struct page *scratch_page;
78 int refcount; 79 dma_addr_t scratch_page_dma;
79} intel_private; 80} intel_private;
80 81
81#define INTEL_GTT_GEN intel_private.driver->gen 82#define INTEL_GTT_GEN intel_private.driver->gen
@@ -84,33 +85,40 @@ static struct _intel_private {
84#define IS_IRONLAKE intel_private.driver->is_ironlake 85#define IS_IRONLAKE intel_private.driver->is_ironlake
85#define HAS_PGTBL_EN intel_private.driver->has_pgtbl_enable 86#define HAS_PGTBL_EN intel_private.driver->has_pgtbl_enable
86 87
87static int intel_gtt_map_memory(struct page **pages, 88int intel_gtt_map_memory(struct page **pages, unsigned int num_entries,
88 unsigned int num_entries, 89 struct scatterlist **sg_list, int *num_sg)
89 struct sg_table *st)
90{ 90{
91 struct sg_table st;
91 struct scatterlist *sg; 92 struct scatterlist *sg;
92 int i; 93 int i;
93 94
95 if (*sg_list)
96 return 0; /* already mapped (for e.g. resume */
97
94 DBG("try mapping %lu pages\n", (unsigned long)num_entries); 98 DBG("try mapping %lu pages\n", (unsigned long)num_entries);
95 99
96 if (sg_alloc_table(st, num_entries, GFP_KERNEL)) 100 if (sg_alloc_table(&st, num_entries, GFP_KERNEL))
97 goto err; 101 goto err;
98 102
99 for_each_sg(st->sgl, sg, num_entries, i) 103 *sg_list = sg = st.sgl;
104
105 for (i = 0 ; i < num_entries; i++, sg = sg_next(sg))
100 sg_set_page(sg, pages[i], PAGE_SIZE, 0); 106 sg_set_page(sg, pages[i], PAGE_SIZE, 0);
101 107
102 if (!pci_map_sg(intel_private.pcidev, 108 *num_sg = pci_map_sg(intel_private.pcidev, *sg_list,
103 st->sgl, st->nents, PCI_DMA_BIDIRECTIONAL)) 109 num_entries, PCI_DMA_BIDIRECTIONAL);
110 if (unlikely(!*num_sg))
104 goto err; 111 goto err;
105 112
106 return 0; 113 return 0;
107 114
108err: 115err:
109 sg_free_table(st); 116 sg_free_table(&st);
110 return -ENOMEM; 117 return -ENOMEM;
111} 118}
119EXPORT_SYMBOL(intel_gtt_map_memory);
112 120
113static void intel_gtt_unmap_memory(struct scatterlist *sg_list, int num_sg) 121void intel_gtt_unmap_memory(struct scatterlist *sg_list, int num_sg)
114{ 122{
115 struct sg_table st; 123 struct sg_table st;
116 DBG("try unmapping %lu pages\n", (unsigned long)mem->page_count); 124 DBG("try unmapping %lu pages\n", (unsigned long)mem->page_count);
@@ -123,6 +131,7 @@ static void intel_gtt_unmap_memory(struct scatterlist *sg_list, int num_sg)
123 131
124 sg_free_table(&st); 132 sg_free_table(&st);
125} 133}
134EXPORT_SYMBOL(intel_gtt_unmap_memory);
126 135
127static void intel_fake_agp_enable(struct agp_bridge_data *bridge, u32 mode) 136static void intel_fake_agp_enable(struct agp_bridge_data *bridge, u32 mode)
128{ 137{
@@ -297,9 +306,9 @@ static int intel_gtt_setup_scratch_page(void)
297 if (pci_dma_mapping_error(intel_private.pcidev, dma_addr)) 306 if (pci_dma_mapping_error(intel_private.pcidev, dma_addr))
298 return -EINVAL; 307 return -EINVAL;
299 308
300 intel_private.base.scratch_page_dma = dma_addr; 309 intel_private.scratch_page_dma = dma_addr;
301 } else 310 } else
302 intel_private.base.scratch_page_dma = page_to_phys(page); 311 intel_private.scratch_page_dma = page_to_phys(page);
303 312
304 intel_private.scratch_page = page; 313 intel_private.scratch_page = page;
305 314
@@ -367,6 +376,62 @@ static unsigned int intel_gtt_stolen_size(void)
367 stolen_size = 0; 376 stolen_size = 0;
368 break; 377 break;
369 } 378 }
379 } else if (INTEL_GTT_GEN == 6) {
380 /*
381 * SandyBridge has new memory control reg at 0x50.w
382 */
383 u16 snb_gmch_ctl;
384 pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl);
385 switch (snb_gmch_ctl & SNB_GMCH_GMS_STOLEN_MASK) {
386 case SNB_GMCH_GMS_STOLEN_32M:
387 stolen_size = MB(32);
388 break;
389 case SNB_GMCH_GMS_STOLEN_64M:
390 stolen_size = MB(64);
391 break;
392 case SNB_GMCH_GMS_STOLEN_96M:
393 stolen_size = MB(96);
394 break;
395 case SNB_GMCH_GMS_STOLEN_128M:
396 stolen_size = MB(128);
397 break;
398 case SNB_GMCH_GMS_STOLEN_160M:
399 stolen_size = MB(160);
400 break;
401 case SNB_GMCH_GMS_STOLEN_192M:
402 stolen_size = MB(192);
403 break;
404 case SNB_GMCH_GMS_STOLEN_224M:
405 stolen_size = MB(224);
406 break;
407 case SNB_GMCH_GMS_STOLEN_256M:
408 stolen_size = MB(256);
409 break;
410 case SNB_GMCH_GMS_STOLEN_288M:
411 stolen_size = MB(288);
412 break;
413 case SNB_GMCH_GMS_STOLEN_320M:
414 stolen_size = MB(320);
415 break;
416 case SNB_GMCH_GMS_STOLEN_352M:
417 stolen_size = MB(352);
418 break;
419 case SNB_GMCH_GMS_STOLEN_384M:
420 stolen_size = MB(384);
421 break;
422 case SNB_GMCH_GMS_STOLEN_416M:
423 stolen_size = MB(416);
424 break;
425 case SNB_GMCH_GMS_STOLEN_448M:
426 stolen_size = MB(448);
427 break;
428 case SNB_GMCH_GMS_STOLEN_480M:
429 stolen_size = MB(480);
430 break;
431 case SNB_GMCH_GMS_STOLEN_512M:
432 stolen_size = MB(512);
433 break;
434 }
370 } else { 435 } else {
371 switch (gmch_ctrl & I855_GMCH_GMS_MASK) { 436 switch (gmch_ctrl & I855_GMCH_GMS_MASK) {
372 case I855_GMCH_GMS_STOLEN_1M: 437 case I855_GMCH_GMS_STOLEN_1M:
@@ -500,9 +565,29 @@ static unsigned int i965_gtt_total_entries(void)
500 565
501static unsigned int intel_gtt_total_entries(void) 566static unsigned int intel_gtt_total_entries(void)
502{ 567{
568 int size;
569
503 if (IS_G33 || INTEL_GTT_GEN == 4 || INTEL_GTT_GEN == 5) 570 if (IS_G33 || INTEL_GTT_GEN == 4 || INTEL_GTT_GEN == 5)
504 return i965_gtt_total_entries(); 571 return i965_gtt_total_entries();
505 else { 572 else if (INTEL_GTT_GEN == 6) {
573 u16 snb_gmch_ctl;
574
575 pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl);
576 switch (snb_gmch_ctl & SNB_GTT_SIZE_MASK) {
577 default:
578 case SNB_GTT_SIZE_0M:
579 printk(KERN_ERR "Bad GTT size mask: 0x%04x.\n", snb_gmch_ctl);
580 size = MB(0);
581 break;
582 case SNB_GTT_SIZE_1M:
583 size = MB(1);
584 break;
585 case SNB_GTT_SIZE_2M:
586 size = MB(2);
587 break;
588 }
589 return size/4;
590 } else {
506 /* On previous hardware, the GTT size was just what was 591 /* On previous hardware, the GTT size was just what was
507 * required to map the aperture. 592 * required to map the aperture.
508 */ 593 */
@@ -546,7 +631,7 @@ static unsigned int intel_gtt_mappable_entries(void)
546static void intel_gtt_teardown_scratch_page(void) 631static void intel_gtt_teardown_scratch_page(void)
547{ 632{
548 set_pages_wb(intel_private.scratch_page, 1); 633 set_pages_wb(intel_private.scratch_page, 1);
549 pci_unmap_page(intel_private.pcidev, intel_private.base.scratch_page_dma, 634 pci_unmap_page(intel_private.pcidev, intel_private.scratch_page_dma,
550 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 635 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
551 put_page(intel_private.scratch_page); 636 put_page(intel_private.scratch_page);
552 __free_page(intel_private.scratch_page); 637 __free_page(intel_private.scratch_page);
@@ -564,7 +649,6 @@ static void intel_gtt_cleanup(void)
564 649
565static int intel_gtt_init(void) 650static int intel_gtt_init(void)
566{ 651{
567 u32 gma_addr;
568 u32 gtt_map_size; 652 u32 gtt_map_size;
569 int ret; 653 int ret;
570 654
@@ -590,19 +674,13 @@ static int intel_gtt_init(void)
590 674
591 gtt_map_size = intel_private.base.gtt_total_entries * 4; 675 gtt_map_size = intel_private.base.gtt_total_entries * 4;
592 676
593 intel_private.gtt = NULL; 677 intel_private.gtt = ioremap(intel_private.gtt_bus_addr,
594 if (INTEL_GTT_GEN < 6 && INTEL_GTT_GEN > 2) 678 gtt_map_size);
595 intel_private.gtt = ioremap_wc(intel_private.gtt_bus_addr, 679 if (!intel_private.gtt) {
596 gtt_map_size);
597 if (intel_private.gtt == NULL)
598 intel_private.gtt = ioremap(intel_private.gtt_bus_addr,
599 gtt_map_size);
600 if (intel_private.gtt == NULL) {
601 intel_private.driver->cleanup(); 680 intel_private.driver->cleanup();
602 iounmap(intel_private.registers); 681 iounmap(intel_private.registers);
603 return -ENOMEM; 682 return -ENOMEM;
604 } 683 }
605 intel_private.base.gtt = intel_private.gtt;
606 684
607 global_cache_flush(); /* FIXME: ? */ 685 global_cache_flush(); /* FIXME: ? */
608 686
@@ -616,15 +694,6 @@ static int intel_gtt_init(void)
616 return ret; 694 return ret;
617 } 695 }
618 696
619 if (INTEL_GTT_GEN <= 2)
620 pci_read_config_dword(intel_private.pcidev, I810_GMADDR,
621 &gma_addr);
622 else
623 pci_read_config_dword(intel_private.pcidev, I915_GMADDR,
624 &gma_addr);
625
626 intel_private.base.gma_bus_addr = (gma_addr & PCI_BASE_ADDRESS_MEM_MASK);
627
628 return 0; 697 return 0;
629} 698}
630 699
@@ -698,10 +767,23 @@ static void i830_write_entry(dma_addr_t addr, unsigned int entry,
698 writel(addr | pte_flags, intel_private.gtt + entry); 767 writel(addr | pte_flags, intel_private.gtt + entry);
699} 768}
700 769
701bool intel_enable_gtt(void) 770static bool intel_enable_gtt(void)
702{ 771{
772 u32 gma_addr;
703 u8 __iomem *reg; 773 u8 __iomem *reg;
704 774
775 if (INTEL_GTT_GEN <= 2)
776 pci_read_config_dword(intel_private.pcidev, I810_GMADDR,
777 &gma_addr);
778 else
779 pci_read_config_dword(intel_private.pcidev, I915_GMADDR,
780 &gma_addr);
781
782 intel_private.gma_bus_addr = (gma_addr & PCI_BASE_ADDRESS_MEM_MASK);
783
784 if (INTEL_GTT_GEN >= 6)
785 return true;
786
705 if (INTEL_GTT_GEN == 2) { 787 if (INTEL_GTT_GEN == 2) {
706 u16 gmch_ctrl; 788 u16 gmch_ctrl;
707 789
@@ -741,7 +823,6 @@ bool intel_enable_gtt(void)
741 823
742 return true; 824 return true;
743} 825}
744EXPORT_SYMBOL(intel_enable_gtt);
745 826
746static int i830_setup(void) 827static int i830_setup(void)
747{ 828{
@@ -779,7 +860,7 @@ static int intel_fake_agp_configure(void)
779 return -EIO; 860 return -EIO;
780 861
781 intel_private.clear_fake_agp = true; 862 intel_private.clear_fake_agp = true;
782 agp_bridge->gart_bus_addr = intel_private.base.gma_bus_addr; 863 agp_bridge->gart_bus_addr = intel_private.gma_bus_addr;
783 864
784 return 0; 865 return 0;
785} 866}
@@ -797,7 +878,8 @@ static bool i830_check_flags(unsigned int flags)
797 return false; 878 return false;
798} 879}
799 880
800void intel_gtt_insert_sg_entries(struct sg_table *st, 881void intel_gtt_insert_sg_entries(struct scatterlist *sg_list,
882 unsigned int sg_len,
801 unsigned int pg_start, 883 unsigned int pg_start,
802 unsigned int flags) 884 unsigned int flags)
803{ 885{
@@ -809,11 +891,12 @@ void intel_gtt_insert_sg_entries(struct sg_table *st,
809 891
810 /* sg may merge pages, but we have to separate 892 /* sg may merge pages, but we have to separate
811 * per-page addr for GTT */ 893 * per-page addr for GTT */
812 for_each_sg(st->sgl, sg, st->nents, i) { 894 for_each_sg(sg_list, sg, sg_len, i) {
813 len = sg_dma_len(sg) >> PAGE_SHIFT; 895 len = sg_dma_len(sg) >> PAGE_SHIFT;
814 for (m = 0; m < len; m++) { 896 for (m = 0; m < len; m++) {
815 dma_addr_t addr = sg_dma_address(sg) + (m << PAGE_SHIFT); 897 dma_addr_t addr = sg_dma_address(sg) + (m << PAGE_SHIFT);
816 intel_private.driver->write_entry(addr, j, flags); 898 intel_private.driver->write_entry(addr,
899 j, flags);
817 j++; 900 j++;
818 } 901 }
819 } 902 }
@@ -821,10 +904,8 @@ void intel_gtt_insert_sg_entries(struct sg_table *st,
821} 904}
822EXPORT_SYMBOL(intel_gtt_insert_sg_entries); 905EXPORT_SYMBOL(intel_gtt_insert_sg_entries);
823 906
824static void intel_gtt_insert_pages(unsigned int first_entry, 907void intel_gtt_insert_pages(unsigned int first_entry, unsigned int num_entries,
825 unsigned int num_entries, 908 struct page **pages, unsigned int flags)
826 struct page **pages,
827 unsigned int flags)
828{ 909{
829 int i, j; 910 int i, j;
830 911
@@ -835,15 +916,13 @@ static void intel_gtt_insert_pages(unsigned int first_entry,
835 } 916 }
836 readl(intel_private.gtt+j-1); 917 readl(intel_private.gtt+j-1);
837} 918}
919EXPORT_SYMBOL(intel_gtt_insert_pages);
838 920
839static int intel_fake_agp_insert_entries(struct agp_memory *mem, 921static int intel_fake_agp_insert_entries(struct agp_memory *mem,
840 off_t pg_start, int type) 922 off_t pg_start, int type)
841{ 923{
842 int ret = -EINVAL; 924 int ret = -EINVAL;
843 925
844 if (intel_private.base.do_idle_maps)
845 return -ENODEV;
846
847 if (intel_private.clear_fake_agp) { 926 if (intel_private.clear_fake_agp) {
848 int start = intel_private.base.stolen_size / PAGE_SIZE; 927 int start = intel_private.base.stolen_size / PAGE_SIZE;
849 int end = intel_private.base.gtt_mappable_entries; 928 int end = intel_private.base.gtt_mappable_entries;
@@ -870,15 +949,13 @@ static int intel_fake_agp_insert_entries(struct agp_memory *mem,
870 global_cache_flush(); 949 global_cache_flush();
871 950
872 if (intel_private.base.needs_dmar) { 951 if (intel_private.base.needs_dmar) {
873 struct sg_table st; 952 ret = intel_gtt_map_memory(mem->pages, mem->page_count,
874 953 &mem->sg_list, &mem->num_sg);
875 ret = intel_gtt_map_memory(mem->pages, mem->page_count, &st);
876 if (ret != 0) 954 if (ret != 0)
877 return ret; 955 return ret;
878 956
879 intel_gtt_insert_sg_entries(&st, pg_start, type); 957 intel_gtt_insert_sg_entries(mem->sg_list, mem->num_sg,
880 mem->sg_list = st.sgl; 958 pg_start, type);
881 mem->num_sg = st.nents;
882 } else 959 } else
883 intel_gtt_insert_pages(pg_start, mem->page_count, mem->pages, 960 intel_gtt_insert_pages(pg_start, mem->page_count, mem->pages,
884 type); 961 type);
@@ -895,7 +972,7 @@ void intel_gtt_clear_range(unsigned int first_entry, unsigned int num_entries)
895 unsigned int i; 972 unsigned int i;
896 973
897 for (i = first_entry; i < (first_entry + num_entries); i++) { 974 for (i = first_entry; i < (first_entry + num_entries); i++) {
898 intel_private.driver->write_entry(intel_private.base.scratch_page_dma, 975 intel_private.driver->write_entry(intel_private.scratch_page_dma,
899 i, 0); 976 i, 0);
900 } 977 }
901 readl(intel_private.gtt+i-1); 978 readl(intel_private.gtt+i-1);
@@ -908,9 +985,6 @@ static int intel_fake_agp_remove_entries(struct agp_memory *mem,
908 if (mem->page_count == 0) 985 if (mem->page_count == 0)
909 return 0; 986 return 0;
910 987
911 if (intel_private.base.do_idle_maps)
912 return -ENODEV;
913
914 intel_gtt_clear_range(pg_start, mem->page_count); 988 intel_gtt_clear_range(pg_start, mem->page_count);
915 989
916 if (intel_private.base.needs_dmar) { 990 if (intel_private.base.needs_dmar) {
@@ -1070,54 +1144,72 @@ static void i965_write_entry(dma_addr_t addr,
1070 writel(addr | pte_flags, intel_private.gtt + entry); 1144 writel(addr | pte_flags, intel_private.gtt + entry);
1071} 1145}
1072 1146
1073/* Certain Gen5 chipsets require require idling the GPU before 1147static bool gen6_check_flags(unsigned int flags)
1074 * unmapping anything from the GTT when VT-d is enabled.
1075 */
1076static inline int needs_idle_maps(void)
1077{ 1148{
1078#ifdef CONFIG_INTEL_IOMMU 1149 return true;
1079 const unsigned short gpu_devid = intel_private.pcidev->device; 1150}
1080 1151
1081 /* Query intel_iommu to see if we need the workaround. Presumably that 1152static void gen6_write_entry(dma_addr_t addr, unsigned int entry,
1082 * was loaded first. 1153 unsigned int flags)
1083 */ 1154{
1084 if ((gpu_devid == PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB || 1155 unsigned int type_mask = flags & ~AGP_USER_CACHED_MEMORY_GFDT;
1085 gpu_devid == PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG) && 1156 unsigned int gfdt = flags & AGP_USER_CACHED_MEMORY_GFDT;
1086 intel_iommu_gfx_mapped) 1157 u32 pte_flags;
1087 return 1; 1158
1088#endif 1159 if (type_mask == AGP_USER_MEMORY)
1089 return 0; 1160 pte_flags = GEN6_PTE_UNCACHED | I810_PTE_VALID;
1161 else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) {
1162 pte_flags = GEN6_PTE_LLC_MLC | I810_PTE_VALID;
1163 if (gfdt)
1164 pte_flags |= GEN6_PTE_GFDT;
1165 } else { /* set 'normal'/'cached' to LLC by default */
1166 pte_flags = GEN6_PTE_LLC | I810_PTE_VALID;
1167 if (gfdt)
1168 pte_flags |= GEN6_PTE_GFDT;
1169 }
1170
1171 /* gen6 has bit11-4 for physical addr bit39-32 */
1172 addr |= (addr >> 28) & 0xff0;
1173 writel(addr | pte_flags, intel_private.gtt + entry);
1174}
1175
1176static void gen6_cleanup(void)
1177{
1090} 1178}
1091 1179
1092static int i9xx_setup(void) 1180static int i9xx_setup(void)
1093{ 1181{
1094 u32 reg_addr, gtt_addr; 1182 u32 reg_addr;
1095 int size = KB(512);
1096 1183
1097 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &reg_addr); 1184 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &reg_addr);
1098 1185
1099 reg_addr &= 0xfff80000; 1186 reg_addr &= 0xfff80000;
1100 1187
1101 intel_private.registers = ioremap(reg_addr, size); 1188 intel_private.registers = ioremap(reg_addr, 128 * 4096);
1102 if (!intel_private.registers) 1189 if (!intel_private.registers)
1103 return -ENOMEM; 1190 return -ENOMEM;
1104 1191
1105 switch (INTEL_GTT_GEN) { 1192 if (INTEL_GTT_GEN == 3) {
1106 case 3: 1193 u32 gtt_addr;
1194
1107 pci_read_config_dword(intel_private.pcidev, 1195 pci_read_config_dword(intel_private.pcidev,
1108 I915_PTEADDR, &gtt_addr); 1196 I915_PTEADDR, &gtt_addr);
1109 intel_private.gtt_bus_addr = gtt_addr; 1197 intel_private.gtt_bus_addr = gtt_addr;
1110 break; 1198 } else {
1111 case 5: 1199 u32 gtt_offset;
1112 intel_private.gtt_bus_addr = reg_addr + MB(2);
1113 break;
1114 default:
1115 intel_private.gtt_bus_addr = reg_addr + KB(512);
1116 break;
1117 }
1118 1200
1119 if (needs_idle_maps()) 1201 switch (INTEL_GTT_GEN) {
1120 intel_private.base.do_idle_maps = 1; 1202 case 5:
1203 case 6:
1204 gtt_offset = MB(2);
1205 break;
1206 case 4:
1207 default:
1208 gtt_offset = KB(512);
1209 break;
1210 }
1211 intel_private.gtt_bus_addr = reg_addr + gtt_offset;
1212 }
1121 1213
1122 intel_i9xx_setup_flush(); 1214 intel_i9xx_setup_flush();
1123 1215
@@ -1225,6 +1317,15 @@ static const struct intel_gtt_driver ironlake_gtt_driver = {
1225 .check_flags = i830_check_flags, 1317 .check_flags = i830_check_flags,
1226 .chipset_flush = i9xx_chipset_flush, 1318 .chipset_flush = i9xx_chipset_flush,
1227}; 1319};
1320static const struct intel_gtt_driver sandybridge_gtt_driver = {
1321 .gen = 6,
1322 .setup = i9xx_setup,
1323 .cleanup = gen6_cleanup,
1324 .write_entry = gen6_write_entry,
1325 .dma_mask_size = 40,
1326 .check_flags = gen6_check_flags,
1327 .chipset_flush = i9xx_chipset_flush,
1328};
1228 1329
1229/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of 1330/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of
1230 * driver and gmch_driver must be non-null, and find_gmch will determine 1331 * driver and gmch_driver must be non-null, and find_gmch will determine
@@ -1305,6 +1406,30 @@ static const struct intel_gtt_driver_description {
1305 "HD Graphics", &ironlake_gtt_driver }, 1406 "HD Graphics", &ironlake_gtt_driver },
1306 { PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 1407 { PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
1307 "HD Graphics", &ironlake_gtt_driver }, 1408 "HD Graphics", &ironlake_gtt_driver },
1409 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT1_IG,
1410 "Sandybridge", &sandybridge_gtt_driver },
1411 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_IG,
1412 "Sandybridge", &sandybridge_gtt_driver },
1413 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_GT2_PLUS_IG,
1414 "Sandybridge", &sandybridge_gtt_driver },
1415 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT1_IG,
1416 "Sandybridge", &sandybridge_gtt_driver },
1417 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_IG,
1418 "Sandybridge", &sandybridge_gtt_driver },
1419 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_GT2_PLUS_IG,
1420 "Sandybridge", &sandybridge_gtt_driver },
1421 { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_S_IG,
1422 "Sandybridge", &sandybridge_gtt_driver },
1423 { PCI_DEVICE_ID_INTEL_IVYBRIDGE_GT1_IG,
1424 "Ivybridge", &sandybridge_gtt_driver },
1425 { PCI_DEVICE_ID_INTEL_IVYBRIDGE_GT2_IG,
1426 "Ivybridge", &sandybridge_gtt_driver },
1427 { PCI_DEVICE_ID_INTEL_IVYBRIDGE_M_GT1_IG,
1428 "Ivybridge", &sandybridge_gtt_driver },
1429 { PCI_DEVICE_ID_INTEL_IVYBRIDGE_M_GT2_IG,
1430 "Ivybridge", &sandybridge_gtt_driver },
1431 { PCI_DEVICE_ID_INTEL_IVYBRIDGE_S_GT1_IG,
1432 "Ivybridge", &sandybridge_gtt_driver },
1308 { 0, NULL, NULL } 1433 { 0, NULL, NULL }
1309}; 1434};
1310 1435
@@ -1325,32 +1450,14 @@ static int find_gmch(u16 device)
1325 return 1; 1450 return 1;
1326} 1451}
1327 1452
1328int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev, 1453int intel_gmch_probe(struct pci_dev *pdev,
1329 struct agp_bridge_data *bridge) 1454 struct agp_bridge_data *bridge)
1330{ 1455{
1331 int i, mask; 1456 int i, mask;
1332 1457 intel_private.driver = NULL;
1333 /*
1334 * Can be called from the fake agp driver but also directly from
1335 * drm/i915.ko. Hence we need to check whether everything is set up
1336 * already.
1337 */
1338 if (intel_private.driver) {
1339 intel_private.refcount++;
1340 return 1;
1341 }
1342 1458
1343 for (i = 0; intel_gtt_chipsets[i].name != NULL; i++) { 1459 for (i = 0; intel_gtt_chipsets[i].name != NULL; i++) {
1344 if (gpu_pdev) { 1460 if (find_gmch(intel_gtt_chipsets[i].gmch_chip_id)) {
1345 if (gpu_pdev->device ==
1346 intel_gtt_chipsets[i].gmch_chip_id) {
1347 intel_private.pcidev = pci_dev_get(gpu_pdev);
1348 intel_private.driver =
1349 intel_gtt_chipsets[i].gtt_driver;
1350
1351 break;
1352 }
1353 } else if (find_gmch(intel_gtt_chipsets[i].gmch_chip_id)) {
1354 intel_private.driver = 1461 intel_private.driver =
1355 intel_gtt_chipsets[i].gtt_driver; 1462 intel_gtt_chipsets[i].gtt_driver;
1356 break; 1463 break;
@@ -1360,17 +1467,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
1360 if (!intel_private.driver) 1467 if (!intel_private.driver)
1361 return 0; 1468 return 0;
1362 1469
1363 intel_private.refcount++; 1470 bridge->driver = &intel_fake_agp_driver;
1471 bridge->dev_private_data = &intel_private;
1472 bridge->dev = pdev;
1364 1473
1365 if (bridge) { 1474 intel_private.bridge_dev = pci_dev_get(pdev);
1366 bridge->driver = &intel_fake_agp_driver;
1367 bridge->dev_private_data = &intel_private;
1368 bridge->dev = bridge_pdev;
1369 }
1370
1371 intel_private.bridge_dev = pci_dev_get(bridge_pdev);
1372 1475
1373 dev_info(&bridge_pdev->dev, "Intel %s Chipset\n", intel_gtt_chipsets[i].name); 1476 dev_info(&pdev->dev, "Intel %s Chipset\n", intel_gtt_chipsets[i].name);
1374 1477
1375 mask = intel_private.driver->dma_mask_size; 1478 mask = intel_private.driver->dma_mask_size;
1376 if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask))) 1479 if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
@@ -1380,17 +1483,17 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
1380 pci_set_consistent_dma_mask(intel_private.pcidev, 1483 pci_set_consistent_dma_mask(intel_private.pcidev,
1381 DMA_BIT_MASK(mask)); 1484 DMA_BIT_MASK(mask));
1382 1485
1383 if (intel_gtt_init() != 0) { 1486 /*if (bridge->driver == &intel_810_driver)
1384 intel_gmch_remove(); 1487 return 1;*/
1385 1488
1489 if (intel_gtt_init() != 0)
1386 return 0; 1490 return 0;
1387 }
1388 1491
1389 return 1; 1492 return 1;
1390} 1493}
1391EXPORT_SYMBOL(intel_gmch_probe); 1494EXPORT_SYMBOL(intel_gmch_probe);
1392 1495
1393struct intel_gtt *intel_gtt_get(void) 1496const struct intel_gtt *intel_gtt_get(void)
1394{ 1497{
1395 return &intel_private.base; 1498 return &intel_private.base;
1396} 1499}
@@ -1403,16 +1506,12 @@ void intel_gtt_chipset_flush(void)
1403} 1506}
1404EXPORT_SYMBOL(intel_gtt_chipset_flush); 1507EXPORT_SYMBOL(intel_gtt_chipset_flush);
1405 1508
1406void intel_gmch_remove(void) 1509void intel_gmch_remove(struct pci_dev *pdev)
1407{ 1510{
1408 if (--intel_private.refcount)
1409 return;
1410
1411 if (intel_private.pcidev) 1511 if (intel_private.pcidev)
1412 pci_dev_put(intel_private.pcidev); 1512 pci_dev_put(intel_private.pcidev);
1413 if (intel_private.bridge_dev) 1513 if (intel_private.bridge_dev)
1414 pci_dev_put(intel_private.bridge_dev); 1514 pci_dev_put(intel_private.bridge_dev);
1415 intel_private.driver = NULL;
1416} 1515}
1417EXPORT_SYMBOL(intel_gmch_remove); 1516EXPORT_SYMBOL(intel_gmch_remove);
1418 1517
diff --git a/drivers/char/agp/nvidia-agp.c b/drivers/char/agp/nvidia-agp.c
index 62be3ec0da4..b9734a97818 100644
--- a/drivers/char/agp/nvidia-agp.c
+++ b/drivers/char/agp/nvidia-agp.c
@@ -332,8 +332,8 @@ static const struct agp_bridge_driver nvidia_driver = {
332 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 332 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
333}; 333};
334 334
335static int agp_nvidia_probe(struct pci_dev *pdev, 335static int __devinit agp_nvidia_probe(struct pci_dev *pdev,
336 const struct pci_device_id *ent) 336 const struct pci_device_id *ent)
337{ 337{
338 struct agp_bridge_data *bridge; 338 struct agp_bridge_data *bridge;
339 u8 cap_ptr; 339 u8 cap_ptr;
@@ -388,7 +388,7 @@ static int agp_nvidia_probe(struct pci_dev *pdev,
388 return agp_add_bridge(bridge); 388 return agp_add_bridge(bridge);
389} 389}
390 390
391static void agp_nvidia_remove(struct pci_dev *pdev) 391static void __devexit agp_nvidia_remove(struct pci_dev *pdev)
392{ 392{
393 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 393 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
394 394
diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c
index 05b8d0241bd..ffa888cd1c8 100644
--- a/drivers/char/agp/sgi-agp.c
+++ b/drivers/char/agp/sgi-agp.c
@@ -158,6 +158,7 @@ static int sgi_tioca_insert_memory(struct agp_memory *mem, off_t pg_start,
158 break; 158 break;
159 case LVL2_APER_SIZE: 159 case LVL2_APER_SIZE:
160 return -EINVAL; 160 return -EINVAL;
161 break;
161 default: 162 default:
162 num_entries = 0; 163 num_entries = 0;
163 break; 164 break;
@@ -270,7 +271,7 @@ const struct agp_bridge_driver sgi_tioca_driver = {
270 .num_aperture_sizes = 1, 271 .num_aperture_sizes = 1,
271}; 272};
272 273
273static int agp_sgi_init(void) 274static int __devinit agp_sgi_init(void)
274{ 275{
275 unsigned int j; 276 unsigned int j;
276 struct tioca_kernel *info; 277 struct tioca_kernel *info;
@@ -289,11 +290,12 @@ static int agp_sgi_init(void)
289 290
290 j = 0; 291 j = 0;
291 list_for_each_entry(info, &tioca_list, ca_list) { 292 list_for_each_entry(info, &tioca_list, ca_list) {
293 struct list_head *tmp;
292 if (list_empty(info->ca_devices)) 294 if (list_empty(info->ca_devices))
293 continue; 295 continue;
294 list_for_each_entry(pdev, info->ca_devices, bus_list) { 296 list_for_each(tmp, info->ca_devices) {
295 u8 cap_ptr; 297 u8 cap_ptr;
296 298 pdev = pci_dev_b(tmp);
297 if (pdev->class != (PCI_CLASS_DISPLAY_VGA << 8)) 299 if (pdev->class != (PCI_CLASS_DISPLAY_VGA << 8))
298 continue; 300 continue;
299 cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 301 cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
@@ -327,7 +329,7 @@ static int agp_sgi_init(void)
327 return 0; 329 return 0;
328} 330}
329 331
330static void agp_sgi_cleanup(void) 332static void __devexit agp_sgi_cleanup(void)
331{ 333{
332 kfree(sgi_tioca_agp_bridges); 334 kfree(sgi_tioca_agp_bridges);
333 sgi_tioca_agp_bridges = NULL; 335 sgi_tioca_agp_bridges = NULL;
diff --git a/drivers/char/agp/sis-agp.c b/drivers/char/agp/sis-agp.c
index 79c838c434b..29aacd81de7 100644
--- a/drivers/char/agp/sis-agp.c
+++ b/drivers/char/agp/sis-agp.c
@@ -17,8 +17,8 @@
17#define PCI_DEVICE_ID_SI_662 0x0662 17#define PCI_DEVICE_ID_SI_662 0x0662
18#define PCI_DEVICE_ID_SI_671 0x0671 18#define PCI_DEVICE_ID_SI_671 0x0671
19 19
20static bool agp_sis_force_delay = 0; 20static int __devinitdata agp_sis_force_delay = 0;
21static int agp_sis_agp_spec = -1; 21static int __devinitdata agp_sis_agp_spec = -1;
22 22
23static int sis_fetch_size(void) 23static int sis_fetch_size(void)
24{ 24{
@@ -148,13 +148,13 @@ static struct agp_bridge_driver sis_driver = {
148}; 148};
149 149
150// chipsets that require the 'delay hack' 150// chipsets that require the 'delay hack'
151static int sis_broken_chipsets[] = { 151static int sis_broken_chipsets[] __devinitdata = {
152 PCI_DEVICE_ID_SI_648, 152 PCI_DEVICE_ID_SI_648,
153 PCI_DEVICE_ID_SI_746, 153 PCI_DEVICE_ID_SI_746,
154 0 // terminator 154 0 // terminator
155}; 155};
156 156
157static void sis_get_driver(struct agp_bridge_data *bridge) 157static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
158{ 158{
159 int i; 159 int i;
160 160
@@ -180,7 +180,8 @@ static void sis_get_driver(struct agp_bridge_data *bridge)
180} 180}
181 181
182 182
183static int agp_sis_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 183static int __devinit agp_sis_probe(struct pci_dev *pdev,
184 const struct pci_device_id *ent)
184{ 185{
185 struct agp_bridge_data *bridge; 186 struct agp_bridge_data *bridge;
186 u8 cap_ptr; 187 u8 cap_ptr;
@@ -210,7 +211,7 @@ static int agp_sis_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
210 return agp_add_bridge(bridge); 211 return agp_add_bridge(bridge);
211} 212}
212 213
213static void agp_sis_remove(struct pci_dev *pdev) 214static void __devexit agp_sis_remove(struct pci_dev *pdev)
214{ 215{
215 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 216 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
216 217
diff --git a/drivers/char/agp/sworks-agp.c b/drivers/char/agp/sworks-agp.c
index 9b163b49d97..f02f9b07fd4 100644
--- a/drivers/char/agp/sworks-agp.c
+++ b/drivers/char/agp/sworks-agp.c
@@ -445,8 +445,8 @@ static const struct agp_bridge_driver sworks_driver = {
445 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 445 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
446}; 446};
447 447
448static int agp_serverworks_probe(struct pci_dev *pdev, 448static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
449 const struct pci_device_id *ent) 449 const struct pci_device_id *ent)
450{ 450{
451 struct agp_bridge_data *bridge; 451 struct agp_bridge_data *bridge;
452 struct pci_dev *bridge_dev; 452 struct pci_dev *bridge_dev;
@@ -518,7 +518,7 @@ static int agp_serverworks_probe(struct pci_dev *pdev,
518 return agp_add_bridge(bridge); 518 return agp_add_bridge(bridge);
519} 519}
520 520
521static void agp_serverworks_remove(struct pci_dev *pdev) 521static void __devexit agp_serverworks_remove(struct pci_dev *pdev)
522{ 522{
523 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 523 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
524 524
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c
index a56ee9bedd1..a32c492baf5 100644
--- a/drivers/char/agp/uninorth-agp.c
+++ b/drivers/char/agp/uninorth-agp.c
@@ -557,7 +557,7 @@ const struct agp_bridge_driver u3_agp_driver = {
557 .needs_scratch_page = true, 557 .needs_scratch_page = true,
558}; 558};
559 559
560static struct agp_device_ids uninorth_agp_device_ids[] = { 560static struct agp_device_ids uninorth_agp_device_ids[] __devinitdata = {
561 { 561 {
562 .device_id = PCI_DEVICE_ID_APPLE_UNI_N_AGP, 562 .device_id = PCI_DEVICE_ID_APPLE_UNI_N_AGP,
563 .chipset_name = "UniNorth", 563 .chipset_name = "UniNorth",
@@ -592,8 +592,8 @@ static struct agp_device_ids uninorth_agp_device_ids[] = {
592 }, 592 },
593}; 593};
594 594
595static int agp_uninorth_probe(struct pci_dev *pdev, 595static int __devinit agp_uninorth_probe(struct pci_dev *pdev,
596 const struct pci_device_id *ent) 596 const struct pci_device_id *ent)
597{ 597{
598 struct agp_device_ids *devs = uninorth_agp_device_ids; 598 struct agp_device_ids *devs = uninorth_agp_device_ids;
599 struct agp_bridge_data *bridge; 599 struct agp_bridge_data *bridge;
@@ -663,7 +663,7 @@ static int agp_uninorth_probe(struct pci_dev *pdev,
663 return agp_add_bridge(bridge); 663 return agp_add_bridge(bridge);
664} 664}
665 665
666static void agp_uninorth_remove(struct pci_dev *pdev) 666static void __devexit agp_uninorth_remove(struct pci_dev *pdev)
667{ 667{
668 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 668 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
669 669
diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c
index 74d3aa3773b..8bc38493740 100644
--- a/drivers/char/agp/via-agp.c
+++ b/drivers/char/agp/via-agp.c
@@ -224,7 +224,7 @@ static const struct agp_bridge_driver via_driver = {
224 .agp_type_to_mask_type = agp_generic_type_to_mask_type, 224 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
225}; 225};
226 226
227static struct agp_device_ids via_agp_device_ids[] = 227static struct agp_device_ids via_agp_device_ids[] __devinitdata =
228{ 228{
229 { 229 {
230 .device_id = PCI_DEVICE_ID_VIA_82C597_0, 230 .device_id = PCI_DEVICE_ID_VIA_82C597_0,
@@ -438,7 +438,8 @@ static void check_via_agp3 (struct agp_bridge_data *bridge)
438} 438}
439 439
440 440
441static int agp_via_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 441static int __devinit agp_via_probe(struct pci_dev *pdev,
442 const struct pci_device_id *ent)
442{ 443{
443 struct agp_device_ids *devs = via_agp_device_ids; 444 struct agp_device_ids *devs = via_agp_device_ids;
444 struct agp_bridge_data *bridge; 445 struct agp_bridge_data *bridge;
@@ -484,7 +485,7 @@ static int agp_via_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
484 return agp_add_bridge(bridge); 485 return agp_add_bridge(bridge);
485} 486}
486 487
487static void agp_via_remove(struct pci_dev *pdev) 488static void __devexit agp_via_remove(struct pci_dev *pdev)
488{ 489{
489 struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 490 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
490 491