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:
@@ -30,6 +30,7 @@ the beginning of each description states the restrictions within which a
|
|||||||
parameter is applicable:
|
parameter is applicable:
|
||||||
|
|
||||||
ACPI ACPI support is enabled.
|
ACPI ACPI support is enabled.
|
||||||
|
AGP AGP (Accelerated Graphics Port) is enabled.
|
||||||
ALSA ALSA sound support is enabled.
|
ALSA ALSA sound support is enabled.
|
||||||
APIC APIC support is enabled.
|
APIC APIC support is enabled.
|
||||||
APM Advanced Power Management 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
|
to assume that this machine's pmtimer latches its value
|
||||||
and always returns good values.
|
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_timer_pin_1 [i386,x86-64]
|
||||||
Enable PIN 1 of APIC timer
|
Enable PIN 1 of APIC timer
|
||||||
Can be useful to work around chipset bugs
|
Can be useful to work around chipset bugs
|
||||||
|
@@ -50,7 +50,7 @@ config AGP_ATI
|
|||||||
|
|
||||||
config AGP_AMD
|
config AGP_AMD
|
||||||
tristate "AMD Irongate, 761, and 762 chipset support"
|
tristate "AMD Irongate, 761, and 762 chipset support"
|
||||||
depends on AGP && X86_32
|
depends on AGP && (X86_32 || ALPHA)
|
||||||
help
|
help
|
||||||
This option gives you AGP support for the GLX component of
|
This option gives you AGP support for the GLX component of
|
||||||
X on AMD Irongate, 761, and 762 chipsets.
|
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++) {
|
for (i = 0; i < nr_tables; i++) {
|
||||||
entry = kzalloc(sizeof(struct ati_page_map), GFP_KERNEL);
|
entry = kzalloc(sizeof(struct ati_page_map), GFP_KERNEL);
|
||||||
|
tables[i] = entry;
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
while (i > 0) {
|
|
||||||
kfree(tables[i-1]);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
kfree(tables);
|
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tables[i] = entry;
|
|
||||||
retval = ati_create_page_map(entry);
|
retval = ati_create_page_map(entry);
|
||||||
if (retval != 0)
|
if (retval != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ati_generic_private.num_tables = nr_tables;
|
ati_generic_private.num_tables = i;
|
||||||
ati_generic_private.gatt_pages = tables;
|
ati_generic_private.gatt_pages = tables;
|
||||||
|
|
||||||
if (retval != 0)
|
if (retval != 0)
|
||||||
|
@@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge)
|
|||||||
map_page_into_agp(page);
|
map_page_into_agp(page);
|
||||||
|
|
||||||
get_page(page);
|
get_page(page);
|
||||||
SetPageLocked(page);
|
|
||||||
atomic_inc(&agp_bridge->current_memory_agp);
|
atomic_inc(&agp_bridge->current_memory_agp);
|
||||||
return page_address(page);
|
return page_address(page);
|
||||||
}
|
}
|
||||||
@@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr)
|
|||||||
page = virt_to_page(addr);
|
page = virt_to_page(addr);
|
||||||
unmap_page_from_agp(page);
|
unmap_page_from_agp(page);
|
||||||
put_page(page);
|
put_page(page);
|
||||||
unlock_page(page);
|
|
||||||
free_page((unsigned long)addr);
|
free_page((unsigned long)addr);
|
||||||
atomic_dec(&agp_bridge->current_memory_agp);
|
atomic_dec(&agp_bridge->current_memory_agp);
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,9 @@
|
|||||||
#define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2
|
#define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2
|
||||||
#define PCI_DEVICE_ID_INTEL_82965GM_HB 0x2A00
|
#define PCI_DEVICE_ID_INTEL_82965GM_HB 0x2A00
|
||||||
#define PCI_DEVICE_ID_INTEL_82965GM_IG 0x2A02
|
#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_82965GME_IG 0x2A12
|
||||||
|
#define PCI_DEVICE_ID_INTEL_82945GME_HB 0x27AC
|
||||||
#define PCI_DEVICE_ID_INTEL_82945GME_IG 0x27AE
|
#define PCI_DEVICE_ID_INTEL_82945GME_IG 0x27AE
|
||||||
#define PCI_DEVICE_ID_INTEL_G33_HB 0x29C0
|
#define PCI_DEVICE_ID_INTEL_G33_HB 0x29C0
|
||||||
#define PCI_DEVICE_ID_INTEL_G33_IG 0x29C2
|
#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_82965G_1_HB || \
|
||||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_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_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 || \
|
#define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
|
||||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
|
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
|
||||||
@@ -213,7 +216,6 @@ static void *i8xx_alloc_pages(void)
|
|||||||
}
|
}
|
||||||
global_flush_tlb();
|
global_flush_tlb();
|
||||||
get_page(page);
|
get_page(page);
|
||||||
SetPageLocked(page);
|
|
||||||
atomic_inc(&agp_bridge->current_memory_agp);
|
atomic_inc(&agp_bridge->current_memory_agp);
|
||||||
return page_address(page);
|
return page_address(page);
|
||||||
}
|
}
|
||||||
@@ -229,7 +231,6 @@ static void i8xx_destroy_pages(void *addr)
|
|||||||
change_page_attr(page, 4, PAGE_KERNEL);
|
change_page_attr(page, 4, PAGE_KERNEL);
|
||||||
global_flush_tlb();
|
global_flush_tlb();
|
||||||
put_page(page);
|
put_page(page);
|
||||||
unlock_page(page);
|
|
||||||
__free_pages(page, 2);
|
__free_pages(page, 2);
|
||||||
atomic_dec(&agp_bridge->current_memory_agp);
|
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_82915GM_HB ||
|
||||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_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_82945GM_HB ||
|
||||||
|
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB ||
|
||||||
IS_I965 || IS_G33)
|
IS_I965 || IS_G33)
|
||||||
gtt_entries = MB(48) - KB(size);
|
gtt_entries = MB(48) - KB(size);
|
||||||
else
|
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_82915GM_HB ||
|
||||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_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_82945GM_HB ||
|
||||||
|
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB ||
|
||||||
IS_I965 || IS_G33)
|
IS_I965 || IS_G33)
|
||||||
gtt_entries = MB(64) - KB(size);
|
gtt_entries = MB(64) - KB(size);
|
||||||
else
|
else
|
||||||
@@ -1848,9 +1851,9 @@ static const struct intel_driver_description {
|
|||||||
NULL, &intel_915_driver },
|
NULL, &intel_915_driver },
|
||||||
{ PCI_DEVICE_ID_INTEL_82945G_HB, PCI_DEVICE_ID_INTEL_82945G_IG, 0, "945G",
|
{ PCI_DEVICE_ID_INTEL_82945G_HB, PCI_DEVICE_ID_INTEL_82945G_IG, 0, "945G",
|
||||||
NULL, &intel_915_driver },
|
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 },
|
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 },
|
NULL, &intel_915_driver },
|
||||||
{ PCI_DEVICE_ID_INTEL_82946GZ_HB, PCI_DEVICE_ID_INTEL_82946GZ_IG, 0, "946GZ",
|
{ PCI_DEVICE_ID_INTEL_82946GZ_HB, PCI_DEVICE_ID_INTEL_82946GZ_IG, 0, "946GZ",
|
||||||
NULL, &intel_i965_driver },
|
NULL, &intel_i965_driver },
|
||||||
@@ -1860,9 +1863,9 @@ static const struct intel_driver_description {
|
|||||||
NULL, &intel_i965_driver },
|
NULL, &intel_i965_driver },
|
||||||
{ PCI_DEVICE_ID_INTEL_82965G_HB, PCI_DEVICE_ID_INTEL_82965G_IG, 0, "965G",
|
{ PCI_DEVICE_ID_INTEL_82965G_HB, PCI_DEVICE_ID_INTEL_82965G_IG, 0, "965G",
|
||||||
NULL, &intel_i965_driver },
|
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 },
|
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 },
|
NULL, &intel_i965_driver },
|
||||||
{ PCI_DEVICE_ID_INTEL_7505_0, 0, 0, "E7505", &intel_7505_driver, NULL },
|
{ 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 },
|
{ 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_82915GM_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_82945G_HB),
|
ID(PCI_DEVICE_ID_INTEL_82945G_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_82945GM_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_82946GZ_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
|
ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
|
ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_82965G_HB),
|
ID(PCI_DEVICE_ID_INTEL_82965G_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_82965GM_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_G33_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_Q35_HB),
|
ID(PCI_DEVICE_ID_INTEL_Q35_HB),
|
||||||
ID(PCI_DEVICE_ID_INTEL_Q33_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;
|
return NULL;
|
||||||
|
|
||||||
get_page(page);
|
get_page(page);
|
||||||
SetPageLocked(page);
|
|
||||||
atomic_inc(&agp_bridge->current_memory_agp);
|
atomic_inc(&agp_bridge->current_memory_agp);
|
||||||
return page_address(page);
|
return page_address(page);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user