sis-agp.c revision b7d0640f9229a9426ba9223796329c4f0cc4acb9
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 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_device_id agp_sis_pci_table[] = { 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 21982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 22082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 22182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 22282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_5591_AGP, 22382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 22482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 22582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 22682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 22782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 22882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 22982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 23082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_530, 23182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 23282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 23382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 23482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 23582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 23682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 23782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 23882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_540, 23982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 24082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 24182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 24282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 24382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 24482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 24582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 24682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_550, 24782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 24882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 24982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 25082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 25182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 25282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 25382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 25482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_620, 25582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 25682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 25782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 25882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 25982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 26082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 26182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 26282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_630, 26382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 26482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 26582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 26682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 26782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 26882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 26982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 27082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_635, 27182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 27282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 27382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 27482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 27582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 27682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 27782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 27882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_645, 27982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 28082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 28182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 28282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 28382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 28482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 28582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 28682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_646, 28782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 28882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 28982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 29082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 29182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 29282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 29382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 29482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_648, 29582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 29682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 29782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 29882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 29982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 30082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 30182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 30282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_650, 30382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 30482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 30582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 30682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 30782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 30882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 30982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 31082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_651, 31182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 31282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 31382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 31482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 31582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 31682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 31782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 31882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_655, 31982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 32082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 32182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 32282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 32382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 32482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 32582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 32682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_661, 32782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 32882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 32982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 33082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 33182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 33282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 33382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 33482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_730, 33582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 33682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 33782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 33882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 33982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 34082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 34182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 34282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_735, 34382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 34482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 34582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 34682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 34782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 34882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 34982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 35082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_740, 35182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 35282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 35382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 35482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 35582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 35682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 35782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 35882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_741, 35982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 36082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 36182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 36282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 36382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 36482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 36582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 36682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_745, 36782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 36882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 36982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 37082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 37182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 37282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 37382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 37482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_746, 37582eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 37682eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 37782eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum }, 37882eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum { 37982eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class = (PCI_CLASS_BRIDGE_HOST << 8), 38082eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .class_mask = ~0, 38182eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .vendor = PCI_VENDOR_ID_SI, 38282eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .device = PCI_DEVICE_ID_SI_760, 38382eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subvendor = PCI_ANY_ID, 38482eab1306c20f67f718cb5439f7efd62f4e86fc8Oliver Neukum .subdevice = PCI_ANY_ID, 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { } 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, agp_sis_pci_table); 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_driver agp_sis_pci_driver = { 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "agpgart-sis", 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id_table = agp_sis_pci_table, 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .probe = agp_sis_probe, 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove = agp_sis_remove, 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init agp_sis_init(void) 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (agp_off) 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pci_register_driver(&agp_sis_pci_driver); 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit agp_sis_cleanup(void) 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_unregister_driver(&agp_sis_pci_driver); 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(agp_sis_init); 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(agp_sis_cleanup); 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(agp_sis_force_delay, bool, 0); 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(agp_sis_force_delay,"forces sis delay hack"); 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(agp_sis_agp_spec, int, 0); 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(agp_sis_agp_spec,"0=force sis init, 1=force generic agp3 init, default: autodetect"); 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL and additional rights"); 418