Commit 6585b572402e5ec7936422123b44b65fef7a5ea6

Authored by Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart

* master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart:
  [AGPGART] Rework AGPv3 modesetting fallback.
  [AGPGART] Add suspend callback for i965
  [AGPGART] Fix number of aperture sizes in 830 gart structs.
  [AGPGART] Intel 965 Express support.
  [AGPGART] agp.h: constify struct agp_bridge_data::version
  [AGPGART] const'ify VIA AGP PCI table.
  [AGPGART] CONFIG_PM=n slim: drivers/char/agp/intel-agp.c
  [AGPGART] CONFIG_PM=n slim: drivers/char/agp/efficeon-agp.c
  [AGPGART] Const'ify the agpgart driver version.
  [AGPGART] remove private page protection map

Showing 9 changed files Side-by-side Diff

drivers/char/agp/agp.h
... ... @@ -117,7 +117,7 @@
117 117 };
118 118  
119 119 struct agp_bridge_data {
120   - struct agp_version *version;
  120 + const struct agp_version *version;
121 121 struct agp_bridge_driver *driver;
122 122 struct vm_operations_struct *vm_ops;
123 123 void *previous_size;
drivers/char/agp/backend.c
... ... @@ -44,7 +44,7 @@
44 44 * past 0.99 at all due to some boolean logic error. */
45 45 #define AGPGART_VERSION_MAJOR 0
46 46 #define AGPGART_VERSION_MINOR 101
47   -static struct agp_version agp_current_version =
  47 +static const struct agp_version agp_current_version =
48 48 {
49 49 .major = AGPGART_VERSION_MAJOR,
50 50 .minor = AGPGART_VERSION_MINOR,
drivers/char/agp/efficeon-agp.c
... ... @@ -337,13 +337,6 @@
337 337 .agp_destroy_page = agp_generic_destroy_page,
338 338 };
339 339  
340   -
341   -static int agp_efficeon_resume(struct pci_dev *pdev)
342   -{
343   - printk(KERN_DEBUG PFX "agp_efficeon_resume()\n");
344   - return efficeon_configure();
345   -}
346   -
347 340 static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
348 341 const struct pci_device_id *ent)
349 342 {
350 343  
... ... @@ -414,11 +407,18 @@
414 407 agp_put_bridge(bridge);
415 408 }
416 409  
  410 +#ifdef CONFIG_PM
417 411 static int agp_efficeon_suspend(struct pci_dev *dev, pm_message_t state)
418 412 {
419 413 return 0;
420 414 }
421 415  
  416 +static int agp_efficeon_resume(struct pci_dev *pdev)
  417 +{
  418 + printk(KERN_DEBUG PFX "agp_efficeon_resume()\n");
  419 + return efficeon_configure();
  420 +}
  421 +#endif
