18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * SiS AGPGART routines. 38c2ecf20Sopenharmony_ci */ 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/module.h> 68c2ecf20Sopenharmony_ci#include <linux/pci.h> 78c2ecf20Sopenharmony_ci#include <linux/init.h> 88c2ecf20Sopenharmony_ci#include <linux/agp_backend.h> 98c2ecf20Sopenharmony_ci#include <linux/delay.h> 108c2ecf20Sopenharmony_ci#include "agp.h" 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#define SIS_ATTBASE 0x90 138c2ecf20Sopenharmony_ci#define SIS_APSIZE 0x94 148c2ecf20Sopenharmony_ci#define SIS_TLBCNTRL 0x97 158c2ecf20Sopenharmony_ci#define SIS_TLBFLUSH 0x98 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_SI_662 0x0662 188c2ecf20Sopenharmony_ci#define PCI_DEVICE_ID_SI_671 0x0671 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistatic bool agp_sis_force_delay = 0; 218c2ecf20Sopenharmony_cistatic int agp_sis_agp_spec = -1; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistatic int sis_fetch_size(void) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci u8 temp_size; 268c2ecf20Sopenharmony_ci int i; 278c2ecf20Sopenharmony_ci struct aper_size_info_8 *values; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, SIS_APSIZE, &temp_size); 308c2ecf20Sopenharmony_ci values = A_SIZE_8(agp_bridge->driver->aperture_sizes); 318c2ecf20Sopenharmony_ci for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 328c2ecf20Sopenharmony_ci if ((temp_size == values[i].size_value) || 338c2ecf20Sopenharmony_ci ((temp_size & ~(0x07)) == 348c2ecf20Sopenharmony_ci (values[i].size_value & ~(0x07)))) { 358c2ecf20Sopenharmony_ci agp_bridge->previous_size = 368c2ecf20Sopenharmony_ci agp_bridge->current_size = (void *) (values + i); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci agp_bridge->aperture_size_idx = i; 398c2ecf20Sopenharmony_ci return values[i].size; 408c2ecf20Sopenharmony_ci } 418c2ecf20Sopenharmony_ci } 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci return 0; 448c2ecf20Sopenharmony_ci} 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic void sis_tlbflush(struct agp_memory *mem) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, SIS_TLBFLUSH, 0x02); 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic int sis_configure(void) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci struct aper_size_info_8 *current_size; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 568c2ecf20Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, SIS_TLBCNTRL, 0x05); 578c2ecf20Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 588c2ecf20Sopenharmony_ci AGP_APERTURE_BAR); 598c2ecf20Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, SIS_ATTBASE, 608c2ecf20Sopenharmony_ci agp_bridge->gatt_bus_addr); 618c2ecf20Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, SIS_APSIZE, 628c2ecf20Sopenharmony_ci current_size->size_value); 638c2ecf20Sopenharmony_ci return 0; 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cistatic void sis_cleanup(void) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci struct aper_size_info_8 *previous_size; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci previous_size = A_SIZE_8(agp_bridge->previous_size); 718c2ecf20Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, SIS_APSIZE, 728c2ecf20Sopenharmony_ci (previous_size->size_value & ~(0x03))); 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistatic void sis_delayed_enable(struct agp_bridge_data *bridge, u32 mode) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci struct pci_dev *device = NULL; 788c2ecf20Sopenharmony_ci u32 command; 798c2ecf20Sopenharmony_ci int rate; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci dev_info(&agp_bridge->dev->dev, "AGP %d.%d bridge\n", 828c2ecf20Sopenharmony_ci agp_bridge->major_version, agp_bridge->minor_version); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx + PCI_AGP_STATUS, &command); 858c2ecf20Sopenharmony_ci command = agp_collect_device_status(bridge, mode, command); 868c2ecf20Sopenharmony_ci command |= AGPSTAT_AGP_ENABLE; 878c2ecf20Sopenharmony_ci rate = (command & 0x7) << 2; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci for_each_pci_dev(device) { 908c2ecf20Sopenharmony_ci u8 agp = pci_find_capability(device, PCI_CAP_ID_AGP); 918c2ecf20Sopenharmony_ci if (!agp) 928c2ecf20Sopenharmony_ci continue; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci dev_info(&agp_bridge->dev->dev, "putting AGP V3 device at %s into %dx mode\n", 958c2ecf20Sopenharmony_ci pci_name(device), rate); 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci /* 1008c2ecf20Sopenharmony_ci * Weird: on some sis chipsets any rate change in the target 1018c2ecf20Sopenharmony_ci * command register triggers a 5ms screwup during which the master 1028c2ecf20Sopenharmony_ci * cannot be configured 1038c2ecf20Sopenharmony_ci */ 1048c2ecf20Sopenharmony_ci if (device->device == bridge->dev->device) { 1058c2ecf20Sopenharmony_ci dev_info(&agp_bridge->dev->dev, "SiS delay workaround: giving bridge time to recover\n"); 1068c2ecf20Sopenharmony_ci msleep(10); 1078c2ecf20Sopenharmony_ci } 1088c2ecf20Sopenharmony_ci } 1098c2ecf20Sopenharmony_ci} 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_cistatic const struct aper_size_info_8 sis_generic_sizes[7] = 1128c2ecf20Sopenharmony_ci{ 1138c2ecf20Sopenharmony_ci {256, 65536, 6, 99}, 1148c2ecf20Sopenharmony_ci {128, 32768, 5, 83}, 1158c2ecf20Sopenharmony_ci {64, 16384, 4, 67}, 1168c2ecf20Sopenharmony_ci {32, 8192, 3, 51}, 1178c2ecf20Sopenharmony_ci {16, 4096, 2, 35}, 1188c2ecf20Sopenharmony_ci {8, 2048, 1, 19}, 1198c2ecf20Sopenharmony_ci {4, 1024, 0, 3} 1208c2ecf20Sopenharmony_ci}; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic struct agp_bridge_driver sis_driver = { 1238c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 1248c2ecf20Sopenharmony_ci .aperture_sizes = sis_generic_sizes, 1258c2ecf20Sopenharmony_ci .size_type = U8_APER_SIZE, 1268c2ecf20Sopenharmony_ci .num_aperture_sizes = 7, 1278c2ecf20Sopenharmony_ci .needs_scratch_page = true, 1288c2ecf20Sopenharmony_ci .configure = sis_configure, 1298c2ecf20Sopenharmony_ci .fetch_size = sis_fetch_size, 1308c2ecf20Sopenharmony_ci .cleanup = sis_cleanup, 1318c2ecf20Sopenharmony_ci .tlb_flush = sis_tlbflush, 1328c2ecf20Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 1338c2ecf20Sopenharmony_ci .masks = NULL, 1348c2ecf20Sopenharmony_ci .agp_enable = agp_generic_enable, 1358c2ecf20Sopenharmony_ci .cache_flush = global_cache_flush, 1368c2ecf20Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 1378c2ecf20Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 1388c2ecf20Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 1398c2ecf20Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 1408c2ecf20Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 1418c2ecf20Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 1428c2ecf20Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 1438c2ecf20Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 1448c2ecf20Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 1458c2ecf20Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 1468c2ecf20Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 1478c2ecf20Sopenharmony_ci}; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci// chipsets that require the 'delay hack' 1508c2ecf20Sopenharmony_cistatic int sis_broken_chipsets[] = { 1518c2ecf20Sopenharmony_ci PCI_DEVICE_ID_SI_648, 1528c2ecf20Sopenharmony_ci PCI_DEVICE_ID_SI_746, 1538c2ecf20Sopenharmony_ci 0 // terminator 1548c2ecf20Sopenharmony_ci}; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistatic void sis_get_driver(struct agp_bridge_data *bridge) 1578c2ecf20Sopenharmony_ci{ 1588c2ecf20Sopenharmony_ci int i; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci for (i=0; sis_broken_chipsets[i]!=0; ++i) 1618c2ecf20Sopenharmony_ci if (bridge->dev->device==sis_broken_chipsets[i]) 1628c2ecf20Sopenharmony_ci break; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci if (sis_broken_chipsets[i] || agp_sis_force_delay) 1658c2ecf20Sopenharmony_ci sis_driver.agp_enable=sis_delayed_enable; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci // sis chipsets that indicate less than agp3.5 1688c2ecf20Sopenharmony_ci // are not actually fully agp3 compliant 1698c2ecf20Sopenharmony_ci if ((agp_bridge->major_version == 3 && agp_bridge->minor_version >= 5 1708c2ecf20Sopenharmony_ci && agp_sis_agp_spec!=0) || agp_sis_agp_spec==1) { 1718c2ecf20Sopenharmony_ci sis_driver.aperture_sizes = agp3_generic_sizes; 1728c2ecf20Sopenharmony_ci sis_driver.size_type = U16_APER_SIZE; 1738c2ecf20Sopenharmony_ci sis_driver.num_aperture_sizes = AGP_GENERIC_SIZES_ENTRIES; 1748c2ecf20Sopenharmony_ci sis_driver.configure = agp3_generic_configure; 1758c2ecf20Sopenharmony_ci sis_driver.fetch_size = agp3_generic_fetch_size; 1768c2ecf20Sopenharmony_ci sis_driver.cleanup = agp3_generic_cleanup; 1778c2ecf20Sopenharmony_ci sis_driver.tlb_flush = agp3_generic_tlbflush; 1788c2ecf20Sopenharmony_ci } 1798c2ecf20Sopenharmony_ci} 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_cistatic int agp_sis_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 1838c2ecf20Sopenharmony_ci{ 1848c2ecf20Sopenharmony_ci struct agp_bridge_data *bridge; 1858c2ecf20Sopenharmony_ci u8 cap_ptr; 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 1888c2ecf20Sopenharmony_ci if (!cap_ptr) 1898c2ecf20Sopenharmony_ci return -ENODEV; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci dev_info(&pdev->dev, "SiS chipset [%04x/%04x]\n", 1938c2ecf20Sopenharmony_ci pdev->vendor, pdev->device); 1948c2ecf20Sopenharmony_ci bridge = agp_alloc_bridge(); 1958c2ecf20Sopenharmony_ci if (!bridge) 1968c2ecf20Sopenharmony_ci return -ENOMEM; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci bridge->driver = &sis_driver; 1998c2ecf20Sopenharmony_ci bridge->dev = pdev; 2008c2ecf20Sopenharmony_ci bridge->capndx = cap_ptr; 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci get_agp_version(bridge); 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci /* Fill in the mode register */ 2058c2ecf20Sopenharmony_ci pci_read_config_dword(pdev, bridge->capndx+PCI_AGP_STATUS, &bridge->mode); 2068c2ecf20Sopenharmony_ci sis_get_driver(bridge); 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci pci_set_drvdata(pdev, bridge); 2098c2ecf20Sopenharmony_ci return agp_add_bridge(bridge); 2108c2ecf20Sopenharmony_ci} 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistatic void agp_sis_remove(struct pci_dev *pdev) 2138c2ecf20Sopenharmony_ci{ 2148c2ecf20Sopenharmony_ci struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci agp_remove_bridge(bridge); 2178c2ecf20Sopenharmony_ci agp_put_bridge(bridge); 2188c2ecf20Sopenharmony_ci} 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_cistatic int agp_sis_suspend(struct pci_dev *pdev, pm_message_t state) 2238c2ecf20Sopenharmony_ci{ 2248c2ecf20Sopenharmony_ci pci_save_state(pdev); 2258c2ecf20Sopenharmony_ci pci_set_power_state(pdev, pci_choose_state(pdev, state)); 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci return 0; 2288c2ecf20Sopenharmony_ci} 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic int agp_sis_resume(struct pci_dev *pdev) 2318c2ecf20Sopenharmony_ci{ 2328c2ecf20Sopenharmony_ci pci_set_power_state(pdev, PCI_D0); 2338c2ecf20Sopenharmony_ci pci_restore_state(pdev); 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci return sis_driver.configure(); 2368c2ecf20Sopenharmony_ci} 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci#endif /* CONFIG_PM */ 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_cistatic const struct pci_device_id agp_sis_pci_table[] = { 2418c2ecf20Sopenharmony_ci { 2428c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2438c2ecf20Sopenharmony_ci .class_mask = ~0, 2448c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2458c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_5591, 2468c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2478c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2488c2ecf20Sopenharmony_ci }, 2498c2ecf20Sopenharmony_ci { 2508c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2518c2ecf20Sopenharmony_ci .class_mask = ~0, 2528c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2538c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_530, 2548c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2558c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2568c2ecf20Sopenharmony_ci }, 2578c2ecf20Sopenharmony_ci { 2588c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2598c2ecf20Sopenharmony_ci .class_mask = ~0, 2608c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2618c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_540, 2628c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2638c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2648c2ecf20Sopenharmony_ci }, 2658c2ecf20Sopenharmony_ci { 2668c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2678c2ecf20Sopenharmony_ci .class_mask = ~0, 2688c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2698c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_550, 2708c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2718c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2728c2ecf20Sopenharmony_ci }, 2738c2ecf20Sopenharmony_ci { 2748c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2758c2ecf20Sopenharmony_ci .class_mask = ~0, 2768c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2778c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_620, 2788c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2798c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2808c2ecf20Sopenharmony_ci }, 2818c2ecf20Sopenharmony_ci { 2828c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2838c2ecf20Sopenharmony_ci .class_mask = ~0, 2848c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2858c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_630, 2868c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2878c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2888c2ecf20Sopenharmony_ci }, 2898c2ecf20Sopenharmony_ci { 2908c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2918c2ecf20Sopenharmony_ci .class_mask = ~0, 2928c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 2938c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_635, 2948c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 2958c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 2968c2ecf20Sopenharmony_ci }, 2978c2ecf20Sopenharmony_ci { 2988c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 2998c2ecf20Sopenharmony_ci .class_mask = ~0, 3008c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3018c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_645, 3028c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3038c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3048c2ecf20Sopenharmony_ci }, 3058c2ecf20Sopenharmony_ci { 3068c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3078c2ecf20Sopenharmony_ci .class_mask = ~0, 3088c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3098c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_646, 3108c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3118c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3128c2ecf20Sopenharmony_ci }, 3138c2ecf20Sopenharmony_ci { 3148c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3158c2ecf20Sopenharmony_ci .class_mask = ~0, 3168c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3178c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_648, 3188c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3198c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3208c2ecf20Sopenharmony_ci }, 3218c2ecf20Sopenharmony_ci { 3228c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3238c2ecf20Sopenharmony_ci .class_mask = ~0, 3248c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3258c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_650, 3268c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3278c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3288c2ecf20Sopenharmony_ci }, 3298c2ecf20Sopenharmony_ci { 3308c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3318c2ecf20Sopenharmony_ci .class_mask = ~0, 3328c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3338c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_651, 3348c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3358c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3368c2ecf20Sopenharmony_ci }, 3378c2ecf20Sopenharmony_ci { 3388c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3398c2ecf20Sopenharmony_ci .class_mask = ~0, 3408c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3418c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_655, 3428c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3438c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3448c2ecf20Sopenharmony_ci }, 3458c2ecf20Sopenharmony_ci { 3468c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3478c2ecf20Sopenharmony_ci .class_mask = ~0, 3488c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3498c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_661, 3508c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3518c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3528c2ecf20Sopenharmony_ci }, 3538c2ecf20Sopenharmony_ci { 3548c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3558c2ecf20Sopenharmony_ci .class_mask = ~0, 3568c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3578c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_662, 3588c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3598c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3608c2ecf20Sopenharmony_ci }, 3618c2ecf20Sopenharmony_ci { 3628c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3638c2ecf20Sopenharmony_ci .class_mask = ~0, 3648c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3658c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_671, 3668c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3678c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3688c2ecf20Sopenharmony_ci }, 3698c2ecf20Sopenharmony_ci { 3708c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3718c2ecf20Sopenharmony_ci .class_mask = ~0, 3728c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3738c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_730, 3748c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3758c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3768c2ecf20Sopenharmony_ci }, 3778c2ecf20Sopenharmony_ci { 3788c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3798c2ecf20Sopenharmony_ci .class_mask = ~0, 3808c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3818c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_735, 3828c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3838c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3848c2ecf20Sopenharmony_ci }, 3858c2ecf20Sopenharmony_ci { 3868c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3878c2ecf20Sopenharmony_ci .class_mask = ~0, 3888c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3898c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_740, 3908c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3918c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 3928c2ecf20Sopenharmony_ci }, 3938c2ecf20Sopenharmony_ci { 3948c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 3958c2ecf20Sopenharmony_ci .class_mask = ~0, 3968c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 3978c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_741, 3988c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 3998c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 4008c2ecf20Sopenharmony_ci }, 4018c2ecf20Sopenharmony_ci { 4028c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 4038c2ecf20Sopenharmony_ci .class_mask = ~0, 4048c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 4058c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_745, 4068c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 4078c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 4088c2ecf20Sopenharmony_ci }, 4098c2ecf20Sopenharmony_ci { 4108c2ecf20Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), 4118c2ecf20Sopenharmony_ci .class_mask = ~0, 4128c2ecf20Sopenharmony_ci .vendor = PCI_VENDOR_ID_SI, 4138c2ecf20Sopenharmony_ci .device = PCI_DEVICE_ID_SI_746, 4148c2ecf20Sopenharmony_ci .subvendor = PCI_ANY_ID, 4158c2ecf20Sopenharmony_ci .subdevice = PCI_ANY_ID, 4168c2ecf20Sopenharmony_ci }, 4178c2ecf20Sopenharmony_ci { } 4188c2ecf20Sopenharmony_ci}; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci, agp_sis_pci_table); 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_cistatic struct pci_driver agp_sis_pci_driver = { 4238c2ecf20Sopenharmony_ci .name = "agpgart-sis", 4248c2ecf20Sopenharmony_ci .id_table = agp_sis_pci_table, 4258c2ecf20Sopenharmony_ci .probe = agp_sis_probe, 4268c2ecf20Sopenharmony_ci .remove = agp_sis_remove, 4278c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 4288c2ecf20Sopenharmony_ci .suspend = agp_sis_suspend, 4298c2ecf20Sopenharmony_ci .resume = agp_sis_resume, 4308c2ecf20Sopenharmony_ci#endif 4318c2ecf20Sopenharmony_ci}; 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_cistatic int __init agp_sis_init(void) 4348c2ecf20Sopenharmony_ci{ 4358c2ecf20Sopenharmony_ci if (agp_off) 4368c2ecf20Sopenharmony_ci return -EINVAL; 4378c2ecf20Sopenharmony_ci return pci_register_driver(&agp_sis_pci_driver); 4388c2ecf20Sopenharmony_ci} 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_cistatic void __exit agp_sis_cleanup(void) 4418c2ecf20Sopenharmony_ci{ 4428c2ecf20Sopenharmony_ci pci_unregister_driver(&agp_sis_pci_driver); 4438c2ecf20Sopenharmony_ci} 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_cimodule_init(agp_sis_init); 4468c2ecf20Sopenharmony_cimodule_exit(agp_sis_cleanup); 4478c2ecf20Sopenharmony_ci 4488c2ecf20Sopenharmony_cimodule_param(agp_sis_force_delay, bool, 0); 4498c2ecf20Sopenharmony_ciMODULE_PARM_DESC(agp_sis_force_delay,"forces sis delay hack"); 4508c2ecf20Sopenharmony_cimodule_param(agp_sis_agp_spec, int, 0); 4518c2ecf20Sopenharmony_ciMODULE_PARM_DESC(agp_sis_agp_spec,"0=force sis init, 1=force generic agp3 init, default: autodetect"); 4528c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL and additional rights"); 453