Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[sfrench/cifs-2.6.git] / drivers / char / agp / intel-agp.c
1 /*
2  * Intel AGPGART routines.
3  */
4
5 #include <linux/module.h>
6 #include <linux/pci.h>
7 #include <linux/init.h>
8 #include <linux/kernel.h>
9 #include <linux/pagemap.h>
10 #include <linux/agp_backend.h>
11 #include "agp.h"
12
13 #define PCI_DEVICE_ID_INTEL_82946GZ_HB      0x2970
14 #define PCI_DEVICE_ID_INTEL_82946GZ_IG      0x2972
15 #define PCI_DEVICE_ID_INTEL_82965G_1_HB     0x2980
16 #define PCI_DEVICE_ID_INTEL_82965G_1_IG     0x2982
17 #define PCI_DEVICE_ID_INTEL_82965Q_HB       0x2990
18 #define PCI_DEVICE_ID_INTEL_82965Q_IG       0x2992
19 #define PCI_DEVICE_ID_INTEL_82965G_HB       0x29A0
20 #define PCI_DEVICE_ID_INTEL_82965G_IG       0x29A2
21 #define PCI_DEVICE_ID_INTEL_82965GM_HB      0x2A00
22 #define PCI_DEVICE_ID_INTEL_82965GM_IG      0x2A02
23 #define PCI_DEVICE_ID_INTEL_82965GME_IG     0x2A12
24 #define PCI_DEVICE_ID_INTEL_82945GME_IG     0x27AE
25 #define PCI_DEVICE_ID_INTEL_G33_HB          0x29C0
26 #define PCI_DEVICE_ID_INTEL_G33_IG          0x29C2
27 #define PCI_DEVICE_ID_INTEL_Q35_HB          0x29B0
28 #define PCI_DEVICE_ID_INTEL_Q35_IG          0x29B2
29 #define PCI_DEVICE_ID_INTEL_Q33_HB          0x29D0
30 #define PCI_DEVICE_ID_INTEL_Q33_IG          0x29D2
31
32 #define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \
33                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
34                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
35                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB || \
36                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB)
37
38 #define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
39                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
40                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q33_HB)
41
42 extern int agp_memory_reserved;
43
44
45 /* Intel 815 register */
46 #define INTEL_815_APCONT        0x51
47 #define INTEL_815_ATTBASE_MASK  ~0x1FFFFFFF
48
49 /* Intel i820 registers */
50 #define INTEL_I820_RDCR         0x51
51 #define INTEL_I820_ERRSTS       0xc8
52
53 /* Intel i840 registers */
54 #define INTEL_I840_MCHCFG       0x50
55 #define INTEL_I840_ERRSTS       0xc8
56
57 /* Intel i850 registers */
58 #define INTEL_I850_MCHCFG       0x50
59 #define INTEL_I850_ERRSTS       0xc8
60
61 /* intel 915G registers */
62 #define I915_GMADDR     0x18
63 #define I915_MMADDR     0x10
64 #define I915_PTEADDR    0x1C
65 #define I915_GMCH_GMS_STOLEN_48M        (0x6 << 4)
66 #define I915_GMCH_GMS_STOLEN_64M        (0x7 << 4)
67 #define G33_GMCH_GMS_STOLEN_128M       (0x8 << 4)
68 #define G33_GMCH_GMS_STOLEN_256M       (0x9 << 4)
69
70 /* Intel 965G registers */
71 #define I965_MSAC 0x62
72
73 /* Intel 7505 registers */
74 #define INTEL_I7505_APSIZE      0x74
75 #define INTEL_I7505_NCAPID      0x60
76 #define INTEL_I7505_NISTAT      0x6c
77 #define INTEL_I7505_ATTBASE     0x78
78 #define INTEL_I7505_ERRSTS      0x42
79 #define INTEL_I7505_AGPCTRL     0x70
80 #define INTEL_I7505_MCHCFG      0x50
81
82 static const struct aper_size_info_fixed intel_i810_sizes[] =
83 {
84         {64, 16384, 4},
85         /* The 32M mode still requires a 64k gatt */
86         {32, 8192, 4}
87 };
88
89 #define AGP_DCACHE_MEMORY       1
90 #define AGP_PHYS_MEMORY         2
91 #define INTEL_AGP_CACHED_MEMORY 3
92
93 static struct gatt_mask intel_i810_masks[] =
94 {
95         {.mask = I810_PTE_VALID, .type = 0},
96         {.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
97         {.mask = I810_PTE_VALID, .type = 0},
98         {.mask = I810_PTE_VALID | I830_PTE_SYSTEM_CACHED,
99          .type = INTEL_AGP_CACHED_MEMORY}
100 };
101
102 static struct _intel_private {
103         struct pci_dev *pcidev; /* device one */
104         u8 __iomem *registers;
105         u32 __iomem *gtt;               /* I915G */
106         int num_dcache_entries;
107         /* gtt_entries is the number of gtt entries that are already mapped
108          * to stolen memory.  Stolen memory is larger than the memory mapped
109          * through gtt_entries, as it includes some reserved space for the BIOS
110          * popup and for the GTT.
111          */
112         int gtt_entries;                        /* i830+ */
113 } intel_private;
114
115 static int intel_i810_fetch_size(void)
116 {
117         u32 smram_miscc;
118         struct aper_size_info_fixed *values;
119
120         pci_read_config_dword(agp_bridge->dev, I810_SMRAM_MISCC, &smram_miscc);
121         values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
122
123         if ((smram_miscc & I810_GMS) == I810_GMS_DISABLE) {
124                 printk(KERN_WARNING PFX "i810 is disabled\n");
125                 return 0;
126         }
127         if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) == I810_GFX_MEM_WIN_32M) {
128                 agp_bridge->previous_size =
129                         agp_bridge->current_size = (void *) (values + 1);
130                 agp_bridge->aperture_size_idx = 1;
131                 return values[1].size;
132         } else {
133                 agp_bridge->previous_size =
134                         agp_bridge->current_size = (void *) (values);
135                 agp_bridge->aperture_size_idx = 0;
136                 return values[0].size;
137         }
138
139         return 0;
140 }
141
142 static int intel_i810_configure(void)
143 {
144         struct aper_size_info_fixed *current_size;
145         u32 temp;
146         int i;
147
148         current_size = A_SIZE_FIX(agp_bridge->current_size);
149
150         if (!intel_private.registers) {
151                 pci_read_config_dword(intel_private.pcidev, I810_MMADDR, &temp);
152                 temp &= 0xfff80000;
153
154                 intel_private.registers = ioremap(temp, 128 * 4096);
155                 if (!intel_private.registers) {
156                         printk(KERN_ERR PFX "Unable to remap memory.\n");
157                         return -ENOMEM;
158                 }
159         }
160
161         if ((readl(intel_private.registers+I810_DRAM_CTL)
162                 & I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
163                 /* This will need to be dynamically assigned */
164                 printk(KERN_INFO PFX "detected 4MB dedicated video ram.\n");
165                 intel_private.num_dcache_entries = 1024;
166         }
167         pci_read_config_dword(intel_private.pcidev, I810_GMADDR, &temp);
168         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
169         writel(agp_bridge->gatt_bus_addr | I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
170         readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
171
172         if (agp_bridge->driver->needs_scratch_page) {
173                 for (i = 0; i < current_size->num_entries; i++) {
174                         writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
175                         readl(intel_private.registers+I810_PTE_BASE+(i*4));     /* PCI posting. */
176                 }
177         }
178         global_cache_flush();
179         return 0;
180 }
181
182 static void intel_i810_cleanup(void)
183 {
184         writel(0, intel_private.registers+I810_PGETBL_CTL);
185         readl(intel_private.registers); /* PCI Posting. */
186         iounmap(intel_private.registers);
187 }
188
189 static void intel_i810_tlbflush(struct agp_memory *mem)
190 {
191         return;
192 }
193
194 static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode)
195 {
196         return;
197 }
198
199 /* Exists to support ARGB cursors */
200 static void *i8xx_alloc_pages(void)
201 {
202         struct page * page;
203
204         page = alloc_pages(GFP_KERNEL | GFP_DMA32, 2);
205         if (page == NULL)
206                 return NULL;
207
208         if (change_page_attr(page, 4, PAGE_KERNEL_NOCACHE) < 0) {
209                 change_page_attr(page, 4, PAGE_KERNEL);
210                 global_flush_tlb();
211                 __free_pages(page, 2);
212                 return NULL;
213         }
214         global_flush_tlb();
215         get_page(page);
216         SetPageLocked(page);
217         atomic_inc(&agp_bridge->current_memory_agp);
218         return page_address(page);
219 }
220
221 static void i8xx_destroy_pages(void *addr)
222 {
223         struct page *page;
224
225         if (addr == NULL)
226                 return;
227
228         page = virt_to_page(addr);
229         change_page_attr(page, 4, PAGE_KERNEL);
230         global_flush_tlb();
231         put_page(page);
232         unlock_page(page);
233         __free_pages(page, 2);
234         atomic_dec(&agp_bridge->current_memory_agp);
235 }
236
237 static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge,
238                                         int type)
239 {
240         if (type < AGP_USER_TYPES)
241                 return type;
242         else if (type == AGP_USER_CACHED_MEMORY)
243                 return INTEL_AGP_CACHED_MEMORY;
244         else
245                 return 0;
246 }
247
248 static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
249                                 int type)
250 {
251         int i, j, num_entries;
252         void *temp;
253         int ret = -EINVAL;
254         int mask_type;
255
256         if (mem->page_count == 0)
257                 goto out;
258
259         temp = agp_bridge->current_size;
260         num_entries = A_SIZE_FIX(temp)->num_entries;
261
262         if ((pg_start + mem->page_count) > num_entries)
263                 goto out_err;
264
265
266         for (j = pg_start; j < (pg_start + mem->page_count); j++) {
267                 if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) {
268                         ret = -EBUSY;
269                         goto out_err;
270                 }
271         }
272
273         if (type != mem->type)
274                 goto out_err;
275
276         mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
277
278         switch (mask_type) {
279         case AGP_DCACHE_MEMORY:
280                 if (!mem->is_flushed)
281                         global_cache_flush();
282                 for (i = pg_start; i < (pg_start + mem->page_count); i++) {
283                         writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID,
284                                intel_private.registers+I810_PTE_BASE+(i*4));
285                 }
286                 readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
287                 break;
288         case AGP_PHYS_MEMORY:
289         case AGP_NORMAL_MEMORY:
290                 if (!mem->is_flushed)
291                         global_cache_flush();
292                 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
293                         writel(agp_bridge->driver->mask_memory(agp_bridge,
294                                                                mem->memory[i],
295                                                                mask_type),
296                                intel_private.registers+I810_PTE_BASE+(j*4));
297                 }
298                 readl(intel_private.registers+I810_PTE_BASE+((j-1)*4));
299                 break;
300         default:
301                 goto out_err;
302         }
303
304         agp_bridge->driver->tlb_flush(mem);
305 out:
306         ret = 0;
307 out_err:
308         mem->is_flushed = 1;
309         return ret;
310 }
311
312 static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
313                                 int type)
314 {
315         int i;
316
317         if (mem->page_count == 0)
318                 return 0;
319
320         for (i = pg_start; i < (mem->page_count + pg_start); i++) {
321                 writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
322         }
323         readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
324
325         agp_bridge->driver->tlb_flush(mem);
326         return 0;
327 }
328
329 /*
330  * The i810/i830 requires a physical address to program its mouse
331  * pointer into hardware.
332  * However the Xserver still writes to it through the agp aperture.
333  */
334 static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
335 {
336         struct agp_memory *new;
337         void *addr;
338
339         switch (pg_count) {
340         case 1: addr = agp_bridge->driver->agp_alloc_page(agp_bridge);
341                 global_flush_tlb();
342                 break;
343         case 4:
344                 /* kludge to get 4 physical pages for ARGB cursor */
345                 addr = i8xx_alloc_pages();
346                 break;
347         default:
348                 return NULL;
349         }
350
351         if (addr == NULL)
352                 return NULL;
353
354         new = agp_create_memory(pg_count);
355         if (new == NULL)
356                 return NULL;
357
358         new->memory[0] = virt_to_gart(addr);
359         if (pg_count == 4) {
360                 /* kludge to get 4 physical pages for ARGB cursor */
361                 new->memory[1] = new->memory[0] + PAGE_SIZE;
362                 new->memory[2] = new->memory[1] + PAGE_SIZE;
363                 new->memory[3] = new->memory[2] + PAGE_SIZE;
364         }
365         new->page_count = pg_count;
366         new->num_scratch_pages = pg_count;
367         new->type = AGP_PHYS_MEMORY;
368         new->physical = new->memory[0];
369         return new;
370 }
371
372 static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
373 {
374         struct agp_memory *new;
375
376         if (type == AGP_DCACHE_MEMORY) {
377                 if (pg_count != intel_private.num_dcache_entries)
378                         return NULL;
379
380                 new = agp_create_memory(1);
381                 if (new == NULL)
382                         return NULL;
383
384                 new->type = AGP_DCACHE_MEMORY;
385                 new->page_count = pg_count;
386                 new->num_scratch_pages = 0;
387                 agp_free_page_array(new);
388                 return new;
389         }
390         if (type == AGP_PHYS_MEMORY)
391                 return alloc_agpphysmem_i8xx(pg_count, type);
392         return NULL;
393 }
394
395 static void intel_i810_free_by_type(struct agp_memory *curr)
396 {
397         agp_free_key(curr->key);
398         if (curr->type == AGP_PHYS_MEMORY) {
399                 if (curr->page_count == 4)
400                         i8xx_destroy_pages(gart_to_virt(curr->memory[0]));
401                 else {
402                         agp_bridge->driver->agp_destroy_page(
403                                  gart_to_virt(curr->memory[0]));
404                         global_flush_tlb();
405                 }
406                 agp_free_page_array(curr);
407         }
408         kfree(curr);
409 }
410
411 static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge,
412         unsigned long addr, int type)
413 {
414         /* Type checking must be done elsewhere */
415         return addr | bridge->driver->masks[type].mask;
416 }
417
418 static struct aper_size_info_fixed intel_i830_sizes[] =
419 {
420         {128, 32768, 5},
421         /* The 64M mode still requires a 128k gatt */
422         {64, 16384, 5},
423         {256, 65536, 6},
424         {512, 131072, 7},
425 };
426
427 static void intel_i830_init_gtt_entries(void)
428 {
429         u16 gmch_ctrl;
430         int gtt_entries;
431         u8 rdct;
432         int local = 0;
433         static const int ddt[4] = { 0, 16, 32, 64 };
434         int size; /* reserved space (in kb) at the top of stolen memory */
435
436         pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
437
438         if (IS_I965) {
439                 u32 pgetbl_ctl;
440                 pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL);
441
442                 /* The 965 has a field telling us the size of the GTT,
443                  * which may be larger than what is necessary to map the
444                  * aperture.
445                  */
446                 switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) {
447                 case I965_PGETBL_SIZE_128KB:
448                         size = 128;
449                         break;
450                 case I965_PGETBL_SIZE_256KB:
451                         size = 256;
452                         break;
453                 case I965_PGETBL_SIZE_512KB:
454                         size = 512;
455                         break;
456                 default:
457                         printk(KERN_INFO PFX "Unknown page table size, "
458                                "assuming 512KB\n");
459                         size = 512;
460                 }
461                 size += 4; /* add in BIOS popup space */
462         } else if (IS_G33) {
463         /* G33's GTT size defined in gmch_ctrl */
464                 switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) {
465                 case G33_PGETBL_SIZE_1M:
466                         size = 1024;
467                         break;
468                 case G33_PGETBL_SIZE_2M:
469                         size = 2048;
470                         break;
471                 default:
472                         printk(KERN_INFO PFX "Unknown page table size 0x%x, "
473                                 "assuming 512KB\n",
474                                 (gmch_ctrl & G33_PGETBL_SIZE_MASK));
475                         size = 512;
476                 }
477                 size += 4;
478         } else {
479                 /* On previous hardware, the GTT size was just what was
480                  * required to map the aperture.
481                  */
482                 size = agp_bridge->driver->fetch_size() + 4;
483         }
484
485         if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
486             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
487                 switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
488                 case I830_GMCH_GMS_STOLEN_512:
489                         gtt_entries = KB(512) - KB(size);
490                         break;
491                 case I830_GMCH_GMS_STOLEN_1024:
492                         gtt_entries = MB(1) - KB(size);
493                         break;
494                 case I830_GMCH_GMS_STOLEN_8192:
495                         gtt_entries = MB(8) - KB(size);
496                         break;
497                 case I830_GMCH_GMS_LOCAL:
498                         rdct = readb(intel_private.registers+I830_RDRAM_CHANNEL_TYPE);
499                         gtt_entries = (I830_RDRAM_ND(rdct) + 1) *
500                                         MB(ddt[I830_RDRAM_DDT(rdct)]);
501                         local = 1;
502                         break;
503                 default:
504                         gtt_entries = 0;
505                         break;
506                 }
507         } else {
508                 switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
509                 case I855_GMCH_GMS_STOLEN_1M:
510                         gtt_entries = MB(1) - KB(size);
511                         break;
512                 case I855_GMCH_GMS_STOLEN_4M:
513                         gtt_entries = MB(4) - KB(size);
514                         break;
515                 case I855_GMCH_GMS_STOLEN_8M:
516                         gtt_entries = MB(8) - KB(size);
517                         break;
518                 case I855_GMCH_GMS_STOLEN_16M:
519                         gtt_entries = MB(16) - KB(size);
520                         break;
521                 case I855_GMCH_GMS_STOLEN_32M:
522                         gtt_entries = MB(32) - KB(size);
523                         break;
524                 case I915_GMCH_GMS_STOLEN_48M:
525                         /* Check it's really I915G */
526                         if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
527                             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
528                             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
529                             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB ||
530                             IS_I965 || IS_G33)
531                                 gtt_entries = MB(48) - KB(size);
532                         else
533                                 gtt_entries = 0;
534                         break;
535                 case I915_GMCH_GMS_STOLEN_64M:
536                         /* Check it's really I915G */
537                         if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB ||
538                             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
539                             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
540                             agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB ||
541                             IS_I965 || IS_G33)
542                                 gtt_entries = MB(64) - KB(size);
543                         else
544                                 gtt_entries = 0;
545                         break;
546                 case G33_GMCH_GMS_STOLEN_128M:
547                         if (IS_G33)
548                                 gtt_entries = MB(128) - KB(size);
549                         else
550                                 gtt_entries = 0;
551                         break;
552                 case G33_GMCH_GMS_STOLEN_256M:
553                         if (IS_G33)
554                                 gtt_entries = MB(256) - KB(size);
555                         else
556                                 gtt_entries = 0;
557                         break;
558                 default:
559                         gtt_entries = 0;
560                         break;
561                 }
562         }
563         if (gtt_entries > 0)
564                 printk(KERN_INFO PFX "Detected %dK %s memory.\n",
565                        gtt_entries / KB(1), local ? "local" : "stolen");
566         else
567                 printk(KERN_INFO PFX
568                        "No pre-allocated video memory detected.\n");
569         gtt_entries /= KB(4);
570
571         intel_private.gtt_entries = gtt_entries;
572 }
573
574 /* The intel i830 automatically initializes the agp aperture during POST.
575  * Use the memory already set aside for in the GTT.
576  */
577 static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
578 {
579         int page_order;
580         struct aper_size_info_fixed *size;
581         int num_entries;
582         u32 temp;
583
584         size = agp_bridge->current_size;
585         page_order = size->page_order;
586         num_entries = size->num_entries;
587         agp_bridge->gatt_table_real = NULL;
588
589         pci_read_config_dword(intel_private.pcidev,I810_MMADDR,&temp);
590         temp &= 0xfff80000;
591
592         intel_private.registers = ioremap(temp,128 * 4096);
593         if (!intel_private.registers)
594                 return -ENOMEM;
595
596         temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
597         global_cache_flush();   /* FIXME: ?? */
598
599         /* we have to call this as early as possible after the MMIO base address is known */
600         intel_i830_init_gtt_entries();
601
602         agp_bridge->gatt_table = NULL;
603
604         agp_bridge->gatt_bus_addr = temp;
605
606         return 0;
607 }
608
609 /* Return the gatt table to a sane state. Use the top of stolen
610  * memory for the GTT.
611  */
612 static int intel_i830_free_gatt_table(struct agp_bridge_data *bridge)
613 {
614         return 0;
615 }
616
617 static int intel_i830_fetch_size(void)
618 {
619         u16 gmch_ctrl;
620         struct aper_size_info_fixed *values;
621
622         values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
623
624         if (agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82830_HB &&
625             agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82845G_HB) {
626                 /* 855GM/852GM/865G has 128MB aperture size */
627                 agp_bridge->previous_size = agp_bridge->current_size = (void *) values;
628                 agp_bridge->aperture_size_idx = 0;
629                 return values[0].size;
630         }
631
632         pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
633
634         if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) {
635                 agp_bridge->previous_size = agp_bridge->current_size = (void *) values;
636                 agp_bridge->aperture_size_idx = 0;
637                 return values[0].size;
638         } else {
639                 agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + 1);
640                 agp_bridge->aperture_size_idx = 1;
641                 return values[1].size;
642         }
643
644         return 0;
645 }
646
647 static int intel_i830_configure(void)
648 {
649         struct aper_size_info_fixed *current_size;
650         u32 temp;
651         u16 gmch_ctrl;
652         int i;
653
654         current_size = A_SIZE_FIX(agp_bridge->current_size);
655
656         pci_read_config_dword(intel_private.pcidev,I810_GMADDR,&temp);
657         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
658
659         pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
660         gmch_ctrl |= I830_GMCH_ENABLED;
661         pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
662
663         writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
664         readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
665
666         if (agp_bridge->driver->needs_scratch_page) {
667                 for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
668                         writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
669                         readl(intel_private.registers+I810_PTE_BASE+(i*4));     /* PCI Posting. */
670                 }
671         }
672
673         global_cache_flush();
674         return 0;
675 }
676
677 static void intel_i830_cleanup(void)
678 {
679         iounmap(intel_private.registers);
680 }
681
682 static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int type)
683 {
684         int i,j,num_entries;
685         void *temp;
686         int ret = -EINVAL;
687         int mask_type;
688
689         if (mem->page_count == 0)
690                 goto out;
691
692         temp = agp_bridge->current_size;
693         num_entries = A_SIZE_FIX(temp)->num_entries;
694
695         if (pg_start < intel_private.gtt_entries) {
696                 printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_private.gtt_entries == 0x%.8x\n",
697                                 pg_start,intel_private.gtt_entries);
698
699                 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
700                 goto out_err;
701         }
702
703         if ((pg_start + mem->page_count) > num_entries)
704                 goto out_err;
705
706         /* The i830 can't check the GTT for entries since its read only,
707          * depend on the caller to make the correct offset decisions.
708          */
709
710         if (type != mem->type)
711                 goto out_err;
712
713         mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
714
715         if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
716             mask_type != INTEL_AGP_CACHED_MEMORY)
717                 goto out_err;
718
719         if (!mem->is_flushed)
720                 global_cache_flush();
721
722         for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
723                 writel(agp_bridge->driver->mask_memory(agp_bridge,
724                                                        mem->memory[i], mask_type),
725                        intel_private.registers+I810_PTE_BASE+(j*4));
726         }
727         readl(intel_private.registers+I810_PTE_BASE+((j-1)*4));
728         agp_bridge->driver->tlb_flush(mem);
729
730 out:
731         ret = 0;
732 out_err:
733         mem->is_flushed = 1;
734         return ret;
735 }
736
737 static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,
738                                 int type)
739 {
740         int i;
741
742         if (mem->page_count == 0)
743                 return 0;
744
745         if (pg_start < intel_private.gtt_entries) {
746                 printk (KERN_INFO PFX "Trying to disable local/stolen memory\n");
747                 return -EINVAL;
748         }
749
750         for (i = pg_start; i < (mem->page_count + pg_start); i++) {
751                 writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
752         }
753         readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
754
755         agp_bridge->driver->tlb_flush(mem);
756         return 0;
757 }
758
759 static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
760 {
761         if (type == AGP_PHYS_MEMORY)
762                 return alloc_agpphysmem_i8xx(pg_count, type);
763         /* always return NULL for other allocation types for now */
764         return NULL;
765 }
766
767 static int intel_i915_configure(void)
768 {
769         struct aper_size_info_fixed *current_size;
770         u32 temp;
771         u16 gmch_ctrl;
772         int i;
773
774         current_size = A_SIZE_FIX(agp_bridge->current_size);
775
776         pci_read_config_dword(intel_private.pcidev, I915_GMADDR, &temp);
777
778         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
779
780         pci_read_config_word(agp_bridge->dev,I830_GMCH_CTRL,&gmch_ctrl);
781         gmch_ctrl |= I830_GMCH_ENABLED;
782         pci_write_config_word(agp_bridge->dev,I830_GMCH_CTRL,gmch_ctrl);
783
784         writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
785         readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
786
787         if (agp_bridge->driver->needs_scratch_page) {
788                 for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
789                         writel(agp_bridge->scratch_page, intel_private.gtt+i);
790                         readl(intel_private.gtt+i);     /* PCI Posting. */
791                 }
792         }
793
794         global_cache_flush();
795         return 0;
796 }
797
798 static void intel_i915_cleanup(void)
799 {
800         iounmap(intel_private.gtt);
801         iounmap(intel_private.registers);
802 }
803
804 static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
805                                 int type)
806 {
807         int i,j,num_entries;
808         void *temp;
809         int ret = -EINVAL;
810         int mask_type;
811
812         if (mem->page_count == 0)
813                 goto out;
814
815         temp = agp_bridge->current_size;
816         num_entries = A_SIZE_FIX(temp)->num_entries;
817
818         if (pg_start < intel_private.gtt_entries) {
819                 printk (KERN_DEBUG PFX "pg_start == 0x%.8lx,intel_private.gtt_entries == 0x%.8x\n",
820                                 pg_start,intel_private.gtt_entries);
821
822                 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
823                 goto out_err;
824         }
825
826         if ((pg_start + mem->page_count) > num_entries)
827                 goto out_err;
828
829         /* The i915 can't check the GTT for entries since its read only,
830          * depend on the caller to make the correct offset decisions.
831          */
832
833         if (type != mem->type)
834                 goto out_err;
835
836         mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
837
838         if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
839             mask_type != INTEL_AGP_CACHED_MEMORY)
840                 goto out_err;
841
842         if (!mem->is_flushed)
843                 global_cache_flush();
844
845         for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
846                 writel(agp_bridge->driver->mask_memory(agp_bridge,
847                         mem->memory[i], mask_type), intel_private.gtt+j);
848         }
849
850         readl(intel_private.gtt+j-1);
851         agp_bridge->driver->tlb_flush(mem);
852
853  out:
854         ret = 0;
855  out_err:
856         mem->is_flushed = 1;
857         return ret;
858 }
859
860 static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
861                                 int type)
862 {
863         int i;
864
865         if (mem->page_count == 0)
866                 return 0;
867
868         if (pg_start < intel_private.gtt_entries) {
869                 printk (KERN_INFO PFX "Trying to disable local/stolen memory\n");
870                 return -EINVAL;
871         }
872
873         for (i = pg_start; i < (mem->page_count + pg_start); i++) {
874                 writel(agp_bridge->scratch_page, intel_private.gtt+i);
875         }
876         readl(intel_private.gtt+i-1);
877
878         agp_bridge->driver->tlb_flush(mem);
879         return 0;
880 }
881
882 /* Return the aperture size by just checking the resource length.  The effect
883  * described in the spec of the MSAC registers is just changing of the
884  * resource size.
885  */
886 static int intel_i9xx_fetch_size(void)
887 {
888         int num_sizes = ARRAY_SIZE(intel_i830_sizes);
889         int aper_size; /* size in megabytes */
890         int i;
891
892         aper_size = pci_resource_len(intel_private.pcidev, 2) / MB(1);
893
894         for (i = 0; i < num_sizes; i++) {
895                 if (aper_size == intel_i830_sizes[i].size) {
896                         agp_bridge->current_size = intel_i830_sizes + i;
897                         agp_bridge->previous_size = agp_bridge->current_size;
898                         return aper_size;
899                 }
900         }
901
902         return 0;
903 }
904
905 /* The intel i915 automatically initializes the agp aperture during POST.
906  * Use the memory already set aside for in the GTT.
907  */
908 static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
909 {
910         int page_order;
911         struct aper_size_info_fixed *size;
912         int num_entries;
913         u32 temp, temp2;
914
915         size = agp_bridge->current_size;
916         page_order = size->page_order;
917         num_entries = size->num_entries;
918         agp_bridge->gatt_table_real = NULL;
919
920         pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
921         pci_read_config_dword(intel_private.pcidev, I915_PTEADDR,&temp2);
922
923         intel_private.gtt = ioremap(temp2, 256 * 1024);
924         if (!intel_private.gtt)
925                 return -ENOMEM;
926
927         temp &= 0xfff80000;
928
929         intel_private.registers = ioremap(temp,128 * 4096);
930         if (!intel_private.registers)
931                 return -ENOMEM;
932
933         temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
934         global_cache_flush();   /* FIXME: ? */
935
936         /* we have to call this as early as possible after the MMIO base address is known */
937         intel_i830_init_gtt_entries();
938
939         agp_bridge->gatt_table = NULL;
940
941         agp_bridge->gatt_bus_addr = temp;
942
943         return 0;
944 }
945
946 /*
947  * The i965 supports 36-bit physical addresses, but to keep
948  * the format of the GTT the same, the bits that don't fit
949  * in a 32-bit word are shifted down to bits 4..7.
950  *
951  * Gcc is smart enough to notice that "(addr >> 28) & 0xf0"
952  * is always zero on 32-bit architectures, so no need to make
953  * this conditional.
954  */
955 static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge,
956         unsigned long addr, int type)
957 {
958         /* Shift high bits down */
959         addr |= (addr >> 28) & 0xf0;
960
961         /* Type checking must be done elsewhere */
962         return addr | bridge->driver->masks[type].mask;
963 }
964
965 /* The intel i965 automatically initializes the agp aperture during POST.
966  * Use the memory already set aside for in the GTT.
967  */
968 static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
969 {
970        int page_order;
971        struct aper_size_info_fixed *size;
972        int num_entries;
973        u32 temp;
974
975        size = agp_bridge->current_size;
976        page_order = size->page_order;
977        num_entries = size->num_entries;
978        agp_bridge->gatt_table_real = NULL;
979
980        pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
981
982        temp &= 0xfff00000;
983        intel_private.gtt = ioremap((temp + (512 * 1024)) , 512 * 1024);
984
985        if (!intel_private.gtt)
986                return -ENOMEM;
987
988
989        intel_private.registers = ioremap(temp,128 * 4096);
990        if (!intel_private.registers)
991                return -ENOMEM;
992
993        temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
994        global_cache_flush();   /* FIXME: ? */
995
996        /* we have to call this as early as possible after the MMIO base address is known */
997        intel_i830_init_gtt_entries();
998
999        agp_bridge->gatt_table = NULL;
1000
1001        agp_bridge->gatt_bus_addr = temp;
1002
1003        return 0;
1004 }
1005
1006
1007 static int intel_fetch_size(void)
1008 {
1009         int i;
1010         u16 temp;
1011         struct aper_size_info_16 *values;
1012
1013         pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
1014         values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
1015
1016         for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
1017                 if (temp == values[i].size_value) {
1018                         agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
1019                         agp_bridge->aperture_size_idx = i;
1020                         return values[i].size;
1021                 }
1022         }
1023
1024         return 0;
1025 }
1026
1027 static int __intel_8xx_fetch_size(u8 temp)
1028 {
1029         int i;
1030         struct aper_size_info_8 *values;
1031
1032         values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
1033
1034         for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
1035                 if (temp == values[i].size_value) {
1036                         agp_bridge->previous_size =
1037                                 agp_bridge->current_size = (void *) (values + i);
1038                         agp_bridge->aperture_size_idx = i;
1039                         return values[i].size;
1040                 }
1041         }
1042         return 0;
1043 }
1044
1045 static int intel_8xx_fetch_size(void)
1046 {
1047         u8 temp;
1048
1049         pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
1050         return __intel_8xx_fetch_size(temp);
1051 }
1052
1053 static int intel_815_fetch_size(void)
1054 {
1055         u8 temp;
1056
1057         /* Intel 815 chipsets have a _weird_ APSIZE register with only
1058          * one non-reserved bit, so mask the others out ... */
1059         pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
1060         temp &= (1 << 3);
1061
1062         return __intel_8xx_fetch_size(temp);
1063 }
1064
1065 static void intel_tlbflush(struct agp_memory *mem)
1066 {
1067         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
1068         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
1069 }
1070
1071
1072 static void intel_8xx_tlbflush(struct agp_memory *mem)
1073 {
1074         u32 temp;
1075         pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
1076         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
1077         pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
1078         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
1079 }
1080
1081
1082 static void intel_cleanup(void)
1083 {
1084         u16 temp;
1085         struct aper_size_info_16 *previous_size;
1086
1087         previous_size = A_SIZE_16(agp_bridge->previous_size);
1088         pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
1089         pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
1090         pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
1091 }
1092
1093
1094 static void intel_8xx_cleanup(void)
1095 {
1096         u16 temp;
1097         struct aper_size_info_8 *previous_size;
1098
1099         previous_size = A_SIZE_8(agp_bridge->previous_size);
1100         pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
1101         pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
1102         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
1103 }
1104
1105
1106 static int intel_configure(void)
1107 {
1108         u32 temp;
1109         u16 temp2;
1110         struct aper_size_info_16 *current_size;
1111
1112         current_size = A_SIZE_16(agp_bridge->current_size);
1113
1114         /* aperture size */
1115         pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1116
1117         /* address to map to */
1118         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1119         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1120
1121         /* attbase - aperture base */
1122         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1123
1124         /* agpctrl */
1125         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
1126
1127         /* paccfg/nbxcfg */
1128         pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
1129         pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
1130                         (temp2 & ~(1 << 10)) | (1 << 9));
1131         /* clear any possible error conditions */
1132         pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
1133         return 0;
1134 }
1135
1136 static int intel_815_configure(void)
1137 {
1138         u32 temp, addr;
1139         u8 temp2;
1140         struct aper_size_info_8 *current_size;
1141
1142         /* attbase - aperture base */
1143         /* the Intel 815 chipset spec. says that bits 29-31 in the
1144         * ATTBASE register are reserved -> try not to write them */
1145         if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
1146                 printk (KERN_EMERG PFX "gatt bus addr too high");
1147                 return -EINVAL;
1148         }
1149
1150         current_size = A_SIZE_8(agp_bridge->current_size);
1151
1152         /* aperture size */
1153         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
1154                         current_size->size_value);
1155
1156         /* address to map to */
1157         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1158         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1159
1160         pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
1161         addr &= INTEL_815_ATTBASE_MASK;
1162         addr |= agp_bridge->gatt_bus_addr;
1163         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
1164
1165         /* agpctrl */
1166         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1167
1168         /* apcont */
1169         pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
1170         pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
1171
1172         /* clear any possible error conditions */
1173         /* Oddness : this chipset seems to have no ERRSTS register ! */
1174         return 0;
1175 }
1176
1177 static void intel_820_tlbflush(struct agp_memory *mem)
1178 {
1179         return;
1180 }
1181
1182 static void intel_820_cleanup(void)
1183 {
1184         u8 temp;
1185         struct aper_size_info_8 *previous_size;
1186
1187         previous_size = A_SIZE_8(agp_bridge->previous_size);
1188         pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
1189         pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
1190                         temp & ~(1 << 1));
1191         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
1192                         previous_size->size_value);
1193 }
1194
1195
1196 static int intel_820_configure(void)
1197 {
1198         u32 temp;
1199         u8 temp2;
1200         struct aper_size_info_8 *current_size;
1201
1202         current_size = A_SIZE_8(agp_bridge->current_size);
1203
1204         /* aperture size */
1205         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1206
1207         /* address to map to */
1208         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1209         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1210
1211         /* attbase - aperture base */
1212         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1213
1214         /* agpctrl */
1215         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1216
1217         /* global enable aperture access */
1218         /* This flag is not accessed through MCHCFG register as in */
1219         /* i850 chipset. */
1220         pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
1221         pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
1222         /* clear any possible AGP-related error conditions */
1223         pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
1224         return 0;
1225 }
1226
1227 static int intel_840_configure(void)
1228 {
1229         u32 temp;
1230         u16 temp2;
1231         struct aper_size_info_8 *current_size;
1232
1233         current_size = A_SIZE_8(agp_bridge->current_size);
1234
1235         /* aperture size */
1236         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1237
1238         /* address to map to */
1239         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1240         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1241
1242         /* attbase - aperture base */
1243         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1244
1245         /* agpctrl */
1246         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1247
1248         /* mcgcfg */
1249         pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
1250         pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
1251         /* clear any possible error conditions */
1252         pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
1253         return 0;
1254 }
1255
1256 static int intel_845_configure(void)
1257 {
1258         u32 temp;
1259         u8 temp2;
1260         struct aper_size_info_8 *current_size;
1261
1262         current_size = A_SIZE_8(agp_bridge->current_size);
1263
1264         /* aperture size */
1265         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1266
1267         if (agp_bridge->apbase_config != 0) {
1268                 pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
1269                                        agp_bridge->apbase_config);
1270         } else {
1271                 /* address to map to */
1272                 pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1273                 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1274                 agp_bridge->apbase_config = temp;
1275         }
1276
1277         /* attbase - aperture base */
1278         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1279
1280         /* agpctrl */
1281         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1282
1283         /* agpm */
1284         pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
1285         pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
1286         /* clear any possible error conditions */
1287         pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
1288         return 0;
1289 }
1290
1291 static int intel_850_configure(void)
1292 {
1293         u32 temp;
1294         u16 temp2;
1295         struct aper_size_info_8 *current_size;
1296
1297         current_size = A_SIZE_8(agp_bridge->current_size);
1298
1299         /* aperture size */
1300         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1301
1302         /* address to map to */
1303         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1304         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1305
1306         /* attbase - aperture base */
1307         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1308
1309         /* agpctrl */
1310         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1311
1312         /* mcgcfg */
1313         pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
1314         pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
1315         /* clear any possible AGP-related error conditions */
1316         pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
1317         return 0;
1318 }
1319
1320 static int intel_860_configure(void)
1321 {
1322         u32 temp;
1323         u16 temp2;
1324         struct aper_size_info_8 *current_size;
1325
1326         current_size = A_SIZE_8(agp_bridge->current_size);
1327
1328         /* aperture size */
1329         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1330
1331         /* address to map to */
1332         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1333         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1334
1335         /* attbase - aperture base */
1336         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1337
1338         /* agpctrl */
1339         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1340
1341         /* mcgcfg */
1342         pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
1343         pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
1344         /* clear any possible AGP-related error conditions */
1345         pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
1346         return 0;
1347 }
1348
1349 static int intel_830mp_configure(void)
1350 {
1351         u32 temp;
1352         u16 temp2;
1353         struct aper_size_info_8 *current_size;
1354
1355         current_size = A_SIZE_8(agp_bridge->current_size);
1356
1357         /* aperture size */
1358         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1359
1360         /* address to map to */
1361         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1362         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1363
1364         /* attbase - aperture base */
1365         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1366
1367         /* agpctrl */
1368         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1369
1370         /* gmch */
1371         pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
1372         pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
1373         /* clear any possible AGP-related error conditions */
1374         pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
1375         return 0;
1376 }
1377
1378 static int intel_7505_configure(void)
1379 {
1380         u32 temp;
1381         u16 temp2;
1382         struct aper_size_info_8 *current_size;
1383
1384         current_size = A_SIZE_8(agp_bridge->current_size);
1385
1386         /* aperture size */
1387         pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
1388
1389         /* address to map to */
1390         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1391         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1392
1393         /* attbase - aperture base */
1394         pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
1395
1396         /* agpctrl */
1397         pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
1398
1399         /* mchcfg */
1400         pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
1401         pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
1402
1403         return 0;
1404 }
1405
1406 /* Setup function */
1407 static const struct gatt_mask intel_generic_masks[] =
1408 {
1409         {.mask = 0x00000017, .type = 0}
1410 };
1411
1412 static const struct aper_size_info_8 intel_815_sizes[2] =
1413 {
1414         {64, 16384, 4, 0},
1415         {32, 8192, 3, 8},
1416 };
1417
1418 static const struct aper_size_info_8 intel_8xx_sizes[7] =
1419 {
1420         {256, 65536, 6, 0},
1421         {128, 32768, 5, 32},
1422         {64, 16384, 4, 48},
1423         {32, 8192, 3, 56},
1424         {16, 4096, 2, 60},
1425         {8, 2048, 1, 62},
1426         {4, 1024, 0, 63}
1427 };
1428
1429 static const struct aper_size_info_16 intel_generic_sizes[7] =
1430 {
1431         {256, 65536, 6, 0},
1432         {128, 32768, 5, 32},
1433         {64, 16384, 4, 48},
1434         {32, 8192, 3, 56},
1435         {16, 4096, 2, 60},
1436         {8, 2048, 1, 62},
1437         {4, 1024, 0, 63}
1438 };
1439
1440 static const struct aper_size_info_8 intel_830mp_sizes[4] =
1441 {
1442         {256, 65536, 6, 0},
1443         {128, 32768, 5, 32},
1444         {64, 16384, 4, 48},
1445         {32, 8192, 3, 56}
1446 };
1447
1448 static const struct agp_bridge_driver intel_generic_driver = {
1449         .owner                  = THIS_MODULE,
1450         .aperture_sizes         = intel_generic_sizes,
1451         .size_type              = U16_APER_SIZE,
1452         .num_aperture_sizes     = 7,
1453         .configure              = intel_configure,
1454         .fetch_size             = intel_fetch_size,
1455         .cleanup                = intel_cleanup,
1456         .tlb_flush              = intel_tlbflush,
1457         .mask_memory            = agp_generic_mask_memory,
1458         .masks                  = intel_generic_masks,
1459         .agp_enable             = agp_generic_enable,
1460         .cache_flush            = global_cache_flush,
1461         .create_gatt_table      = agp_generic_create_gatt_table,
1462         .free_gatt_table        = agp_generic_free_gatt_table,
1463         .insert_memory          = agp_generic_insert_memory,
1464         .remove_memory          = agp_generic_remove_memory,
1465         .alloc_by_type          = agp_generic_alloc_by_type,
1466         .free_by_type           = agp_generic_free_by_type,
1467         .agp_alloc_page         = agp_generic_alloc_page,
1468         .agp_destroy_page       = agp_generic_destroy_page,
1469         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1470 };
1471
1472 static const struct agp_bridge_driver intel_810_driver = {
1473         .owner                  = THIS_MODULE,
1474         .aperture_sizes         = intel_i810_sizes,
1475         .size_type              = FIXED_APER_SIZE,
1476         .num_aperture_sizes     = 2,
1477         .needs_scratch_page     = TRUE,
1478         .configure              = intel_i810_configure,
1479         .fetch_size             = intel_i810_fetch_size,
1480         .cleanup                = intel_i810_cleanup,
1481         .tlb_flush              = intel_i810_tlbflush,
1482         .mask_memory            = intel_i810_mask_memory,
1483         .masks                  = intel_i810_masks,
1484         .agp_enable             = intel_i810_agp_enable,
1485         .cache_flush            = global_cache_flush,
1486         .create_gatt_table      = agp_generic_create_gatt_table,
1487         .free_gatt_table        = agp_generic_free_gatt_table,
1488         .insert_memory          = intel_i810_insert_entries,
1489         .remove_memory          = intel_i810_remove_entries,
1490         .alloc_by_type          = intel_i810_alloc_by_type,
1491         .free_by_type           = intel_i810_free_by_type,
1492         .agp_alloc_page         = agp_generic_alloc_page,
1493         .agp_destroy_page       = agp_generic_destroy_page,
1494         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1495 };
1496
1497 static const struct agp_bridge_driver intel_815_driver = {
1498         .owner                  = THIS_MODULE,
1499         .aperture_sizes         = intel_815_sizes,
1500         .size_type              = U8_APER_SIZE,
1501         .num_aperture_sizes     = 2,
1502         .configure              = intel_815_configure,
1503         .fetch_size             = intel_815_fetch_size,
1504         .cleanup                = intel_8xx_cleanup,
1505         .tlb_flush              = intel_8xx_tlbflush,
1506         .mask_memory            = agp_generic_mask_memory,
1507         .masks                  = intel_generic_masks,
1508         .agp_enable             = agp_generic_enable,
1509         .cache_flush            = global_cache_flush,
1510         .create_gatt_table      = agp_generic_create_gatt_table,
1511         .free_gatt_table        = agp_generic_free_gatt_table,
1512         .insert_memory          = agp_generic_insert_memory,
1513         .remove_memory          = agp_generic_remove_memory,
1514         .alloc_by_type          = agp_generic_alloc_by_type,
1515         .free_by_type           = agp_generic_free_by_type,
1516         .agp_alloc_page         = agp_generic_alloc_page,
1517         .agp_destroy_page       = agp_generic_destroy_page,
1518         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1519 };
1520
1521 static const struct agp_bridge_driver intel_830_driver = {
1522         .owner                  = THIS_MODULE,
1523         .aperture_sizes         = intel_i830_sizes,
1524         .size_type              = FIXED_APER_SIZE,
1525         .num_aperture_sizes     = 4,
1526         .needs_scratch_page     = TRUE,
1527         .configure              = intel_i830_configure,
1528         .fetch_size             = intel_i830_fetch_size,
1529         .cleanup                = intel_i830_cleanup,
1530         .tlb_flush              = intel_i810_tlbflush,
1531         .mask_memory            = intel_i810_mask_memory,
1532         .masks                  = intel_i810_masks,
1533         .agp_enable             = intel_i810_agp_enable,
1534         .cache_flush            = global_cache_flush,
1535         .create_gatt_table      = intel_i830_create_gatt_table,
1536         .free_gatt_table        = intel_i830_free_gatt_table,
1537         .insert_memory          = intel_i830_insert_entries,
1538         .remove_memory          = intel_i830_remove_entries,
1539         .alloc_by_type          = intel_i830_alloc_by_type,
1540         .free_by_type           = intel_i810_free_by_type,
1541         .agp_alloc_page         = agp_generic_alloc_page,
1542         .agp_destroy_page       = agp_generic_destroy_page,
1543         .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
1544 };
1545
1546 static const struct agp_bridge_driver intel_820_driver = {
1547         .owner                  = THIS_MODULE,
1548         .aperture_sizes         = intel_8xx_sizes,
1549         .size_type              = U8_APER_SIZE,
1550         .num_aperture_sizes     = 7,
1551         .configure              = intel_820_configure,
1552         .fetch_size             = intel_8xx_fetch_size,
1553         .cleanup                = intel_820_cleanup,
1554         .tlb_flush              = intel_820_tlbflush,
1555         .mask_memory            = agp_generic_mask_memory,
1556         .masks                  = intel_generic_masks,
1557         .agp_enable             = agp_generic_enable,
1558         .cache_flush            = global_cache_flush,
1559         .create_gatt_table      = agp_generic_create_gatt_table,
1560         .free_gatt_table        = agp_generic_free_gatt_table,
1561         .insert_memory          = agp_generic_insert_memory,
1562         .remove_memory          = agp_generic_remove_memory,
1563         .alloc_by_type          = agp_generic_alloc_by_type,
1564         .free_by_type           = agp_generic_free_by_type,
1565         .agp_alloc_page         = agp_generic_alloc_page,
1566         .agp_destroy_page       = agp_generic_destroy_page,
1567         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1568 };
1569
1570 static const struct agp_bridge_driver intel_830mp_driver = {
1571         .owner                  = THIS_MODULE,
1572         .aperture_sizes         = intel_830mp_sizes,
1573         .size_type              = U8_APER_SIZE,
1574         .num_aperture_sizes     = 4,
1575         .configure              = intel_830mp_configure,
1576         .fetch_size             = intel_8xx_fetch_size,
1577         .cleanup                = intel_8xx_cleanup,
1578         .tlb_flush              = intel_8xx_tlbflush,
1579         .mask_memory            = agp_generic_mask_memory,
1580         .masks                  = intel_generic_masks,
1581         .agp_enable             = agp_generic_enable,
1582         .cache_flush            = global_cache_flush,
1583         .create_gatt_table      = agp_generic_create_gatt_table,
1584         .free_gatt_table        = agp_generic_free_gatt_table,
1585         .insert_memory          = agp_generic_insert_memory,
1586         .remove_memory          = agp_generic_remove_memory,
1587         .alloc_by_type          = agp_generic_alloc_by_type,
1588         .free_by_type           = agp_generic_free_by_type,
1589         .agp_alloc_page         = agp_generic_alloc_page,
1590         .agp_destroy_page       = agp_generic_destroy_page,
1591         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1592 };
1593
1594 static const struct agp_bridge_driver intel_840_driver = {
1595         .owner                  = THIS_MODULE,
1596         .aperture_sizes         = intel_8xx_sizes,
1597         .size_type              = U8_APER_SIZE,
1598         .num_aperture_sizes     = 7,
1599         .configure              = intel_840_configure,
1600         .fetch_size             = intel_8xx_fetch_size,
1601         .cleanup                = intel_8xx_cleanup,
1602         .tlb_flush              = intel_8xx_tlbflush,
1603         .mask_memory            = agp_generic_mask_memory,
1604         .masks                  = intel_generic_masks,
1605         .agp_enable             = agp_generic_enable,
1606         .cache_flush            = global_cache_flush,
1607         .create_gatt_table      = agp_generic_create_gatt_table,
1608         .free_gatt_table        = agp_generic_free_gatt_table,
1609         .insert_memory          = agp_generic_insert_memory,
1610         .remove_memory          = agp_generic_remove_memory,
1611         .alloc_by_type          = agp_generic_alloc_by_type,
1612         .free_by_type           = agp_generic_free_by_type,
1613         .agp_alloc_page         = agp_generic_alloc_page,
1614         .agp_destroy_page       = agp_generic_destroy_page,
1615         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1616 };
1617
1618 static const struct agp_bridge_driver intel_845_driver = {
1619         .owner                  = THIS_MODULE,
1620         .aperture_sizes         = intel_8xx_sizes,
1621         .size_type              = U8_APER_SIZE,
1622         .num_aperture_sizes     = 7,
1623         .configure              = intel_845_configure,
1624         .fetch_size             = intel_8xx_fetch_size,
1625         .cleanup                = intel_8xx_cleanup,
1626         .tlb_flush              = intel_8xx_tlbflush,
1627         .mask_memory            = agp_generic_mask_memory,
1628         .masks                  = intel_generic_masks,
1629         .agp_enable             = agp_generic_enable,
1630         .cache_flush            = global_cache_flush,
1631         .create_gatt_table      = agp_generic_create_gatt_table,
1632         .free_gatt_table        = agp_generic_free_gatt_table,
1633         .insert_memory          = agp_generic_insert_memory,
1634         .remove_memory          = agp_generic_remove_memory,
1635         .alloc_by_type          = agp_generic_alloc_by_type,
1636         .free_by_type           = agp_generic_free_by_type,
1637         .agp_alloc_page         = agp_generic_alloc_page,
1638         .agp_destroy_page       = agp_generic_destroy_page,
1639         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1640 };
1641
1642 static const struct agp_bridge_driver intel_850_driver = {
1643         .owner                  = THIS_MODULE,
1644         .aperture_sizes         = intel_8xx_sizes,
1645         .size_type              = U8_APER_SIZE,
1646         .num_aperture_sizes     = 7,
1647         .configure              = intel_850_configure,
1648         .fetch_size             = intel_8xx_fetch_size,
1649         .cleanup                = intel_8xx_cleanup,
1650         .tlb_flush              = intel_8xx_tlbflush,
1651         .mask_memory            = agp_generic_mask_memory,
1652         .masks                  = intel_generic_masks,
1653         .agp_enable             = agp_generic_enable,
1654         .cache_flush            = global_cache_flush,
1655         .create_gatt_table      = agp_generic_create_gatt_table,
1656         .free_gatt_table        = agp_generic_free_gatt_table,
1657         .insert_memory          = agp_generic_insert_memory,
1658         .remove_memory          = agp_generic_remove_memory,
1659         .alloc_by_type          = agp_generic_alloc_by_type,
1660         .free_by_type           = agp_generic_free_by_type,
1661         .agp_alloc_page         = agp_generic_alloc_page,
1662         .agp_destroy_page       = agp_generic_destroy_page,
1663         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1664 };
1665
1666 static const struct agp_bridge_driver intel_860_driver = {
1667         .owner                  = THIS_MODULE,
1668         .aperture_sizes         = intel_8xx_sizes,
1669         .size_type              = U8_APER_SIZE,
1670         .num_aperture_sizes     = 7,
1671         .configure              = intel_860_configure,
1672         .fetch_size             = intel_8xx_fetch_size,
1673         .cleanup                = intel_8xx_cleanup,
1674         .tlb_flush              = intel_8xx_tlbflush,
1675         .mask_memory            = agp_generic_mask_memory,
1676         .masks                  = intel_generic_masks,
1677         .agp_enable             = agp_generic_enable,
1678         .cache_flush            = global_cache_flush,
1679         .create_gatt_table      = agp_generic_create_gatt_table,
1680         .free_gatt_table        = agp_generic_free_gatt_table,
1681         .insert_memory          = agp_generic_insert_memory,
1682         .remove_memory          = agp_generic_remove_memory,
1683         .alloc_by_type          = agp_generic_alloc_by_type,
1684         .free_by_type           = agp_generic_free_by_type,
1685         .agp_alloc_page         = agp_generic_alloc_page,
1686         .agp_destroy_page       = agp_generic_destroy_page,
1687         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1688 };
1689
1690 static const struct agp_bridge_driver intel_915_driver = {
1691         .owner                  = THIS_MODULE,
1692         .aperture_sizes         = intel_i830_sizes,
1693         .size_type              = FIXED_APER_SIZE,
1694         .num_aperture_sizes     = 4,
1695         .needs_scratch_page     = TRUE,
1696         .configure              = intel_i915_configure,
1697         .fetch_size             = intel_i9xx_fetch_size,
1698         .cleanup                = intel_i915_cleanup,
1699         .tlb_flush              = intel_i810_tlbflush,
1700         .mask_memory            = intel_i810_mask_memory,
1701         .masks                  = intel_i810_masks,
1702         .agp_enable             = intel_i810_agp_enable,
1703         .cache_flush            = global_cache_flush,
1704         .create_gatt_table      = intel_i915_create_gatt_table,
1705         .free_gatt_table        = intel_i830_free_gatt_table,
1706         .insert_memory          = intel_i915_insert_entries,
1707         .remove_memory          = intel_i915_remove_entries,
1708         .alloc_by_type          = intel_i830_alloc_by_type,
1709         .free_by_type           = intel_i810_free_by_type,
1710         .agp_alloc_page         = agp_generic_alloc_page,
1711         .agp_destroy_page       = agp_generic_destroy_page,
1712         .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
1713 };
1714
1715 static const struct agp_bridge_driver intel_i965_driver = {
1716        .owner                  = THIS_MODULE,
1717        .aperture_sizes         = intel_i830_sizes,
1718        .size_type              = FIXED_APER_SIZE,
1719        .num_aperture_sizes     = 4,
1720        .needs_scratch_page     = TRUE,
1721        .configure              = intel_i915_configure,
1722        .fetch_size             = intel_i9xx_fetch_size,
1723        .cleanup                = intel_i915_cleanup,
1724        .tlb_flush              = intel_i810_tlbflush,
1725        .mask_memory            = intel_i965_mask_memory,
1726        .masks                  = intel_i810_masks,
1727        .agp_enable             = intel_i810_agp_enable,
1728        .cache_flush            = global_cache_flush,
1729        .create_gatt_table      = intel_i965_create_gatt_table,
1730        .free_gatt_table        = intel_i830_free_gatt_table,
1731        .insert_memory          = intel_i915_insert_entries,
1732        .remove_memory          = intel_i915_remove_entries,
1733        .alloc_by_type          = intel_i830_alloc_by_type,
1734        .free_by_type           = intel_i810_free_by_type,
1735        .agp_alloc_page         = agp_generic_alloc_page,
1736        .agp_destroy_page       = agp_generic_destroy_page,
1737        .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
1738 };
1739
1740 static const struct agp_bridge_driver intel_7505_driver = {
1741         .owner                  = THIS_MODULE,
1742         .aperture_sizes         = intel_8xx_sizes,
1743         .size_type              = U8_APER_SIZE,
1744         .num_aperture_sizes     = 7,
1745         .configure              = intel_7505_configure,
1746         .fetch_size             = intel_8xx_fetch_size,
1747         .cleanup                = intel_8xx_cleanup,
1748         .tlb_flush              = intel_8xx_tlbflush,
1749         .mask_memory            = agp_generic_mask_memory,
1750         .masks                  = intel_generic_masks,
1751         .agp_enable             = agp_generic_enable,
1752         .cache_flush            = global_cache_flush,
1753         .create_gatt_table      = agp_generic_create_gatt_table,
1754         .free_gatt_table        = agp_generic_free_gatt_table,
1755         .insert_memory          = agp_generic_insert_memory,
1756         .remove_memory          = agp_generic_remove_memory,
1757         .alloc_by_type          = agp_generic_alloc_by_type,
1758         .free_by_type           = agp_generic_free_by_type,
1759         .agp_alloc_page         = agp_generic_alloc_page,
1760         .agp_destroy_page       = agp_generic_destroy_page,
1761         .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
1762 };
1763
1764 static const struct agp_bridge_driver intel_g33_driver = {
1765         .owner                  = THIS_MODULE,
1766         .aperture_sizes         = intel_i830_sizes,
1767         .size_type              = FIXED_APER_SIZE,
1768         .num_aperture_sizes     = 4,
1769         .needs_scratch_page     = TRUE,
1770         .configure              = intel_i915_configure,
1771         .fetch_size             = intel_i9xx_fetch_size,
1772         .cleanup                = intel_i915_cleanup,
1773         .tlb_flush              = intel_i810_tlbflush,
1774         .mask_memory            = intel_i965_mask_memory,
1775         .masks                  = intel_i810_masks,
1776         .agp_enable             = intel_i810_agp_enable,
1777         .cache_flush            = global_cache_flush,
1778         .create_gatt_table      = intel_i915_create_gatt_table,
1779         .free_gatt_table        = intel_i830_free_gatt_table,
1780         .insert_memory          = intel_i915_insert_entries,
1781         .remove_memory          = intel_i915_remove_entries,
1782         .alloc_by_type          = intel_i830_alloc_by_type,
1783         .free_by_type           = intel_i810_free_by_type,
1784         .agp_alloc_page         = agp_generic_alloc_page,
1785         .agp_destroy_page       = agp_generic_destroy_page,
1786         .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
1787 };
1788
1789 static int find_gmch(u16 device)
1790 {
1791         struct pci_dev *gmch_device;
1792
1793         gmch_device = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL);
1794         if (gmch_device && PCI_FUNC(gmch_device->devfn) != 0) {
1795                 gmch_device = pci_get_device(PCI_VENDOR_ID_INTEL,
1796                                 device, gmch_device);
1797         }
1798
1799         if (!gmch_device)
1800                 return 0;
1801
1802         intel_private.pcidev = gmch_device;
1803         return 1;
1804 }
1805
1806 /* Table to describe Intel GMCH and AGP/PCIE GART drivers.  At least one of
1807  * driver and gmch_driver must be non-null, and find_gmch will determine
1808  * which one should be used if a gmch_chip_id is present.
1809  */
1810 static const struct intel_driver_description {
1811         unsigned int chip_id;
1812         unsigned int gmch_chip_id;
1813         unsigned int multi_gmch_chip; /* if we have more gfx chip type on this HB. */
1814         char *name;
1815         const struct agp_bridge_driver *driver;
1816         const struct agp_bridge_driver *gmch_driver;
1817 } intel_agp_chipsets[] = {
1818         { PCI_DEVICE_ID_INTEL_82443LX_0, 0, 0, "440LX", &intel_generic_driver, NULL },
1819         { PCI_DEVICE_ID_INTEL_82443BX_0, 0, 0, "440BX", &intel_generic_driver, NULL },
1820         { PCI_DEVICE_ID_INTEL_82443GX_0, 0, 0, "440GX", &intel_generic_driver, NULL },
1821         { PCI_DEVICE_ID_INTEL_82810_MC1, PCI_DEVICE_ID_INTEL_82810_IG1, 0, "i810",
1822                 NULL, &intel_810_driver },
1823         { PCI_DEVICE_ID_INTEL_82810_MC3, PCI_DEVICE_ID_INTEL_82810_IG3, 0, "i810",
1824                 NULL, &intel_810_driver },
1825         { PCI_DEVICE_ID_INTEL_82810E_MC, PCI_DEVICE_ID_INTEL_82810E_IG, 0, "i810",
1826                 NULL, &intel_810_driver },
1827         { PCI_DEVICE_ID_INTEL_82815_MC, PCI_DEVICE_ID_INTEL_82815_CGC, 0, "i815",
1828                 &intel_815_driver, &intel_810_driver },
1829         { PCI_DEVICE_ID_INTEL_82820_HB, 0, 0, "i820", &intel_820_driver, NULL },
1830         { PCI_DEVICE_ID_INTEL_82820_UP_HB, 0, 0, "i820", &intel_820_driver, NULL },
1831         { PCI_DEVICE_ID_INTEL_82830_HB, PCI_DEVICE_ID_INTEL_82830_CGC, 0, "830M",
1832                 &intel_830mp_driver, &intel_830_driver },
1833         { PCI_DEVICE_ID_INTEL_82840_HB, 0, 0, "i840", &intel_840_driver, NULL },
1834         { PCI_DEVICE_ID_INTEL_82845_HB, 0, 0, "845G", &intel_845_driver, NULL },
1835         { PCI_DEVICE_ID_INTEL_82845G_HB, PCI_DEVICE_ID_INTEL_82845G_IG, 0, "830M",
1836                 &intel_845_driver, &intel_830_driver },
1837         { PCI_DEVICE_ID_INTEL_82850_HB, 0, 0, "i850", &intel_850_driver, NULL },
1838         { PCI_DEVICE_ID_INTEL_82855PM_HB, 0, 0, "855PM", &intel_845_driver, NULL },
1839         { PCI_DEVICE_ID_INTEL_82855GM_HB, PCI_DEVICE_ID_INTEL_82855GM_IG, 0, "855GM",
1840                 &intel_845_driver, &intel_830_driver },
1841         { PCI_DEVICE_ID_INTEL_82860_HB, 0, 0, "i860", &intel_860_driver, NULL },
1842         { PCI_DEVICE_ID_INTEL_82865_HB, PCI_DEVICE_ID_INTEL_82865_IG, 0, "865",
1843                 &intel_845_driver, &intel_830_driver },
1844         { PCI_DEVICE_ID_INTEL_82875_HB, 0, 0, "i875", &intel_845_driver, NULL },
1845         { PCI_DEVICE_ID_INTEL_82915G_HB, PCI_DEVICE_ID_INTEL_82915G_IG, 0, "915G",
1846                 NULL, &intel_915_driver },
1847         { PCI_DEVICE_ID_INTEL_82915GM_HB, PCI_DEVICE_ID_INTEL_82915GM_IG, 0, "915GM",
1848                 NULL, &intel_915_driver },
1849         { PCI_DEVICE_ID_INTEL_82945G_HB, PCI_DEVICE_ID_INTEL_82945G_IG, 0, "945G",
1850                 NULL, &intel_915_driver },
1851         { PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GM_IG, 1, "945GM",
1852                 NULL, &intel_915_driver },
1853         { PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GME_IG, 0, "945GME",
1854                 NULL, &intel_915_driver },
1855         { PCI_DEVICE_ID_INTEL_82946GZ_HB, PCI_DEVICE_ID_INTEL_82946GZ_IG, 0, "946GZ",
1856                 NULL, &intel_i965_driver },
1857         { PCI_DEVICE_ID_INTEL_82965G_1_HB, PCI_DEVICE_ID_INTEL_82965G_1_IG, 0, "965G",
1858                 NULL, &intel_i965_driver },
1859         { PCI_DEVICE_ID_INTEL_82965Q_HB, PCI_DEVICE_ID_INTEL_82965Q_IG, 0, "965Q",
1860                 NULL, &intel_i965_driver },
1861         { PCI_DEVICE_ID_INTEL_82965G_HB, PCI_DEVICE_ID_INTEL_82965G_IG, 0, "965G",
1862                 NULL, &intel_i965_driver },
1863         { PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GM_IG, 1, "965GM",
1864                 NULL, &intel_i965_driver },
1865         { PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GME_IG, 0, "965GME/GLE",
1866                 NULL, &intel_i965_driver },
1867         { PCI_DEVICE_ID_INTEL_7505_0, 0, 0, "E7505", &intel_7505_driver, NULL },
1868         { PCI_DEVICE_ID_INTEL_7205_0, 0, 0, "E7205", &intel_7505_driver, NULL },
1869         { PCI_DEVICE_ID_INTEL_G33_HB, PCI_DEVICE_ID_INTEL_G33_IG, 0, "G33",
1870                 NULL, &intel_g33_driver },
1871         { PCI_DEVICE_ID_INTEL_Q35_HB, PCI_DEVICE_ID_INTEL_Q35_IG, 0, "Q35",
1872                 NULL, &intel_g33_driver },
1873         { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33",
1874                 NULL, &intel_g33_driver },
1875         { 0, 0, 0, NULL, NULL, NULL }
1876 };
1877
1878 static int __devinit agp_intel_probe(struct pci_dev *pdev,
1879                                      const struct pci_device_id *ent)
1880 {
1881         struct agp_bridge_data *bridge;
1882         u8 cap_ptr = 0;
1883         struct resource *r;
1884         int i;
1885
1886         cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
1887
1888         bridge = agp_alloc_bridge();
1889         if (!bridge)
1890                 return -ENOMEM;
1891
1892         for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
1893                 /* In case that multiple models of gfx chip may
1894                    stand on same host bridge type, this can be
1895                    sure we detect the right IGD. */
1896                 if (pdev->device == intel_agp_chipsets[i].chip_id) {
1897                         if ((intel_agp_chipsets[i].gmch_chip_id != 0) &&
1898                                 find_gmch(intel_agp_chipsets[i].gmch_chip_id)) {
1899                                 bridge->driver =
1900                                         intel_agp_chipsets[i].gmch_driver;
1901                                 break;
1902                         } else if (intel_agp_chipsets[i].multi_gmch_chip) {
1903                                 continue;
1904                         } else {
1905                                 bridge->driver = intel_agp_chipsets[i].driver;
1906                                 break;
1907                         }
1908                 }
1909         }
1910
1911         if (intel_agp_chipsets[i].name == NULL) {
1912                 if (cap_ptr)
1913                         printk(KERN_WARNING PFX "Unsupported Intel chipset"
1914                                "(device id: %04x)\n", pdev->device);
1915                 agp_put_bridge(bridge);
1916                 return -ENODEV;
1917         }
1918
1919         if (bridge->driver == NULL) {
1920                 /* bridge has no AGP and no IGD detected */
1921                 if (cap_ptr)
1922                         printk(KERN_WARNING PFX "Failed to find bridge device "
1923                                 "(chip_id: %04x)\n",
1924                                 intel_agp_chipsets[i].gmch_chip_id);
1925                 agp_put_bridge(bridge);
1926                 return -ENODEV;
1927         }
1928
1929         bridge->dev = pdev;
1930         bridge->capndx = cap_ptr;
1931         bridge->dev_private_data = &intel_private;
1932
1933         printk(KERN_INFO PFX "Detected an Intel %s Chipset.\n",
1934                 intel_agp_chipsets[i].name);
1935
1936         /*
1937         * The following fixes the case where the BIOS has "forgotten" to
1938         * provide an address range for the GART.
1939         * 20030610 - hamish@zot.org
1940         */
1941         r = &pdev->resource[0];
1942         if (!r->start && r->end) {
1943                 if (pci_assign_resource(pdev, 0)) {
1944                         printk(KERN_ERR PFX "could not assign resource 0\n");
1945                         agp_put_bridge(bridge);
1946                         return -ENODEV;
1947                 }
1948         }
1949
1950         /*
1951         * If the device has not been properly setup, the following will catch
1952         * the problem and should stop the system from crashing.
1953         * 20030610 - hamish@zot.org
1954         */
1955         if (pci_enable_device(pdev)) {
1956                 printk(KERN_ERR PFX "Unable to Enable PCI device\n");
1957                 agp_put_bridge(bridge);
1958                 return -ENODEV;
1959         }
1960
1961         /* Fill in the mode register */
1962         if (cap_ptr) {
1963                 pci_read_config_dword(pdev,
1964                                 bridge->capndx+PCI_AGP_STATUS,
1965                                 &bridge->mode);
1966         }
1967
1968         pci_set_drvdata(pdev, bridge);
1969         return agp_add_bridge(bridge);
1970 }
1971
1972 static void __devexit agp_intel_remove(struct pci_dev *pdev)
1973 {
1974         struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
1975
1976         agp_remove_bridge(bridge);
1977
1978         if (intel_private.pcidev)
1979                 pci_dev_put(intel_private.pcidev);
1980
1981         agp_put_bridge(bridge);
1982 }
1983
1984 #ifdef CONFIG_PM
1985 static int agp_intel_resume(struct pci_dev *pdev)
1986 {
1987         struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
1988
1989         pci_restore_state(pdev);
1990
1991         /* We should restore our graphics device's config space,
1992          * as host bridge (00:00) resumes before graphics device (02:00),
1993          * then our access to its pci space can work right.
1994          */
1995         if (intel_private.pcidev)
1996                 pci_restore_state(intel_private.pcidev);
1997
1998         if (bridge->driver == &intel_generic_driver)
1999                 intel_configure();
2000         else if (bridge->driver == &intel_850_driver)
2001                 intel_850_configure();
2002         else if (bridge->driver == &intel_845_driver)
2003                 intel_845_configure();
2004         else if (bridge->driver == &intel_830mp_driver)
2005                 intel_830mp_configure();
2006         else if (bridge->driver == &intel_915_driver)
2007                 intel_i915_configure();
2008         else if (bridge->driver == &intel_830_driver)
2009                 intel_i830_configure();
2010         else if (bridge->driver == &intel_810_driver)
2011                 intel_i810_configure();
2012         else if (bridge->driver == &intel_i965_driver)
2013                 intel_i915_configure();
2014
2015         return 0;
2016 }
2017 #endif
2018
2019 static struct pci_device_id agp_intel_pci_table[] = {
2020 #define ID(x)                                           \
2021         {                                               \
2022         .class          = (PCI_CLASS_BRIDGE_HOST << 8), \
2023         .class_mask     = ~0,                           \
2024         .vendor         = PCI_VENDOR_ID_INTEL,          \
2025         .device         = x,                            \
2026         .subvendor      = PCI_ANY_ID,                   \
2027         .subdevice      = PCI_ANY_ID,                   \
2028         }
2029         ID(PCI_DEVICE_ID_INTEL_82443LX_0),
2030         ID(PCI_DEVICE_ID_INTEL_82443BX_0),
2031         ID(PCI_DEVICE_ID_INTEL_82443GX_0),
2032         ID(PCI_DEVICE_ID_INTEL_82810_MC1),
2033         ID(PCI_DEVICE_ID_INTEL_82810_MC3),
2034         ID(PCI_DEVICE_ID_INTEL_82810E_MC),
2035         ID(PCI_DEVICE_ID_INTEL_82815_MC),
2036         ID(PCI_DEVICE_ID_INTEL_82820_HB),
2037         ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
2038         ID(PCI_DEVICE_ID_INTEL_82830_HB),
2039         ID(PCI_DEVICE_ID_INTEL_82840_HB),
2040         ID(PCI_DEVICE_ID_INTEL_82845_HB),
2041         ID(PCI_DEVICE_ID_INTEL_82845G_HB),
2042         ID(PCI_DEVICE_ID_INTEL_82850_HB),
2043         ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
2044         ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
2045         ID(PCI_DEVICE_ID_INTEL_82860_HB),
2046         ID(PCI_DEVICE_ID_INTEL_82865_HB),
2047         ID(PCI_DEVICE_ID_INTEL_82875_HB),
2048         ID(PCI_DEVICE_ID_INTEL_7505_0),
2049         ID(PCI_DEVICE_ID_INTEL_7205_0),
2050         ID(PCI_DEVICE_ID_INTEL_82915G_HB),
2051         ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
2052         ID(PCI_DEVICE_ID_INTEL_82945G_HB),
2053         ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
2054         ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
2055         ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
2056         ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
2057         ID(PCI_DEVICE_ID_INTEL_82965G_HB),
2058         ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
2059         ID(PCI_DEVICE_ID_INTEL_G33_HB),
2060         ID(PCI_DEVICE_ID_INTEL_Q35_HB),
2061         ID(PCI_DEVICE_ID_INTEL_Q33_HB),
2062         { }
2063 };
2064
2065 MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
2066
2067 static struct pci_driver agp_intel_pci_driver = {
2068         .name           = "agpgart-intel",
2069         .id_table       = agp_intel_pci_table,
2070         .probe          = agp_intel_probe,
2071         .remove         = __devexit_p(agp_intel_remove),
2072 #ifdef CONFIG_PM
2073         .resume         = agp_intel_resume,
2074 #endif
2075 };
2076
2077 static int __init agp_intel_init(void)
2078 {
2079         if (agp_off)
2080                 return -EINVAL;
2081         return pci_register_driver(&agp_intel_pci_driver);
2082 }
2083
2084 static void __exit agp_intel_cleanup(void)
2085 {
2086         pci_unregister_driver(&agp_intel_pci_driver);
2087 }
2088
2089 module_init(agp_intel_init);
2090 module_exit(agp_intel_cleanup);
2091
2092 MODULE_AUTHOR("Dave Jones <davej@codemonkey.org.uk>");
2093 MODULE_LICENSE("GPL and additional rights");