422 422  
423 423 static struct pci_device_id agp_efficeon_pci_table[] = {
424 424 {
425 425  
... ... @@ -439,8 +439,10 @@
439 439 .id_table = agp_efficeon_pci_table,
440 440 .probe = agp_efficeon_probe,
441 441 .remove = agp_efficeon_remove,
  442 +#ifdef CONFIG_PM
442 443 .suspend = agp_efficeon_suspend,
443 444 .resume = agp_efficeon_resume,
  445 +#endif
444 446 };
445 447  
446 448 static int __init agp_efficeon_init(void)
drivers/char/agp/frontend.c
... ... @@ -151,35 +151,12 @@
151 151 client->segments = seg;
152 152 }
153 153  
154   -/* Originally taken from linux/mm/mmap.c from the array
155   - * protection_map.
156   - * The original really should be exported to modules, or
157   - * some routine which does the conversion for you
158   - */
159   -
160   -static const pgprot_t my_protect_map[16] =
161   -{
162   - __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
163   - __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
164   -};
165   -
166 154 static pgprot_t agp_convert_mmap_flags(int prot)
167 155 {
168   -#define _trans(x,bit1,bit2) \
169   -((bit1==bit2)?(x&bit1):(x&bit1)?bit2:0)
170   -
171 156 unsigned long prot_bits;
172   - pgprot_t temp;
173 157  
174   - prot_bits = _trans(prot, PROT_READ, VM_READ) |
175   - _trans(prot, PROT_WRITE, VM_WRITE) |
176   - _trans(prot, PROT_EXEC, VM_EXEC);
177   -
178   - prot_bits |= VM_SHARED;
179   -
180   - temp = my_protect_map[prot_bits & 0x0000000f];
181   -
182   - return temp;
  158 + prot_bits = calc_vm_prot_bits(prot) | VM_SHARED;
  159 + return vm_get_page_prot(prot_bits);
183 160 }
184 161  
185 162 static int agp_create_segment(struct agp_client *client, struct agp_region *region)
drivers/char/agp/generic.c
... ... @@ -568,25 +568,34 @@
568 568 *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
569 569 goto done;
570 570  
  571 + } else if (*requested_mode & AGPSTAT3_4X) {
  572 + *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
  573 + *bridge_agpstat |= AGPSTAT3_4X;
  574 + goto done;
  575 +
571 576 } else {
572 577  
573 578 /*
574   - * If we didn't specify AGPx8, we can only do x4.
575   - * If the hardware can't do x4, we're up shit creek, and never
576   - * should have got this far.
  579 + * If we didn't specify an AGP mode, we see if both
  580 + * the graphics card, and the bridge can do x8, and use if so.
  581 + * If not, we fall back to x4 mode.
577 582 */
578   - *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
579   - if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X))
580   - *bridge_agpstat |= AGPSTAT3_4X;
581   - else {
582   - printk(KERN_INFO PFX "Badness. Don't know which AGP mode to set. "
583   - "[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n",
584   - origbridge, origvga, *bridge_agpstat, *vga_agpstat);
585   - if (!(*bridge_agpstat & AGPSTAT3_4X))
586   - printk(KERN_INFO PFX "Bridge couldn't do AGP x4.\n");
587   - if (!(*vga_agpstat & AGPSTAT3_4X))
588   - printk(KERN_INFO PFX "Graphic card couldn't do AGP x4.\n");
589   - return;
  583 + if ((*bridge_agpstat & AGPSTAT3_8X) && (*vga_agpstat & AGPSTAT3_8X)) {
  584 + printk(KERN_INFO PFX "No AGP mode specified. Setting to highest mode supported by bridge & card (x8).\n");
  585 + *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
  586 + *vga_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
  587 + } else {
  588 + printk(KERN_INFO PFX "Fell back to AGPx4 mode because");
  589 + if (!(*bridge_agpstat & AGPSTAT3_8X)) {
  590 + printk("bridge couldn't do x8. bridge_agpstat:%x (orig=%x)\n", *bridge_agpstat, origbridge);
  591 + *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
  592 + *bridge_agpstat |= AGPSTAT3_4X;
  593 + }
  594 + if (!(*vga_agpstat & AGPSTAT3_8X)) {
  595 + printk("graphics card couldn't do x8. vga_agpstat:%x (orig=%x)\n", *vga_agpstat, origvga);
  596 + *vga_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
  597 + *vga_agpstat |= AGPSTAT3_4X;
  598 + }
590 599 }
591 600 }
592 601  
drivers/char/agp/intel-agp.c
... ... @@ -2,14 +2,6 @@
2 2 * Intel AGPGART routines.
3 3 */
4 4  
5   -/*
6   - * Intel(R) 855GM/852GM and 865G support added by David Dawes
7   - * <dawes@tungstengraphics.com>.
8   - *
9   - * Intel(R) 915G/915GM support added by Alan Hourihane
10   - * <alanh@tungstengraphics.com>.
11   - */
12   -
13 5 #include <linux/module.h>
14 6 #include <linux/pci.h>
15 7 #include <linux/init.h>
... ... @@ -17,6 +9,21 @@
17 9 #include <linux/agp_backend.h>
18 10 #include "agp.h"
19 11  
  12 +#define PCI_DEVICE_ID_INTEL_82946GZ_HB 0x2970
  13 +#define PCI_DEVICE_ID_INTEL_82946GZ_IG 0x2972
  14 +#define PCI_DEVICE_ID_INTEL_82965G_1_HB 0x2980
  15 +#define PCI_DEVICE_ID_INTEL_82965G_1_IG 0x2982
  16 +#define PCI_DEVICE_ID_INTEL_82965Q_HB 0x2990
  17 +#define PCI_DEVICE_ID_INTEL_82965Q_IG 0x2992
  18 +#define PCI_DEVICE_ID_INTEL_82965G_HB 0x29A0
  19 +#define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2
  20 +
  21 +#define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \
  22 + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
  23 + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
  24 + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
  25 +
  26 +
