forked from Minki/linux
Merge branch 'agp-patches' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/agp-2.6
* 'agp-patches' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/agp-2.6: agp: AMD AGP is used on UP1100 & UP1500 alpha boxen intel_agp: really fix 945/965GME agp: don't lock pages AGP: document boot options Fix "use after free" / "double free" bug in ati_create_gatt_pages / ati_free_gatt_pages
This commit is contained in:
commit
933a6208d8
@ -30,6 +30,7 @@ the beginning of each description states the restrictions within which a
|
||||
parameter is applicable:
|
||||
|
||||
ACPI ACPI support is enabled.
|
||||
AGP AGP (Accelerated Graphics Port) is enabled.
|
||||
ALSA ALSA sound support is enabled.
|
||||
APIC APIC support is enabled.
|
||||
APM Advanced Power Management support is enabled.
|
||||
@ -227,6 +228,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
to assume that this machine's pmtimer latches its value
|
||||
and always returns good values.
|
||||
|
||||
agp= [AGP]
|
||||
{ off | try_unsupported }
|
||||
off: disable AGP support
|
||||
try_unsupported: try to drive unsupported chipsets
|
||||
(may crash computer or cause data corruption)
|
||||
|
||||
enable_timer_pin_1 [i386,x86-64]
|
||||
Enable PIN 1 of APIC timer
|
||||
Can be useful to work around chipset bugs
|
||||
|
@ -50,7 +50,7 @@ config AGP_ATI
|
||||
|
||||
config AGP_AMD
|
||||
tristate "AMD Irongate, 761, and 762 chipset support"
|
||||
depends on AGP && X86_32
|
||||
depends on AGP && (X86_32 || ALPHA)
|
||||
help
|
||||
This option gives you AGP support for the GLX component of
|
||||
X on AMD Irongate, 761, and 762 chipsets.
|
||||
|
@ -123,21 +123,16 @@ static int ati_create_gatt_pages(int nr_tables)
|
||||
|
||||
for (i = 0; i < nr_tables; i++) {
|
||||
entry = kzalloc(sizeof(struct ati_page_map), GFP_KERNEL);
|
||||
tables[i] = entry;
|
||||
if (entry == NULL) {
|
||||
while (i > 0) {
|
||||
kfree(tables[i-1]);
|
||||
i--;
|
||||
}
|
||||
kfree(tables);
|
||||
retval = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
tables[i] = entry;
|
||||
retval = ati_create_page_map(entry);
|
||||
if (retval != 0)
|
||||
break;
|
||||
}
|
||||
ati_generic_private.num_tables = nr_tables;
|
||||
ati_generic_private.num_tables = i;
|
||||
ati_generic_private.gatt_pages = tables;
|
||||
|
||||
if (retval != 0)
|
||||
|
@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge)
|
||||
map_page_into_agp(page);
|
||||
|
||||
get_page(page);
|
||||
SetPageLocked(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
return page_address(page);
|
||||
}
|
||||
@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr)
|
||||
page = virt_to_page(addr);
|
||||
unmap_page_from_agp(page);
|
||||
put_page(page);
|
||||
unlock_page(page);
|
||||
free_page((unsigned long)addr);
|
||||
atomic_dec(&agp_bridge->current_memory_agp);
|
||||
}
|
||||
|
@ -20,7 +20,9 @@
|
||||
#define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2
|
||||
#define PCI_DEVICE_ID_INTEL_82965GM_HB 0x2A00
|
||||
#define PCI_DEVICE_ID_INTEL_82965GM_IG 0x2A02
|
||||
#define PCI_DEVICE_ID_INTEL_82965GME_HB 0x2A10
|
||||
#define PCI_DEVICE_ID_INTEL_82965GME_IG 0x2A12
|
||||
#define PCI_DEVICE_ID_INTEL_82945GME_HB 0x27AC
|
||||
#define PCI_DEVICE_ID_INTEL_82945GME_IG 0x27AE
|
||||
#define PCI_DEVICE_ID_INTEL_G33_HB 0x29C0
|
||||
#define PCI_DEVICE_ID_INTEL_G33_IG 0x29C2
|
||||
@ -33,7 +35,8 @@
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB)
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB)
|
||||
|
||||
#define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
|
||||
@ -213,7 +216,6 @@ static void *i8xx_alloc_pages(void)
|
||||
}
|
||||
global_flush_tlb();
|
||||
get_page(page);
|
||||
SetPageLocked(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
return page_address(page);
|
||||
}
|
||||
@ -229,7 +231,6 @@ static void i8xx_destroy_pages(void *addr)
|
||||
change_page_attr(page, 4, PAGE_KERNEL);
|
||||
global_flush_tlb();
|
||||
put_page(page);
|
||||
unlock_page(page);
|
||||
__free_pages(page, 2);
|
||||
atomic_dec(&agp_bridge->current_memory_agp);
|
||||
}
|
||||
@ -527,6 +528,7 @@ static void intel_i830_init_gtt_entries(void)
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB ||
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB ||
|
||||
IS_I965 || IS_G33)
|
||||
gtt_entries = MB(48) - KB(size);
|
||||
else
|
||||
@ -538,6 +540,7 @@ static void intel_i830_init_gtt_entries(void)
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB ||
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB ||
|
||||
IS_I965 || IS_G33)
|
||||
gtt_entries = MB(64) - KB(size);
|
||||
else
|
||||
@ -1848,9 +1851,9 @@ static const struct intel_driver_description {
|
||||
NULL, &intel_915_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82945G_HB, PCI_DEVICE_ID_INTEL_82945G_IG, 0, "945G",
|
||||
NULL, &intel_915_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GM_IG, 1, "945GM",
|
||||
{ PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GM_IG, 0, "945GM",
|
||||
NULL, &intel_915_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GME_IG, 0, "945GME",
|
||||
{ PCI_DEVICE_ID_INTEL_82945GME_HB, PCI_DEVICE_ID_INTEL_82945GME_IG, 0, "945GME",
|
||||
NULL, &intel_915_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82946GZ_HB, PCI_DEVICE_ID_INTEL_82946GZ_IG, 0, "946GZ",
|
||||
NULL, &intel_i965_driver },
|
||||
@ -1860,9 +1863,9 @@ static const struct intel_driver_description {
|
||||
NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82965G_HB, PCI_DEVICE_ID_INTEL_82965G_IG, 0, "965G",
|
||||
NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GM_IG, 1, "965GM",
|
||||
{ PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GM_IG, 0, "965GM",
|
||||
NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GME_IG, 0, "965GME/GLE",
|
||||
{ PCI_DEVICE_ID_INTEL_82965GME_HB, PCI_DEVICE_ID_INTEL_82965GME_IG, 0, "965GME/GLE",
|
||||
NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_7505_0, 0, 0, "E7505", &intel_7505_driver, NULL },
|
||||
{ PCI_DEVICE_ID_INTEL_7205_0, 0, 0, "E7205", &intel_7505_driver, NULL },
|
||||
@ -2051,11 +2054,13 @@ static struct pci_device_id agp_intel_pci_table[] = {
|
||||
ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82945G_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82965G_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_G33_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_Q35_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_Q33_HB),
|
||||
|
@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct agp_bridge_data *bridge)
|
||||
return NULL;
|
||||
|
||||
get_page(page);
|
||||
SetPageLocked(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
return page_address(page);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user