aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp/intel-agp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/agp/intel-agp.c')
-rw-r--r--drivers/char/agp/intel-agp.c186
1 files changed, 120 insertions, 66 deletions
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index a3011de51f7c..4e455f03b4f0 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -24,6 +24,9 @@
24 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB) 24 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
25 25
26 26
27extern int agp_memory_reserved;
28
29
27/* Intel 815 register */ 30/* Intel 815 register */
28#define INTEL_815_APCONT 0x51 31#define INTEL_815_APCONT 0x51
29#define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF 32#define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF
@@ -68,12 +71,15 @@ static struct aper_size_info_fixed intel_i810_sizes[] =
68 71
69#define AGP_DCACHE_MEMORY 1 72#define AGP_DCACHE_MEMORY 1
70#define AGP_PHYS_MEMORY 2 73#define AGP_PHYS_MEMORY 2
74#define INTEL_AGP_CACHED_MEMORY 3
71 75
72static struct gatt_mask intel_i810_masks[] = 76static struct gatt_mask intel_i810_masks[] =
73{ 77{
74 {.mask = I810_PTE_VALID, .type = 0}, 78 {.mask = I810_PTE_VALID, .type = 0},
75 {.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY}, 79 {.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
76 {.mask = I810_PTE_VALID, .type = 0} 80 {.mask = I810_PTE_VALID, .type = 0},
81 {.mask = I810_PTE_VALID | I830_PTE_SYSTEM_CACHED,
82 .type = INTEL_AGP_CACHED_MEMORY}
77}; 83};
78 84
79static struct _intel_i810_private { 85static struct _intel_i810_private {
@@ -82,6 +88,7 @@ static struct _intel_i810_private {
82 int num_dcache_entries; 88 int num_dcache_entries;
83} intel_i810_private; 89} intel_i810_private;
84 90
91
85static int intel_i810_fetch_size(void) 92static int intel_i810_fetch_size(void)
86{ 93{
87 u32 smram_miscc; 94 u32 smram_miscc;
@@ -201,62 +208,79 @@ static void i8xx_destroy_pages(void *addr)
201 atomic_dec(&agp_bridge->current_memory_agp); 208 atomic_dec(&agp_bridge->current_memory_agp);
202} 209}
203 210
211static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge,
212 int type)
213{
214 if (type < AGP_USER_TYPES)
215 return type;
216 else if (type == AGP_USER_CACHED_MEMORY)
217 return INTEL_AGP_CACHED_MEMORY;
218 else
219 return 0;
220}
221
204static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, 222static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
205 int type) 223 int type)
206{ 224{
207 int i, j, num_entries; 225 int i, j, num_entries;
208 void *temp; 226 void *temp;
227 int ret = -EINVAL;
228 int mask_type;
209 229
210 if (mem->page_count == 0) 230 if (mem->page_count == 0)
211 return 0; 231 goto out;
212 232
213 temp = agp_bridge->current_size; 233 temp = agp_bridge->current_size;
214 num_entries = A_SIZE_FIX(temp)->num_entries; 234 num_entries = A_SIZE_FIX(temp)->num_entries;
215 235
216 if ((pg_start + mem->page_count) > num_entries) 236 if ((pg_start + mem->page_count) > num_entries)
217 return -EINVAL; 237 goto out_err;
218 238
219 for (j = pg_start; j < (pg_start + mem->page_count); j++) {
220 if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j)))
221 return -EBUSY;
222 }
223 239
224 if (type != 0 || mem->type != 0) { 240 for (j = pg_start; j < (pg_start + mem->page_count); j++) {
225 if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) { 241 if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) {
226 /* special insert */ 242 ret = -EBUSY;
227 if (!mem->is_flushed) { 243 goto out_err;
228 global_cache_flush();
229 mem->is_flushed = TRUE;
230 }
231
232 for (i = pg_start; i < (pg_start + mem->page_count); i++) {
233 writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4));
234 }
235 readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */
236
237 agp_bridge->driver->tlb_flush(mem);
238 return 0;
239 } 244 }
240 if ((type == AGP_PHYS_MEMORY) && (mem->type == AGP_PHYS_MEMORY))
241 goto insert;
242 return -EINVAL;
243 } 245 }
244 246
245insert: 247 if (type != mem->type)
246 if (!mem->is_flushed) { 248 goto out_err;
247 global_cache_flush();
248 mem->is_flushed = TRUE;
249 }
250 249
251 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { 250 mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
252 writel(agp_bridge->driver->mask_memory(agp_bridge, 251
253 mem->memory[i], mem->type), 252 switch (mask_type) {
254 intel_i810_private.registers+I810_PTE_BASE+(j*4)); 253 case AGP_DCACHE_MEMORY:
254 if (!mem->is_flushed)
255 global_cache_flush();
256 for (i = pg_start; i < (pg_start + mem->page_count); i++) {
257 writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID,
258 intel_i810_private.registers+I810_PTE_BASE+(i*4));
259 }
260 readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4));
261 break;
262 case AGP_PHYS_MEMORY:
263 case AGP_NORMAL_MEMORY:
264 if (!mem->is_flushed)
265 global_cache_flush();
266 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
267 writel(agp_bridge->driver->mask_memory(agp_bridge,
268 mem->memory[i],
269 mask_type),
270 intel_i810_private.registers+I810_PTE_BASE+(j*4));
271 }
272 readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4));
273 break;
274 default:
275 goto out_err;
255 } 276 }
256 readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4)); /* PCI Posting. */
257 277
258 agp_bridge->driver->tlb_flush(mem); 278 agp_bridge->driver->tlb_flush(mem);
259 return 0; 279out:
280 ret = 0;
281out_err:
282 mem->is_flushed = 1;
283 return ret;
260} 284}
261 285
262static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start, 286static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
@@ -337,12 +361,11 @@ static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
337 new->type = AGP_DCACHE_MEMORY; 361 new->type = AGP_DCACHE_MEMORY;
338 new->page_count = pg_count; 362 new->page_count = pg_count;
339 new->num_scratch_pages = 0; 363 new->num_scratch_pages = 0;
340 vfree(new->memory); 364 agp_free_page_array(new);
341 return new; 365 return new;
342 } 366 }
343 if (type == AGP_PHYS_MEMORY) 367 if (type == AGP_PHYS_MEMORY)
344 return alloc_agpphysmem_i8xx(pg_count, type); 368 return alloc_agpphysmem_i8xx(pg_count, type);
345
346 return NULL; 369 return NULL;
347} 370}
348 371
@@ -357,7 +380,7 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
357 gart_to_virt(curr->memory[0])); 380 gart_to_virt(curr->memory[0]));
358 global_flush_tlb(); 381 global_flush_tlb();
359 } 382 }
360 vfree(curr->memory); 383 agp_free_page_array(curr);
361 } 384 }
362 kfree(curr); 385 kfree(curr);
363} 386}
@@ -619,9 +642,11 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
619{ 642{
620 int i,j,num_entries; 643 int i,j,num_entries;
621 void *temp; 644 void *temp;
645 int ret = -EINVAL;
646 int mask_type;
622 647
623 if (mem->page_count == 0) 648 if (mem->page_count == 0)
624 return 0; 649 goto out;
625 650
626 temp = agp_bridge->current_size; 651 temp = agp_bridge->current_size;
627 num_entries = A_SIZE_FIX(temp)->num_entries; 652 num_entries = A_SIZE_FIX(temp)->num_entries;
@@ -631,34 +656,41 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
631 pg_start,intel_i830_private.gtt_entries); 656 pg_start,intel_i830_private.gtt_entries);
632 657
633 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n"); 658 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
634 return -EINVAL; 659 goto out_err;
635 } 660 }
636 661
637 if ((pg_start + mem->page_count) > num_entries) 662 if ((pg_start + mem->page_count) > num_entries)
638 return -EINVAL; 663 goto out_err;
639 664
640 /* The i830 can't check the GTT for entries since its read only, 665 /* The i830 can't check the GTT for entries since its read only,
641 * depend on the caller to make the correct offset decisions. 666 * depend on the caller to make the correct offset decisions.
642 */ 667 */
643 668
644 if ((type != 0 && type != AGP_PHYS_MEMORY) || 669 if (type != mem->type)
645 (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) 670 goto out_err;
646 return -EINVAL; 671
672 mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
647 673
648 if (!mem->is_flushed) { 674 if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
675 mask_type != INTEL_AGP_CACHED_MEMORY)
676 goto out_err;
677
678 if (!mem->is_flushed)
649 global_cache_flush(); 679 global_cache_flush();
650 mem->is_flushed = TRUE;
651 }
652 680
653 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { 681 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
654 writel(agp_bridge->driver->mask_memory(agp_bridge, 682 writel(agp_bridge->driver->mask_memory(agp_bridge,
655 mem->memory[i], mem->type), 683 mem->memory[i], mask_type),
656 intel_i830_private.registers+I810_PTE_BASE+(j*4)); 684 intel_i830_private.registers+I810_PTE_BASE+(j*4));
657 } 685 }
658 readl(intel_i830_private.registers+I810_PTE_BASE+((j-1)*4)); 686 readl(intel_i830_private.registers+I810_PTE_BASE+((j-1)*4));
659
660 agp_bridge->driver->tlb_flush(mem); 687 agp_bridge->driver->tlb_flush(mem);
661 return 0; 688
689out:
690 ret = 0;
691out_err:
692 mem->is_flushed = 1;
693 return ret;
662} 694}
663 695
664static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start, 696static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,
@@ -687,7 +719,6 @@ static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
687{ 719{
688 if (type == AGP_PHYS_MEMORY) 720 if (type == AGP_PHYS_MEMORY)
689 return alloc_agpphysmem_i8xx(pg_count, type); 721 return alloc_agpphysmem_i8xx(pg_count, type);
690
691 /* always return NULL for other allocation types for now */ 722 /* always return NULL for other allocation types for now */
692 return NULL; 723 return NULL;
693} 724}
@@ -734,9 +765,11 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
734{ 765{
735 int i,j,num_entries; 766 int i,j,num_entries;
736 void *temp; 767 void *temp;
768 int ret = -EINVAL;
769 int mask_type;
737 770
738 if (mem->page_count == 0) 771 if (mem->page_count == 0)
739 return 0; 772 goto out;
740 773
741 temp = agp_bridge->current_size; 774 temp = agp_bridge->current_size;
742 num_entries = A_SIZE_FIX(temp)->num_entries; 775 num_entries = A_SIZE_FIX(temp)->num_entries;
@@ -746,33 +779,41 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
746 pg_start,intel_i830_private.gtt_entries); 779 pg_start,intel_i830_private.gtt_entries);
747 780
748 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n"); 781 printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
749 return -EINVAL; 782 goto out_err;
750 } 783 }
751 784
752 if ((pg_start + mem->page_count) > num_entries) 785 if ((pg_start + mem->page_count) > num_entries)
753 return -EINVAL; 786 goto out_err;
754 787
755 /* The i830 can't check the GTT for entries since its read only, 788 /* The i915 can't check the GTT for entries since its read only,
756 * depend on the caller to make the correct offset decisions. 789 * depend on the caller to make the correct offset decisions.
757 */ 790 */
758 791
759 if ((type != 0 && type != AGP_PHYS_MEMORY) || 792 if (type != mem->type)
760 (mem->type != 0 && mem->type != AGP_PHYS_MEMORY)) 793 goto out_err;
761 return -EINVAL; 794
795 mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
762 796
763 if (!mem->is_flushed) { 797 if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
798 mask_type != INTEL_AGP_CACHED_MEMORY)
799 goto out_err;
800
801 if (!mem->is_flushed)
764 global_cache_flush(); 802 global_cache_flush();
765 mem->is_flushed = TRUE;
766 }
767 803
768 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { 804 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
769 writel(agp_bridge->driver->mask_memory(agp_bridge, 805 writel(agp_bridge->driver->mask_memory(agp_bridge,
770 mem->memory[i], mem->type), intel_i830_private.gtt+j); 806 mem->memory[i], mask_type), intel_i830_private.gtt+j);
771 } 807 }
772 readl(intel_i830_private.gtt+j-1);
773 808
809 readl(intel_i830_private.gtt+j-1);
774 agp_bridge->driver->tlb_flush(mem); 810 agp_bridge->driver->tlb_flush(mem);
775 return 0; 811
812 out:
813 ret = 0;
814 out_err:
815 mem->is_flushed = 1;
816 return ret;
776} 817}
777 818
778static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start, 819static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
@@ -1384,6 +1425,7 @@ static struct agp_bridge_driver intel_generic_driver = {
1384 .free_by_type = agp_generic_free_by_type, 1425 .free_by_type = agp_generic_free_by_type,
1385 .agp_alloc_page = agp_generic_alloc_page, 1426 .agp_alloc_page = agp_generic_alloc_page,
1386 .agp_destroy_page = agp_generic_destroy_page, 1427 .agp_destroy_page = agp_generic_destroy_page,
1428 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1387}; 1429};
1388 1430
1389static struct agp_bridge_driver intel_810_driver = { 1431static struct agp_bridge_driver intel_810_driver = {
@@ -1408,6 +1450,7 @@ static struct agp_bridge_driver intel_810_driver = {
1408 .free_by_type = intel_i810_free_by_type, 1450 .free_by_type = intel_i810_free_by_type,
1409 .agp_alloc_page = agp_generic_alloc_page, 1451 .agp_alloc_page = agp_generic_alloc_page,
1410 .agp_destroy_page = agp_generic_destroy_page, 1452 .agp_destroy_page = agp_generic_destroy_page,
1453 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1411}; 1454};
1412 1455
1413static struct agp_bridge_driver intel_815_driver = { 1456static struct agp_bridge_driver intel_815_driver = {
@@ -1431,6 +1474,7 @@ static struct agp_bridge_driver intel_815_driver = {
1431 .free_by_type = agp_generic_free_by_type, 1474 .free_by_type = agp_generic_free_by_type,
1432 .agp_alloc_page = agp_generic_alloc_page, 1475 .agp_alloc_page = agp_generic_alloc_page,
1433 .agp_destroy_page = agp_generic_destroy_page, 1476 .agp_destroy_page = agp_generic_destroy_page,
1477 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1434}; 1478};
1435 1479
1436static struct agp_bridge_driver intel_830_driver = { 1480static struct agp_bridge_driver intel_830_driver = {
@@ -1455,6 +1499,7 @@ static struct agp_bridge_driver intel_830_driver = {
1455 .free_by_type = intel_i810_free_by_type, 1499 .free_by_type = intel_i810_free_by_type,
1456 .agp_alloc_page = agp_generic_alloc_page, 1500 .agp_alloc_page = agp_generic_alloc_page,
1457 .agp_destroy_page = agp_generic_destroy_page, 1501 .agp_destroy_page = agp_generic_destroy_page,
1502 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1458}; 1503};
1459 1504
1460static struct agp_bridge_driver intel_820_driver = { 1505static struct agp_bridge_driver intel_820_driver = {
@@ -1478,6 +1523,7 @@ static struct agp_bridge_driver intel_820_driver = {
1478 .free_by_type = agp_generic_free_by_type, 1523 .free_by_type = agp_generic_free_by_type,
1479 .agp_alloc_page = agp_generic_alloc_page, 1524 .agp_alloc_page = agp_generic_alloc_page,
1480 .agp_destroy_page = agp_generic_destroy_page, 1525 .agp_destroy_page = agp_generic_destroy_page,
1526 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1481}; 1527};
1482 1528
1483static struct agp_bridge_driver intel_830mp_driver = { 1529static struct agp_bridge_driver intel_830mp_driver = {
@@ -1501,6 +1547,7 @@ static struct agp_bridge_driver intel_830mp_driver = {
1501 .free_by_type = agp_generic_free_by_type, 1547 .free_by_type = agp_generic_free_by_type,
1502 .agp_alloc_page = agp_generic_alloc_page, 1548 .agp_alloc_page = agp_generic_alloc_page,
1503 .agp_destroy_page = agp_generic_destroy_page, 1549 .agp_destroy_page = agp_generic_destroy_page,
1550 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1504}; 1551};
1505 1552
1506static struct agp_bridge_driver intel_840_driver = { 1553static struct agp_bridge_driver intel_840_driver = {
@@ -1524,6 +1571,7 @@ static struct agp_bridge_driver intel_840_driver = {
1524 .free_by_type = agp_generic_free_by_type, 1571 .free_by_type = agp_generic_free_by_type,
1525 .agp_alloc_page = agp_generic_alloc_page, 1572 .agp_alloc_page = agp_generic_alloc_page,
1526 .agp_destroy_page = agp_generic_destroy_page, 1573 .agp_destroy_page = agp_generic_destroy_page,
1574 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1527}; 1575};
1528 1576
1529static struct agp_bridge_driver intel_845_driver = { 1577static struct agp_bridge_driver intel_845_driver = {
@@ -1547,6 +1595,7 @@ static struct agp_bridge_driver intel_845_driver = {
1547 .free_by_type = agp_generic_free_by_type, 1595 .free_by_type = agp_generic_free_by_type,
1548 .agp_alloc_page = agp_generic_alloc_page, 1596 .agp_alloc_page = agp_generic_alloc_page,
1549 .agp_destroy_page = agp_generic_destroy_page, 1597 .agp_destroy_page = agp_generic_destroy_page,
1598 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1550}; 1599};
1551 1600
1552static struct agp_bridge_driver intel_850_driver = { 1601static struct agp_bridge_driver intel_850_driver = {
@@ -1570,6 +1619,7 @@ static struct agp_bridge_driver intel_850_driver = {
1570 .free_by_type = agp_generic_free_by_type, 1619 .free_by_type = agp_generic_free_by_type,
1571 .agp_alloc_page = agp_generic_alloc_page, 1620 .agp_alloc_page = agp_generic_alloc_page,
1572 .agp_destroy_page = agp_generic_destroy_page, 1621 .agp_destroy_page = agp_generic_destroy_page,
1622 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1573}; 1623};
1574 1624
1575static struct agp_bridge_driver intel_860_driver = { 1625static struct agp_bridge_driver intel_860_driver = {
@@ -1593,6 +1643,7 @@ static struct agp_bridge_driver intel_860_driver = {
1593 .free_by_type = agp_generic_free_by_type, 1643 .free_by_type = agp_generic_free_by_type,
1594 .agp_alloc_page = agp_generic_alloc_page, 1644 .agp_alloc_page = agp_generic_alloc_page,
1595 .agp_destroy_page = agp_generic_destroy_page, 1645 .agp_destroy_page = agp_generic_destroy_page,
1646 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1596}; 1647};
1597 1648
1598static struct agp_bridge_driver intel_915_driver = { 1649static struct agp_bridge_driver intel_915_driver = {
@@ -1617,6 +1668,7 @@ static struct agp_bridge_driver intel_915_driver = {
1617 .free_by_type = intel_i810_free_by_type, 1668 .free_by_type = intel_i810_free_by_type,
1618 .agp_alloc_page = agp_generic_alloc_page, 1669 .agp_alloc_page = agp_generic_alloc_page,
1619 .agp_destroy_page = agp_generic_destroy_page, 1670 .agp_destroy_page = agp_generic_destroy_page,
1671 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1620}; 1672};
1621 1673
1622static struct agp_bridge_driver intel_i965_driver = { 1674static struct agp_bridge_driver intel_i965_driver = {
@@ -1641,6 +1693,7 @@ static struct agp_bridge_driver intel_i965_driver = {
1641 .free_by_type = intel_i810_free_by_type, 1693 .free_by_type = intel_i810_free_by_type,
1642 .agp_alloc_page = agp_generic_alloc_page, 1694 .agp_alloc_page = agp_generic_alloc_page,
1643 .agp_destroy_page = agp_generic_destroy_page, 1695 .agp_destroy_page = agp_generic_destroy_page,
1696 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1644}; 1697};
1645 1698
1646static struct agp_bridge_driver intel_7505_driver = { 1699static struct agp_bridge_driver intel_7505_driver = {
@@ -1664,6 +1717,7 @@ static struct agp_bridge_driver intel_7505_driver = {
1664 .free_by_type = agp_generic_free_by_type, 1717 .free_by_type = agp_generic_free_by_type,
1665 .agp_alloc_page = agp_generic_alloc_page, 1718 .agp_alloc_page = agp_generic_alloc_page,
1666 .agp_destroy_page = agp_generic_destroy_page, 1719 .agp_destroy_page = agp_generic_destroy_page,
1720 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1667}; 1721};
1668 1722
1669static int find_i810(u16 device) 1723static int find_i810(u16 device)