20 27 /* Intel 815 register */
21 28 #define INTEL_815_APCONT 0x51
22 29 #define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF
... ... @@ -40,6 +47,8 @@
40 47 #define I915_GMCH_GMS_STOLEN_48M (0x6 << 4)
41 48 #define I915_GMCH_GMS_STOLEN_64M (0x7 << 4)
42 49  
  50 +/* Intel 965G registers */
  51 +#define I965_MSAC 0x62
43 52  
44 53 /* Intel 7505 registers */
45 54 #define INTEL_I7505_APSIZE 0x74
... ... @@ -354,6 +363,7 @@
354 363 /* The 64M mode still requires a 128k gatt */
355 364 {64, 16384, 5},
356 365 {256, 65536, 6},
  366 + {512, 131072, 7},
357 367 };
358 368  
359 369 static struct _intel_i830_private {
360 370  
... ... @@ -377,8 +387,12 @@
377 387 /* We obtain the size of the GTT, which is also stored (for some
378 388 * reason) at the top of stolen memory. Then we add 4KB to that
379 389 * for the video BIOS popup, which is also stored in there. */
380   - size = agp_bridge->driver->fetch_size() + 4;
381 390  
  391 + if (IS_I965)
  392 + size = 512 + 4;
  393 + else
  394 + size = agp_bridge->driver->fetch_size() + 4;
  395 +
382 396 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
383 397 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
384 398 switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
... ... @@ -423,7 +437,7 @@
423 437 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
424 438 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
425 439 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
426   - agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB)
  440 + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || IS_I965 )
427 441 gtt_entries = MB(48) - KB(size);
428 442 else
429 443 gtt_entries = 0;
... ... @@ -433,7 +447,7 @@
433 447 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
434 448 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
435 449 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
436   - agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB)
  450 + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || IS_I965)
437 451 gtt_entries = MB(64) - KB(size);
438 452 else
439 453 gtt_entries = 0;
440 454  
... ... @@ -791,7 +805,78 @@
791 805  
792 806 return 0;
793 807 }
  808 +static int intel_i965_fetch_size(void)
  809 +{
  810 + struct aper_size_info_fixed *values;
  811 + u32 offset = 0;
  812 + u8 temp;
794 813  
  814 +#define I965_512MB_ADDRESS_MASK (3<<1)
  815 +
  816 + values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
  817 +
  818 + pci_read_config_byte(intel_i830_private.i830_dev, I965_MSAC, &temp);
  819 + temp &= I965_512MB_ADDRESS_MASK;
  820 + switch (temp) {
  821 + case 0x00:
  822 + offset = 0; /* 128MB */
  823 + break;
  824 + case 0x06:
  825 + offset = 3; /* 512MB */
  826 + break;
  827 + default:
  828 + case 0x02:
  829 + offset = 2; /* 256MB */
  830 + break;
  831 + }
  832 +
  833 + agp_bridge->previous_size = agp_bridge->current_size = (void *)(values + offset);
  834 +
  835 + return values[offset].size;
  836 +}
  837 +
  838 +/* The intel i965 automatically initializes the agp aperture during POST.
  839 ++ * Use the memory already set aside for in the GTT.
  840 ++ */
  841 +static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
  842 +{
  843 + int page_order;
  844 + struct aper_size_info_fixed *size;
  845 + int num_entries;
  846 + u32 temp;
  847 +
  848 + size = agp_bridge->current_size;
  849 + page_order = size->page_order;
  850 + num_entries = size->num_entries;
  851 + agp_bridge->gatt_table_real = NULL;
  852 +
  853 + pci_read_config_dword(intel_i830_private.i830_dev, I915_MMADDR, &temp);
  854 +
  855 + temp &= 0xfff00000;
  856 + intel_i830_private.gtt = ioremap((temp + (512 * 1024)) , 512 * 1024);
  857 +
  858 + if (!intel_i830_private.gtt)
  859 + return -ENOMEM;
  860 +
  861 +
  862 + intel_i830_private.registers = ioremap(temp,128 * 4096);
  863 + if (!intel_i830_private.registers)
  864 + return -ENOMEM;
  865 +
  866 + temp = readl(intel_i830_private.registers+I810_PGETBL_CTL) & 0xfffff000;
  867 + global_cache_flush(); /* FIXME: ? */
  868 +
  869 + /* we have to call this as early as possible after the MMIO base address is known */
  870 + intel_i830_init_gtt_entries();
  871 +
  872 + agp_bridge->gatt_table = NULL;
  873 +
  874 + agp_bridge->gatt_bus_addr = temp;
  875 +
  876 + return 0;
  877 +}
  878 +
  879 +
