11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * VIA AGPGART routines. 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/agp_backend.h> 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "agp.h" 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12b53e674a707cf77e76339852abdc063696679261Dave Jonesstatic const struct pci_device_id agp_via_pci_table[]; 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_GARTCTRL 0x80 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_APSIZE 0x84 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_ATTBASE 0x88 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_AGP3_GARTCTRL 0x90 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_AGP3_APSIZE 0x94 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_AGP3_ATTBASE 0x98 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VIA_AGPSEL 0xfd 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int via_fetch_size(void) 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 temp; 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *values; 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds values = A_SIZE_8(agp_bridge->driver->aperture_sizes); 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_byte(agp_bridge->dev, VIA_APSIZE, &temp); 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (temp == values[i].size_value) { 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->previous_size = 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->current_size = (void *) (values + i); 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->aperture_size_idx = i; 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return values[i].size; 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_ERR PFX "Unknown aperture size from AGP bridge (0x%x)\n", temp); 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int via_configure(void) 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *current_size; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size = A_SIZE_8(agp_bridge->current_size); 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* aperture size */ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size->size_value); 52e501b3d87f003dfad8fcbd0f55ae17ea52495a56Bjorn Helgaas /* address to map to */ 53e501b3d87f003dfad8fcbd0f55ae17ea52495a56Bjorn Helgaas agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 54e501b3d87f003dfad8fcbd0f55ae17ea52495a56Bjorn Helgaas AGP_APERTURE_BAR); 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* GART control register */ 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000000f); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* attbase - aperture GATT base */ 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_ATTBASE, 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (agp_bridge->gatt_bus_addr & 0xfffff000) | 3); 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_cleanup(void) 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *previous_size; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size = A_SIZE_8(agp_bridge->previous_size); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size->size_value); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Do not disable by writing 0 to VIA_ATTBASE, it screws things up 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * during reinitialization. 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_tlbflush(struct agp_memory *mem) 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, VIA_GARTCTRL, &temp); 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds temp |= (1<<7); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, temp); 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds temp &= ~(1<<7); 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, temp); 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91e5524f355a0d272ba5233537a896a668db1f3008Dave Jonesstatic const struct aper_size_info_8 via_generic_sizes[9] = 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {256, 65536, 6, 0}, 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {128, 32768, 5, 128}, 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {64, 16384, 4, 192}, 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {32, 8192, 3, 224}, 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {16, 4096, 2, 240}, 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {8, 2048, 1, 248}, 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {4, 1024, 0, 252}, 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {2, 512, 0, 254}, 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {1, 256, 0, 255} 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int via_fetch_size_agp3(void) 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 temp; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_16 *values; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds values = A_SIZE_16(agp_bridge->driver->aperture_sizes); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_word(agp_bridge->dev, VIA_AGP3_APSIZE, &temp); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds temp &= 0xfff; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (temp == values[i].size_value) { 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->previous_size = 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->current_size = (void *) (values + i); 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->aperture_size_idx = i; 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return values[i].size; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int via_configure_agp3(void) 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_16 *current_size; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size = A_SIZE_16(agp_bridge->current_size); 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 134e501b3d87f003dfad8fcbd0f55ae17ea52495a56Bjorn Helgaas /* address to map to */ 135e501b3d87f003dfad8fcbd0f55ae17ea52495a56Bjorn Helgaas agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 136e501b3d87f003dfad8fcbd0f55ae17ea52495a56Bjorn Helgaas AGP_APERTURE_BAR); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* attbase - aperture GATT base */ 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE, 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->gatt_bus_addr & 0xfffff000); 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1. Enable GTLB in RX90<7>, all AGP aperture access needs to fetch 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * translation table first. 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Enable AGP aperture in RX91<0>. This bit controls the enabling of the 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * graphics AGP aperture for the AGP3.0 port. 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp); 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp | (3<<7)); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_cleanup_agp3(void) 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_16 *previous_size; 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size = A_SIZE_16(agp_bridge->previous_size); 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, previous_size->size_value); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_tlbflush_agp3(struct agp_memory *mem) 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp); 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp & ~(1<<7)); 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp); 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 172e5524f355a0d272ba5233537a896a668db1f3008Dave Jonesstatic const struct agp_bridge_driver via_agp3_driver = { 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .aperture_sizes = agp3_generic_sizes, 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .size_type = U8_APER_SIZE, 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_aperture_sizes = 10, 17761cf059325a30995a78c5001db2ed2a8ab1d4c36Jerome Glisse .needs_scratch_page = true, 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .configure = via_configure_agp3, 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .fetch_size = via_fetch_size_agp3, 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cleanup = via_cleanup_agp3, 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .tlb_flush = via_tlbflush_agp3, 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .mask_memory = agp_generic_mask_memory, 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .masks = NULL, 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_enable = agp_generic_enable, 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cache_flush = global_cache_flush, 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .create_gatt_table = agp_generic_create_gatt_table, 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_gatt_table = agp_generic_free_gatt_table, 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .insert_memory = agp_generic_insert_memory, 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove_memory = agp_generic_remove_memory, 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .alloc_by_type = agp_generic_alloc_by_type, 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_by_type = agp_generic_free_by_type, 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_alloc_page = agp_generic_alloc_page, 1935f310b63781f6777bf4e812570560ec0f8ea42d8Rene Herman .agp_alloc_pages = agp_generic_alloc_pages, 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_destroy_page = agp_generic_destroy_page, 1955f310b63781f6777bf4e812570560ec0f8ea42d8Rene Herman .agp_destroy_pages = agp_generic_destroy_pages, 196a030ce4477baa06dd9c037ccd3c8d171aac9ed44Thomas Hellstrom .agp_type_to_mask_type = agp_generic_type_to_mask_type, 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 199e5524f355a0d272ba5233537a896a668db1f3008Dave Jonesstatic const struct agp_bridge_driver via_driver = { 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .aperture_sizes = via_generic_sizes, 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .size_type = U8_APER_SIZE, 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_aperture_sizes = 9, 20461cf059325a30995a78c5001db2ed2a8ab1d4c36Jerome Glisse .needs_scratch_page = true, 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .configure = via_configure, 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .fetch_size = via_fetch_size, 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cleanup = via_cleanup, 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .tlb_flush = via_tlbflush, 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .mask_memory = agp_generic_mask_memory, 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .masks = NULL, 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_enable = agp_generic_enable, 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cache_flush = global_cache_flush, 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .create_gatt_table = agp_generic_create_gatt_table, 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_gatt_table = agp_generic_free_gatt_table, 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .insert_memory = agp_generic_insert_memory, 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove_memory = agp_generic_remove_memory, 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .alloc_by_type = agp_generic_alloc_by_type, 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_by_type = agp_generic_free_by_type, 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_alloc_page = agp_generic_alloc_page, 2205f310b63781f6777bf4e812570560ec0f8ea42d8Rene Herman .agp_alloc_pages = agp_generic_alloc_pages, 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_destroy_page = agp_generic_destroy_page, 2225f310b63781f6777bf4e812570560ec0f8ea42d8Rene Herman .agp_destroy_pages = agp_generic_destroy_pages, 223a030ce4477baa06dd9c037ccd3c8d171aac9ed44Thomas Hellstrom .agp_type_to_mask_type = agp_generic_type_to_mask_type, 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2260bbed20e0518f6b9d46b7fe2bd044e3398a6dc40Bill Pembertonstatic struct agp_device_ids via_agp_device_ids[] = 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_82C597_0, 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo VP3", 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_82C598_0, 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo MVP3", 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8501_0, 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo MVP4", 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8601 */ 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8601_0, 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo ProMedia/PLE133Ta", 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT82C693A / VT28C694T */ 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_82C691_0, 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo Pro 133", 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8371_0, 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KX133", 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8633 */ 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8633_0, 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Pro 266", 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_XN266, 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo Pro266", 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8361 */ 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8361, 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KLE133", 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8365 / VT8362 */ 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8363_0, 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Twister-K/KT133x/KM133", 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8753A */ 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8753_0, 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4X266", 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8366 */ 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8367_0, 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KT266/KY266x/KT333", 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8633 (for CuMine/ Celeron) */ 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8653_0, 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Pro266T", 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KM266 / PM266 */ 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_XM266, 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PM266/KM266", 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* CLE266 */ 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_862X_0, 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "CLE266", 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8377_0, 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KT400/KT400A/KT600", 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8604 / VT8605 / VT8603 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (Apollo Pro133A chipset with S3 Savage4) */ 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8605_0, 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "ProSavage PM133/PL133/PN133" 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* P4M266x/P4N266 */ 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8703_51_0, 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4M266x/P4N266", 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8754 */ 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8754C_0, 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PT800", 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* P4X600 */ 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8763_0, 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4X600" 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KM400 */ 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8378_0, 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KM400/KM400A", 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PT880 */ 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_PT880, 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PT880", 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3557dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler /* PT880 Ultra */ 3567dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler { 3577dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler .device_id = PCI_DEVICE_ID_VIA_PT880ULTRA, 3587dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler .chipset_name = "PT880 Ultra", 3597dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler }, 3607dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PT890 */ 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8783_0, 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PT890", 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PM800/PN800/PM880/PN880 */ 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_PX8X0_0, 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PM800/PN800/PM880/PN880", 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KT880 */ 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_3269_0, 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KT880", 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KTxxx/Px8xx */ 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_83_87XX_1, 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "VT83xx/VT87xx/KTxxx/Px8xx", 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* P4M800 */ 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_3296_0, 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4M800", 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 387c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones /* P4M800CE */ 388c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones { 389c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones .device_id = PCI_DEVICE_ID_VIA_P4M800CE, 39043ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones .chipset_name = "VT3314", 39143ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones }, 392bbdfff86a8f0c91ad8b6dedf74bc14de4ba39679Gabriel Mansi /* VT3324 / CX700 */ 39343ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones { 394bbdfff86a8f0c91ad8b6dedf74bc14de4ba39679Gabriel Mansi .device_id = PCI_DEVICE_ID_VIA_VT3324, 39543ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones .chipset_name = "CX700", 39643ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones }, 397dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman /* VT3336 - this is a chipset for AMD Athlon/K8 CPU. Due to K8's unique 398dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman * architecture, the AGP resource and behavior are different from 399dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman * the traditional AGP which resides only in chipset. AGP is used 400dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman * by 3D driver which wasn't available for the VT3336 and VT3364 401dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman * generation until now. Unfortunately, by testing, VT3364 works 40225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * but VT3336 doesn't. - explanation from via, just leave this as 403dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman * as a placeholder to avoid future patches adding it back in. 404dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman */ 405dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman#if 0 40643ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones { 40743ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones .device_id = PCI_DEVICE_ID_VIA_VT3336, 40843ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones .chipset_name = "VT3336", 40943ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones }, 410dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman#endif 41143ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones /* P4M890 */ 41243ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones { 41343ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones .device_id = PCI_DEVICE_ID_VIA_P4M890, 41443ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones .chipset_name = "P4M890", 415c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones }, 41632ddef98f232585f20bc8bdb891029a6a5f633d0Xavier Bachelot /* P4M900 */ 41732ddef98f232585f20bc8bdb891029a6a5f633d0Xavier Bachelot { 41832ddef98f232585f20bc8bdb891029a6a5f633d0Xavier Bachelot .device_id = PCI_DEVICE_ID_VIA_VT3364, 41932ddef98f232585f20bc8bdb891029a6a5f633d0Xavier Bachelot .chipset_name = "P4M900", 42032ddef98f232585f20bc8bdb891029a6a5f633d0Xavier Bachelot }, 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { }, /* dummy final entry, always present */ 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * VIA's AGP3 chipsets do magick to put the AGP bridge compliant 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with the same standards version as the graphics card. 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_via_agp3 (struct agp_bridge_data *bridge) 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reg; 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_byte(bridge->dev, VIA_AGPSEL, ®); 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check AGP 2.0 compatibility mode. */ 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((reg & (1<<1))==0) 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->driver = &via_agp3_driver; 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 440bcd2982a0e2af8d0506271b439af4b568fc33fdcGreg Kroah-Hartmanstatic int agp_via_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_device_ids *devs = via_agp_device_ids; 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge; 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int j = 0; 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cap_ptr; 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!cap_ptr) 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds j = ent - agp_via_pci_table; 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk (KERN_INFO PFX "Detected VIA %s chipset\n", devs[j].chipset_name); 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge = agp_alloc_bridge(); 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!bridge) 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->dev = pdev; 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->capndx = cap_ptr; 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->driver = &via_driver; 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Garg, there are KT400s with KT266 IDs. 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pdev->device == PCI_DEVICE_ID_VIA_8367_0) { 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Is there a KT400 subsystem ? */ 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pdev->subsystem_device == PCI_DEVICE_ID_VIA_8377_0) { 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO PFX "Found KT400 in disguise as a KT266.\n"); 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds check_via_agp3(bridge); 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If this is an AGP3 bridge, check which mode its in and adjust. */ 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_agp_version(bridge); 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (bridge->major_version >= 3) 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds check_via_agp3(bridge); 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fill in the mode register */ 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(pdev, 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->capndx+PCI_AGP_STATUS, &bridge->mode); 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_drvdata(pdev, bridge); 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return agp_add_bridge(bridge); 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 48639af33fc458543fd6daaf154e109eba22ab89a8fBill Pembertonstatic void agp_via_remove(struct pci_dev *pdev) 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_remove_bridge(bridge); 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_put_bridge(bridge); 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int agp_via_suspend(struct pci_dev *pdev, pm_message_t state) 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_save_state (pdev); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_power_state (pdev, PCI_D3hot); 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int agp_via_resume(struct pci_dev *pdev) 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_power_state (pdev, PCI_D0); 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_restore_state(pdev); 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (bridge->driver == &via_agp3_driver) 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return via_configure_agp3(); 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (bridge->driver == &via_driver) 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return via_configure(); 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_PM */ 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* must be the same order as name table above */ 522b53e674a707cf77e76339852abdc063696679261Dave Jonesstatic const struct pci_device_id agp_via_pci_table[] = { 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ID(x) \ 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { \ 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .class = (PCI_CLASS_BRIDGE_HOST << 8), \ 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .class_mask = ~0, \ 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .vendor = PCI_VENDOR_ID_VIA, \ 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device = x, \ 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .subvendor = PCI_ANY_ID, \ 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .subdevice = PCI_ANY_ID, \ 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_82C597_0), 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_82C598_0), 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8501_0), 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8601_0), 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_82C691_0), 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8371_0), 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8633_0), 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_XN266), 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8361), 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8363_0), 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8753_0), 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8367_0), 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8653_0), 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_XM266), 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_862X_0), 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8377_0), 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8605_0), 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8703_51_0), 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8754C_0), 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8763_0), 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8378_0), 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_PT880), 5547dd1d9b85cfb63eebf48fa13d3c5d25a3deb3a25Magnus Kessler ID(PCI_DEVICE_ID_VIA_PT880ULTRA), 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8783_0), 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_PX8X0_0), 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_3269_0), 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_83_87XX_1), 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_3296_0), 560c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones ID(PCI_DEVICE_ID_VIA_P4M800CE), 561bbdfff86a8f0c91ad8b6dedf74bc14de4ba39679Gabriel Mansi ID(PCI_DEVICE_ID_VIA_VT3324), 56243ed41f648554c9fecaf7597d25e05da63ec7290Dave Jones ID(PCI_DEVICE_ID_VIA_P4M890), 563dcd981a77b2b35d169656d4b9cee208096ed7ccfGreg Kroah-Hartman ID(PCI_DEVICE_ID_VIA_VT3364), 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { } 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, agp_via_pci_table); 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_driver agp_via_pci_driver = { 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "agpgart-via", 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id_table = agp_via_pci_table, 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .probe = agp_via_probe, 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove = agp_via_remove, 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .suspend = agp_via_suspend, 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resume = agp_via_resume, 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init agp_via_init(void) 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (agp_off) 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pci_register_driver(&agp_via_pci_driver); 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit agp_via_cleanup(void) 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_unregister_driver(&agp_via_pci_driver); 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(agp_via_init); 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(agp_via_cleanup); 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 598f4432c5caec5fa95ea7eefd00f8e6cee17e2e023Dave JonesMODULE_AUTHOR("Dave Jones <davej@redhat.com>"); 599