I just bought a Sony VAIO FRV-25 (w/o the modem problem) running Gentoo, here's an lspci after Hui's patches:
And I just bought a FRV27. I had the patches for this stuff days ago, but I did not get a chance to post them since I was at OLS. This patch is against 2.4.21 based off of Hui's 2.4.18 patch with added stuff for ATI and the 345M. Please note the PCI ID additions that I would like to propose. Also notice the changes to the ALi driver and PCI quirks. I felt that PCI_DEVICE_ID_ATI_RADEON_IGP was poor naming since it is one of a number of IGP host controllers. I added in the PCI_DEVICE_ID_ATI_RS200M for the Sony laptops and added checking for into the agpgart_be.c file. I am curious if people are comfortable with the PCI ID and naming scheme. I apologize for posting to the list, as I could not figure out how to post using Bugzilla for DRI development.
-Steve
diff -urN linux-2.4.21/drivers/char/Config.in
linux-2.4.21-patched/drivers/char/Config.in
--- linux-2.4.21/drivers/char/Config.in 2003-07-29 13:22:35.000000000 -0400
+++ linux-2.4.21-patched/drivers/char/Config.in 2003-07-26 20:07:03.000000000 -0400
@@ -309,6 +309,7 @@
if [ "$CONFIG_IA64" = "y" ]; then
bool ' HP ZX1 AGP support' CONFIG_AGP_HP_ZX1
fi
+ bool ' ATI IGP chipset support' CONFIG_AGP_ATI
fi
bool 'Direct Rendering Manager (XFree86 DRI support)' CONFIG_DRM
diff -urN linux-2.4.21/drivers/char/agp/agp.h
linux-2.4.21-patched/drivers/char/agp/agp.h
--- linux-2.4.21/drivers/char/agp/agp.h 2003-07-29 13:22:35.000000000 -0400
+++ linux-2.4.21-patched/drivers/char/agp/agp.h 2003-07-26 20:28:39.000000000 -0400
@@ -421,4 +421,18 @@
#define HP_ZX1_PDIR_BASE 0x320
#define HP_ZX1_CACHE_FLUSH 0x428
+/* ATI registers */
+#define ATI_APBASE 0x10
+#define ATI_GART_MMBASE_ADDR 0x14
+#define ATI_RS100_APSIZE 0xac
+#define ATI_RS300_APSIZE 0xf8
+#define ATI_RS100_IG_AGPMODE 0xb0
+#define ATI_RS300_IG_AGPMODE 0xfc
+
+#define ATI_GART_FEATURE_ID 0x00
+#define ATI_GART_BASE 0x04
+#define ATI_GART_CACHE_SZBASE 0x08
+#define ATI_GART_CACHE_CNTRL 0x0c
+#define ATI_GART_CACHE_ENTRY_CNTRL 0x10
+
#endif /* _AGP_BACKEND_PRIV_H */
diff -urN linux-2.4.21/drivers/char/agp/agpgart_be.c
linux-2.4.21-patched/drivers/char/agp/agpgart_be.c
--- linux-2.4.21/drivers/char/agp/agpgart_be.c 2003-07-29 13:22:35.000000000 -0400
+++ linux-2.4.21-patched/drivers/char/agp/agpgart_be.c 2003-07-28 21:54:01.000000000
-0400
@@ -481,6 +481,7 @@
}
}
+#ifndef CONFIG_AGP_ATI
static int agp_generic_create_gatt_table(void)
{
char *table;
@@ -577,7 +578,7 @@
for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
SetPageReserved(page);
- agp_bridge.gatt_table_real = (unsigned long *) table;
+ agp_bridge.gatt_table_real = (u32 *) table;
agp_gatt_table = (void *)table;
#ifdef CONFIG_X86
err = change_page_attr(virt_to_page(table), 1<<page_order,
PAGE_KERNEL_NOCACHE);
@@ -604,6 +605,7 @@
return 0;
}
+#endif
static int agp_generic_suspend(void)
{
@@ -615,6 +617,7 @@
return;
}
+#ifndef CONFIG_AGP_ATI
static int agp_generic_free_gatt_table(void)
{
int page_order;
@@ -745,6 +748,7 @@
agp_bridge.tlb_flush(mem);
return 0;
}
+#endif
static agp_memory *agp_generic_alloc_by_type(size_t page_count, int type)
{
@@ -4365,6 +4369,408 @@
#endif /* CONFIG_AGP_HP_ZX1 */
+#ifdef CONFIG_AGP_ATI
+static aper_size_info_lvl2 ati_generic_sizes[7] =
+{
+ {2048, 524288, 0x0000000c},
+ {1024, 262144, 0x0000000a},
+ {512, 131072, 0x00000008},
+ {256, 65536, 0x00000006},
+ {128, 32768, 0x00000004},
+ {64, 16384, 0x00000002},
+ {32, 8192, 0x00000000}
+};
+
+static gatt_mask ati_generic_masks[] =
+{
+ {0x00000001, 0}
+};
+
+typedef struct _ati_page_map {
+ unsigned long *real;
+ unsigned long *remapped;
+} ati_page_map;
+
+static struct _ati_generic_private {
+ volatile u8 *registers;
+ ati_page_map **gatt_pages;
+ int num_tables;
+} ati_generic_private;
+
+static int ati_create_page_map(ati_page_map *page_map)
+{
+ int i;
+
+ page_map->real = (unsigned long *) __get_free_page(GFP_KERNEL);
+ if (page_map->real == NULL) {
+ return -ENOMEM;
+ }
+ set_bit(PG_reserved, &virt_to_page(page_map->real)->flags);
+ CACHE_FLUSH();
+ page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real),
+ PAGE_SIZE);
+ if (page_map->remapped == NULL) {
+ clear_bit(PG_reserved,
+ &virt_to_page(page_map->real)->flags);
+ free_page((unsigned long) page_map->real);
+ page_map->real = NULL;
+ return -ENOMEM;
+ }
+ CACHE_FLUSH();
+
+ for(i = 0; i < PAGE_SIZE / sizeof(unsigned long); i++) {
+ page_map->remapped[i] = agp_bridge.scratch_page;
+ }
+
+ return 0;
+}
+
+static void ati_free_page_map(ati_page_map *page_map)
+{
+ iounmap(page_map->remapped);
+ clear_bit(PG_reserved,
+ &virt_to_page(page_map->real)->flags);
+ free_page((unsigned long) page_map->real);
+}
+
+static void ati_free_gatt_pages(void)
+{
+ int i;
+ ati_page_map **tables;
+ ati_page_map *entry;
+
+ tables = ati_generic_private.gatt_pages;
+ for(i = 0; i < ati_generic_private.num_tables; i++) {
+ entry = tables[i];
+ if (entry != NULL) {
+ if (entry->real != NULL) {
+ ati_free_page_map(entry);
+ }
+ kfree(entry);
+ }
+ }
+ kfree(tables);
+}
+
+static int ati_create_gatt_pages(int nr_tables)
+{
+ ati_page_map **tables;
+ ati_page_map *entry;
+ int retval = 0;
+ int i;
+
+ tables = kmalloc((nr_tables + 1) * sizeof(ati_page_map *),
+ GFP_KERNEL);
+ if (tables == NULL) {
+ return -ENOMEM;
+ }
+ memset(tables, 0, sizeof(ati_page_map *) * (nr_tables + 1));
+ for (i = 0; i < nr_tables; i++) {
+ entry = kmalloc(sizeof(ati_page_map), GFP_KERNEL);
+ if (entry == NULL) {
+ retval = -ENOMEM;
+ break;
+ }
+ memset(entry, 0, sizeof(ati_page_map));
+ tables[i] = entry;
+ retval = ati_create_page_map(entry);
+ if (retval != 0) break;
+ }
+ ati_generic_private.num_tables = nr_tables;
+ ati_generic_private.gatt_pages = tables;
+
+ if (retval != 0) ati_free_gatt_pages();
+
+ return retval;
+}
+
+/* Since we don't need contigious memory we just try
+ * to get the gatt table once
+ */
+
+#define GET_PAGE_DIR_OFF(addr) (addr >> 22)
+#define GET_PAGE_DIR_IDX(addr) (GET_PAGE_DIR_OFF(addr) - \
+ GET_PAGE_DIR_OFF(agp_bridge.gart_bus_addr))
+#define GET_GATT_OFF(addr) ((addr & 0x003ff000) >> 12)
+#undef GET_GATT
+#define GET_GATT(addr) (ati_generic_private.gatt_pages[\
+ GET_PAGE_DIR_IDX(addr)]->remapped)
+
+static int ati_insert_memory(agp_memory * mem,
+ off_t pg_start, int type)
+{
+ int i, j, num_entries;
+ unsigned long *cur_gatt;
+ unsigned long addr;
+
+ num_entries = A_SIZE_LVL2(agp_bridge.current_size)->num_entries;
+
+ if (type != 0 || mem->type != 0) {
+ return -EINVAL;
+ }
+ if ((pg_start + mem->page_count) > num_entries) {
+ return -EINVAL;
+ }
+
+ j = pg_start;
+ while (j < (pg_start + mem->page_count)) {
+ addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
+ cur_gatt = GET_GATT(addr);
+ if (!PGE_EMPTY(cur_gatt[GET_GATT_OFF(addr)])) {
+ return -EBUSY;
+ }
+ j++;
+ }
+
+ if (mem->is_flushed == FALSE) {
+ CACHE_FLUSH();
+ mem->is_flushed = TRUE;
+ }
+
+ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
+ addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
+ cur_gatt = GET_GATT(addr);
+ cur_gatt[GET_GATT_OFF(addr)] = mem->memory[i];
+ }
+ agp_bridge.tlb_flush(mem);
+ return 0;
+}
+
+static int ati_remove_memory(agp_memory * mem, off_t pg_start,
+ int type)
+{
+ int i;
+ unsigned long *cur_gatt;
+ unsigned long addr;
+
+ if (type != 0 || mem->type != 0) {
+ return -EINVAL;
+ }
+ for (i = pg_start; i < (mem->page_count + pg_start); i++) {
+ addr = (i * PAGE_SIZE) + agp_bridge.gart_bus_addr;
+ cur_gatt = GET_GATT(addr);
+ cur_gatt[GET_GATT_OFF(addr)] =
+ (unsigned long) agp_bridge.scratch_page;
+ }
+
+ agp_bridge.tlb_flush(mem);
+ return 0;
+}
+
+static int ati_create_gatt_table(void)
+{
+ aper_size_info_lvl2 *value;
+ ati_page_map page_dir;
+ unsigned long addr;
+ int retval;
+ u32 temp;
+ int i;
+ aper_size_info_lvl2 *current_size;
+
+ value = A_SIZE_LVL2(agp_bridge.current_size);
+ retval = ati_create_page_map(&page_dir);
+ if (retval != 0) {
+ return retval;
+ }
+
+ retval = ati_create_gatt_pages(value->num_entries / 1024);
+ if (retval != 0) {
+ ati_free_page_map(&page_dir);
+ return retval;
+ }
+
+ agp_bridge.gatt_table_real = (u32 *) page_dir.real;
+ agp_bridge.gatt_table = (u32 *) page_dir.remapped;
+ agp_bridge.gatt_bus_addr = virt_to_bus(page_dir.real);
+
+ /* Write out the size register */
+ current_size = A_SIZE_LVL2(agp_bridge.current_size);
+
+ if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200M) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+ pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp);
+ temp = (((temp & ~(0x0000000e)) | current_size->size_value)
+ | 0x00000001);
+ pci_write_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, temp);
+ pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp);
+ } else {
+ pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp);
+ temp = (((temp & ~(0x0000000e)) | current_size->size_value)
+ | 0x00000001);
+ pci_write_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, temp);
+ pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp);
+ }
+
+ /* Get the address for the gart region.
+ * This is a bus address even on the alpha, b/c its
+ * used to program the agp master not the cpu
+ */
+ pci_read_config_dword(agp_bridge.dev, ATI_APBASE, &temp);
+ addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
+ agp_bridge.gart_bus_addr = addr;
+
+ /* Calculate the agp offset */
+ for(i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) {
+ page_dir.remapped[GET_PAGE_DIR_OFF(addr)] =
+ virt_to_bus(ati_generic_private.gatt_pages[i]->real);
+ page_dir.remapped[GET_PAGE_DIR_OFF(addr)] |= 0x00000001;
+ }
+
+ return 0;
+}
+
+static int ati_free_gatt_table(void)
+{
+ ati_page_map page_dir;
+
+ page_dir.real = (unsigned long *) agp_bridge.gatt_table_real;
+ page_dir.remapped = (unsigned long *) agp_bridge.gatt_table;
+
+ ati_free_gatt_pages();
+ ati_free_page_map(&page_dir);
+ return 0;
+}
+
+static int ati_fetch_size(void)
+{
+ int i;
+ u32 temp;
+ aper_size_info_lvl2 *values;
+
+ if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200M) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+ pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp);
+ } else {
+ pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp);
+ }
+
+ temp = (temp & 0x0000000e);
+ values = A_SIZE_LVL2(agp_bridge.aperture_sizes);
+ for (i = 0; i < agp_bridge.num_aperture_sizes; i++) {
+ if (temp == values[i].size_value) {
+ agp_bridge.previous_size =
+ agp_bridge.current_size = (void *) (values + i);
+
+ agp_bridge.aperture_size_idx = i;
+ return values[i].size;
+ }
+ }
+
+ return 0;
+}
+
+static int ati_configure(void)
+{
+ u32 temp;
+
+ /* Get the memory mapped registers */
+ pci_read_config_dword(agp_bridge.dev, ATI_GART_MMBASE_ADDR, &temp);
+ temp = (temp & 0xfffff000);
+ ati_generic_private.registers = (volatile u8 *) ioremap(temp, 4096);
+
+ if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200M) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+ pci_write_config_dword(agp_bridge.dev, ATI_RS100_IG_AGPMODE, 0x20000);
+ } else {
+ pci_write_config_dword(agp_bridge.dev, ATI_RS300_IG_AGPMODE, 0x20000);
+
+ }
+
+ /* address to map too */
+ /*
+ pci_read_config_dword(agp_bridge.dev, ATI_APBASE, &temp);
+ agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
+ printk(KERN_INFO "IGP320 gart_bus_addr: %x\n", agp_bridge.gart_bus_addr);
+ */
+ OUTREG32(ati_generic_private.registers, ATI_GART_FEATURE_ID, 0x60000);
+
+ /* SIGNALED_SYSTEM_ERROR @ NB_STATUS */
+ pci_read_config_dword(agp_bridge.dev, 4, &temp);
+ pci_write_config_dword(agp_bridge.dev, 4, temp | (1<<14));
+
+ /* Write out the address of the gatt table */
+ OUTREG32(ati_generic_private.registers, ATI_GART_BASE,
+ agp_bridge.gatt_bus_addr);
+
+ /* Flush the tlb */
+ OUTREG32(ati_generic_private.registers, ATI_GART_CACHE_CNTRL, 1);
+ return 0;
+}
+
+static void ati_cleanup(void)
+{
+ aper_size_info_lvl2 *previous_size;
+ u32 temp;
+
+ previous_size = A_SIZE_LVL2(agp_bridge.previous_size);
+
+ /* Write back the previous size and disable gart translation */
+ if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200M) ||
+ (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) {
+ pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp);
+ temp = ((temp & ~(0x0000000f)) | previous_size->size_value);
+ pci_write_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, temp);
+ } else {
+ pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp);
+ temp = ((temp & ~(0x0000000f)) | previous_size->size_value);
+ pci_write_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, temp);
+ }
+ iounmap((void *) ati_generic_private.registers);
+}
+
+static void ati_tlbflush(agp_memory * mem)
+{
+ OUTREG32(ati_generic_private.registers, ATI_GART_CACHE_CNTRL, 1);
+}
+
+static unsigned long ati_mask_memory(unsigned long addr, int type)
+{
+ /* Memory type is ignored */
+
+ return addr | agp_bridge.masks[0].mask;
+}
+
+static int __init ati_generic_setup (struct pci_dev *pdev)
+{
+ agp_bridge.masks = ati_generic_masks;
+ agp_bridge.aperture_sizes = (void *) ati_generic_sizes;
+ agp_bridge.size_type = LVL2_APER_SIZE;
+ agp_bridge.num_aperture_sizes = 7;
+ agp_bridge.dev_private_data = (void *) &ati_generic_private;
+ agp_bridge.needs_scratch_page = FALSE;
+ agp_bridge.configure = ati_configure;
+ agp_bridge.fetch_size = ati_fetch_size;
+ agp_bridge.cleanup = ati_cleanup;
+ agp_bridge.tlb_flush = ati_tlbflush;
+ agp_bridge.mask_memory = ati_mask_memory;
+ agp_bridge.agp_enable = agp_generic_agp_enable;
+ agp_bridge.cache_flush = global_cache_flush;
+ agp_bridge.create_gatt_table = ati_create_gatt_table;
+ agp_bridge.free_gatt_table = ati_free_gatt_table;
+ agp_bridge.insert_memory = ati_insert_memory;
+ agp_bridge.remove_memory = ati_remove_memory;
+ agp_bridge.alloc_by_type = agp_generic_alloc_by_type;
+ agp_bridge.free_by_type = agp_generic_free_by_type;
+ agp_bridge.agp_alloc_page = agp_generic_alloc_page;
+ agp_bridge.agp_destroy_page = agp_generic_destroy_page;
+ agp_bridge.suspend = agp_generic_suspend;
+ agp_bridge.resume = agp_generic_resume;
+ agp_bridge.cant_use_aperture = 0;
+
+ return 0;
+
+ (void) pdev; /* unused */
+}
+#endif /* CONFIG_AGP_ATI */
+
/* per-chipset initialization data.
* note -- all chipsets for a single vendor MUST be grouped together
*/
@@ -4711,6 +5117,57 @@
hp_zx1_setup },
#endif
+#ifdef CONFIG_AGP_ATI
+ { PCI_DEVICE_ID_ATI_RS100,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS100,
+ "ATI",
+ "IGP320/M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS200,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS200,
+ "ATI",
+ "IGP330/340/345/350/M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS200M,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS200M,
+ "ATI",
+ "IGP345M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS250,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS250,
+ "ATI",
+ "IGP7000/M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS300_100,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS300_100,
+ "ATI",
+ "IGP9100/M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS300_133,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS300_133,
+ "ATI",
+ "IGP9100/M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS300_166,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS300_166,
+ "ATI",
+ "IGP9100/M",
+ ati_generic_setup },
+ { PCI_DEVICE_ID_ATI_RS300_200,
+ PCI_VENDOR_ID_ATI,
+ ATI_RS300_200,
+ "ATI",
+ "IGP9100/M",
+ ati_generic_setup },
+#endif /* CONFIG_AGP_ATI */
+
{ 0, }, /* dummy final entry, always present */
};
diff -urN linux-2.4.21/drivers/ide/pci/alim15x3.c
linux-2.4.21-patched/drivers/ide/pci/alim15x3.c
--- linux-2.4.21/drivers/ide/pci/alim15x3.c 2003-07-29 13:22:35.000000000 -0400
+++ linux-2.4.21-patched/drivers/ide/pci/alim15x3.c 2003-07-26 22:42:44.000000000
-0400
@@ -873,7 +873,7 @@
{
ide_pci_device_t *d = &ali15x3_chipsets[id->driver_data];
- if(pci_find_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_IGP, NULL))
+ if(pci_find_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100, NULL))
printk(KERN_ERR "Warning: ATI Radeon IGP Northbridge is not yet fully
tested.\n");
#if defined(CONFIG_SPARC64)
diff -urN linux-2.4.21/drivers/pci/pci.ids linux-2.4.21-patched/drivers/pci/pci.ids
--- linux-2.4.21/drivers/pci/pci.ids 2003-07-29 13:22:37.000000000 -0400
+++ linux-2.4.21-patched/drivers/pci/pci.ids 2003-07-26 23:29:15.000000000 -0400
@@ -161,6 +161,8 @@
4158 68800AX [Mach32]
4242 Radeon 8500 DV
1002 02aa Radeon 8500 AIW DV Edition
+ 4337 Radeon IGP340M
+ 1002 8158 Sony Vaio PCG-FRV27
4354 215CT [Mach64 CT]
4358 210888CX [Mach64 CX]
4554 210888ET [Mach64 ET]
@@ -390,6 +392,11 @@
1002 5654 Mach64VT Reference
5655 264VT3 [Mach64 VT3]
5656 264VT4 [Mach64 VT4]
+ 7010 IGP34X AGP Bridge
+ cab0 RS100 Host Controller [IGP 320M]
+ cab2 RS200 Host Controller [IGP 340M]
+ cab3 RS250 Host Controller [IGP 340]
+ cbb2 RS200M Host Controller [IGP 345M]
1003 ULSI Systems
0201 US201
1004 VLSI Technology Inc
diff -urN linux-2.4.21/drivers/pci/quirks.c linux-2.4.21-patched/drivers/pci/quirks.c
--- linux-2.4.21/drivers/pci/quirks.c 2003-07-29 13:22:37.000000000 -0400
+++ linux-2.4.21-patched/drivers/pci/quirks.c 2003-07-26 23:08:12.000000000 -0400
@@ -706,7 +706,7 @@
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7410,
quirk_amd_ioapic },
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD,
PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering },
- { PCI_FIXUP_FINAL, PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_IGP,
quirk_ati_exploding_mce },
+ { PCI_FIXUP_FINAL, PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100,
quirk_ati_exploding_mce },
/*
* i82380FB mobile docking controller: its PCI-to-PCI bridge
* is subtractive decoding (transparent), and does indicate this
diff -urN linux-2.4.21/include/linux/agp_backend.h
linux-2.4.21-patched/include/linux/agp_backend.h
--- linux-2.4.21/include/linux/agp_backend.h 2003-07-29 13:22:41.000000000 -0400
+++ linux-2.4.21-patched/include/linux/agp_backend.h 2003-07-26 21:04:09.000000000
-0400
@@ -82,6 +82,14 @@
SVWRKS_LE,
SVWRKS_GENERIC,
HP_ZX1,
+ ATI_RS100,
+ ATI_RS200,
+ ATI_RS200M,
+ ATI_RS250,
+ ATI_RS300_100,
+ ATI_RS300_133,
+ ATI_RS300_166,
+ ATI_RS300_200
};
typedef struct _agp_version {
diff -urN linux-2.4.21/include/linux/pci_ids.h
linux-2.4.21-patched/include/linux/pci_ids.h
--- linux-2.4.21/include/linux/pci_ids.h 2003-07-29 13:22:41.000000000 -0400
+++ linux-2.4.21-patched/include/linux/pci_ids.h 2003-07-26 22:38:53.000000000
-0400
@@ -269,8 +269,17 @@
#define PCI_DEVICE_ID_ATI_RADEON_RB 0x5145
#define PCI_DEVICE_ID_ATI_RADEON_RC 0x5146
#define PCI_DEVICE_ID_ATI_RADEON_RD 0x5147
-/* RadeonIGP */
-#define PCI_DEVICE_ID_ATI_RADEON_IGP 0xCAB0
+#define PCI_DEVICE_ID_ATI_RS300_100 0x5830
+#define PCI_DEVICE_ID_ATI_RS300_133 0x5831
+#define PCI_DEVICE_ID_ATI_RS300_166 0x5832
+#define PCI_DEVICE_ID_ATI_RS300_200 0x5833
+/* Radeon IGP */
+#define PCI_DEVICE_ID_ATI_IGP340 0x4337
+#define PCI_DEVICE_ID_ATI_IGP34X 0x7010
+#define PCI_DEVICE_ID_ATI_RS100 0xcab0
+#define PCI_DEVICE_ID_ATI_RS200 0xcab2
+#define PCI_DEVICE_ID_ATI_RS250 0xcab3
+#define PCI_DEVICE_ID_ATI_RS200M 0xcbb2
#define PCI_VENDOR_ID_VLSI 0x1004
#define PCI_DEVICE_ID_VLSI_82C592 0x0005