795 880 static int intel_fetch_size(void)
796 881 {
797 882 int i;
... ... @@ -1307,7 +1392,7 @@
1307 1392 .owner = THIS_MODULE,
1308 1393 .aperture_sizes = intel_i830_sizes,
1309 1394 .size_type = FIXED_APER_SIZE,
1310   - .num_aperture_sizes = 3,
  1395 + .num_aperture_sizes = 4,
1311 1396 .needs_scratch_page = TRUE,
1312 1397 .configure = intel_i830_configure,
1313 1398 .fetch_size = intel_i830_fetch_size,
... ... @@ -1469,7 +1554,7 @@
1469 1554 .owner = THIS_MODULE,
1470 1555 .aperture_sizes = intel_i830_sizes,
1471 1556 .size_type = FIXED_APER_SIZE,
1472   - .num_aperture_sizes = 3,
  1557 + .num_aperture_sizes = 4,
1473 1558 .needs_scratch_page = TRUE,
1474 1559 .configure = intel_i915_configure,
1475 1560 .fetch_size = intel_i915_fetch_size,
... ... @@ -1489,6 +1574,29 @@
1489 1574 .agp_destroy_page = agp_generic_destroy_page,
1490 1575 };
1491 1576  
  1577 +static struct agp_bridge_driver intel_i965_driver = {
  1578 + .owner = THIS_MODULE,
  1579 + .aperture_sizes = intel_i830_sizes,
  1580 + .size_type = FIXED_APER_SIZE,
  1581 + .num_aperture_sizes = 4,
  1582 + .needs_scratch_page = TRUE,
  1583 + .configure = intel_i915_configure,
  1584 + .fetch_size = intel_i965_fetch_size,
  1585 + .cleanup = intel_i915_cleanup,
  1586 + .tlb_flush = intel_i810_tlbflush,
  1587 + .mask_memory = intel_i810_mask_memory,
  1588 + .masks = intel_i810_masks,
  1589 + .agp_enable = intel_i810_agp_enable,
  1590 + .cache_flush = global_cache_flush,
  1591 + .create_gatt_table = intel_i965_create_gatt_table,
  1592 + .free_gatt_table = intel_i830_free_gatt_table,
  1593 + .insert_memory = intel_i915_insert_entries,
  1594 + .remove_memory = intel_i915_remove_entries,
  1595 + .alloc_by_type = intel_i830_alloc_by_type,
  1596 + .free_by_type = intel_i810_free_by_type,
  1597 + .agp_alloc_page = agp_generic_alloc_page,
  1598 + .agp_destroy_page = agp_generic_destroy_page,
  1599 +};
