cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

intel-agp.c (28664B)


      1/*
      2 * Intel AGPGART routines.
      3 */
      4
      5#include <linux/module.h>
      6#include <linux/pci.h>
      7#include <linux/slab.h>
      8#include <linux/init.h>
      9#include <linux/kernel.h>
     10#include <linux/pagemap.h>
     11#include <linux/agp_backend.h>
     12#include <asm/smp.h>
     13#include "agp.h"
     14#include "intel-agp.h"
     15#include <drm/intel-gtt.h>
     16
     17static int intel_fetch_size(void)
     18{
     19	int i;
     20	u16 temp;
     21	struct aper_size_info_16 *values;
     22
     23	pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
     24	values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
     25
     26	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
     27		if (temp == values[i].size_value) {
     28			agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
     29			agp_bridge->aperture_size_idx = i;
     30			return values[i].size;
     31		}
     32	}
     33
     34	return 0;
     35}
     36
     37static int __intel_8xx_fetch_size(u8 temp)
     38{
     39	int i;
     40	struct aper_size_info_8 *values;
     41
     42	values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
     43
     44	for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
     45		if (temp == values[i].size_value) {
     46			agp_bridge->previous_size =
     47				agp_bridge->current_size = (void *) (values + i);
     48			agp_bridge->aperture_size_idx = i;
     49			return values[i].size;
     50		}
     51	}
     52	return 0;
     53}
     54
     55static int intel_8xx_fetch_size(void)
     56{
     57	u8 temp;
     58
     59	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
     60	return __intel_8xx_fetch_size(temp);
     61}
     62
     63static int intel_815_fetch_size(void)
     64{
     65	u8 temp;
     66
     67	/* Intel 815 chipsets have a _weird_ APSIZE register with only
     68	 * one non-reserved bit, so mask the others out ... */
     69	pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
     70	temp &= (1 << 3);
     71
     72	return __intel_8xx_fetch_size(temp);
     73}
     74
     75static void intel_tlbflush(struct agp_memory *mem)
     76{
     77	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
     78	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
     79}
     80
     81
     82static void intel_8xx_tlbflush(struct agp_memory *mem)
     83{
     84	u32 temp;
     85	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
     86	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
     87	pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
     88	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
     89}
     90
     91
     92static void intel_cleanup(void)
     93{
     94	u16 temp;
     95	struct aper_size_info_16 *previous_size;
     96
     97	previous_size = A_SIZE_16(agp_bridge->previous_size);
     98	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
     99	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
    100	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
    101}
    102
    103
    104static void intel_8xx_cleanup(void)
    105{
    106	u16 temp;
    107	struct aper_size_info_8 *previous_size;
    108
    109	previous_size = A_SIZE_8(agp_bridge->previous_size);
    110	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
    111	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
    112	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
    113}
    114
    115
    116static int intel_configure(void)
    117{
    118	u16 temp2;
    119	struct aper_size_info_16 *current_size;
    120
    121	current_size = A_SIZE_16(agp_bridge->current_size);
    122
    123	/* aperture size */
    124	pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    125
    126	/* address to map to */
    127	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    128						    AGP_APERTURE_BAR);
    129
    130	/* attbase - aperture base */
    131	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    132
    133	/* agpctrl */
    134	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
    135
    136	/* paccfg/nbxcfg */
    137	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
    138	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
    139			(temp2 & ~(1 << 10)) | (1 << 9));
    140	/* clear any possible error conditions */
    141	pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
    142	return 0;
    143}
    144
    145static int intel_815_configure(void)
    146{
    147	u32 addr;
    148	u8 temp2;
    149	struct aper_size_info_8 *current_size;
    150
    151	/* attbase - aperture base */
    152	/* the Intel 815 chipset spec. says that bits 29-31 in the
    153	* ATTBASE register are reserved -> try not to write them */
    154	if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
    155		dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high");
    156		return -EINVAL;
    157	}
    158
    159	current_size = A_SIZE_8(agp_bridge->current_size);
    160
    161	/* aperture size */
    162	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
    163			current_size->size_value);
    164
    165	/* address to map to */
    166	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    167						    AGP_APERTURE_BAR);
    168
    169	pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
    170	addr &= INTEL_815_ATTBASE_MASK;
    171	addr |= agp_bridge->gatt_bus_addr;
    172	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
    173
    174	/* agpctrl */
    175	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    176
    177	/* apcont */
    178	pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
    179	pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
    180
    181	/* clear any possible error conditions */
    182	/* Oddness : this chipset seems to have no ERRSTS register ! */
    183	return 0;
    184}
    185
    186static void intel_820_tlbflush(struct agp_memory *mem)
    187{
    188	return;
    189}
    190
    191static void intel_820_cleanup(void)
    192{
    193	u8 temp;
    194	struct aper_size_info_8 *previous_size;
    195
    196	previous_size = A_SIZE_8(agp_bridge->previous_size);
    197	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
    198	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
    199			temp & ~(1 << 1));
    200	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
    201			previous_size->size_value);
    202}
    203
    204
    205static int intel_820_configure(void)
    206{
    207	u8 temp2;
    208	struct aper_size_info_8 *current_size;
    209
    210	current_size = A_SIZE_8(agp_bridge->current_size);
    211
    212	/* aperture size */
    213	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    214
    215	/* address to map to */
    216	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    217						    AGP_APERTURE_BAR);
    218
    219	/* attbase - aperture base */
    220	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    221
    222	/* agpctrl */
    223	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    224
    225	/* global enable aperture access */
    226	/* This flag is not accessed through MCHCFG register as in */
    227	/* i850 chipset. */
    228	pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
    229	pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
    230	/* clear any possible AGP-related error conditions */
    231	pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
    232	return 0;
    233}
    234
    235static int intel_840_configure(void)
    236{
    237	u16 temp2;
    238	struct aper_size_info_8 *current_size;
    239
    240	current_size = A_SIZE_8(agp_bridge->current_size);
    241
    242	/* aperture size */
    243	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    244
    245	/* address to map to */
    246	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    247						    AGP_APERTURE_BAR);
    248
    249	/* attbase - aperture base */
    250	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    251
    252	/* agpctrl */
    253	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    254
    255	/* mcgcfg */
    256	pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
    257	pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
    258	/* clear any possible error conditions */
    259	pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
    260	return 0;
    261}
    262
    263static int intel_845_configure(void)
    264{
    265	u8 temp2;
    266	struct aper_size_info_8 *current_size;
    267
    268	current_size = A_SIZE_8(agp_bridge->current_size);
    269
    270	/* aperture size */
    271	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    272
    273	if (agp_bridge->apbase_config != 0) {
    274		pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
    275				       agp_bridge->apbase_config);
    276	} else {
    277		/* address to map to */
    278		agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    279							    AGP_APERTURE_BAR);
    280		agp_bridge->apbase_config = agp_bridge->gart_bus_addr;
    281	}
    282
    283	/* attbase - aperture base */
    284	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    285
    286	/* agpctrl */
    287	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    288
    289	/* agpm */
    290	pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
    291	pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
    292	/* clear any possible error conditions */
    293	pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
    294	return 0;
    295}
    296
    297static int intel_850_configure(void)
    298{
    299	u16 temp2;
    300	struct aper_size_info_8 *current_size;
    301
    302	current_size = A_SIZE_8(agp_bridge->current_size);
    303
    304	/* aperture size */
    305	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    306
    307	/* address to map to */
    308	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    309						    AGP_APERTURE_BAR);
    310
    311	/* attbase - aperture base */
    312	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    313
    314	/* agpctrl */
    315	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    316
    317	/* mcgcfg */
    318	pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
    319	pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
    320	/* clear any possible AGP-related error conditions */
    321	pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
    322	return 0;
    323}
    324
    325static int intel_860_configure(void)
    326{
    327	u16 temp2;
    328	struct aper_size_info_8 *current_size;
    329
    330	current_size = A_SIZE_8(agp_bridge->current_size);
    331
    332	/* aperture size */
    333	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    334
    335	/* address to map to */
    336	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    337						    AGP_APERTURE_BAR);
    338
    339	/* attbase - aperture base */
    340	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    341
    342	/* agpctrl */
    343	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    344
    345	/* mcgcfg */
    346	pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
    347	pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
    348	/* clear any possible AGP-related error conditions */
    349	pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
    350	return 0;
    351}
    352
    353static int intel_830mp_configure(void)
    354{
    355	u16 temp2;
    356	struct aper_size_info_8 *current_size;
    357
    358	current_size = A_SIZE_8(agp_bridge->current_size);
    359
    360	/* aperture size */
    361	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    362
    363	/* address to map to */
    364	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    365						    AGP_APERTURE_BAR);
    366
    367	/* attbase - aperture base */
    368	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    369
    370	/* agpctrl */
    371	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    372
    373	/* gmch */
    374	pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
    375	pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
    376	/* clear any possible AGP-related error conditions */
    377	pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
    378	return 0;
    379}
    380
    381static int intel_7505_configure(void)
    382{
    383	u16 temp2;
    384	struct aper_size_info_8 *current_size;
    385
    386	current_size = A_SIZE_8(agp_bridge->current_size);
    387
    388	/* aperture size */
    389	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
    390
    391	/* address to map to */
    392	agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
    393						    AGP_APERTURE_BAR);
    394
    395	/* attbase - aperture base */
    396	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
    397
    398	/* agpctrl */
    399	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
    400
    401	/* mchcfg */
    402	pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
    403	pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
    404
    405	return 0;
    406}
    407
    408/* Setup function */
    409static const struct gatt_mask intel_generic_masks[] =
    410{
    411	{.mask = 0x00000017, .type = 0}
    412};
    413
    414static const struct aper_size_info_8 intel_815_sizes[2] =
    415{
    416	{64, 16384, 4, 0},
    417	{32, 8192, 3, 8},
    418};
    419
    420static const struct aper_size_info_8 intel_8xx_sizes[7] =
    421{
    422	{256, 65536, 6, 0},
    423	{128, 32768, 5, 32},
    424	{64, 16384, 4, 48},
    425	{32, 8192, 3, 56},
    426	{16, 4096, 2, 60},
    427	{8, 2048, 1, 62},
    428	{4, 1024, 0, 63}
    429};
    430
    431static const struct aper_size_info_16 intel_generic_sizes[7] =
    432{
    433	{256, 65536, 6, 0},
    434	{128, 32768, 5, 32},
    435	{64, 16384, 4, 48},
    436	{32, 8192, 3, 56},
    437	{16, 4096, 2, 60},
    438	{8, 2048, 1, 62},
    439	{4, 1024, 0, 63}
    440};
    441
    442static const struct aper_size_info_8 intel_830mp_sizes[4] =
    443{
    444	{256, 65536, 6, 0},
    445	{128, 32768, 5, 32},
    446	{64, 16384, 4, 48},
    447	{32, 8192, 3, 56}
    448};
    449
    450static const struct agp_bridge_driver intel_generic_driver = {
    451	.owner			= THIS_MODULE,
    452	.aperture_sizes		= intel_generic_sizes,
    453	.size_type		= U16_APER_SIZE,
    454	.num_aperture_sizes	= 7,
    455	.needs_scratch_page	= true,
    456	.configure		= intel_configure,
    457	.fetch_size		= intel_fetch_size,
    458	.cleanup		= intel_cleanup,
    459	.tlb_flush		= intel_tlbflush,
    460	.mask_memory		= agp_generic_mask_memory,
    461	.masks			= intel_generic_masks,
    462	.agp_enable		= agp_generic_enable,
    463	.cache_flush		= global_cache_flush,
    464	.create_gatt_table	= agp_generic_create_gatt_table,
    465	.free_gatt_table	= agp_generic_free_gatt_table,
    466	.insert_memory		= agp_generic_insert_memory,
    467	.remove_memory		= agp_generic_remove_memory,
    468	.alloc_by_type		= agp_generic_alloc_by_type,
    469	.free_by_type		= agp_generic_free_by_type,
    470	.agp_alloc_page		= agp_generic_alloc_page,
    471	.agp_alloc_pages        = agp_generic_alloc_pages,
    472	.agp_destroy_page	= agp_generic_destroy_page,
    473	.agp_destroy_pages      = agp_generic_destroy_pages,
    474	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    475};
    476
    477static const struct agp_bridge_driver intel_815_driver = {
    478	.owner			= THIS_MODULE,
    479	.aperture_sizes		= intel_815_sizes,
    480	.size_type		= U8_APER_SIZE,
    481	.num_aperture_sizes	= 2,
    482	.needs_scratch_page	= true,
    483	.configure		= intel_815_configure,
    484	.fetch_size		= intel_815_fetch_size,
    485	.cleanup		= intel_8xx_cleanup,
    486	.tlb_flush		= intel_8xx_tlbflush,
    487	.mask_memory		= agp_generic_mask_memory,
    488	.masks			= intel_generic_masks,
    489	.agp_enable		= agp_generic_enable,
    490	.cache_flush		= global_cache_flush,
    491	.create_gatt_table	= agp_generic_create_gatt_table,
    492	.free_gatt_table	= agp_generic_free_gatt_table,
    493	.insert_memory		= agp_generic_insert_memory,
    494	.remove_memory		= agp_generic_remove_memory,
    495	.alloc_by_type		= agp_generic_alloc_by_type,
    496	.free_by_type		= agp_generic_free_by_type,
    497	.agp_alloc_page		= agp_generic_alloc_page,
    498	.agp_alloc_pages        = agp_generic_alloc_pages,
    499	.agp_destroy_page	= agp_generic_destroy_page,
    500	.agp_destroy_pages      = agp_generic_destroy_pages,
    501	.agp_type_to_mask_type	= agp_generic_type_to_mask_type,
    502};
    503
    504static const struct agp_bridge_driver intel_820_driver = {
    505	.owner			= THIS_MODULE,
    506	.aperture_sizes		= intel_8xx_sizes,
    507	.size_type		= U8_APER_SIZE,
    508	.num_aperture_sizes	= 7,
    509	.needs_scratch_page	= true,
    510	.configure		= intel_820_configure,
    511	.fetch_size		= intel_8xx_fetch_size,
    512	.cleanup		= intel_820_cleanup,
    513	.tlb_flush		= intel_820_tlbflush,
    514	.mask_memory		= agp_generic_mask_memory,
    515	.masks			= intel_generic_masks,
    516	.agp_enable		= agp_generic_enable,
    517	.cache_flush		= global_cache_flush,
    518	.create_gatt_table	= agp_generic_create_gatt_table,
    519	.free_gatt_table	= agp_generic_free_gatt_table,
    520	.insert_memory		= agp_generic_insert_memory,
    521	.remove_memory		= agp_generic_remove_memory,
    522	.alloc_by_type		= agp_generic_alloc_by_type,
    523	.free_by_type		= agp_generic_free_by_type,
    524	.agp_alloc_page		= agp_generic_alloc_page,
    525	.agp_alloc_pages        = agp_generic_alloc_pages,
    526	.agp_destroy_page	= agp_generic_destroy_page,
    527	.agp_destroy_pages      = agp_generic_destroy_pages,
    528	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    529};
    530
    531static const struct agp_bridge_driver intel_830mp_driver = {
    532	.owner			= THIS_MODULE,
    533	.aperture_sizes		= intel_830mp_sizes,
    534	.size_type		= U8_APER_SIZE,
    535	.num_aperture_sizes	= 4,
    536	.needs_scratch_page	= true,
    537	.configure		= intel_830mp_configure,
    538	.fetch_size		= intel_8xx_fetch_size,
    539	.cleanup		= intel_8xx_cleanup,
    540	.tlb_flush		= intel_8xx_tlbflush,
    541	.mask_memory		= agp_generic_mask_memory,
    542	.masks			= intel_generic_masks,
    543	.agp_enable		= agp_generic_enable,
    544	.cache_flush		= global_cache_flush,
    545	.create_gatt_table	= agp_generic_create_gatt_table,
    546	.free_gatt_table	= agp_generic_free_gatt_table,
    547	.insert_memory		= agp_generic_insert_memory,
    548	.remove_memory		= agp_generic_remove_memory,
    549	.alloc_by_type		= agp_generic_alloc_by_type,
    550	.free_by_type		= agp_generic_free_by_type,
    551	.agp_alloc_page		= agp_generic_alloc_page,
    552	.agp_alloc_pages        = agp_generic_alloc_pages,
    553	.agp_destroy_page	= agp_generic_destroy_page,
    554	.agp_destroy_pages      = agp_generic_destroy_pages,
    555	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    556};
    557
    558static const struct agp_bridge_driver intel_840_driver = {
    559	.owner			= THIS_MODULE,
    560	.aperture_sizes		= intel_8xx_sizes,
    561	.size_type		= U8_APER_SIZE,
    562	.num_aperture_sizes	= 7,
    563	.needs_scratch_page	= true,
    564	.configure		= intel_840_configure,
    565	.fetch_size		= intel_8xx_fetch_size,
    566	.cleanup		= intel_8xx_cleanup,
    567	.tlb_flush		= intel_8xx_tlbflush,
    568	.mask_memory		= agp_generic_mask_memory,
    569	.masks			= intel_generic_masks,
    570	.agp_enable		= agp_generic_enable,
    571	.cache_flush		= global_cache_flush,
    572	.create_gatt_table	= agp_generic_create_gatt_table,
    573	.free_gatt_table	= agp_generic_free_gatt_table,
    574	.insert_memory		= agp_generic_insert_memory,
    575	.remove_memory		= agp_generic_remove_memory,
    576	.alloc_by_type		= agp_generic_alloc_by_type,
    577	.free_by_type		= agp_generic_free_by_type,
    578	.agp_alloc_page		= agp_generic_alloc_page,
    579	.agp_alloc_pages        = agp_generic_alloc_pages,
    580	.agp_destroy_page	= agp_generic_destroy_page,
    581	.agp_destroy_pages      = agp_generic_destroy_pages,
    582	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    583};
    584
    585static const struct agp_bridge_driver intel_845_driver = {
    586	.owner			= THIS_MODULE,
    587	.aperture_sizes		= intel_8xx_sizes,
    588	.size_type		= U8_APER_SIZE,
    589	.num_aperture_sizes	= 7,
    590	.needs_scratch_page	= true,
    591	.configure		= intel_845_configure,
    592	.fetch_size		= intel_8xx_fetch_size,
    593	.cleanup		= intel_8xx_cleanup,
    594	.tlb_flush		= intel_8xx_tlbflush,
    595	.mask_memory		= agp_generic_mask_memory,
    596	.masks			= intel_generic_masks,
    597	.agp_enable		= agp_generic_enable,
    598	.cache_flush		= global_cache_flush,
    599	.create_gatt_table	= agp_generic_create_gatt_table,
    600	.free_gatt_table	= agp_generic_free_gatt_table,
    601	.insert_memory		= agp_generic_insert_memory,
    602	.remove_memory		= agp_generic_remove_memory,
    603	.alloc_by_type		= agp_generic_alloc_by_type,
    604	.free_by_type		= agp_generic_free_by_type,
    605	.agp_alloc_page		= agp_generic_alloc_page,
    606	.agp_alloc_pages        = agp_generic_alloc_pages,
    607	.agp_destroy_page	= agp_generic_destroy_page,
    608	.agp_destroy_pages      = agp_generic_destroy_pages,
    609	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    610};
    611
    612static const struct agp_bridge_driver intel_850_driver = {
    613	.owner			= THIS_MODULE,
    614	.aperture_sizes		= intel_8xx_sizes,
    615	.size_type		= U8_APER_SIZE,
    616	.num_aperture_sizes	= 7,
    617	.needs_scratch_page	= true,
    618	.configure		= intel_850_configure,
    619	.fetch_size		= intel_8xx_fetch_size,
    620	.cleanup		= intel_8xx_cleanup,
    621	.tlb_flush		= intel_8xx_tlbflush,
    622	.mask_memory		= agp_generic_mask_memory,
    623	.masks			= intel_generic_masks,
    624	.agp_enable		= agp_generic_enable,
    625	.cache_flush		= global_cache_flush,
    626	.create_gatt_table	= agp_generic_create_gatt_table,
    627	.free_gatt_table	= agp_generic_free_gatt_table,
    628	.insert_memory		= agp_generic_insert_memory,
    629	.remove_memory		= agp_generic_remove_memory,
    630	.alloc_by_type		= agp_generic_alloc_by_type,
    631	.free_by_type		= agp_generic_free_by_type,
    632	.agp_alloc_page		= agp_generic_alloc_page,
    633	.agp_alloc_pages        = agp_generic_alloc_pages,
    634	.agp_destroy_page	= agp_generic_destroy_page,
    635	.agp_destroy_pages      = agp_generic_destroy_pages,
    636	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    637};
    638
    639static const struct agp_bridge_driver intel_860_driver = {
    640	.owner			= THIS_MODULE,
    641	.aperture_sizes		= intel_8xx_sizes,
    642	.size_type		= U8_APER_SIZE,
    643	.num_aperture_sizes	= 7,
    644	.needs_scratch_page	= true,
    645	.configure		= intel_860_configure,
    646	.fetch_size		= intel_8xx_fetch_size,
    647	.cleanup		= intel_8xx_cleanup,
    648	.tlb_flush		= intel_8xx_tlbflush,
    649	.mask_memory		= agp_generic_mask_memory,
    650	.masks			= intel_generic_masks,
    651	.agp_enable		= agp_generic_enable,
    652	.cache_flush		= global_cache_flush,
    653	.create_gatt_table	= agp_generic_create_gatt_table,
    654	.free_gatt_table	= agp_generic_free_gatt_table,
    655	.insert_memory		= agp_generic_insert_memory,
    656	.remove_memory		= agp_generic_remove_memory,
    657	.alloc_by_type		= agp_generic_alloc_by_type,
    658	.free_by_type		= agp_generic_free_by_type,
    659	.agp_alloc_page		= agp_generic_alloc_page,
    660	.agp_alloc_pages        = agp_generic_alloc_pages,
    661	.agp_destroy_page	= agp_generic_destroy_page,
    662	.agp_destroy_pages      = agp_generic_destroy_pages,
    663	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    664};
    665
    666static const struct agp_bridge_driver intel_7505_driver = {
    667	.owner			= THIS_MODULE,
    668	.aperture_sizes		= intel_8xx_sizes,
    669	.size_type		= U8_APER_SIZE,
    670	.num_aperture_sizes	= 7,
    671	.needs_scratch_page	= true,
    672	.configure		= intel_7505_configure,
    673	.fetch_size		= intel_8xx_fetch_size,
    674	.cleanup		= intel_8xx_cleanup,
    675	.tlb_flush		= intel_8xx_tlbflush,
    676	.mask_memory		= agp_generic_mask_memory,
    677	.masks			= intel_generic_masks,
    678	.agp_enable		= agp_generic_enable,
    679	.cache_flush		= global_cache_flush,
    680	.create_gatt_table	= agp_generic_create_gatt_table,
    681	.free_gatt_table	= agp_generic_free_gatt_table,
    682	.insert_memory		= agp_generic_insert_memory,
    683	.remove_memory		= agp_generic_remove_memory,
    684	.alloc_by_type		= agp_generic_alloc_by_type,
    685	.free_by_type		= agp_generic_free_by_type,
    686	.agp_alloc_page		= agp_generic_alloc_page,
    687	.agp_alloc_pages        = agp_generic_alloc_pages,
    688	.agp_destroy_page	= agp_generic_destroy_page,
    689	.agp_destroy_pages      = agp_generic_destroy_pages,
    690	.agp_type_to_mask_type  = agp_generic_type_to_mask_type,
    691};
    692
    693/* Table to describe Intel GMCH and AGP/PCIE GART drivers.  At least one of
    694 * driver and gmch_driver must be non-null, and find_gmch will determine
    695 * which one should be used if a gmch_chip_id is present.
    696 */
    697static const struct intel_agp_driver_description {
    698	unsigned int chip_id;
    699	char *name;
    700	const struct agp_bridge_driver *driver;
    701} intel_agp_chipsets[] = {
    702	{ PCI_DEVICE_ID_INTEL_82443LX_0, "440LX", &intel_generic_driver },
    703	{ PCI_DEVICE_ID_INTEL_82443BX_0, "440BX", &intel_generic_driver },
    704	{ PCI_DEVICE_ID_INTEL_82443GX_0, "440GX", &intel_generic_driver },
    705	{ PCI_DEVICE_ID_INTEL_82815_MC, "i815", &intel_815_driver },
    706	{ PCI_DEVICE_ID_INTEL_82820_HB, "i820", &intel_820_driver },
    707	{ PCI_DEVICE_ID_INTEL_82820_UP_HB, "i820", &intel_820_driver },
    708	{ PCI_DEVICE_ID_INTEL_82830_HB, "830M", &intel_830mp_driver },
    709	{ PCI_DEVICE_ID_INTEL_82840_HB, "i840", &intel_840_driver },
    710	{ PCI_DEVICE_ID_INTEL_82845_HB, "i845", &intel_845_driver },
    711	{ PCI_DEVICE_ID_INTEL_82845G_HB, "845G", &intel_845_driver },
    712	{ PCI_DEVICE_ID_INTEL_82850_HB, "i850", &intel_850_driver },
    713	{ PCI_DEVICE_ID_INTEL_82854_HB, "854", &intel_845_driver },
    714	{ PCI_DEVICE_ID_INTEL_82855PM_HB, "855PM", &intel_845_driver },
    715	{ PCI_DEVICE_ID_INTEL_82855GM_HB, "855GM", &intel_845_driver },
    716	{ PCI_DEVICE_ID_INTEL_82860_HB, "i860", &intel_860_driver },
    717	{ PCI_DEVICE_ID_INTEL_82865_HB, "865", &intel_845_driver },
    718	{ PCI_DEVICE_ID_INTEL_82875_HB, "i875", &intel_845_driver },
    719	{ PCI_DEVICE_ID_INTEL_7505_0, "E7505", &intel_7505_driver },
    720	{ PCI_DEVICE_ID_INTEL_7205_0, "E7205", &intel_7505_driver },
    721	{ 0, NULL, NULL }
    722};
    723
    724static int agp_intel_probe(struct pci_dev *pdev,
    725			   const struct pci_device_id *ent)
    726{
    727	struct agp_bridge_data *bridge;
    728	u8 cap_ptr = 0;
    729	struct resource *r;
    730	int i, err;
    731
    732	cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
    733
    734	bridge = agp_alloc_bridge();
    735	if (!bridge)
    736		return -ENOMEM;
    737
    738	bridge->capndx = cap_ptr;
    739
    740	if (intel_gmch_probe(pdev, NULL, bridge))
    741		goto found_gmch;
    742
    743	for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
    744		/* In case that multiple models of gfx chip may
    745		   stand on same host bridge type, this can be
    746		   sure we detect the right IGD. */
    747		if (pdev->device == intel_agp_chipsets[i].chip_id) {
    748			bridge->driver = intel_agp_chipsets[i].driver;
    749			break;
    750		}
    751	}
    752
    753	if (!bridge->driver) {
    754		if (cap_ptr)
    755			dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
    756				 pdev->vendor, pdev->device);
    757		agp_put_bridge(bridge);
    758		return -ENODEV;
    759	}
    760
    761	bridge->dev = pdev;
    762	bridge->dev_private_data = NULL;
    763
    764	dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
    765
    766	/*
    767	* The following fixes the case where the BIOS has "forgotten" to
    768	* provide an address range for the GART.
    769	* 20030610 - hamish@zot.org
    770	* This happens before pci_enable_device() intentionally;
    771	* calling pci_enable_device() before assigning the resource
    772	* will result in the GART being disabled on machines with such
    773	* BIOSs (the GART ends up with a BAR starting at 0, which
    774	* conflicts a lot of other devices).
    775	*/
    776	r = &pdev->resource[0];
    777	if (!r->start && r->end) {
    778		if (pci_assign_resource(pdev, 0)) {
    779			dev_err(&pdev->dev, "can't assign resource 0\n");
    780			agp_put_bridge(bridge);
    781			return -ENODEV;
    782		}
    783	}
    784
    785	/*
    786	* If the device has not been properly setup, the following will catch
    787	* the problem and should stop the system from crashing.
    788	* 20030610 - hamish@zot.org
    789	*/
    790	if (pci_enable_device(pdev)) {
    791		dev_err(&pdev->dev, "can't enable PCI device\n");
    792		agp_put_bridge(bridge);
    793		return -ENODEV;
    794	}
    795
    796	/* Fill in the mode register */
    797	if (cap_ptr) {
    798		pci_read_config_dword(pdev,
    799				bridge->capndx+PCI_AGP_STATUS,
    800				&bridge->mode);
    801	}
    802
    803found_gmch:
    804	pci_set_drvdata(pdev, bridge);
    805	err = agp_add_bridge(bridge);
    806	return err;
    807}
    808
    809static void agp_intel_remove(struct pci_dev *pdev)
    810{
    811	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
    812
    813	agp_remove_bridge(bridge);
    814
    815	intel_gmch_remove();
    816
    817	agp_put_bridge(bridge);
    818}
    819
    820#ifdef CONFIG_PM
    821static int agp_intel_resume(struct pci_dev *pdev)
    822{
    823	struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
    824
    825	bridge->driver->configure();
    826
    827	return 0;
    828}
    829#endif
    830
    831static const struct pci_device_id agp_intel_pci_table[] = {
    832#define ID(x)						\
    833	{						\
    834	.class		= (PCI_CLASS_BRIDGE_HOST << 8),	\
    835	.class_mask	= ~0,				\
    836	.vendor		= PCI_VENDOR_ID_INTEL,		\
    837	.device		= x,				\
    838	.subvendor	= PCI_ANY_ID,			\
    839	.subdevice	= PCI_ANY_ID,			\
    840	}
    841	ID(PCI_DEVICE_ID_INTEL_82441), /* for HAS2 support */
    842	ID(PCI_DEVICE_ID_INTEL_82443LX_0),
    843	ID(PCI_DEVICE_ID_INTEL_82443BX_0),
    844	ID(PCI_DEVICE_ID_INTEL_82443GX_0),
    845	ID(PCI_DEVICE_ID_INTEL_82810_MC1),
    846	ID(PCI_DEVICE_ID_INTEL_82810_MC3),
    847	ID(PCI_DEVICE_ID_INTEL_82810E_MC),
    848	ID(PCI_DEVICE_ID_INTEL_82815_MC),
    849	ID(PCI_DEVICE_ID_INTEL_82820_HB),
    850	ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
    851	ID(PCI_DEVICE_ID_INTEL_82830_HB),
    852	ID(PCI_DEVICE_ID_INTEL_82840_HB),
    853	ID(PCI_DEVICE_ID_INTEL_82845_HB),
    854	ID(PCI_DEVICE_ID_INTEL_82845G_HB),
    855	ID(PCI_DEVICE_ID_INTEL_82850_HB),
    856	ID(PCI_DEVICE_ID_INTEL_82854_HB),
    857	ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
    858	ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
    859	ID(PCI_DEVICE_ID_INTEL_82860_HB),
    860	ID(PCI_DEVICE_ID_INTEL_82865_HB),
    861	ID(PCI_DEVICE_ID_INTEL_82875_HB),
    862	ID(PCI_DEVICE_ID_INTEL_7505_0),
    863	ID(PCI_DEVICE_ID_INTEL_7205_0),
    864	ID(PCI_DEVICE_ID_INTEL_E7221_HB),
    865	ID(PCI_DEVICE_ID_INTEL_82915G_HB),
    866	ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
    867	ID(PCI_DEVICE_ID_INTEL_82945G_HB),
    868	ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
    869	ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
    870	ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
    871	ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
    872	ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
    873	ID(PCI_DEVICE_ID_INTEL_82G35_HB),
    874	ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
    875	ID(PCI_DEVICE_ID_INTEL_82965G_HB),
    876	ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
    877	ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
    878	ID(PCI_DEVICE_ID_INTEL_G33_HB),
    879	ID(PCI_DEVICE_ID_INTEL_Q35_HB),
    880	ID(PCI_DEVICE_ID_INTEL_Q33_HB),
    881	ID(PCI_DEVICE_ID_INTEL_GM45_HB),
    882	ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
    883	ID(PCI_DEVICE_ID_INTEL_Q45_HB),
    884	ID(PCI_DEVICE_ID_INTEL_G45_HB),
    885	ID(PCI_DEVICE_ID_INTEL_G41_HB),
    886	ID(PCI_DEVICE_ID_INTEL_B43_HB),
    887	ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
    888	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
    889	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
    890	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
    891	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
    892	ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
    893	{ }
    894};
    895
    896MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
    897
    898static struct pci_driver agp_intel_pci_driver = {
    899	.name		= "agpgart-intel",
    900	.id_table	= agp_intel_pci_table,
    901	.probe		= agp_intel_probe,
    902	.remove		= agp_intel_remove,
    903#ifdef CONFIG_PM
    904	.resume		= agp_intel_resume,
    905#endif
    906};
    907
    908static int __init agp_intel_init(void)
    909{
    910	if (agp_off)
    911		return -EINVAL;
    912	return pci_register_driver(&agp_intel_pci_driver);
    913}
    914
    915static void __exit agp_intel_cleanup(void)
    916{
    917	pci_unregister_driver(&agp_intel_pci_driver);
    918}
    919
    920module_init(agp_intel_init);
    921module_exit(agp_intel_cleanup);
    922
    923MODULE_AUTHOR("Dave Jones, Various @Intel");
    924MODULE_LICENSE("GPL and additional rights");