162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Intel AGPGART routines. 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/module.h> 662306a36Sopenharmony_ci#include <linux/pci.h> 762306a36Sopenharmony_ci#include <linux/slab.h> 862306a36Sopenharmony_ci#include <linux/init.h> 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/pagemap.h> 1162306a36Sopenharmony_ci#include <linux/agp_backend.h> 1262306a36Sopenharmony_ci#include <asm/smp.h> 1362306a36Sopenharmony_ci#include "agp.h" 1462306a36Sopenharmony_ci#include "intel-agp.h" 1562306a36Sopenharmony_ci#include <drm/intel-gtt.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic int intel_fetch_size(void) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci int i; 2062306a36Sopenharmony_ci u16 temp; 2162306a36Sopenharmony_ci struct aper_size_info_16 *values; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp); 2462306a36Sopenharmony_ci values = A_SIZE_16(agp_bridge->driver->aperture_sizes); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 2762306a36Sopenharmony_ci if (temp == values[i].size_value) { 2862306a36Sopenharmony_ci agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i); 2962306a36Sopenharmony_ci agp_bridge->aperture_size_idx = i; 3062306a36Sopenharmony_ci return values[i].size; 3162306a36Sopenharmony_ci } 3262306a36Sopenharmony_ci } 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return 0; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic int __intel_8xx_fetch_size(u8 temp) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci int i; 4062306a36Sopenharmony_ci struct aper_size_info_8 *values; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci values = A_SIZE_8(agp_bridge->driver->aperture_sizes); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) { 4562306a36Sopenharmony_ci if (temp == values[i].size_value) { 4662306a36Sopenharmony_ci agp_bridge->previous_size = 4762306a36Sopenharmony_ci agp_bridge->current_size = (void *) (values + i); 4862306a36Sopenharmony_ci agp_bridge->aperture_size_idx = i; 4962306a36Sopenharmony_ci return values[i].size; 5062306a36Sopenharmony_ci } 5162306a36Sopenharmony_ci } 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic int intel_8xx_fetch_size(void) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci u8 temp; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp); 6062306a36Sopenharmony_ci return __intel_8xx_fetch_size(temp); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic int intel_815_fetch_size(void) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci u8 temp; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* Intel 815 chipsets have a _weird_ APSIZE register with only 6862306a36Sopenharmony_ci * one non-reserved bit, so mask the others out ... */ 6962306a36Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp); 7062306a36Sopenharmony_ci temp &= (1 << 3); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci return __intel_8xx_fetch_size(temp); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic void intel_tlbflush(struct agp_memory *mem) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200); 7862306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic void intel_8xx_tlbflush(struct agp_memory *mem) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci u32 temp; 8562306a36Sopenharmony_ci pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp); 8662306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7)); 8762306a36Sopenharmony_ci pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp); 8862306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7)); 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic void intel_cleanup(void) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci u16 temp; 9562306a36Sopenharmony_ci struct aper_size_info_16 *previous_size; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci previous_size = A_SIZE_16(agp_bridge->previous_size); 9862306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp); 9962306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9)); 10062306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic void intel_8xx_cleanup(void) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci u16 temp; 10762306a36Sopenharmony_ci struct aper_size_info_8 *previous_size; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci previous_size = A_SIZE_8(agp_bridge->previous_size); 11062306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp); 11162306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9)); 11262306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value); 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistatic int intel_configure(void) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci u16 temp2; 11962306a36Sopenharmony_ci struct aper_size_info_16 *current_size; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci current_size = A_SIZE_16(agp_bridge->current_size); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci /* aperture size */ 12462306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci /* address to map to */ 12762306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 12862306a36Sopenharmony_ci AGP_APERTURE_BAR); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci /* attbase - aperture base */ 13162306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci /* agpctrl */ 13462306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci /* paccfg/nbxcfg */ 13762306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2); 13862306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, 13962306a36Sopenharmony_ci (temp2 & ~(1 << 10)) | (1 << 9)); 14062306a36Sopenharmony_ci /* clear any possible error conditions */ 14162306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7); 14262306a36Sopenharmony_ci return 0; 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic int intel_815_configure(void) 14662306a36Sopenharmony_ci{ 14762306a36Sopenharmony_ci u32 addr; 14862306a36Sopenharmony_ci u8 temp2; 14962306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci /* attbase - aperture base */ 15262306a36Sopenharmony_ci /* the Intel 815 chipset spec. says that bits 29-31 in the 15362306a36Sopenharmony_ci * ATTBASE register are reserved -> try not to write them */ 15462306a36Sopenharmony_ci if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) { 15562306a36Sopenharmony_ci dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high"); 15662306a36Sopenharmony_ci return -EINVAL; 15762306a36Sopenharmony_ci } 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci /* aperture size */ 16262306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, 16362306a36Sopenharmony_ci current_size->size_value); 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci /* address to map to */ 16662306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 16762306a36Sopenharmony_ci AGP_APERTURE_BAR); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr); 17062306a36Sopenharmony_ci addr &= INTEL_815_ATTBASE_MASK; 17162306a36Sopenharmony_ci addr |= agp_bridge->gatt_bus_addr; 17262306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci /* agpctrl */ 17562306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* apcont */ 17862306a36Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2); 17962306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1)); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* clear any possible error conditions */ 18262306a36Sopenharmony_ci /* Oddness : this chipset seems to have no ERRSTS register ! */ 18362306a36Sopenharmony_ci return 0; 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic void intel_820_tlbflush(struct agp_memory *mem) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci return; 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic void intel_820_cleanup(void) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci u8 temp; 19462306a36Sopenharmony_ci struct aper_size_info_8 *previous_size; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci previous_size = A_SIZE_8(agp_bridge->previous_size); 19762306a36Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp); 19862306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, 19962306a36Sopenharmony_ci temp & ~(1 << 1)); 20062306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, 20162306a36Sopenharmony_ci previous_size->size_value); 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic int intel_820_configure(void) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci u8 temp2; 20862306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci /* aperture size */ 21362306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci /* address to map to */ 21662306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 21762306a36Sopenharmony_ci AGP_APERTURE_BAR); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci /* attbase - aperture base */ 22062306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* agpctrl */ 22362306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci /* global enable aperture access */ 22662306a36Sopenharmony_ci /* This flag is not accessed through MCHCFG register as in */ 22762306a36Sopenharmony_ci /* i850 chipset. */ 22862306a36Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2); 22962306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1)); 23062306a36Sopenharmony_ci /* clear any possible AGP-related error conditions */ 23162306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c); 23262306a36Sopenharmony_ci return 0; 23362306a36Sopenharmony_ci} 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic int intel_840_configure(void) 23662306a36Sopenharmony_ci{ 23762306a36Sopenharmony_ci u16 temp2; 23862306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci /* aperture size */ 24362306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* address to map to */ 24662306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 24762306a36Sopenharmony_ci AGP_APERTURE_BAR); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci /* attbase - aperture base */ 25062306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci /* agpctrl */ 25362306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* mcgcfg */ 25662306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2); 25762306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9)); 25862306a36Sopenharmony_ci /* clear any possible error conditions */ 25962306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000); 26062306a36Sopenharmony_ci return 0; 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistatic int intel_845_configure(void) 26462306a36Sopenharmony_ci{ 26562306a36Sopenharmony_ci u8 temp2; 26662306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci /* aperture size */ 27162306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci if (agp_bridge->apbase_config != 0) { 27462306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, AGP_APBASE, 27562306a36Sopenharmony_ci agp_bridge->apbase_config); 27662306a36Sopenharmony_ci } else { 27762306a36Sopenharmony_ci /* address to map to */ 27862306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 27962306a36Sopenharmony_ci AGP_APERTURE_BAR); 28062306a36Sopenharmony_ci agp_bridge->apbase_config = agp_bridge->gart_bus_addr; 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci /* attbase - aperture base */ 28462306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci /* agpctrl */ 28762306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci /* agpm */ 29062306a36Sopenharmony_ci pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2); 29162306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1)); 29262306a36Sopenharmony_ci /* clear any possible error conditions */ 29362306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c); 29462306a36Sopenharmony_ci return 0; 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistatic int intel_850_configure(void) 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci u16 temp2; 30062306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci /* aperture size */ 30562306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci /* address to map to */ 30862306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 30962306a36Sopenharmony_ci AGP_APERTURE_BAR); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci /* attbase - aperture base */ 31262306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci /* agpctrl */ 31562306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci /* mcgcfg */ 31862306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2); 31962306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9)); 32062306a36Sopenharmony_ci /* clear any possible AGP-related error conditions */ 32162306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c); 32262306a36Sopenharmony_ci return 0; 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic int intel_860_configure(void) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci u16 temp2; 32862306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci /* aperture size */ 33362306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci /* address to map to */ 33662306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 33762306a36Sopenharmony_ci AGP_APERTURE_BAR); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci /* attbase - aperture base */ 34062306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci /* agpctrl */ 34362306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci /* mcgcfg */ 34662306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2); 34762306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9)); 34862306a36Sopenharmony_ci /* clear any possible AGP-related error conditions */ 34962306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700); 35062306a36Sopenharmony_ci return 0; 35162306a36Sopenharmony_ci} 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistatic int intel_830mp_configure(void) 35462306a36Sopenharmony_ci{ 35562306a36Sopenharmony_ci u16 temp2; 35662306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci /* aperture size */ 36162306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci /* address to map to */ 36462306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 36562306a36Sopenharmony_ci AGP_APERTURE_BAR); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci /* attbase - aperture base */ 36862306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci /* agpctrl */ 37162306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci /* gmch */ 37462306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2); 37562306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9)); 37662306a36Sopenharmony_ci /* clear any possible AGP-related error conditions */ 37762306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c); 37862306a36Sopenharmony_ci return 0; 37962306a36Sopenharmony_ci} 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistatic int intel_7505_configure(void) 38262306a36Sopenharmony_ci{ 38362306a36Sopenharmony_ci u16 temp2; 38462306a36Sopenharmony_ci struct aper_size_info_8 *current_size; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci current_size = A_SIZE_8(agp_bridge->current_size); 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci /* aperture size */ 38962306a36Sopenharmony_ci pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci /* address to map to */ 39262306a36Sopenharmony_ci agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev, 39362306a36Sopenharmony_ci AGP_APERTURE_BAR); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci /* attbase - aperture base */ 39662306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci /* agpctrl */ 39962306a36Sopenharmony_ci pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci /* mchcfg */ 40262306a36Sopenharmony_ci pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2); 40362306a36Sopenharmony_ci pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9)); 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci return 0; 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* Setup function */ 40962306a36Sopenharmony_cistatic const struct gatt_mask intel_generic_masks[] = 41062306a36Sopenharmony_ci{ 41162306a36Sopenharmony_ci {.mask = 0x00000017, .type = 0} 41262306a36Sopenharmony_ci}; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_cistatic const struct aper_size_info_8 intel_815_sizes[2] = 41562306a36Sopenharmony_ci{ 41662306a36Sopenharmony_ci {64, 16384, 4, 0}, 41762306a36Sopenharmony_ci {32, 8192, 3, 8}, 41862306a36Sopenharmony_ci}; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic const struct aper_size_info_8 intel_8xx_sizes[7] = 42162306a36Sopenharmony_ci{ 42262306a36Sopenharmony_ci {256, 65536, 6, 0}, 42362306a36Sopenharmony_ci {128, 32768, 5, 32}, 42462306a36Sopenharmony_ci {64, 16384, 4, 48}, 42562306a36Sopenharmony_ci {32, 8192, 3, 56}, 42662306a36Sopenharmony_ci {16, 4096, 2, 60}, 42762306a36Sopenharmony_ci {8, 2048, 1, 62}, 42862306a36Sopenharmony_ci {4, 1024, 0, 63} 42962306a36Sopenharmony_ci}; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_cistatic const struct aper_size_info_16 intel_generic_sizes[7] = 43262306a36Sopenharmony_ci{ 43362306a36Sopenharmony_ci {256, 65536, 6, 0}, 43462306a36Sopenharmony_ci {128, 32768, 5, 32}, 43562306a36Sopenharmony_ci {64, 16384, 4, 48}, 43662306a36Sopenharmony_ci {32, 8192, 3, 56}, 43762306a36Sopenharmony_ci {16, 4096, 2, 60}, 43862306a36Sopenharmony_ci {8, 2048, 1, 62}, 43962306a36Sopenharmony_ci {4, 1024, 0, 63} 44062306a36Sopenharmony_ci}; 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cistatic const struct aper_size_info_8 intel_830mp_sizes[4] = 44362306a36Sopenharmony_ci{ 44462306a36Sopenharmony_ci {256, 65536, 6, 0}, 44562306a36Sopenharmony_ci {128, 32768, 5, 32}, 44662306a36Sopenharmony_ci {64, 16384, 4, 48}, 44762306a36Sopenharmony_ci {32, 8192, 3, 56} 44862306a36Sopenharmony_ci}; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_generic_driver = { 45162306a36Sopenharmony_ci .owner = THIS_MODULE, 45262306a36Sopenharmony_ci .aperture_sizes = intel_generic_sizes, 45362306a36Sopenharmony_ci .size_type = U16_APER_SIZE, 45462306a36Sopenharmony_ci .num_aperture_sizes = 7, 45562306a36Sopenharmony_ci .needs_scratch_page = true, 45662306a36Sopenharmony_ci .configure = intel_configure, 45762306a36Sopenharmony_ci .fetch_size = intel_fetch_size, 45862306a36Sopenharmony_ci .cleanup = intel_cleanup, 45962306a36Sopenharmony_ci .tlb_flush = intel_tlbflush, 46062306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 46162306a36Sopenharmony_ci .masks = intel_generic_masks, 46262306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 46362306a36Sopenharmony_ci .cache_flush = global_cache_flush, 46462306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 46562306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 46662306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 46762306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 46862306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 46962306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 47062306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 47162306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 47262306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 47362306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 47462306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 47562306a36Sopenharmony_ci}; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_815_driver = { 47862306a36Sopenharmony_ci .owner = THIS_MODULE, 47962306a36Sopenharmony_ci .aperture_sizes = intel_815_sizes, 48062306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 48162306a36Sopenharmony_ci .num_aperture_sizes = 2, 48262306a36Sopenharmony_ci .needs_scratch_page = true, 48362306a36Sopenharmony_ci .configure = intel_815_configure, 48462306a36Sopenharmony_ci .fetch_size = intel_815_fetch_size, 48562306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 48662306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 48762306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 48862306a36Sopenharmony_ci .masks = intel_generic_masks, 48962306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 49062306a36Sopenharmony_ci .cache_flush = global_cache_flush, 49162306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 49262306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 49362306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 49462306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 49562306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 49662306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 49762306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 49862306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 49962306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 50062306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 50162306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 50262306a36Sopenharmony_ci}; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_820_driver = { 50562306a36Sopenharmony_ci .owner = THIS_MODULE, 50662306a36Sopenharmony_ci .aperture_sizes = intel_8xx_sizes, 50762306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 50862306a36Sopenharmony_ci .num_aperture_sizes = 7, 50962306a36Sopenharmony_ci .needs_scratch_page = true, 51062306a36Sopenharmony_ci .configure = intel_820_configure, 51162306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 51262306a36Sopenharmony_ci .cleanup = intel_820_cleanup, 51362306a36Sopenharmony_ci .tlb_flush = intel_820_tlbflush, 51462306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 51562306a36Sopenharmony_ci .masks = intel_generic_masks, 51662306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 51762306a36Sopenharmony_ci .cache_flush = global_cache_flush, 51862306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 51962306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 52062306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 52162306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 52262306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 52362306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 52462306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 52562306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 52662306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 52762306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 52862306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 52962306a36Sopenharmony_ci}; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_830mp_driver = { 53262306a36Sopenharmony_ci .owner = THIS_MODULE, 53362306a36Sopenharmony_ci .aperture_sizes = intel_830mp_sizes, 53462306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 53562306a36Sopenharmony_ci .num_aperture_sizes = 4, 53662306a36Sopenharmony_ci .needs_scratch_page = true, 53762306a36Sopenharmony_ci .configure = intel_830mp_configure, 53862306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 53962306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 54062306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 54162306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 54262306a36Sopenharmony_ci .masks = intel_generic_masks, 54362306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 54462306a36Sopenharmony_ci .cache_flush = global_cache_flush, 54562306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 54662306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 54762306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 54862306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 54962306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 55062306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 55162306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 55262306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 55362306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 55462306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 55562306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 55662306a36Sopenharmony_ci}; 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_840_driver = { 55962306a36Sopenharmony_ci .owner = THIS_MODULE, 56062306a36Sopenharmony_ci .aperture_sizes = intel_8xx_sizes, 56162306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 56262306a36Sopenharmony_ci .num_aperture_sizes = 7, 56362306a36Sopenharmony_ci .needs_scratch_page = true, 56462306a36Sopenharmony_ci .configure = intel_840_configure, 56562306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 56662306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 56762306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 56862306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 56962306a36Sopenharmony_ci .masks = intel_generic_masks, 57062306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 57162306a36Sopenharmony_ci .cache_flush = global_cache_flush, 57262306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 57362306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 57462306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 57562306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 57662306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 57762306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 57862306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 57962306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 58062306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 58162306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 58262306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 58362306a36Sopenharmony_ci}; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_845_driver = { 58662306a36Sopenharmony_ci .owner = THIS_MODULE, 58762306a36Sopenharmony_ci .aperture_sizes = intel_8xx_sizes, 58862306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 58962306a36Sopenharmony_ci .num_aperture_sizes = 7, 59062306a36Sopenharmony_ci .needs_scratch_page = true, 59162306a36Sopenharmony_ci .configure = intel_845_configure, 59262306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 59362306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 59462306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 59562306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 59662306a36Sopenharmony_ci .masks = intel_generic_masks, 59762306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 59862306a36Sopenharmony_ci .cache_flush = global_cache_flush, 59962306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 60062306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 60162306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 60262306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 60362306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 60462306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 60562306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 60662306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 60762306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 60862306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 60962306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 61062306a36Sopenharmony_ci}; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_850_driver = { 61362306a36Sopenharmony_ci .owner = THIS_MODULE, 61462306a36Sopenharmony_ci .aperture_sizes = intel_8xx_sizes, 61562306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 61662306a36Sopenharmony_ci .num_aperture_sizes = 7, 61762306a36Sopenharmony_ci .needs_scratch_page = true, 61862306a36Sopenharmony_ci .configure = intel_850_configure, 61962306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 62062306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 62162306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 62262306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 62362306a36Sopenharmony_ci .masks = intel_generic_masks, 62462306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 62562306a36Sopenharmony_ci .cache_flush = global_cache_flush, 62662306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 62762306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 62862306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 62962306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 63062306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 63162306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 63262306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 63362306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 63462306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 63562306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 63662306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 63762306a36Sopenharmony_ci}; 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_860_driver = { 64062306a36Sopenharmony_ci .owner = THIS_MODULE, 64162306a36Sopenharmony_ci .aperture_sizes = intel_8xx_sizes, 64262306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 64362306a36Sopenharmony_ci .num_aperture_sizes = 7, 64462306a36Sopenharmony_ci .needs_scratch_page = true, 64562306a36Sopenharmony_ci .configure = intel_860_configure, 64662306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 64762306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 64862306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 64962306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 65062306a36Sopenharmony_ci .masks = intel_generic_masks, 65162306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 65262306a36Sopenharmony_ci .cache_flush = global_cache_flush, 65362306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 65462306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 65562306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 65662306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 65762306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 65862306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 65962306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 66062306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 66162306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 66262306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 66362306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 66462306a36Sopenharmony_ci}; 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_cistatic const struct agp_bridge_driver intel_7505_driver = { 66762306a36Sopenharmony_ci .owner = THIS_MODULE, 66862306a36Sopenharmony_ci .aperture_sizes = intel_8xx_sizes, 66962306a36Sopenharmony_ci .size_type = U8_APER_SIZE, 67062306a36Sopenharmony_ci .num_aperture_sizes = 7, 67162306a36Sopenharmony_ci .needs_scratch_page = true, 67262306a36Sopenharmony_ci .configure = intel_7505_configure, 67362306a36Sopenharmony_ci .fetch_size = intel_8xx_fetch_size, 67462306a36Sopenharmony_ci .cleanup = intel_8xx_cleanup, 67562306a36Sopenharmony_ci .tlb_flush = intel_8xx_tlbflush, 67662306a36Sopenharmony_ci .mask_memory = agp_generic_mask_memory, 67762306a36Sopenharmony_ci .masks = intel_generic_masks, 67862306a36Sopenharmony_ci .agp_enable = agp_generic_enable, 67962306a36Sopenharmony_ci .cache_flush = global_cache_flush, 68062306a36Sopenharmony_ci .create_gatt_table = agp_generic_create_gatt_table, 68162306a36Sopenharmony_ci .free_gatt_table = agp_generic_free_gatt_table, 68262306a36Sopenharmony_ci .insert_memory = agp_generic_insert_memory, 68362306a36Sopenharmony_ci .remove_memory = agp_generic_remove_memory, 68462306a36Sopenharmony_ci .alloc_by_type = agp_generic_alloc_by_type, 68562306a36Sopenharmony_ci .free_by_type = agp_generic_free_by_type, 68662306a36Sopenharmony_ci .agp_alloc_page = agp_generic_alloc_page, 68762306a36Sopenharmony_ci .agp_alloc_pages = agp_generic_alloc_pages, 68862306a36Sopenharmony_ci .agp_destroy_page = agp_generic_destroy_page, 68962306a36Sopenharmony_ci .agp_destroy_pages = agp_generic_destroy_pages, 69062306a36Sopenharmony_ci .agp_type_to_mask_type = agp_generic_type_to_mask_type, 69162306a36Sopenharmony_ci}; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci/* Table to describe Intel GMCH and AGP/PCIE GART drivers. At least one of 69462306a36Sopenharmony_ci * driver and gmch_driver must be non-null, and find_gmch will determine 69562306a36Sopenharmony_ci * which one should be used if a gmch_chip_id is present. 69662306a36Sopenharmony_ci */ 69762306a36Sopenharmony_cistatic const struct intel_agp_driver_description { 69862306a36Sopenharmony_ci unsigned int chip_id; 69962306a36Sopenharmony_ci char *name; 70062306a36Sopenharmony_ci const struct agp_bridge_driver *driver; 70162306a36Sopenharmony_ci} intel_agp_chipsets[] = { 70262306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82443LX_0, "440LX", &intel_generic_driver }, 70362306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82443BX_0, "440BX", &intel_generic_driver }, 70462306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82443GX_0, "440GX", &intel_generic_driver }, 70562306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82815_MC, "i815", &intel_815_driver }, 70662306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82820_HB, "i820", &intel_820_driver }, 70762306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82820_UP_HB, "i820", &intel_820_driver }, 70862306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82830_HB, "830M", &intel_830mp_driver }, 70962306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82840_HB, "i840", &intel_840_driver }, 71062306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82845_HB, "i845", &intel_845_driver }, 71162306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82845G_HB, "845G", &intel_845_driver }, 71262306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82850_HB, "i850", &intel_850_driver }, 71362306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82854_HB, "854", &intel_845_driver }, 71462306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82855PM_HB, "855PM", &intel_845_driver }, 71562306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82855GM_HB, "855GM", &intel_845_driver }, 71662306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82860_HB, "i860", &intel_860_driver }, 71762306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82865_HB, "865", &intel_845_driver }, 71862306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_82875_HB, "i875", &intel_845_driver }, 71962306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_7505_0, "E7505", &intel_7505_driver }, 72062306a36Sopenharmony_ci { PCI_DEVICE_ID_INTEL_7205_0, "E7205", &intel_7505_driver }, 72162306a36Sopenharmony_ci { 0, NULL, NULL } 72262306a36Sopenharmony_ci}; 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_cistatic int agp_intel_probe(struct pci_dev *pdev, 72562306a36Sopenharmony_ci const struct pci_device_id *ent) 72662306a36Sopenharmony_ci{ 72762306a36Sopenharmony_ci struct agp_bridge_data *bridge; 72862306a36Sopenharmony_ci u8 cap_ptr = 0; 72962306a36Sopenharmony_ci struct resource *r; 73062306a36Sopenharmony_ci int i, err; 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci bridge = agp_alloc_bridge(); 73562306a36Sopenharmony_ci if (!bridge) 73662306a36Sopenharmony_ci return -ENOMEM; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci bridge->capndx = cap_ptr; 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci if (intel_gmch_probe(pdev, NULL, bridge)) 74162306a36Sopenharmony_ci goto found_gmch; 74262306a36Sopenharmony_ci 74362306a36Sopenharmony_ci for (i = 0; intel_agp_chipsets[i].name != NULL; i++) { 74462306a36Sopenharmony_ci /* In case that multiple models of gfx chip may 74562306a36Sopenharmony_ci stand on same host bridge type, this can be 74662306a36Sopenharmony_ci sure we detect the right IGD. */ 74762306a36Sopenharmony_ci if (pdev->device == intel_agp_chipsets[i].chip_id) { 74862306a36Sopenharmony_ci bridge->driver = intel_agp_chipsets[i].driver; 74962306a36Sopenharmony_ci break; 75062306a36Sopenharmony_ci } 75162306a36Sopenharmony_ci } 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci if (!bridge->driver) { 75462306a36Sopenharmony_ci if (cap_ptr) 75562306a36Sopenharmony_ci dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n", 75662306a36Sopenharmony_ci pdev->vendor, pdev->device); 75762306a36Sopenharmony_ci agp_put_bridge(bridge); 75862306a36Sopenharmony_ci return -ENODEV; 75962306a36Sopenharmony_ci } 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci bridge->dev = pdev; 76262306a36Sopenharmony_ci bridge->dev_private_data = NULL; 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name); 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci /* 76762306a36Sopenharmony_ci * The following fixes the case where the BIOS has "forgotten" to 76862306a36Sopenharmony_ci * provide an address range for the GART. 76962306a36Sopenharmony_ci * 20030610 - hamish@zot.org 77062306a36Sopenharmony_ci * This happens before pci_enable_device() intentionally; 77162306a36Sopenharmony_ci * calling pci_enable_device() before assigning the resource 77262306a36Sopenharmony_ci * will result in the GART being disabled on machines with such 77362306a36Sopenharmony_ci * BIOSs (the GART ends up with a BAR starting at 0, which 77462306a36Sopenharmony_ci * conflicts a lot of other devices). 77562306a36Sopenharmony_ci */ 77662306a36Sopenharmony_ci r = &pdev->resource[0]; 77762306a36Sopenharmony_ci if (!r->start && r->end) { 77862306a36Sopenharmony_ci if (pci_assign_resource(pdev, 0)) { 77962306a36Sopenharmony_ci dev_err(&pdev->dev, "can't assign resource 0\n"); 78062306a36Sopenharmony_ci agp_put_bridge(bridge); 78162306a36Sopenharmony_ci return -ENODEV; 78262306a36Sopenharmony_ci } 78362306a36Sopenharmony_ci } 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci /* 78662306a36Sopenharmony_ci * If the device has not been properly setup, the following will catch 78762306a36Sopenharmony_ci * the problem and should stop the system from crashing. 78862306a36Sopenharmony_ci * 20030610 - hamish@zot.org 78962306a36Sopenharmony_ci */ 79062306a36Sopenharmony_ci if (pci_enable_device(pdev)) { 79162306a36Sopenharmony_ci dev_err(&pdev->dev, "can't enable PCI device\n"); 79262306a36Sopenharmony_ci agp_put_bridge(bridge); 79362306a36Sopenharmony_ci return -ENODEV; 79462306a36Sopenharmony_ci } 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci /* Fill in the mode register */ 79762306a36Sopenharmony_ci if (cap_ptr) { 79862306a36Sopenharmony_ci pci_read_config_dword(pdev, 79962306a36Sopenharmony_ci bridge->capndx+PCI_AGP_STATUS, 80062306a36Sopenharmony_ci &bridge->mode); 80162306a36Sopenharmony_ci } 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_cifound_gmch: 80462306a36Sopenharmony_ci pci_set_drvdata(pdev, bridge); 80562306a36Sopenharmony_ci err = agp_add_bridge(bridge); 80662306a36Sopenharmony_ci return err; 80762306a36Sopenharmony_ci} 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_cistatic void agp_intel_remove(struct pci_dev *pdev) 81062306a36Sopenharmony_ci{ 81162306a36Sopenharmony_ci struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci agp_remove_bridge(bridge); 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_ci intel_gmch_remove(); 81662306a36Sopenharmony_ci 81762306a36Sopenharmony_ci agp_put_bridge(bridge); 81862306a36Sopenharmony_ci} 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_cistatic int agp_intel_resume(struct device *dev) 82162306a36Sopenharmony_ci{ 82262306a36Sopenharmony_ci struct pci_dev *pdev = to_pci_dev(dev); 82362306a36Sopenharmony_ci struct agp_bridge_data *bridge = pci_get_drvdata(pdev); 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci bridge->driver->configure(); 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci return 0; 82862306a36Sopenharmony_ci} 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_cistatic const struct pci_device_id agp_intel_pci_table[] = { 83162306a36Sopenharmony_ci#define ID(x) \ 83262306a36Sopenharmony_ci { \ 83362306a36Sopenharmony_ci .class = (PCI_CLASS_BRIDGE_HOST << 8), \ 83462306a36Sopenharmony_ci .class_mask = ~0, \ 83562306a36Sopenharmony_ci .vendor = PCI_VENDOR_ID_INTEL, \ 83662306a36Sopenharmony_ci .device = x, \ 83762306a36Sopenharmony_ci .subvendor = PCI_ANY_ID, \ 83862306a36Sopenharmony_ci .subdevice = PCI_ANY_ID, \ 83962306a36Sopenharmony_ci } 84062306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82441), /* for HAS2 support */ 84162306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82443LX_0), 84262306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82443BX_0), 84362306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82443GX_0), 84462306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82810_MC1), 84562306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82810_MC3), 84662306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82810E_MC), 84762306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82815_MC), 84862306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82820_HB), 84962306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82820_UP_HB), 85062306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82830_HB), 85162306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82840_HB), 85262306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82845_HB), 85362306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82845G_HB), 85462306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82850_HB), 85562306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82854_HB), 85662306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82855PM_HB), 85762306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82855GM_HB), 85862306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82860_HB), 85962306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82865_HB), 86062306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82875_HB), 86162306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_7505_0), 86262306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_7205_0), 86362306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_E7221_HB), 86462306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82915G_HB), 86562306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82915GM_HB), 86662306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82945G_HB), 86762306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82945GM_HB), 86862306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82945GME_HB), 86962306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB), 87062306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB), 87162306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82946GZ_HB), 87262306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82G35_HB), 87362306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82965Q_HB), 87462306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82965G_HB), 87562306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82965GM_HB), 87662306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_82965GME_HB), 87762306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_G33_HB), 87862306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_Q35_HB), 87962306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_Q33_HB), 88062306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_GM45_HB), 88162306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB), 88262306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_Q45_HB), 88362306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_G45_HB), 88462306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_G41_HB), 88562306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_B43_HB), 88662306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_B43_1_HB), 88762306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB), 88862306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB), 88962306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB), 89062306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB), 89162306a36Sopenharmony_ci ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB), 89262306a36Sopenharmony_ci { } 89362306a36Sopenharmony_ci}; 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(pci, agp_intel_pci_table); 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_cistatic DEFINE_SIMPLE_DEV_PM_OPS(agp_intel_pm_ops, NULL, agp_intel_resume); 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_cistatic struct pci_driver agp_intel_pci_driver = { 90062306a36Sopenharmony_ci .name = "agpgart-intel", 90162306a36Sopenharmony_ci .id_table = agp_intel_pci_table, 90262306a36Sopenharmony_ci .probe = agp_intel_probe, 90362306a36Sopenharmony_ci .remove = agp_intel_remove, 90462306a36Sopenharmony_ci .driver.pm = &agp_intel_pm_ops, 90562306a36Sopenharmony_ci}; 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_cistatic int __init agp_intel_init(void) 90862306a36Sopenharmony_ci{ 90962306a36Sopenharmony_ci if (agp_off) 91062306a36Sopenharmony_ci return -EINVAL; 91162306a36Sopenharmony_ci return pci_register_driver(&agp_intel_pci_driver); 91262306a36Sopenharmony_ci} 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_cistatic void __exit agp_intel_cleanup(void) 91562306a36Sopenharmony_ci{ 91662306a36Sopenharmony_ci pci_unregister_driver(&agp_intel_pci_driver); 91762306a36Sopenharmony_ci} 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_cimodule_init(agp_intel_init); 92062306a36Sopenharmony_cimodule_exit(agp_intel_cleanup); 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ciMODULE_AUTHOR("Dave Jones, Various @Intel"); 92362306a36Sopenharmony_ciMODULE_LICENSE("GPL and additional rights"); 924