1492 1600  
1493 1601 static struct agp_bridge_driver intel_7505_driver = {
1494 1602 .owner = THIS_MODULE,
... ... @@ -1684,6 +1792,35 @@
1684 1792 bridge->driver = &intel_845_driver;
1685 1793 name = "945GM";
1686 1794 break;
  1795 + case PCI_DEVICE_ID_INTEL_82946GZ_HB:
  1796 + if (find_i830(PCI_DEVICE_ID_INTEL_82946GZ_IG))
  1797 + bridge->driver = &intel_i965_driver;
  1798 + else
  1799 + bridge->driver = &intel_845_driver;
  1800 + name = "946GZ";
  1801 + break;
  1802 + case PCI_DEVICE_ID_INTEL_82965G_1_HB:
  1803 + if (find_i830(PCI_DEVICE_ID_INTEL_82965G_1_IG))
  1804 + bridge->driver = &intel_i965_driver;
  1805 + else
  1806 + bridge->driver = &intel_845_driver;
  1807 + name = "965G";
  1808 + break;
  1809 + case PCI_DEVICE_ID_INTEL_82965Q_HB:
  1810 + if (find_i830(PCI_DEVICE_ID_INTEL_82965Q_IG))
  1811 + bridge->driver = &intel_i965_driver;
  1812 + else
  1813 + bridge->driver = &intel_845_driver;
  1814 + name = "965Q";
  1815 + break;
  1816 + case PCI_DEVICE_ID_INTEL_82965G_HB:
  1817 + if (find_i830(PCI_DEVICE_ID_INTEL_82965G_IG))
  1818 + bridge->driver = &intel_i965_driver;
  1819 + else
  1820 + bridge->driver = &intel_845_driver;
  1821 + name = "965G";
  1822 + break;
  1823 +
1687 1824 case PCI_DEVICE_ID_INTEL_7505_0:
1688 1825 bridge->driver = &intel_7505_driver;
1689 1826 name = "E7505";
... ... @@ -1766,6 +1903,7 @@
1766 1903 agp_put_bridge(bridge);
1767 1904 }
1768 1905  
  1906 +#ifdef CONFIG_PM
1769 1907 static int agp_intel_resume(struct pci_dev *pdev)
1770 1908 {
1771 1909 struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
1772 1910  
... ... @@ -1786,9 +1924,12 @@
1786 1924 intel_i830_configure();
1787 1925 else if (bridge->driver == &intel_810_driver)
1788 1926 intel_i810_configure();
  1927 + else if (bridge->driver == &intel_i965_driver)
  1928 + intel_i915_configure();
1789 1929  
1790 1930 return 0;
1791 1931 }
  1932 +#endif
1792 1933  
1793 1934 static struct pci_device_id agp_intel_pci_table[] = {
1794 1935 #define ID(x) \
... ... @@ -1825,6 +1966,10 @@
1825 1966 ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
1826 1967 ID(PCI_DEVICE_ID_INTEL_82945G_HB),
1827 1968 ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
  1969 + ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
  1970 + ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
  1971 + ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
  1972 + ID(PCI_DEVICE_ID_INTEL_82965G_HB),
1828 1973 { }
1829 1974 };
1830 1975  
1831 1976  
... ... @@ -1835,7 +1980,9 @@
1835 1980 .id_table = agp_intel_pci_table,
1836 1981 .probe = agp_intel_probe,
1837 1982 .remove = __devexit_p(agp_intel_remove),
  1983 +#ifdef CONFIG_PM
1838 1984 .resume = agp_intel_resume,
  1985 +#endif
1839 1986 };
1840 1987  
1841 1988 static int __init agp_intel_init(void)
drivers/char/agp/via-agp.c
... ... @@ -9,7 +9,7 @@
9 9 #include <linux/agp_backend.h>
10 10 #include "agp.h"
11 11  
12   -static struct pci_device_id agp_via_pci_table[];
  12 +static const struct pci_device_id agp_via_pci_table[];
13 13  
14 14 #define VIA_GARTCTRL 0x80
15 15 #define VIA_APSIZE 0x84
... ... @@ -485,7 +485,7 @@
485 485 #endif /* CONFIG_PM */
486 486  
487 487 /* must be the same order as name table above */
488   -static struct pci_device_id agp_via_pci_table[] = {
  488 +static const struct pci_device_id agp_via_pci_table[] = {
489 489 #define ID(x) \
490 490 { \
491 491 .class = (PCI_CLASS_BRIDGE_HOST << 8), \
... ... @@ -1013,6 +1013,7 @@
1013 1013 return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
1014 1014 }
1015 1015  
  1016 +pgprot_t vm_get_page_prot(unsigned long vm_flags);
1016 1017 struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
1017 1018 struct page *vmalloc_to_page(void *addr);
1018 1019 unsigned long vmalloc_to_pfn(void *addr);
... ... @@ -64,6 +64,13 @@
64 64 __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
65 65 };
66 66  
  67 +pgprot_t vm_get_page_prot(unsigned long vm_flags)
  68 +{
  69 + return protection_map[vm_flags &
  70 + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)];
  71 +}
  72 +EXPORT_SYMBOL(vm_get_page_prot);
  73 +
67 74 int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */
68 75 int sysctl_overcommit_ratio = 50; /* default is 50% */
69 76 int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT;