------- Additional Comments From [EMAIL PROTECTED] 2003-28-07 22:23 ------- Hi, Just wanted to share my positive experience with Hui Yu's patches.
I just bought a Sony VAIO FRV-25 (w/o the modem problem) running Gentoo, here's an lspci after Hui's patches:
I had this working a few days ago. I recently bought a Sony VAIO FRV27 and created patches against 2.4.21 to get AGPGART and 3D working. I have attached the patch and would like comments, specifically on the PCI ID stuff. I do not have patches against X DRI. I also make changes in the agpgart_be.c to get rid of compiler warnings. The lines with #ifndef CONFIG_AGP_ATI was to get rid of warnings about unused functions. Note the addition of PCI_DEVICE_ID_ATI_RS200M and the changes that I made to the ALi PCI quirks. I also separated out the IGP 345M to be by itself, since it obviously has a new PCI device ID. Comments please?
-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