diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/char/agp | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/char/agp')
-rw-r--r-- | drivers/char/agp/ali-agp.c | 7 | ||||
-rw-r--r-- | drivers/char/agp/amd-k7-agp.c | 8 | ||||
-rw-r--r-- | drivers/char/agp/amd64-agp.c | 19 | ||||
-rw-r--r-- | drivers/char/agp/ati-agp.c | 7 | ||||
-rw-r--r-- | drivers/char/agp/backend.c | 15 | ||||
-rw-r--r-- | drivers/char/agp/efficeon-agp.c | 6 | ||||
-rw-r--r-- | drivers/char/agp/generic.c | 12 | ||||
-rw-r--r-- | drivers/char/agp/hp-agp.c | 6 | ||||
-rw-r--r-- | drivers/char/agp/i460-agp.c | 8 | ||||
-rw-r--r-- | drivers/char/agp/intel-agp.c | 21 | ||||
-rw-r--r-- | drivers/char/agp/intel-agp.h | 52 | ||||
-rw-r--r-- | drivers/char/agp/intel-gtt.c | 351 | ||||
-rw-r--r-- | drivers/char/agp/nvidia-agp.c | 6 | ||||
-rw-r--r-- | drivers/char/agp/sgi-agp.c | 10 | ||||
-rw-r--r-- | drivers/char/agp/sis-agp.c | 13 | ||||
-rw-r--r-- | drivers/char/agp/sworks-agp.c | 6 | ||||
-rw-r--r-- | drivers/char/agp/uninorth-agp.c | 8 | ||||
-rw-r--r-- | drivers/char/agp/via-agp.c | 7 |
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 | ||
252 | static struct agp_device_ids ali_agp_device_ids[] = | 252 | static 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 | ||
302 | static int agp_ali_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 302 | static 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 | ||
376 | static void agp_ali_remove(struct pci_dev *pdev) | 377 | static 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 | ||
391 | static struct agp_device_ids amd_agp_device_ids[] = | 391 | static 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 | ||
408 | static int agp_amdk7_probe(struct pci_dev *pdev, | 408 | static 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 | ||
483 | static void agp_amdk7_remove(struct pci_dev *pdev) | 483 | static 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 | ||
35 | static struct resource *aperture_resource; | 35 | static struct resource *aperture_resource; |
36 | static bool __initdata agp_try_unsupported = 1; | 36 | static int __initdata agp_try_unsupported = 1; |
37 | static int agp_bridges_found; | 37 | static int agp_bridges_found; |
38 | 38 | ||
39 | static void amd64_tlbflush(struct agp_memory *temp) | 39 | static 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. */ |
243 | static int agp_aperture_valid(u64 aper, u32 size) | 243 | static 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 | */ |
270 | static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap) | 270 | static __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 | ||
328 | static int cache_nbs(struct pci_dev *pdev, u32 cap_ptr) | 329 | static __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 */ |
354 | static void amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge) | 355 | static 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 | }; |
392 | static int uli_agp_init(struct pci_dev *pdev) | 393 | static 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 | ||
515 | static int agp_amd64_probe(struct pci_dev *pdev, | 516 | static 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 | ||
581 | static void agp_amd64_remove(struct pci_dev *pdev) | 582 | static 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 | ||
448 | static struct agp_device_ids ati_agp_device_ids[] = | 448 | static 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 | ||
493 | static int agp_ati_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 493 | static 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 | ||
535 | static void agp_ati_remove(struct pci_dev *pdev) | 536 | static 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 | ||
195 | err_out: | 196 | err_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 | ||
346 | static int agp_efficeon_probe(struct pci_dev *pdev, | 346 | static 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 | ||
410 | static void agp_efficeon_remove(struct pci_dev *pdev) | 410 | static 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 | ||
590 | static int agp_intel_i460_probe(struct pci_dev *pdev, | 590 | static 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 | ||
614 | static void agp_intel_i460_remove(struct pci_dev *pdev) | 614 | static 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 | ||
643 | static int __init agp_intel_i460_init(void) | 643 | static 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 | ||
17 | int intel_agp_enabled; | 16 | int intel_agp_enabled; |
18 | EXPORT_SYMBOL(intel_agp_enabled); | 17 | EXPORT_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 | ||
735 | static int agp_intel_probe(struct pci_dev *pdev, | 734 | static 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 | ||
822 | static void agp_intel_remove(struct pci_dev *pdev) | 821 | static 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 | |||
238 | int intel_gmch_probe(struct pci_dev *pdev, | ||
239 | struct agp_bridge_data *bridge); | ||
240 | void 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 | ||
87 | static int intel_gtt_map_memory(struct page **pages, | 88 | int 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 | ||
108 | err: | 115 | err: |
109 | sg_free_table(st); | 116 | sg_free_table(&st); |
110 | return -ENOMEM; | 117 | return -ENOMEM; |
111 | } | 118 | } |
119 | EXPORT_SYMBOL(intel_gtt_map_memory); | ||
112 | 120 | ||
113 | static void intel_gtt_unmap_memory(struct scatterlist *sg_list, int num_sg) | 121 | void 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 | } |
134 | EXPORT_SYMBOL(intel_gtt_unmap_memory); | ||
126 | 135 | ||
127 | static void intel_fake_agp_enable(struct agp_bridge_data *bridge, u32 mode) | 136 | static 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 | ||
501 | static unsigned int intel_gtt_total_entries(void) | 566 | static 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) | |||
546 | static void intel_gtt_teardown_scratch_page(void) | 631 | static 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 | ||
565 | static int intel_gtt_init(void) | 650 | static 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 | ||
701 | bool intel_enable_gtt(void) | 770 | static 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 | } |
744 | EXPORT_SYMBOL(intel_enable_gtt); | ||
745 | 826 | ||
746 | static int i830_setup(void) | 827 | static 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 | ||
800 | void intel_gtt_insert_sg_entries(struct sg_table *st, | 881 | void 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 | } |
822 | EXPORT_SYMBOL(intel_gtt_insert_sg_entries); | 905 | EXPORT_SYMBOL(intel_gtt_insert_sg_entries); |
823 | 906 | ||
824 | static void intel_gtt_insert_pages(unsigned int first_entry, | 907 | void 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 | } |
919 | EXPORT_SYMBOL(intel_gtt_insert_pages); | ||
838 | 920 | ||
839 | static int intel_fake_agp_insert_entries(struct agp_memory *mem, | 921 | static 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 | 1147 | static bool gen6_check_flags(unsigned int flags) |
1074 | * unmapping anything from the GTT when VT-d is enabled. | ||
1075 | */ | ||
1076 | static 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 | 1152 | static 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 | |||
1176 | static void gen6_cleanup(void) | ||
1177 | { | ||
1090 | } | 1178 | } |
1091 | 1179 | ||
1092 | static int i9xx_setup(void) | 1180 | static 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, ®_addr); | 1184 | pci_read_config_dword(intel_private.pcidev, I915_MMADDR, ®_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, >t_addr); | 1196 | I915_PTEADDR, >t_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 | }; |
1320 | static 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 | ||
1328 | int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev, | 1453 | int 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 | } |
1391 | EXPORT_SYMBOL(intel_gmch_probe); | 1494 | EXPORT_SYMBOL(intel_gmch_probe); |
1392 | 1495 | ||
1393 | struct intel_gtt *intel_gtt_get(void) | 1496 | const 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 | } |
1404 | EXPORT_SYMBOL(intel_gtt_chipset_flush); | 1507 | EXPORT_SYMBOL(intel_gtt_chipset_flush); |
1405 | 1508 | ||
1406 | void intel_gmch_remove(void) | 1509 | void 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 | } |
1417 | EXPORT_SYMBOL(intel_gmch_remove); | 1516 | EXPORT_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 | ||
335 | static int agp_nvidia_probe(struct pci_dev *pdev, | 335 | static 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 | ||
391 | static void agp_nvidia_remove(struct pci_dev *pdev) | 391 | static 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 | ||
273 | static int agp_sgi_init(void) | 274 | static 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 | ||
330 | static void agp_sgi_cleanup(void) | 332 | static 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 | ||
20 | static bool agp_sis_force_delay = 0; | 20 | static int __devinitdata agp_sis_force_delay = 0; |
21 | static int agp_sis_agp_spec = -1; | 21 | static int __devinitdata agp_sis_agp_spec = -1; |
22 | 22 | ||
23 | static int sis_fetch_size(void) | 23 | static 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' |
151 | static int sis_broken_chipsets[] = { | 151 | static 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 | ||
157 | static void sis_get_driver(struct agp_bridge_data *bridge) | 157 | static 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 | ||
183 | static int agp_sis_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 183 | static 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 | ||
213 | static void agp_sis_remove(struct pci_dev *pdev) | 214 | static 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 | ||
448 | static int agp_serverworks_probe(struct pci_dev *pdev, | 448 | static 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 | ||
521 | static void agp_serverworks_remove(struct pci_dev *pdev) | 521 | static 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 | ||
560 | static struct agp_device_ids uninorth_agp_device_ids[] = { | 560 | static 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 | ||
595 | static int agp_uninorth_probe(struct pci_dev *pdev, | 595 | static 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 | ||
666 | static void agp_uninorth_remove(struct pci_dev *pdev) | 666 | static 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 | ||
227 | static struct agp_device_ids via_agp_device_ids[] = | 227 | static 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 | ||
441 | static int agp_via_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 441 | static 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 | ||
487 | static void agp_via_remove(struct pci_dev *pdev) | 488 | static 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 | ||