diff options
Diffstat (limited to 'drivers/char/agp/intel-agp.c')
-rw-r--r-- | drivers/char/agp/intel-agp.c | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 1540e693d91e..3cb56a049e24 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -46,6 +46,8 @@ | |||
46 | #define PCI_DEVICE_ID_INTEL_Q35_IG 0x29B2 | 46 | #define PCI_DEVICE_ID_INTEL_Q35_IG 0x29B2 |
47 | #define PCI_DEVICE_ID_INTEL_Q33_HB 0x29D0 | 47 | #define PCI_DEVICE_ID_INTEL_Q33_HB 0x29D0 |
48 | #define PCI_DEVICE_ID_INTEL_Q33_IG 0x29D2 | 48 | #define PCI_DEVICE_ID_INTEL_Q33_IG 0x29D2 |
49 | #define PCI_DEVICE_ID_INTEL_B43_HB 0x2E40 | ||
50 | #define PCI_DEVICE_ID_INTEL_B43_IG 0x2E42 | ||
49 | #define PCI_DEVICE_ID_INTEL_GM45_HB 0x2A40 | 51 | #define PCI_DEVICE_ID_INTEL_GM45_HB 0x2A40 |
50 | #define PCI_DEVICE_ID_INTEL_GM45_IG 0x2A42 | 52 | #define PCI_DEVICE_ID_INTEL_GM45_IG 0x2A42 |
51 | #define PCI_DEVICE_ID_INTEL_IGD_E_HB 0x2E00 | 53 | #define PCI_DEVICE_ID_INTEL_IGD_E_HB 0x2E00 |
@@ -60,6 +62,7 @@ | |||
60 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 | 62 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 |
61 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 | 63 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 |
62 | #define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062 | 64 | #define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062 |
65 | #define PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB 0x006a | ||
63 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 | 66 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 |
64 | 67 | ||
65 | /* cover 915 and 945 variants */ | 68 | /* cover 915 and 945 variants */ |
@@ -91,9 +94,11 @@ | |||
91 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \ | 94 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \ |
92 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \ | 95 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \ |
93 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \ | 96 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \ |
97 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \ | ||
94 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ | 98 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ |
95 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \ | 99 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \ |
96 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB) | 100 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB || \ |
101 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB) | ||
97 | 102 | ||
98 | extern int agp_memory_reserved; | 103 | extern int agp_memory_reserved; |
99 | 104 | ||
@@ -804,23 +809,39 @@ static void intel_i830_setup_flush(void) | |||
804 | if (!intel_private.i8xx_page) | 809 | if (!intel_private.i8xx_page) |
805 | return; | 810 | return; |
806 | 811 | ||
807 | /* make page uncached */ | ||
808 | map_page_into_agp(intel_private.i8xx_page); | ||
809 | |||
810 | intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page); | 812 | intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page); |
811 | if (!intel_private.i8xx_flush_page) | 813 | if (!intel_private.i8xx_flush_page) |
812 | intel_i830_fini_flush(); | 814 | intel_i830_fini_flush(); |
813 | } | 815 | } |
814 | 816 | ||
817 | static void | ||
818 | do_wbinvd(void *null) | ||
819 | { | ||
820 | wbinvd(); | ||
821 | } | ||
822 | |||
823 | /* The chipset_flush interface needs to get data that has already been | ||
824 | * flushed out of the CPU all the way out to main memory, because the GPU | ||
825 | * doesn't snoop those buffers. | ||
826 | * | ||
827 | * The 8xx series doesn't have the same lovely interface for flushing the | ||
828 | * chipset write buffers that the later chips do. According to the 865 | ||
829 | * specs, it's 64 octwords, or 1KB. So, to get those previous things in | ||
830 | * that buffer out, we just fill 1KB and clflush it out, on the assumption | ||
831 | * that it'll push whatever was in there out. It appears to work. | ||
832 | */ | ||
815 | static void intel_i830_chipset_flush(struct agp_bridge_data *bridge) | 833 | static void intel_i830_chipset_flush(struct agp_bridge_data *bridge) |
816 | { | 834 | { |
817 | unsigned int *pg = intel_private.i8xx_flush_page; | 835 | unsigned int *pg = intel_private.i8xx_flush_page; |
818 | int i; | ||
819 | 836 | ||
820 | for (i = 0; i < 256; i += 2) | 837 | memset(pg, 0, 1024); |
821 | *(pg + i) = i; | ||
822 | 838 | ||
823 | wmb(); | 839 | if (cpu_has_clflush) { |
840 | clflush_cache_range(pg, 1024); | ||
841 | } else { | ||
842 | if (on_each_cpu(do_wbinvd, NULL, 1) != 0) | ||
843 | printk(KERN_ERR "Timed out waiting for cache flush.\n"); | ||
844 | } | ||
824 | } | 845 | } |
825 | 846 | ||
826 | /* The intel i830 automatically initializes the agp aperture during POST. | 847 | /* The intel i830 automatically initializes the agp aperture during POST. |
@@ -1142,12 +1163,6 @@ static int intel_i915_configure(void) | |||
1142 | 1163 | ||
1143 | intel_i9xx_setup_flush(); | 1164 | intel_i9xx_setup_flush(); |
1144 | 1165 | ||
1145 | #ifdef USE_PCI_DMA_API | ||
1146 | if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36))) | ||
1147 | dev_err(&intel_private.pcidev->dev, | ||
1148 | "set gfx device dma mask 36bit failed!\n"); | ||
1149 | #endif | ||
1150 | |||
1151 | return 0; | 1166 | return 0; |
1152 | } | 1167 | } |
1153 | 1168 | ||
@@ -1341,9 +1356,11 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) | |||
1341 | case PCI_DEVICE_ID_INTEL_Q45_HB: | 1356 | case PCI_DEVICE_ID_INTEL_Q45_HB: |
1342 | case PCI_DEVICE_ID_INTEL_G45_HB: | 1357 | case PCI_DEVICE_ID_INTEL_G45_HB: |
1343 | case PCI_DEVICE_ID_INTEL_G41_HB: | 1358 | case PCI_DEVICE_ID_INTEL_G41_HB: |
1359 | case PCI_DEVICE_ID_INTEL_B43_HB: | ||
1344 | case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: | 1360 | case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: |
1345 | case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: | 1361 | case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: |
1346 | case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB: | 1362 | case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB: |
1363 | case PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB: | ||
1347 | *gtt_offset = *gtt_size = MB(2); | 1364 | *gtt_offset = *gtt_size = MB(2); |
1348 | break; | 1365 | break; |
1349 | default: | 1366 | default: |
@@ -2335,6 +2352,8 @@ static const struct intel_driver_description { | |||
2335 | "Q45/Q43", NULL, &intel_i965_driver }, | 2352 | "Q45/Q43", NULL, &intel_i965_driver }, |
2336 | { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0, | 2353 | { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0, |
2337 | "G45/G43", NULL, &intel_i965_driver }, | 2354 | "G45/G43", NULL, &intel_i965_driver }, |
2355 | { PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG, 0, | ||
2356 | "B43", NULL, &intel_i965_driver }, | ||
2338 | { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0, | 2357 | { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0, |
2339 | "G41", NULL, &intel_i965_driver }, | 2358 | "G41", NULL, &intel_i965_driver }, |
2340 | { PCI_DEVICE_ID_INTEL_IGDNG_D_HB, PCI_DEVICE_ID_INTEL_IGDNG_D_IG, 0, | 2359 | { PCI_DEVICE_ID_INTEL_IGDNG_D_HB, PCI_DEVICE_ID_INTEL_IGDNG_D_IG, 0, |
@@ -2343,6 +2362,8 @@ static const struct intel_driver_description { | |||
2343 | "IGDNG/M", NULL, &intel_i965_driver }, | 2362 | "IGDNG/M", NULL, &intel_i965_driver }, |
2344 | { PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, | 2363 | { PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, |
2345 | "IGDNG/MA", NULL, &intel_i965_driver }, | 2364 | "IGDNG/MA", NULL, &intel_i965_driver }, |
2365 | { PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, | ||
2366 | "IGDNG/MC2", NULL, &intel_i965_driver }, | ||
2346 | { 0, 0, 0, NULL, NULL, NULL } | 2367 | { 0, 0, 0, NULL, NULL, NULL } |
2347 | }; | 2368 | }; |
2348 | 2369 | ||
@@ -2434,6 +2455,11 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
2434 | &bridge->mode); | 2455 | &bridge->mode); |
2435 | } | 2456 | } |
2436 | 2457 | ||
2458 | if (bridge->driver->mask_memory == intel_i965_mask_memory) | ||
2459 | if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36))) | ||
2460 | dev_err(&intel_private.pcidev->dev, | ||
2461 | "set gfx device dma mask 36bit failed!\n"); | ||
2462 | |||
2437 | pci_set_drvdata(pdev, bridge); | 2463 | pci_set_drvdata(pdev, bridge); |
2438 | return agp_add_bridge(bridge); | 2464 | return agp_add_bridge(bridge); |
2439 | } | 2465 | } |
@@ -2535,9 +2561,11 @@ static struct pci_device_id agp_intel_pci_table[] = { | |||
2535 | ID(PCI_DEVICE_ID_INTEL_Q45_HB), | 2561 | ID(PCI_DEVICE_ID_INTEL_Q45_HB), |
2536 | ID(PCI_DEVICE_ID_INTEL_G45_HB), | 2562 | ID(PCI_DEVICE_ID_INTEL_G45_HB), |
2537 | ID(PCI_DEVICE_ID_INTEL_G41_HB), | 2563 | ID(PCI_DEVICE_ID_INTEL_G41_HB), |
2564 | ID(PCI_DEVICE_ID_INTEL_B43_HB), | ||
2538 | ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), | 2565 | ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), |
2539 | ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), | 2566 | ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), |
2540 | ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB), | 2567 | ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB), |
2568 | ID(PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB), | ||
2541 | { } | 2569 | { } |
2542 | }; | 2570 | }; |
2543 | 2571 | ||