[EMAIL PROTECTED] wrote:

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

Reply via email to