sis-agp.c revision 16469a0ea0f6b7562eac98ebb8a7c41ce902d0b1
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SiS AGPGART routines. 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/agp_backend.h> 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "agp.h" 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIS_ATTBASE 0x90 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIS_APSIZE 0x94 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIS_TLBCNTRL 0x97 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIS_TLBFLUSH 0x98 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinitdata agp_sis_force_delay = 0; 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinitdata agp_sis_agp_spec = -1; 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sis_fetch_size(void) 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 temp_size; 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *values; 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_byte(agp_bridge->dev, SIS_APSIZE, &temp_size); 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds values = A_SIZE_8(agp_bridge->driver->aperture_sizes); 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((temp_size == values[i].size_value) || 30b7d0640f9229a9426ba9223796329c4f0cc4acb9Stuart Bennett ((temp_size & ~(0x07)) == 31b7d0640f9229a9426ba9223796329c4f0cc4acb9Stuart Bennett (values[i].size_value & ~(0x07)))) { 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->previous_size = 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->current_size = (void *) (values + i); 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->aperture_size_idx = i; 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return values[i].size; 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sis_tlbflush(struct agp_memory *mem) 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, SIS_TLBFLUSH, 0x02); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sis_configure(void) 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 temp; 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *current_size; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size = A_SIZE_8(agp_bridge->current_size); 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, SIS_TLBCNTRL, 0x05); 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(agp_bridge->dev, SIS_ATTBASE, 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->gatt_bus_addr); 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, SIS_APSIZE, 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_size->size_value); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sis_cleanup(void) 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aper_size_info_8 *previous_size; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds previous_size = A_SIZE_8(agp_bridge->previous_size); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_byte(agp_bridge->dev, SIS_APSIZE, 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (previous_size->size_value & ~(0x03))); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sis_delayed_enable(struct agp_bridge_data *bridge, u32 mode) 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pci_dev *device = NULL; 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 command; 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int rate; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO PFX "Found an AGP %d.%d compliant device at %s.\n", 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->major_version, 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_bridge->minor_version, 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_name(agp_bridge->dev)); 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx + PCI_AGP_STATUS, &command); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds command = agp_collect_device_status(bridge, mode, command); 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds command |= AGPSTAT_AGP_ENABLE; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rate = (command & 0x7) << 2; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for_each_pci_dev(device) { 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 agp = pci_find_capability(device, PCI_CAP_ID_AGP); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!agp) 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO PFX "Putting AGP V3 device at %s into %dx mode\n", 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_name(device), rate); 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command); 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Weird: on some sis chipsets any rate change in the target 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * command register triggers a 5ms screwup during which the master 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * cannot be configured 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (device->device == bridge->dev->device) { 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO PFX "SiS delay workaround: giving bridge time to recover.\n"); 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(10); 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 111e5524f355a0d272ba5233537a896a668db1f3008Dave Jonesstatic const struct aper_size_info_8 sis_generic_sizes[7] = 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {256, 65536, 6, 99}, 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {128, 32768, 5, 83}, 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {64, 16384, 4, 67}, 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {32, 8192, 3, 51}, 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {16, 4096, 2, 35}, 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {8, 2048, 1, 19}, 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {4, 1024, 0, 3} 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 122408b664a7d394a5e4315fbd14aca49b042cb2b08Adrian Bunkstatic struct agp_bridge_driver sis_driver = { 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 1246a92a4e0d201aea6d7c83f100d77310676b2e049Dave Jones .aperture_sizes = sis_generic_sizes, 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .size_type = U8_APER_SIZE, 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_aperture_sizes = 7, 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .configure = sis_configure, 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .fetch_size = sis_fetch_size, 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cleanup = sis_cleanup, 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .tlb_flush = sis_tlbflush, 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .mask_memory = agp_generic_mask_memory, 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .masks = NULL, 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_enable = agp_generic_enable, 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .cache_flush = global_cache_flush, 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .create_gatt_table = agp_generic_create_gatt_table, 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_gatt_table = agp_generic_free_gatt_table, 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .insert_memory = agp_generic_insert_memory, 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove_memory = agp_generic_remove_memory, 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .alloc_by_type = agp_generic_alloc_by_type, 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .free_by_type = agp_generic_free_by_type, 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_alloc_page = agp_generic_alloc_page, 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .agp_destroy_page = agp_generic_destroy_page, 143bf1e5989aa5783726c6a94931f92b34aa387ec30Thomas Hellstrom .agp_type_to_mask_type = agp_generic_type_to_mask_type, 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds// chipsets that require the 'delay hack' 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int sis_broken_chipsets[] __devinitdata = { 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PCI_DEVICE_ID_SI_648, 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PCI_DEVICE_ID_SI_746, 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0 // terminator 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __devinit sis_get_driver(struct agp_bridge_data *bridge) 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1576a92a4e0d201aea6d7c83f100d77310676b2e049Dave Jones for (i=0; sis_broken_chipsets[i]!=0; ++i) 1586a92a4e0d201aea6d7c83f100d77310676b2e049Dave Jones if (bridge->dev->device==sis_broken_chipsets[i]) 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1616a92a4e0d201aea6d7c83f100d77310676b2e049Dave Jones if (sis_broken_chipsets[i] || agp_sis_force_delay) 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.agp_enable=sis_delayed_enable; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // sis chipsets that indicate less than agp3.5 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // are not actually fully agp3 compliant 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((agp_bridge->major_version == 3 && agp_bridge->minor_version >= 5 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds && agp_sis_agp_spec!=0) || agp_sis_agp_spec==1) { 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.aperture_sizes = agp3_generic_sizes; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.size_type = U16_APER_SIZE; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.num_aperture_sizes = AGP_GENERIC_SIZES_ENTRIES; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.configure = agp3_generic_configure; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.fetch_size = agp3_generic_fetch_size; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.cleanup = agp3_generic_cleanup; 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_driver.tlb_flush = agp3_generic_tlbflush; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit agp_sis_probe(struct pci_dev *pdev, 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct pci_device_id *ent) 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge; 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 cap_ptr; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!cap_ptr) 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum printk(KERN_INFO PFX "Detected SiS chipset - id:%i\n", pdev->device); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge = agp_alloc_bridge(); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!bridge) 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->driver = &sis_driver; 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->dev = pdev; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bridge->capndx = cap_ptr; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds get_agp_version(bridge); 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fill in the mode register */ 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_read_config_dword(pdev, bridge->capndx+PCI_AGP_STATUS, &bridge->mode); 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sis_get_driver(bridge); 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_drvdata(pdev, bridge); 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return agp_add_bridge(bridge); 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __devexit agp_sis_remove(struct pci_dev *pdev) 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_remove_bridge(bridge); 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds agp_put_bridge(bridge); 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21716469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett#ifdef CONFIG_PM 21816469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett 21916469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennettstatic int agp_sis_suspend(struct pci_dev *pdev, pm_message_t state) 22016469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett{ 22116469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett pci_save_state(pdev); 22216469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett pci_set_power_state(pdev, pci_choose_state(pdev, state)); 22316469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett 22416469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett return 0; 22516469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett} 22616469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett 22716469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennettstatic int agp_sis_resume(struct pci_dev *pdev) 22816469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett{ 22916469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett pci_set_power_state(pdev, PCI_D0); 23016469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett pci_restore_state(pdev); 23116469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett 23216469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett return sis_driver.configure(); 23316469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett} 23416469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett 23516469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett#endif /* CONFIG_PM */ 23616469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id agp_sis_pci_table[] = { 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 23982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 24082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 24182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 24282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_5591_AGP, 24382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 24482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 24582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 24682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 24782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 24882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 24982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 25082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_530, 25182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 25282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 25382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 25482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 25582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 25682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 25782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 25882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_540, 25982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 26082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 26182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 26282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 26382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 26482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 26582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 26682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_550, 26782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 26882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 26982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 27082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 27182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 27282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 27382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 27482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_620, 27582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 27682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 27782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 27882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 27982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 28082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 28182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 28282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_630, 28382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 28482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 28582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 28682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 28782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 28882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 28982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 29082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_635, 29182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 29282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 29382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 29482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 29582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 29682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 29782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 29882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_645, 29982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 30082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 30182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 30282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 30382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 30482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 30582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 30682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_646, 30782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 30882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 30982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 31082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 31182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 31282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 31382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 31482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_648, 31582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 31682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 31782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 31882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 31982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 32082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 32182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 32282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_650, 32382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 32482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 32582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 32682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 32782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 32882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 32982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 33082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_651, 33182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 33282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 33382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 33482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 33582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 33682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 33782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 33882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_655, 33982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 34082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 34182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 34282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 34382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 34482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 34582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 34682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_661, 34782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 34882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 34982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 35082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 35182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 35282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 35382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 35482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_730, 35582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 35682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 35782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 35882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 35982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 36082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 36182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 36282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_735, 36382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 36482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 36582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 36682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 36782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 36882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 36982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 37082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_740, 37182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 37282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 37382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 37482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 37582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 37682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 37782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 37882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_741, 37982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 38082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 38182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 38282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 38382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 38482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 38582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 38682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_745, 38782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 38882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 38982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 39082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 39182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 39282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 39382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 39482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_746, 39582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 39682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 39782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 39882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 39982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 40082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 40182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 40282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_760, 40382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 40482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { } 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, agp_sis_pci_table); 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_driver agp_sis_pci_driver = { 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "agpgart-sis", 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id_table = agp_sis_pci_table, 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .probe = agp_sis_probe, 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove = agp_sis_remove, 41616469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett#ifdef CONFIG_PM 41716469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett .suspend = agp_sis_suspend, 41816469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett .resume = agp_sis_resume, 41916469a0ea0f6b7562eac98ebb8a7c41ce902d0b1Stuart Bennett#endif 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init agp_sis_init(void) 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (agp_off) 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pci_register_driver(&agp_sis_pci_driver); 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit agp_sis_cleanup(void) 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_unregister_driver(&agp_sis_pci_driver); 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(agp_sis_init); 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(agp_sis_cleanup); 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(agp_sis_force_delay, bool, 0); 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(agp_sis_force_delay,"forces sis delay hack"); 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(agp_sis_agp_spec, int, 0); 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(agp_sis_agp_spec,"0=force sis init, 1=force generic agp3 init, default: autodetect"); 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL and additional rights"); 442