ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / char / agp / generic.c
1 /*
2  * AGPGART driver.
3  * Copyright (C) 2002-2003 Dave Jones.
4  * Copyright (C) 1999 Jeff Hartmann.
5  * Copyright (C) 1999 Precision Insight, Inc.
6  * Copyright (C) 1999 Xi Graphics, Inc.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, 
22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
24  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  * TODO: 
27  * - Allocate more than order 0 pages to avoid too much linear map splitting.
28  */
29 #include <linux/config.h>
30 #include <linux/module.h>
31 #include <linux/pci.h>
32 #include <linux/init.h>
33 #include <linux/pagemap.h>
34 #include <linux/miscdevice.h>
35 #include <linux/pm.h>
36 #include <linux/agp_backend.h>
37 #include <linux/vmalloc.h>
38 #include "agp.h"
39
40 __u32 *agp_gatt_table; 
41 int agp_memory_reserved;
42
43 /*
44  * Needed by the Nforce GART driver for the time being. Would be
45  * nice to do this some other way instead of needing this export.
46  */
47 EXPORT_SYMBOL_GPL(agp_memory_reserved);
48
49 /* 
50  * Generic routines for handling agp_memory structures -
51  * They use the basic page allocation routines to do the brunt of the work.
52  */
53
54 void agp_free_key(int key)
55 {
56         if (key < 0)
57                 return;
58
59         if (key < MAXKEY)
60                 clear_bit(key, agp_bridge->key_list);
61 }
62 EXPORT_SYMBOL(agp_free_key);
63
64
65 static int agp_get_key(void)
66 {
67         int bit;
68
69         bit = find_first_zero_bit(agp_bridge->key_list, MAXKEY);
70         if (bit < MAXKEY) {
71                 set_bit(bit, agp_bridge->key_list);
72                 return bit;
73         }
74         return -1;
75 }
76
77
78 struct agp_memory *agp_create_memory(int scratch_pages)
79 {
80         struct agp_memory *new;
81
82         new = kmalloc(sizeof(struct agp_memory), GFP_KERNEL);
83
84         if (new == NULL)
85                 return NULL;
86
87         memset(new, 0, sizeof(struct agp_memory));
88         new->key = agp_get_key();
89
90         if (new->key < 0) {
91                 kfree(new);
92                 return NULL;
93         }
94         new->memory = vmalloc(PAGE_SIZE * scratch_pages);
95
96         if (new->memory == NULL) {
97                 agp_free_key(new->key);
98                 kfree(new);
99                 return NULL;
100         }
101         new->num_scratch_pages = scratch_pages;
102         return new;
103 }
104 EXPORT_SYMBOL(agp_create_memory);
105
106 /**
107  *      agp_free_memory - free memory associated with an agp_memory pointer.
108  *
109  *      @curr:          agp_memory pointer to be freed.
110  *
111  *      It is the only function that can be called when the backend is not owned
112  *      by the caller.  (So it can free memory on client death.)
113  */
114 void agp_free_memory(struct agp_memory *curr)
115 {
116         size_t i;
117
118         if ((agp_bridge->type == NOT_SUPPORTED) || (curr == NULL))
119                 return;
120
121         if (curr->is_bound == TRUE)
122                 agp_unbind_memory(curr);
123
124         if (curr->type != 0) {
125                 agp_bridge->driver->free_by_type(curr);
126                 return;
127         }
128         if (curr->page_count != 0) {
129                 for (i = 0; i < curr->page_count; i++) {
130                         agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[i]));
131                 }
132         }
133         agp_free_key(curr->key);
134         vfree(curr->memory);
135         kfree(curr);
136 }
137 EXPORT_SYMBOL(agp_free_memory);
138
139 #define ENTRIES_PER_PAGE                (PAGE_SIZE / sizeof(unsigned long))
140
141 /**
142  *      agp_allocate_memory  -  allocate a group of pages of a certain type.
143  *
144  *      @page_count:    size_t argument of the number of pages
145  *      @type:  u32 argument of the type of memory to be allocated.  
146  *
147  *      Every agp bridge device will allow you to allocate AGP_NORMAL_MEMORY which
148  *      maps to physical ram.  Any other type is device dependent.
149  *
150  *      It returns NULL whenever memory is unavailable. 
151  */
152 struct agp_memory *agp_allocate_memory(size_t page_count, u32 type)
153 {
154         int scratch_pages;
155         struct agp_memory *new;
156         size_t i;
157
158         if (agp_bridge->type == NOT_SUPPORTED)
159                 return NULL;
160
161         if ((atomic_read(&agp_bridge->current_memory_agp) + page_count) > agp_bridge->max_memory_agp)
162                 return NULL;
163
164         if (type != 0) {
165                 new = agp_bridge->driver->alloc_by_type(page_count, type);
166                 return new;
167         }
168
169         scratch_pages = (page_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE;
170
171         new = agp_create_memory(scratch_pages);
172
173         if (new == NULL)
174                 return NULL;
175
176         for (i = 0; i < page_count; i++) {
177                 void *addr = agp_bridge->driver->agp_alloc_page();
178
179                 if (addr == NULL) {
180                         agp_free_memory(new);
181                         return NULL;
182                 }
183                 new->memory[i] =
184                         agp_bridge->driver->mask_memory(virt_to_phys(addr), type);
185                 new->page_count++;
186         }
187
188         flush_agp_mappings();
189
190         return new;
191 }
192 EXPORT_SYMBOL(agp_allocate_memory);
193
194
195 /* End - Generic routines for handling agp_memory structures */
196
197
198 static int agp_return_size(void)
199 {
200         int current_size;
201         void *temp;
202
203         temp = agp_bridge->current_size;
204
205         switch (agp_bridge->driver->size_type) {
206         case U8_APER_SIZE:
207                 current_size = A_SIZE_8(temp)->size;
208                 break;
209         case U16_APER_SIZE:
210                 current_size = A_SIZE_16(temp)->size;
211                 break;
212         case U32_APER_SIZE:
213                 current_size = A_SIZE_32(temp)->size;
214                 break;
215         case LVL2_APER_SIZE:
216                 current_size = A_SIZE_LVL2(temp)->size;
217                 break;
218         case FIXED_APER_SIZE:
219                 current_size = A_SIZE_FIX(temp)->size;
220                 break;
221         default:
222                 current_size = 0;
223                 break;
224         }
225
226         current_size -= (agp_memory_reserved / (1024*1024));
227         if (current_size <0)
228                 current_size = 0;
229         return current_size;
230 }
231
232
233 int agp_num_entries(void)
234 {
235         int num_entries;
236         void *temp;
237
238         temp = agp_bridge->current_size;
239
240         switch (agp_bridge->driver->size_type) {
241         case U8_APER_SIZE:
242                 num_entries = A_SIZE_8(temp)->num_entries;
243                 break;
244         case U16_APER_SIZE:
245                 num_entries = A_SIZE_16(temp)->num_entries;
246                 break;
247         case U32_APER_SIZE:
248                 num_entries = A_SIZE_32(temp)->num_entries;
249                 break;
250         case LVL2_APER_SIZE:
251                 num_entries = A_SIZE_LVL2(temp)->num_entries;
252                 break;
253         case FIXED_APER_SIZE:
254                 num_entries = A_SIZE_FIX(temp)->num_entries;
255                 break;
256         default:
257                 num_entries = 0;
258                 break;
259         }
260
261         num_entries -= agp_memory_reserved>>PAGE_SHIFT;
262         if (num_entries<0)
263                 num_entries = 0;
264         return num_entries;
265 }
266 EXPORT_SYMBOL_GPL(agp_num_entries);
267
268
269 /**
270  *      agp_copy_info  -  copy bridge state information
271  *
272  *      @info:          agp_kern_info pointer.  The caller should insure that this pointer is valid. 
273  *
274  *      This function copies information about the agp bridge device and the state of
275  *      the agp backend into an agp_kern_info pointer.
276  */
277 int agp_copy_info(struct agp_kern_info *info)
278 {
279         memset(info, 0, sizeof(struct agp_kern_info));
280         if (!agp_bridge || agp_bridge->type == NOT_SUPPORTED ||
281             !agp_bridge->version) {
282                 info->chipset = NOT_SUPPORTED;
283                 return -EIO;
284         }
285
286         info->version.major = agp_bridge->version->major;
287         info->version.minor = agp_bridge->version->minor;
288         info->chipset = agp_bridge->type;
289         info->device = agp_bridge->dev;
290         info->mode = agp_bridge->mode;
291         info->aper_base = agp_bridge->gart_bus_addr;
292         info->aper_size = agp_return_size();
293         info->max_memory = agp_bridge->max_memory_agp;
294         info->current_memory = atomic_read(&agp_bridge->current_memory_agp);
295         info->cant_use_aperture = agp_bridge->driver->cant_use_aperture;
296         info->vm_ops = agp_bridge->vm_ops;
297         info->page_mask = ~0UL;
298         return 0;
299 }
300 EXPORT_SYMBOL(agp_copy_info);
301
302
303 /* End - Routine to copy over information structure */
304
305
306 /*
307  * Routines for handling swapping of agp_memory into the GATT -
308  * These routines take agp_memory and insert them into the GATT.
309  * They call device specific routines to actually write to the GATT.
310  */
311
312 /**
313  *      agp_bind_memory  -  Bind an agp_memory structure into the GATT.
314  * 
315  *      @curr:          agp_memory pointer
316  *      @pg_start:      an offset into the graphics aperture translation table
317  *
318  *      It returns -EINVAL if the pointer == NULL.
319  *      It returns -EBUSY if the area of the table requested is already in use.
320  */
321 int agp_bind_memory(struct agp_memory *curr, off_t pg_start)
322 {
323         int ret_val;
324
325         if ((agp_bridge->type == NOT_SUPPORTED) || (curr == NULL))
326                 return -EINVAL;
327
328         if (curr->is_bound == TRUE) {
329                 printk (KERN_INFO PFX "memory %p is already bound!\n", curr);
330                 return -EINVAL;
331         }
332         if (curr->is_flushed == FALSE) {
333                 agp_bridge->driver->cache_flush();
334                 curr->is_flushed = TRUE;
335         }
336         ret_val = agp_bridge->driver->insert_memory(curr, pg_start, curr->type);
337
338         if (ret_val != 0)
339                 return ret_val;
340
341         curr->is_bound = TRUE;
342         curr->pg_start = pg_start;
343         return 0;
344 }
345 EXPORT_SYMBOL(agp_bind_memory);
346
347
348 /**
349  *      agp_unbind_memory  -  Removes an agp_memory structure from the GATT
350  * 
351  * @curr:       agp_memory pointer to be removed from the GATT.
352  * 
353  * It returns -EINVAL if this piece of agp_memory is not currently bound to
354  * the graphics aperture translation table or if the agp_memory pointer == NULL
355  */
356 int agp_unbind_memory(struct agp_memory *curr)
357 {
358         int ret_val;
359
360         if ((agp_bridge->type == NOT_SUPPORTED) || (curr == NULL))
361                 return -EINVAL;
362
363         if (curr->is_bound != TRUE) {
364                 printk (KERN_INFO PFX "memory %p was not bound!\n", curr);
365                 return -EINVAL;
366         }
367
368         ret_val = agp_bridge->driver->remove_memory(curr, curr->pg_start, curr->type);
369
370         if (ret_val != 0)
371                 return ret_val;
372
373         curr->is_bound = FALSE;
374         curr->pg_start = 0;
375         return 0;
376 }
377 EXPORT_SYMBOL(agp_unbind_memory);
378
379 /* End - Routines for handling swapping of agp_memory into the GATT */
380
381
382 /* Generic Agp routines - Start */
383 static void agp_v2_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
384 {
385         /* disable SBA if it's not supported */
386         if (!((*cmd & AGPSTAT_SBA) && (*tmp & AGPSTAT_SBA) && (*mode & AGPSTAT_SBA)))
387                 *cmd &= ~AGPSTAT_SBA;
388
389         /* Set speed */
390         if (!((*cmd & AGPSTAT2_4X) && (*tmp & AGPSTAT2_4X) && (*mode & AGPSTAT2_4X)))
391                 *cmd &= ~AGPSTAT2_4X;
392
393         if (!((*cmd & AGPSTAT2_2X) && (*tmp & AGPSTAT2_2X) && (*mode & AGPSTAT2_2X)))
394                 *cmd &= ~AGPSTAT2_2X;
395
396         if (!((*cmd & AGPSTAT2_1X) && (*tmp & AGPSTAT2_1X) && (*mode & AGPSTAT2_1X)))
397                 *cmd &= ~AGPSTAT2_1X;
398
399         /* Now we know what mode it should be, clear out the unwanted bits. */
400         if (*cmd & AGPSTAT2_4X)
401                 *cmd &= ~(AGPSTAT2_1X | AGPSTAT2_2X);   /* 4X */
402
403         if (*cmd & AGPSTAT2_2X)
404                 *cmd &= ~(AGPSTAT2_1X | AGPSTAT2_4X);   /* 2X */
405
406         if (*cmd & AGPSTAT2_1X)
407                 *cmd &= ~(AGPSTAT2_2X | AGPSTAT2_4X);   /* 1Xf */
408 }
409
410
411 static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
412 {
413         /* ARQSZ - Set the value to the maximum one.
414          * Don't allow the mode register to override values. */
415         *cmd = ((*cmd & ~AGPSTAT_ARQSZ) |
416                 max_t(u32,(*cmd & AGPSTAT_ARQSZ),(*tmp & AGPSTAT_ARQSZ)));
417
418         /* Calibration cycle.
419          * Don't allow the mode register to override values. */
420         *cmd = ((*cmd & ~AGPSTAT_CAL_MASK) |
421                 min_t(u32,(*cmd & AGPSTAT_CAL_MASK),(*tmp & AGPSTAT_CAL_MASK)));
422
423         /* SBA *must* be supported for AGP v3 */
424         *cmd |= AGPSTAT_SBA;
425
426         /*
427          * Set speed.
428          * Check for invalid speeds. This can happen when applications
429          * written before the AGP 3.0 standard pass AGP2.x modes to AGP3 hardware
430          */
431         if (*mode & AGPSTAT_MODE_3_0) {
432                 /*
433                  * Caller hasn't a clue what its doing. We are in 3.0 mode,
434                  * have been passed a 3.0 mode, but with 2.x speed bits set.
435                  * AGP2.x 4x -> AGP3.0 4x.
436                  */
437                 if (*mode & AGPSTAT2_4X) {
438                         printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n",
439                                                 current->comm, *mode);
440                         *mode &= ~AGPSTAT2_4X;
441                         *mode |= AGPSTAT3_4X;
442                 }
443         } else {
444                 /*
445                  * The caller doesn't know what they are doing. We are in 3.0 mode,
446                  * but have been passed an AGP 2.x mode.
447                  * Convert AGP 1x,2x,4x -> AGP 3.0 4x.
448                  */
449                 printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n",
450                                         current->comm, *mode);
451                 *mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X);
452                 *mode |= AGPSTAT3_4X;
453         }
454
455         if (!((*cmd & AGPSTAT3_8X) && (*tmp & AGPSTAT3_8X) && (*mode & AGPSTAT3_8X)))
456                 *cmd &= ~AGPSTAT3_8X;
457
458         if (!((*cmd & AGPSTAT3_4X) && (*tmp & AGPSTAT3_4X) && (*mode & AGPSTAT3_4X)))
459                 *cmd &= ~AGPSTAT3_4X;
460
461         /* Clear out unwanted bits. */
462         if (*cmd & AGPSTAT3_8X)
463                 *cmd &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
464         if (*cmd & AGPSTAT3_4X)
465                 *cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
466 }
467
468 //FIXME: This doesn't smell right.
469 //We need a function we pass an agp_device to.
470 u32 agp_collect_device_status(u32 mode, u32 cmd)
471 {
472         struct pci_dev *device = NULL;
473         u8 cap_ptr;
474         u32 tmp;
475         u32 agp3;
476
477         while ((device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, device)) != NULL) {
478                 cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP);
479                 if (!cap_ptr)
480                         continue;
481
482                 /*
483                  * Ok, here we have a AGP device. Disable impossible 
484                  * settings, and adjust the readqueue to the minimum.
485                  */
486                 pci_read_config_dword(device, cap_ptr+PCI_AGP_STATUS, &tmp);
487
488                 /* adjust RQ depth */
489                 cmd = ((cmd & ~AGPSTAT_RQ_DEPTH) |
490                      min_t(u32, (mode & AGPSTAT_RQ_DEPTH),
491                          min_t(u32, (cmd & AGPSTAT_RQ_DEPTH), (tmp & AGPSTAT_RQ_DEPTH))));
492                 
493                 /* disable FW if it's not supported */
494                 if (!((cmd & AGPSTAT_FW) && (tmp & AGPSTAT_FW) && (mode & AGPSTAT_FW)))
495                         cmd &= ~AGPSTAT_FW;
496
497                 /* Check to see if we are operating in 3.0 mode */
498                 pci_read_config_dword(device, cap_ptr+AGPSTAT, &agp3);
499                 if (agp3 & AGPSTAT_MODE_3_0) {
500                         agp_v3_parse_one(&mode, &cmd, &tmp);
501                 } else {
502                         agp_v2_parse_one(&mode, &cmd, &tmp);
503                 }
504         }
505         return cmd;
506 }
507 EXPORT_SYMBOL(agp_collect_device_status);
508
509
510 void agp_device_command(u32 command, int agp_v3)
511 {
512         struct pci_dev *device = NULL;
513         int mode;
514
515         mode = command & 0x7;
516         if (agp_v3)
517                 mode *= 4;
518
519         while ((device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, device)) != NULL) {
520                 u8 agp = pci_find_capability(device, PCI_CAP_ID_AGP);
521                 if (!agp)
522                         continue;
523
524                 printk(KERN_INFO PFX "Putting AGP V%d device at %s into %dx mode\n",
525                                 agp_v3 ? 3 : 2, pci_name(device), mode);
526                 pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command);
527         }
528 }
529 EXPORT_SYMBOL(agp_device_command);
530
531
532 void get_agp_version(struct agp_bridge_data *bridge)
533 {
534         u32 ncapid;
535
536         /* Exit early if already set by errata workarounds. */
537         if (agp_bridge->major_version != 0)
538                 return;
539
540         pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx, &ncapid);
541         agp_bridge->major_version = (ncapid >> AGP_MAJOR_VERSION_SHIFT) & 0xf;
542         agp_bridge->minor_version = (ncapid >> AGP_MINOR_VERSION_SHIFT) & 0xf;
543 }
544 EXPORT_SYMBOL(get_agp_version);
545
546
547 void agp_generic_enable(u32 mode)
548 {
549         u32 command, temp;
550         u32 agp3;
551
552         get_agp_version(agp_bridge);
553
554         printk(KERN_INFO PFX "Found an AGP %d.%d compliant device at %s.\n",
555                                 agp_bridge->major_version,
556                                 agp_bridge->minor_version,
557                                 agp_bridge->dev->slot_name);
558
559         pci_read_config_dword(agp_bridge->dev,
560                       agp_bridge->capndx + PCI_AGP_STATUS, &command);
561
562         command = agp_collect_device_status(mode, command);
563         command |= AGPSTAT_AGP_ENABLE;
564
565         /* Do AGP version specific frobbing. */
566         if(agp_bridge->major_version >= 3) {
567                 pci_read_config_dword(agp_bridge->dev,
568                         agp_bridge->capndx+AGPSTAT, &agp3);
569
570                 /* Check to see if we are operating in 3.0 mode */
571                 if (agp3 & AGPSTAT_MODE_3_0) {
572                         /* If we have 3.5, we can do the isoch stuff. */
573                         if (agp_bridge->minor_version >= 5)
574                                 agp_3_5_enable(agp_bridge);
575                         agp_device_command(command, TRUE);
576                         return;
577                 } else {
578                     /* Disable calibration cycle in RX91<1> when not in AGP3.0 mode of operation.*/
579                     command &= ~(7<<10) ;
580                     pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, &temp);
581                     temp |= (1<<9);
582                     pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, temp);
583
584                     printk (KERN_INFO PFX "Device is in legacy mode,"
585                                 " falling back to 2.x\n");
586                 }
587         }
588
589         /* AGP v<3 */
590         agp_device_command(command, FALSE);
591 }
592 EXPORT_SYMBOL(agp_generic_enable);
593
594
595 int agp_generic_create_gatt_table(void)
596 {
597         char *table;
598         char *table_end;
599         int size;
600         int page_order;
601         int num_entries;
602         int i;
603         void *temp;
604         struct page *page;
605
606         /* The generic routines can't handle 2 level gatt's */
607         if (agp_bridge->driver->size_type == LVL2_APER_SIZE)
608                 return -EINVAL;
609
610         table = NULL;
611         i = agp_bridge->aperture_size_idx;
612         temp = agp_bridge->current_size;
613         size = page_order = num_entries = 0;
614
615         if (agp_bridge->driver->size_type != FIXED_APER_SIZE) {
616                 do {
617                         switch (agp_bridge->driver->size_type) {
618                         case U8_APER_SIZE:
619                                 size = A_SIZE_8(temp)->size;
620                                 page_order =
621                                     A_SIZE_8(temp)->page_order;
622                                 num_entries =
623                                     A_SIZE_8(temp)->num_entries;
624                                 break;
625                         case U16_APER_SIZE:
626                                 size = A_SIZE_16(temp)->size;
627                                 page_order = A_SIZE_16(temp)->page_order;
628                                 num_entries = A_SIZE_16(temp)->num_entries;
629                                 break;
630                         case U32_APER_SIZE:
631                                 size = A_SIZE_32(temp)->size;
632                                 page_order = A_SIZE_32(temp)->page_order;
633                                 num_entries = A_SIZE_32(temp)->num_entries;
634                                 break;
635                                 /* This case will never really happen. */
636                         case FIXED_APER_SIZE:
637                         case LVL2_APER_SIZE:
638                         default:
639                                 size = page_order = num_entries = 0;
640                                 break;
641                         }
642
643                         table = (char *) __get_free_pages(GFP_KERNEL,
644                                                           page_order);
645
646                         if (table == NULL) {
647                                 i++;
648                                 switch (agp_bridge->driver->size_type) {
649                                 case U8_APER_SIZE:
650                                         agp_bridge->current_size = A_IDX8(agp_bridge);
651                                         break;
652                                 case U16_APER_SIZE:
653                                         agp_bridge->current_size = A_IDX16(agp_bridge);
654                                         break;
655                                 case U32_APER_SIZE:
656                                         agp_bridge->current_size = A_IDX32(agp_bridge);
657                                         break;
658                                         /* This case will never really happen. */
659                                 case FIXED_APER_SIZE:
660                                 case LVL2_APER_SIZE:
661                                 default:
662                                         agp_bridge->current_size =
663                                             agp_bridge->current_size;
664                                         break;
665                                 }
666                                 temp = agp_bridge->current_size;        
667                         } else {
668                                 agp_bridge->aperture_size_idx = i;
669                         }
670                 } while (!table && (i < agp_bridge->driver->num_aperture_sizes));
671         } else {
672                 size = ((struct aper_size_info_fixed *) temp)->size;
673                 page_order = ((struct aper_size_info_fixed *) temp)->page_order;
674                 num_entries = ((struct aper_size_info_fixed *) temp)->num_entries;
675                 table = (char *) __get_free_pages(GFP_KERNEL, page_order);
676         }
677
678         if (table == NULL)
679                 return -ENOMEM;
680
681         table_end = table + ((PAGE_SIZE * (1 << page_order)) - 1);
682
683         for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
684                 SetPageReserved(page);
685
686         agp_bridge->gatt_table_real = (u32 *) table;
687         agp_gatt_table = (void *)table; 
688
689         agp_bridge->driver->cache_flush();
690         agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table),
691                                         (PAGE_SIZE * (1 << page_order)));
692         agp_bridge->driver->cache_flush();
693
694         if (agp_bridge->gatt_table == NULL) {
695                 for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
696                         ClearPageReserved(page);
697
698                 free_pages((unsigned long) table, page_order);
699
700                 return -ENOMEM;
701         }
702         agp_bridge->gatt_bus_addr = virt_to_phys(agp_bridge->gatt_table_real);
703
704         /* AK: bogus, should encode addresses > 4GB */
705         for (i = 0; i < num_entries; i++)
706                 agp_bridge->gatt_table[i] = (unsigned long) agp_bridge->scratch_page;
707
708         return 0;
709 }
710 EXPORT_SYMBOL(agp_generic_create_gatt_table);
711
712 int agp_generic_free_gatt_table(void)
713 {
714         int page_order;
715         char *table, *table_end;
716         void *temp;
717         struct page *page;
718
719         temp = agp_bridge->current_size;
720
721         switch (agp_bridge->driver->size_type) {
722         case U8_APER_SIZE:
723                 page_order = A_SIZE_8(temp)->page_order;
724                 break;
725         case U16_APER_SIZE:
726                 page_order = A_SIZE_16(temp)->page_order;
727                 break;
728         case U32_APER_SIZE:
729                 page_order = A_SIZE_32(temp)->page_order;
730                 break;
731         case FIXED_APER_SIZE:
732                 page_order = A_SIZE_FIX(temp)->page_order;
733                 break;
734         case LVL2_APER_SIZE:
735                 /* The generic routines can't deal with 2 level gatt's */
736                 return -EINVAL;
737                 break;
738         default:
739                 page_order = 0;
740                 break;
741         }
742
743         /* Do not worry about freeing memory, because if this is
744          * called, then all agp memory is deallocated and removed
745          * from the table. */
746
747         iounmap(agp_bridge->gatt_table);
748         table = (char *) agp_bridge->gatt_table_real;
749         table_end = table + ((PAGE_SIZE * (1 << page_order)) - 1);
750
751         for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
752                 ClearPageReserved(page);
753
754         free_pages((unsigned long) agp_bridge->gatt_table_real, page_order);
755
756         agp_gatt_table = NULL;
757         agp_bridge->gatt_table = NULL;
758         agp_bridge->gatt_table_real = NULL;
759         agp_bridge->gatt_bus_addr = 0;
760
761         return 0;
762 }
763 EXPORT_SYMBOL(agp_generic_free_gatt_table);
764
765
766 int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
767 {
768         int num_entries;
769         size_t i;
770         off_t j;
771         void *temp;
772
773         temp = agp_bridge->current_size;
774
775         switch (agp_bridge->driver->size_type) {
776         case U8_APER_SIZE:
777                 num_entries = A_SIZE_8(temp)->num_entries;
778                 break;
779         case U16_APER_SIZE:
780                 num_entries = A_SIZE_16(temp)->num_entries;
781                 break;
782         case U32_APER_SIZE:
783                 num_entries = A_SIZE_32(temp)->num_entries;
784                 break;
785         case FIXED_APER_SIZE:
786                 num_entries = A_SIZE_FIX(temp)->num_entries;
787                 break;
788         case LVL2_APER_SIZE:
789                 /* The generic routines can't deal with 2 level gatt's */
790                 return -EINVAL;
791                 break;
792         default:
793                 num_entries = 0;
794                 break;
795         }
796
797         num_entries -= agp_memory_reserved/PAGE_SIZE;
798         if (num_entries < 0) num_entries = 0;
799
800         if (type != 0 || mem->type != 0) {
801                 /* The generic routines know nothing of memory types */
802                 return -EINVAL;
803         }
804
805         /* AK: could wrap */
806         if ((pg_start + mem->page_count) > num_entries)
807                 return -EINVAL;
808
809         j = pg_start;
810
811         while (j < (pg_start + mem->page_count)) {
812                 if (!PGE_EMPTY(agp_bridge, agp_bridge->gatt_table[j])) {
813                         return -EBUSY;
814                 }
815                 j++;
816         }
817
818         if (mem->is_flushed == FALSE) {
819                 agp_bridge->driver->cache_flush();
820                 mem->is_flushed = TRUE;
821         }
822
823         for (i = 0, j = pg_start; i < mem->page_count; i++, j++)
824                 agp_bridge->gatt_table[j] =
825                                 agp_bridge->driver->mask_memory(
826                                                 mem->memory[i], mem->type);
827
828         agp_bridge->driver->tlb_flush(mem);
829         return 0;
830 }
831 EXPORT_SYMBOL(agp_generic_insert_memory);
832
833
834 int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
835 {
836         size_t i;
837
838         if (type != 0 || mem->type != 0) {
839                 /* The generic routines know nothing of memory types */
840                 return -EINVAL;
841         }
842
843         /* AK: bogus, should encode addresses > 4GB */
844         for (i = pg_start; i < (mem->page_count + pg_start); i++) {
845                 agp_bridge->gatt_table[i] =
846                     (unsigned long) agp_bridge->scratch_page;
847         }
848
849         agp_bridge->driver->tlb_flush(mem);
850         return 0;
851 }
852 EXPORT_SYMBOL(agp_generic_remove_memory);
853
854
855 struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type)
856 {
857         return NULL;
858 }
859 EXPORT_SYMBOL(agp_generic_alloc_by_type);
860
861
862 void agp_generic_free_by_type(struct agp_memory *curr)
863 {
864         if (curr->memory != NULL)
865                 vfree(curr->memory);
866
867         agp_free_key(curr->key);
868         kfree(curr);
869 }
870 EXPORT_SYMBOL(agp_generic_free_by_type);
871
872
873 /* 
874  * Basic Page Allocation Routines -
875  * These routines handle page allocation and by default they reserve the allocated 
876  * memory.  They also handle incrementing the current_memory_agp value, Which is checked
877  * against a maximum value.
878  */
879
880 void *agp_generic_alloc_page(void)
881 {
882         struct page * page;
883
884         page = alloc_page(GFP_KERNEL);
885         if (page == NULL)
886                 return 0;
887
888         map_page_into_agp(page);
889
890         get_page(page);
891         SetPageLocked(page);
892         atomic_inc(&agp_bridge->current_memory_agp);
893         return page_address(page);
894 }
895 EXPORT_SYMBOL(agp_generic_alloc_page);
896
897
898 void agp_generic_destroy_page(void *addr)
899 {
900         struct page *page;
901
902         if (addr == NULL)
903                 return;
904
905         page = virt_to_page(addr);
906         unmap_page_from_agp(page);
907         put_page(page);
908         unlock_page(page);
909         free_page((unsigned long)addr);
910         atomic_dec(&agp_bridge->current_memory_agp);
911 }
912 EXPORT_SYMBOL(agp_generic_destroy_page);
913
914 /* End Basic Page Allocation Routines */
915
916
917 /** 
918  * agp_enable  -  initialise the agp point-to-point connection.
919  * 
920  * @mode:       agp mode register value to configure with.
921  */
922 void agp_enable(u32 mode)
923 {
924         if (agp_bridge->type == NOT_SUPPORTED)
925                 return;
926         agp_bridge->driver->agp_enable(mode);
927 }
928 EXPORT_SYMBOL(agp_enable);
929
930
931 #ifdef CONFIG_SMP
932 static void ipi_handler(void *null)
933 {
934         flush_agp_cache();
935 }
936 #endif
937
938 void global_cache_flush(void)
939 {
940 #ifdef CONFIG_SMP
941         if (on_each_cpu(ipi_handler, NULL, 1, 1) != 0)
942                 panic(PFX "timed out waiting for the other CPUs!\n");
943 #else
944         flush_agp_cache();
945 #endif
946 }
947 EXPORT_SYMBOL(global_cache_flush);
948
949 unsigned long agp_generic_mask_memory(unsigned long addr, int type)
950 {
951         /* memory type is ignored in the generic routine */
952         if (agp_bridge->driver->masks)
953                 return addr | agp_bridge->driver->masks[0].mask;
954         else
955                 return addr;
956 }
957 EXPORT_SYMBOL(agp_generic_mask_memory);
958
959 /*
960  * These functions are implemented according to the AGPv3 spec,
961  * which covers implementation details that had previously been
962  * left open.
963  */
964
965 int agp3_generic_fetch_size(void)
966 {
967         u16 temp_size;
968         int i;
969         struct aper_size_info_16 *values;
970
971         pci_read_config_word(agp_bridge->dev, agp_bridge->capndx+AGPAPSIZE, &temp_size);
972         values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
973
974         for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
975                 if (temp_size == values[i].size_value) {
976                         agp_bridge->previous_size =
977                                 agp_bridge->current_size = (void *) (values + i);
978
979                         agp_bridge->aperture_size_idx = i;
980                         return values[i].size;
981                 }
982         }
983         return 0;
984 }
985 EXPORT_SYMBOL(agp3_generic_fetch_size);
986
987 void agp3_generic_tlbflush(struct agp_memory *mem)
988 {
989         u32 ctrl;
990         pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, &ctrl);
991         pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, ctrl & ~AGPCTRL_GTLBEN);
992         pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, ctrl);
993 }
994 EXPORT_SYMBOL(agp3_generic_tlbflush);
995
996 int agp3_generic_configure(void)
997 {
998         u32 temp;
999         struct aper_size_info_16 *current_size;
1000
1001         current_size = A_SIZE_16(agp_bridge->current_size);
1002
1003         pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
1004         agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1005
1006         /* set aperture size */
1007         pci_write_config_word(agp_bridge->dev, agp_bridge->capndx+AGPAPSIZE, current_size->size_value);
1008         /* set gart pointer */
1009         pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPGARTLO, agp_bridge->gatt_bus_addr);
1010         /* enable aperture and GTLB */
1011         pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, &temp);
1012         pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, temp | AGPCTRL_APERENB | AGPCTRL_GTLBEN);
1013         return 0;
1014 }
1015 EXPORT_SYMBOL(agp3_generic_configure);
1016
1017 void agp3_generic_cleanup(void)
1018 {
1019         u32 ctrl;
1020         pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, &ctrl);
1021         pci_write_config_dword(agp_bridge->dev, agp_bridge->capndx+AGPCTRL, ctrl & ~AGPCTRL_APERENB);
1022 }
1023 EXPORT_SYMBOL(agp3_generic_cleanup);
1024
1025 struct aper_size_info_16 agp3_generic_sizes[AGP_GENERIC_SIZES_ENTRIES] =
1026 {
1027         {4096, 1048576, 10,0x000},
1028         {2048,  524288, 9, 0x800},
1029         {1024,  262144, 8, 0xc00},
1030         { 512,  131072, 7, 0xe00},
1031         { 256,   65536, 6, 0xf00},
1032         { 128,   32768, 5, 0xf20},
1033         {  64,   16384, 4, 0xf30},
1034         {  32,    8192, 3, 0xf38},
1035         {  16,    4096, 2, 0xf3c},
1036         {   8,    2048, 1, 0xf3e},
1037         {   4,    1024, 0, 0xf3f}
1038 };
1039 EXPORT_SYMBOL(agp3_generic_sizes);
1040