diff options
Diffstat (limited to 'drivers/char/agp/intel-agp.c')
-rw-r--r-- | drivers/char/agp/intel-agp.c | 123 |
1 files changed, 113 insertions, 10 deletions
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 8a713f1e9653..919a28558d36 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -11,6 +11,9 @@ | |||
11 | #include <asm/smp.h> | 11 | #include <asm/smp.h> |
12 | #include "agp.h" | 12 | #include "agp.h" |
13 | 13 | ||
14 | int intel_agp_enabled; | ||
15 | EXPORT_SYMBOL(intel_agp_enabled); | ||
16 | |||
14 | /* | 17 | /* |
15 | * If we have Intel graphics, we're not going to have anything other than | 18 | * If we have Intel graphics, we're not going to have anything other than |
16 | * an Intel IOMMU. So make the correct use of the PCI DMA API contingent | 19 | * an Intel IOMMU. So make the correct use of the PCI DMA API contingent |
@@ -65,6 +68,10 @@ | |||
65 | #define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062 | 68 | #define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062 |
66 | #define PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB 0x006a | 69 | #define PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB 0x006a |
67 | #define PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG 0x0046 | 70 | #define PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG 0x0046 |
71 | #define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB 0x0100 | ||
72 | #define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_IG 0x0102 | ||
73 | #define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB 0x0104 | ||
74 | #define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_IG 0x0106 | ||
68 | 75 | ||
69 | /* cover 915 and 945 variants */ | 76 | /* cover 915 and 945 variants */ |
70 | #define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \ | 77 | #define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \ |
@@ -99,7 +106,9 @@ | |||
99 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB || \ | 106 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB || \ |
100 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB || \ | 107 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB || \ |
101 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB || \ | 108 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB || \ |
102 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB) | 109 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB || \ |
110 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || \ | ||
111 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) | ||
103 | 112 | ||
104 | extern int agp_memory_reserved; | 113 | extern int agp_memory_reserved; |
105 | 114 | ||
@@ -148,6 +157,25 @@ extern int agp_memory_reserved; | |||
148 | #define INTEL_I7505_AGPCTRL 0x70 | 157 | #define INTEL_I7505_AGPCTRL 0x70 |
149 | #define INTEL_I7505_MCHCFG 0x50 | 158 | #define INTEL_I7505_MCHCFG 0x50 |
150 | 159 | ||
160 | #define SNB_GMCH_CTRL 0x50 | ||
161 | #define SNB_GMCH_GMS_STOLEN_MASK 0xF8 | ||
162 | #define SNB_GMCH_GMS_STOLEN_32M (1 << 3) | ||
163 | #define SNB_GMCH_GMS_STOLEN_64M (2 << 3) | ||
164 | #define SNB_GMCH_GMS_STOLEN_96M (3 << 3) | ||
165 | #define SNB_GMCH_GMS_STOLEN_128M (4 << 3) | ||
166 | #define SNB_GMCH_GMS_STOLEN_160M (5 << 3) | ||
167 | #define SNB_GMCH_GMS_STOLEN_192M (6 << 3) | ||
168 | #define SNB_GMCH_GMS_STOLEN_224M (7 << 3) | ||
169 | #define SNB_GMCH_GMS_STOLEN_256M (8 << 3) | ||
170 | #define SNB_GMCH_GMS_STOLEN_288M (9 << 3) | ||
171 | #define SNB_GMCH_GMS_STOLEN_320M (0xa << 3) | ||
172 | #define SNB_GMCH_GMS_STOLEN_352M (0xb << 3) | ||
173 | #define SNB_GMCH_GMS_STOLEN_384M (0xc << 3) | ||
174 | #define SNB_GMCH_GMS_STOLEN_416M (0xd << 3) | ||
175 | #define SNB_GMCH_GMS_STOLEN_448M (0xe << 3) | ||
176 | #define SNB_GMCH_GMS_STOLEN_480M (0xf << 3) | ||
177 | #define SNB_GMCH_GMS_STOLEN_512M (0x10 << 3) | ||
178 | |||
151 | static const struct aper_size_info_fixed intel_i810_sizes[] = | 179 | static const struct aper_size_info_fixed intel_i810_sizes[] = |
152 | { | 180 | { |
153 | {64, 16384, 4}, | 181 | {64, 16384, 4}, |
@@ -294,6 +322,13 @@ static void intel_agp_insert_sg_entries(struct agp_memory *mem, | |||
294 | off_t pg_start, int mask_type) | 322 | off_t pg_start, int mask_type) |
295 | { | 323 | { |
296 | int i, j; | 324 | int i, j; |
325 | u32 cache_bits = 0; | ||
326 | |||
327 | if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || | ||
328 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) | ||
329 | { | ||
330 | cache_bits = I830_PTE_SYSTEM_CACHED; | ||
331 | } | ||
297 | 332 | ||
298 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 333 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
299 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 334 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
@@ -614,7 +649,7 @@ static struct aper_size_info_fixed intel_i830_sizes[] = | |||
614 | static void intel_i830_init_gtt_entries(void) | 649 | static void intel_i830_init_gtt_entries(void) |
615 | { | 650 | { |
616 | u16 gmch_ctrl; | 651 | u16 gmch_ctrl; |
617 | int gtt_entries; | 652 | int gtt_entries = 0; |
618 | u8 rdct; | 653 | u8 rdct; |
619 | int local = 0; | 654 | int local = 0; |
620 | static const int ddt[4] = { 0, 16, 32, 64 }; | 655 | static const int ddt[4] = { 0, 16, 32, 64 }; |
@@ -706,6 +741,63 @@ static void intel_i830_init_gtt_entries(void) | |||
706 | gtt_entries = 0; | 741 | gtt_entries = 0; |
707 | break; | 742 | break; |
708 | } | 743 | } |
744 | } else if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || | ||
745 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) { | ||
746 | /* | ||
747 | * SandyBridge has new memory control reg at 0x50.w | ||
748 | */ | ||
749 | u16 snb_gmch_ctl; | ||
750 | pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl); | ||
751 | switch (snb_gmch_ctl & SNB_GMCH_GMS_STOLEN_MASK) { | ||
752 | case SNB_GMCH_GMS_STOLEN_32M: | ||
753 | gtt_entries = MB(32) - KB(size); | ||
754 | break; | ||
755 | case SNB_GMCH_GMS_STOLEN_64M: | ||
756 | gtt_entries = MB(64) - KB(size); | ||
757 | break; | ||
758 | case SNB_GMCH_GMS_STOLEN_96M: | ||
759 | gtt_entries = MB(96) - KB(size); | ||
760 | break; | ||
761 | case SNB_GMCH_GMS_STOLEN_128M: | ||
762 | gtt_entries = MB(128) - KB(size); | ||
763 | break; | ||
764 | case SNB_GMCH_GMS_STOLEN_160M: | ||
765 | gtt_entries = MB(160) - KB(size); | ||
766 | break; | ||
767 | case SNB_GMCH_GMS_STOLEN_192M: | ||
768 | gtt_entries = MB(192) - KB(size); | ||
769 | break; | ||
770 | case SNB_GMCH_GMS_STOLEN_224M: | ||
771 | gtt_entries = MB(224) - KB(size); | ||
772 | break; | ||
773 | case SNB_GMCH_GMS_STOLEN_256M: | ||
774 | gtt_entries = MB(256) - KB(size); | ||
775 | break; | ||
776 | case SNB_GMCH_GMS_STOLEN_288M: | ||
777 | gtt_entries = MB(288) - KB(size); | ||
778 | break; | ||
779 | case SNB_GMCH_GMS_STOLEN_320M: | ||
780 | gtt_entries = MB(320) - KB(size); | ||
781 | break; | ||
782 | case SNB_GMCH_GMS_STOLEN_352M: | ||
783 | gtt_entries = MB(352) - KB(size); | ||
784 | break; | ||
785 | case SNB_GMCH_GMS_STOLEN_384M: | ||
786 | gtt_entries = MB(384) - KB(size); | ||
787 | break; | ||
788 | case SNB_GMCH_GMS_STOLEN_416M: | ||
789 | gtt_entries = MB(416) - KB(size); | ||
790 | break; | ||
791 | case SNB_GMCH_GMS_STOLEN_448M: | ||
792 | gtt_entries = MB(448) - KB(size); | ||
793 | break; | ||
794 | case SNB_GMCH_GMS_STOLEN_480M: | ||
795 | gtt_entries = MB(480) - KB(size); | ||
796 | break; | ||
797 | case SNB_GMCH_GMS_STOLEN_512M: | ||
798 | gtt_entries = MB(512) - KB(size); | ||
799 | break; | ||
800 | } | ||
709 | } else { | 801 | } else { |
710 | switch (gmch_ctrl & I855_GMCH_GMS_MASK) { | 802 | switch (gmch_ctrl & I855_GMCH_GMS_MASK) { |
711 | case I855_GMCH_GMS_STOLEN_1M: | 803 | case I855_GMCH_GMS_STOLEN_1M: |
@@ -1357,6 +1449,8 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) | |||
1357 | case PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB: | 1449 | case PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB: |
1358 | case PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB: | 1450 | case PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB: |
1359 | case PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB: | 1451 | case PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB: |
1452 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB: | ||
1453 | case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB: | ||
1360 | *gtt_offset = *gtt_size = MB(2); | 1454 | *gtt_offset = *gtt_size = MB(2); |
1361 | break; | 1455 | break; |
1362 | default: | 1456 | default: |
@@ -2338,9 +2432,9 @@ static const struct intel_driver_description { | |||
2338 | NULL, &intel_g33_driver }, | 2432 | NULL, &intel_g33_driver }, |
2339 | { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33", | 2433 | { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33", |
2340 | NULL, &intel_g33_driver }, | 2434 | NULL, &intel_g33_driver }, |
2341 | { PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB, PCI_DEVICE_ID_INTEL_PINEVIEW_M_IG, 0, "Pineview", | 2435 | { PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB, PCI_DEVICE_ID_INTEL_PINEVIEW_M_IG, 0, "GMA3150", |
2342 | NULL, &intel_g33_driver }, | 2436 | NULL, &intel_g33_driver }, |
2343 | { PCI_DEVICE_ID_INTEL_PINEVIEW_HB, PCI_DEVICE_ID_INTEL_PINEVIEW_IG, 0, "Pineview", | 2437 | { PCI_DEVICE_ID_INTEL_PINEVIEW_HB, PCI_DEVICE_ID_INTEL_PINEVIEW_IG, 0, "GMA3150", |
2344 | NULL, &intel_g33_driver }, | 2438 | NULL, &intel_g33_driver }, |
2345 | { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG, 0, | 2439 | { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG, 0, |
2346 | "GM45", NULL, &intel_i965_driver }, | 2440 | "GM45", NULL, &intel_i965_driver }, |
@@ -2355,13 +2449,17 @@ static const struct intel_driver_description { | |||
2355 | { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0, | 2449 | { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0, |
2356 | "G41", NULL, &intel_i965_driver }, | 2450 | "G41", NULL, &intel_i965_driver }, |
2357 | { PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG, 0, | 2451 | { PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG, 0, |
2358 | "Ironlake/D", NULL, &intel_i965_driver }, | 2452 | "HD Graphics", NULL, &intel_i965_driver }, |
2359 | { PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 0, | 2453 | { PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 0, |
2360 | "Ironlake/M", NULL, &intel_i965_driver }, | 2454 | "HD Graphics", NULL, &intel_i965_driver }, |
2361 | { PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 0, | 2455 | { PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 0, |
2362 | "Ironlake/MA", NULL, &intel_i965_driver }, | 2456 | "HD Graphics", NULL, &intel_i965_driver }, |
2363 | { PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 0, | 2457 | { PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB, PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG, 0, |
2364 | "Ironlake/MC2", NULL, &intel_i965_driver }, | 2458 | "HD Graphics", NULL, &intel_i965_driver }, |
2459 | { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_IG, 0, | ||
2460 | "Sandybridge", NULL, &intel_i965_driver }, | ||
2461 | { PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB, PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_IG, 0, | ||
2462 | "Sandybridge", NULL, &intel_i965_driver }, | ||
2365 | { 0, 0, 0, NULL, NULL, NULL } | 2463 | { 0, 0, 0, NULL, NULL, NULL } |
2366 | }; | 2464 | }; |
2367 | 2465 | ||
@@ -2371,7 +2469,7 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
2371 | struct agp_bridge_data *bridge; | 2469 | struct agp_bridge_data *bridge; |
2372 | u8 cap_ptr = 0; | 2470 | u8 cap_ptr = 0; |
2373 | struct resource *r; | 2471 | struct resource *r; |
2374 | int i; | 2472 | int i, err; |
2375 | 2473 | ||
2376 | cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); | 2474 | cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); |
2377 | 2475 | ||
@@ -2463,7 +2561,10 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
2463 | } | 2561 | } |
2464 | 2562 | ||
2465 | pci_set_drvdata(pdev, bridge); | 2563 | pci_set_drvdata(pdev, bridge); |
2466 | return agp_add_bridge(bridge); | 2564 | err = agp_add_bridge(bridge); |
2565 | if (!err) | ||
2566 | intel_agp_enabled = 1; | ||
2567 | return err; | ||
2467 | } | 2568 | } |
2468 | 2569 | ||
2469 | static void __devexit agp_intel_remove(struct pci_dev *pdev) | 2570 | static void __devexit agp_intel_remove(struct pci_dev *pdev) |
@@ -2568,6 +2669,8 @@ static struct pci_device_id agp_intel_pci_table[] = { | |||
2568 | ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB), | 2669 | ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB), |
2569 | ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB), | 2670 | ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB), |
2570 | ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB), | 2671 | ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB), |
2672 | ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB), | ||
2673 | ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB), | ||
2571 | { } | 2674 | { } |
2572 | }; | 2675 | }; |
2573 | 2676 | ||