diff options
Diffstat (limited to 'drivers/char/agp/intel-agp.c')
-rw-r--r-- | drivers/char/agp/intel-agp.c | 186 |
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 | ||
27 | extern 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 | ||
72 | static struct gatt_mask intel_i810_masks[] = | 76 | static 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 | ||
79 | static struct _intel_i810_private { | 85 | static 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 | |||
85 | static int intel_i810_fetch_size(void) | 92 | static 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 | ||
211 | static 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 | |||
204 | static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, | 222 | static 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 | ||
245 | insert: | 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; | 279 | out: |
280 | ret = 0; | ||
281 | out_err: | ||
282 | mem->is_flushed = 1; | ||
283 | return ret; | ||
260 | } | 284 | } |
261 | 285 | ||
262 | static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start, | 286 | static 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 | |
689 | out: | ||
690 | ret = 0; | ||
691 | out_err: | ||
692 | mem->is_flushed = 1; | ||
693 | return ret; | ||
662 | } | 694 | } |
663 | 695 | ||
664 | static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start, | 696 | static 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 | ||
778 | static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start, | 819 | static 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 | ||
1389 | static struct agp_bridge_driver intel_810_driver = { | 1431 | static 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 | ||
1413 | static struct agp_bridge_driver intel_815_driver = { | 1456 | static 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 | ||
1436 | static struct agp_bridge_driver intel_830_driver = { | 1480 | static 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 | ||
1460 | static struct agp_bridge_driver intel_820_driver = { | 1505 | static 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 | ||
1483 | static struct agp_bridge_driver intel_830mp_driver = { | 1529 | static 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 | ||
1506 | static struct agp_bridge_driver intel_840_driver = { | 1553 | static 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 | ||
1529 | static struct agp_bridge_driver intel_845_driver = { | 1577 | static 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 | ||
1552 | static struct agp_bridge_driver intel_850_driver = { | 1601 | static 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 | ||
1575 | static struct agp_bridge_driver intel_860_driver = { | 1625 | static 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 | ||
1598 | static struct agp_bridge_driver intel_915_driver = { | 1649 | static 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 | ||
1622 | static struct agp_bridge_driver intel_i965_driver = { | 1674 | static 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 | ||
1646 | static struct agp_bridge_driver intel_7505_driver = { | 1699 | static 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 | ||
1669 | static int find_i810(u16 device) | 1723 | static int find_i810(u16 device) |