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