via-agp.c revision c243f1f1f6545985afcc6adf1fc085729029c3ee
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 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic 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 u32 temp; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *current_size; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size = A_SIZE_8(agp_bridge->current_size); 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* aperture size */ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size->size_value); 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* address to map too */ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* GART control register */ 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000000f); 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* attbase - aperture GATT base */ 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_ATTBASE, 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (agp_bridge->gatt_bus_addr & 0xfffff000) | 3); 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_cleanup(void) 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *previous_size; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size = A_SIZE_8(agp_bridge->previous_size); 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size->size_value); 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Do not disable by writing 0 to VIA_ATTBASE, it screws things up 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * during reinitialization. 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_tlbflush(struct agp_memory *mem) 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, VIA_GARTCTRL, &temp); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds temp |= (1<<7); 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, temp); 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds temp &= ~(1<<7); 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, temp); 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct aper_size_info_8 via_generic_sizes[9] = 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {256, 65536, 6, 0}, 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {128, 32768, 5, 128}, 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {64, 16384, 4, 192}, 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {32, 8192, 3, 224}, 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {16, 4096, 2, 240}, 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {8, 2048, 1, 248}, 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {4, 1024, 0, 252}, 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {2, 512, 0, 254}, 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {1, 256, 0, 255} 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int via_fetch_size_agp3(void) 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 temp; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_16 *values; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds values = A_SIZE_16(agp_bridge->driver->aperture_sizes); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_word(agp_bridge->dev, VIA_AGP3_APSIZE, &temp); 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds temp &= 0xfff; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (temp == values[i].size_value) { 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->previous_size = 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->current_size = (void *) (values + i); 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->aperture_size_idx = i; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return values[i].size; 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int via_configure_agp3(void) 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_16 *current_size; 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size = A_SIZE_16(agp_bridge->current_size); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* address to map too */ 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* attbase - aperture GATT base */ 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE, 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->gatt_bus_addr & 0xfffff000); 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1. Enable GTLB in RX90<7>, all AGP aperture access needs to fetch 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * translation table first. 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Enable AGP aperture in RX91<0>. This bit controls the enabling of the 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * graphics AGP aperture for the AGP3.0 port. 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp | (3<<7)); 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_cleanup_agp3(void) 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_16 *previous_size; 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size = A_SIZE_16(agp_bridge->previous_size); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, previous_size->size_value); 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void via_tlbflush_agp3(struct agp_memory *mem) 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, &temp); 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp & ~(1<<7)); 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, VIA_AGP3_GARTCTRL, temp); 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 173408b664a7d394a5e4315fbd14aca49b042cb2b08Adrian Bunkstatic struct agp_bridge_driver via_agp3_driver = { 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .aperture_sizes = agp3_generic_sizes, 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .size_type = U8_APER_SIZE, 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_aperture_sizes = 10, 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, 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_destroy_page = agp_generic_destroy_page, 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 196408b664a7d394a5e4315fbd14aca49b042cb2b08Adrian Bunkstatic struct agp_bridge_driver via_driver = { 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .aperture_sizes = via_generic_sizes, 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .size_type = U8_APER_SIZE, 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_aperture_sizes = 9, 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .configure = via_configure, 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .fetch_size = via_fetch_size, 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cleanup = via_cleanup, 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .tlb_flush = via_tlbflush, 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .mask_memory = agp_generic_mask_memory, 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .masks = NULL, 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_enable = agp_generic_enable, 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cache_flush = global_cache_flush, 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .create_gatt_table = agp_generic_create_gatt_table, 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_gatt_table = agp_generic_free_gatt_table, 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .insert_memory = agp_generic_insert_memory, 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove_memory = agp_generic_remove_memory, 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .alloc_by_type = agp_generic_alloc_by_type, 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_by_type = agp_generic_free_by_type, 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_alloc_page = agp_generic_alloc_page, 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_destroy_page = agp_generic_destroy_page, 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct agp_device_ids via_agp_device_ids[] __devinitdata = 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_82C597_0, 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo VP3", 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_82C598_0, 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo MVP3", 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8501_0, 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo MVP4", 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8601 */ 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8601_0, 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo ProMedia/PLE133Ta", 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT82C693A / VT28C694T */ 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_82C691_0, 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo Pro 133", 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8371_0, 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KX133", 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8633 */ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8633_0, 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Pro 266", 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_XN266, 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Apollo Pro266", 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8361 */ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8361, 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KLE133", 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8365 / VT8362 */ 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8363_0, 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Twister-K/KT133x/KM133", 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8753A */ 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8753_0, 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4X266", 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8366 */ 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8367_0, 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KT266/KY266x/KT333", 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8633 (for CuMine/ Celeron) */ 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8653_0, 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "Pro266T", 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KM266 / PM266 */ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_XM266, 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PM266/KM266", 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* CLE266 */ 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_862X_0, 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "CLE266", 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8377_0, 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KT400/KT400A/KT600", 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8604 / VT8605 / VT8603 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (Apollo Pro133A chipset with S3 Savage4) */ 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8605_0, 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "ProSavage PM133/PL133/PN133" 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* P4M266x/P4N266 */ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8703_51_0, 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4M266x/P4N266", 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* VT8754 */ 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8754C_0, 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PT800", 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* P4X600 */ 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8763_0, 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4X600" 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KM400 */ 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8378_0, 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KM400/KM400A", 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PT880 */ 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_PT880, 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PT880", 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PT890 */ 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_8783_0, 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PT890", 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PM800/PN800/PM880/PN880 */ 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_PX8X0_0, 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "PM800/PN800/PM880/PN880", 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KT880 */ 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_3269_0, 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "KT880", 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* KTxxx/Px8xx */ 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_83_87XX_1, 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "VT83xx/VT87xx/KTxxx/Px8xx", 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* P4M800 */ 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device_id = PCI_DEVICE_ID_VIA_3296_0, 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .chipset_name = "P4M800", 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 374c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones /* P4M800CE */ 375c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones { 376c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones .device_id = PCI_DEVICE_ID_VIA_P4M800CE, 377c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones .chipset_name = "P4M800CE", 378c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones }, 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { }, /* dummy final entry, always present */ 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * VIA's AGP3 chipsets do magick to put the AGP bridge compliant 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with the same standards version as the graphics card. 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void check_via_agp3 (struct agp_bridge_data *bridge) 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 reg; 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_byte(bridge->dev, VIA_AGPSEL, ®); 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check AGP 2.0 compatibility mode. */ 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((reg & (1<<1))==0) 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->driver = &via_agp3_driver; 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit agp_via_probe(struct pci_dev *pdev, 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct pci_device_id *ent) 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_device_ids *devs = via_agp_device_ids; 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge; 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int j = 0; 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cap_ptr; 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!cap_ptr) 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds j = ent - agp_via_pci_table; 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk (KERN_INFO PFX "Detected VIA %s chipset\n", devs[j].chipset_name); 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge = agp_alloc_bridge(); 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!bridge) 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->dev = pdev; 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->capndx = cap_ptr; 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->driver = &via_driver; 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Garg, there are KT400s with KT266 IDs. 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pdev->device == PCI_DEVICE_ID_VIA_8367_0) { 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Is there a KT400 subsystem ? */ 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pdev->subsystem_device == PCI_DEVICE_ID_VIA_8377_0) { 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO PFX "Found KT400 in disguise as a KT266.\n"); 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds check_via_agp3(bridge); 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If this is an AGP3 bridge, check which mode its in and adjust. */ 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_agp_version(bridge); 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (bridge->major_version >= 3) 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds check_via_agp3(bridge); 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fill in the mode register */ 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(pdev, 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->capndx+PCI_AGP_STATUS, &bridge->mode); 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_drvdata(pdev, bridge); 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return agp_add_bridge(bridge); 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __devexit agp_via_remove(struct pci_dev *pdev) 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_remove_bridge(bridge); 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_put_bridge(bridge); 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int agp_via_suspend(struct pci_dev *pdev, pm_message_t state) 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_save_state (pdev); 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_power_state (pdev, PCI_D3hot); 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int agp_via_resume(struct pci_dev *pdev) 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_power_state (pdev, PCI_D0); 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_restore_state(pdev); 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (bridge->driver == &via_agp3_driver) 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return via_configure_agp3(); 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (bridge->driver == &via_driver) 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return via_configure(); 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_PM */ 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* must be the same order as name table above */ 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id agp_via_pci_table[] = { 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ID(x) \ 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { \ 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .class = (PCI_CLASS_BRIDGE_HOST << 8), \ 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .class_mask = ~0, \ 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .vendor = PCI_VENDOR_ID_VIA, \ 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .device = x, \ 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .subvendor = PCI_ANY_ID, \ 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .subdevice = PCI_ANY_ID, \ 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_82C597_0), 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_82C598_0), 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8501_0), 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8601_0), 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_82C691_0), 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8371_0), 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8633_0), 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_XN266), 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8361), 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8363_0), 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8753_0), 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8367_0), 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8653_0), 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_XM266), 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_862X_0), 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8377_0), 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8605_0), 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8703_51_0), 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8754C_0), 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8763_0), 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8378_0), 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_PT880), 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_8783_0), 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_PX8X0_0), 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_3269_0), 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_83_87XX_1), 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ID(PCI_DEVICE_ID_VIA_3296_0), 519c243f1f1f6545985afcc6adf1fc085729029c3eeDave Jones ID(PCI_DEVICE_ID_VIA_P4M800CE), 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { } 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, agp_via_pci_table); 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_driver agp_via_pci_driver = { 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "agpgart-via", 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id_table = agp_via_pci_table, 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .probe = agp_via_probe, 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove = agp_via_remove, 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .suspend = agp_via_suspend, 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resume = agp_via_resume, 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init agp_via_init(void) 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (agp_off) 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pci_register_driver(&agp_via_pci_driver); 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit agp_via_cleanup(void) 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_unregister_driver(&agp_via_pci_driver); 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(agp_via_init); 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(agp_via_cleanup); 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>"); 555