diff options
Diffstat (limited to 'drivers/char/agp/i460-agp.c')
-rw-r--r-- | drivers/char/agp/i460-agp.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/char/agp/i460-agp.c b/drivers/char/agp/i460-agp.c index 94943298c03e..8ee19a4a6bce 100644 --- a/drivers/char/agp/i460-agp.c +++ b/drivers/char/agp/i460-agp.c | |||
@@ -10,6 +10,8 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/string.h> | ||
14 | #include <linux/slab.h> | ||
13 | #include <linux/agp_backend.h> | 15 | #include <linux/agp_backend.h> |
14 | 16 | ||
15 | #include "agp.h" | 17 | #include "agp.h" |
@@ -109,8 +111,10 @@ static int i460_fetch_size (void) | |||
109 | 111 | ||
110 | if (i460.io_page_shift != I460_IO_PAGE_SHIFT) { | 112 | if (i460.io_page_shift != I460_IO_PAGE_SHIFT) { |
111 | printk(KERN_ERR PFX | 113 | printk(KERN_ERR PFX |
112 | "I/O (GART) page-size %ZuKB doesn't match expected size %ZuKB\n", | 114 | "I/O (GART) page-size %luKB doesn't match expected " |
113 | 1UL << (i460.io_page_shift - 10), 1UL << (I460_IO_PAGE_SHIFT)); | 115 | "size %luKB\n", |
116 | 1UL << (i460.io_page_shift - 10), | ||
117 | 1UL << (I460_IO_PAGE_SHIFT)); | ||
114 | return 0; | 118 | return 0; |
115 | } | 119 | } |
116 | 120 | ||
@@ -225,10 +229,9 @@ static int i460_configure (void) | |||
225 | */ | 229 | */ |
226 | if (I460_IO_PAGE_SHIFT > PAGE_SHIFT) { | 230 | if (I460_IO_PAGE_SHIFT > PAGE_SHIFT) { |
227 | size = current_size->num_entries * sizeof(i460.lp_desc[0]); | 231 | size = current_size->num_entries * sizeof(i460.lp_desc[0]); |
228 | i460.lp_desc = kmalloc(size, GFP_KERNEL); | 232 | i460.lp_desc = kzalloc(size, GFP_KERNEL); |
229 | if (!i460.lp_desc) | 233 | if (!i460.lp_desc) |
230 | return -ENOMEM; | 234 | return -ENOMEM; |
231 | memset(i460.lp_desc, 0, size); | ||
232 | } | 235 | } |
233 | return 0; | 236 | return 0; |
234 | } | 237 | } |
@@ -364,13 +367,12 @@ static int i460_alloc_large_page (struct lp_desc *lp) | |||
364 | } | 367 | } |
365 | 368 | ||
366 | map_size = ((I460_KPAGES_PER_IOPAGE + BITS_PER_LONG - 1) & -BITS_PER_LONG)/8; | 369 | map_size = ((I460_KPAGES_PER_IOPAGE + BITS_PER_LONG - 1) & -BITS_PER_LONG)/8; |
367 | lp->alloced_map = kmalloc(map_size, GFP_KERNEL); | 370 | lp->alloced_map = kzalloc(map_size, GFP_KERNEL); |
368 | if (!lp->alloced_map) { | 371 | if (!lp->alloced_map) { |
369 | free_pages((unsigned long) lpage, order); | 372 | free_pages((unsigned long) lpage, order); |
370 | printk(KERN_ERR PFX "Out of memory, we're in trouble...\n"); | 373 | printk(KERN_ERR PFX "Out of memory, we're in trouble...\n"); |
371 | return -ENOMEM; | 374 | return -ENOMEM; |
372 | } | 375 | } |
373 | memset(lp->alloced_map, 0, map_size); | ||
374 | 376 | ||
375 | lp->paddr = virt_to_gart(lpage); | 377 | lp->paddr = virt_to_gart(lpage); |
376 | lp->refcount = 0; | 378 | lp->refcount = 0; |
@@ -514,9 +516,10 @@ static void *i460_alloc_page (struct agp_bridge_data *bridge) | |||
514 | { | 516 | { |
515 | void *page; | 517 | void *page; |
516 | 518 | ||
517 | if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) | 519 | if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) { |
518 | page = agp_generic_alloc_page(agp_bridge); | 520 | page = agp_generic_alloc_page(agp_bridge); |
519 | else | 521 | global_flush_tlb(); |
522 | } else | ||
520 | /* Returning NULL would cause problems */ | 523 | /* Returning NULL would cause problems */ |
521 | /* AK: really dubious code. */ | 524 | /* AK: really dubious code. */ |
522 | page = (void *)~0UL; | 525 | page = (void *)~0UL; |
@@ -525,8 +528,10 @@ static void *i460_alloc_page (struct agp_bridge_data *bridge) | |||
525 | 528 | ||
526 | static void i460_destroy_page (void *page) | 529 | static void i460_destroy_page (void *page) |
527 | { | 530 | { |
528 | if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) | 531 | if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) { |
529 | agp_generic_destroy_page(page); | 532 | agp_generic_destroy_page(page); |
533 | global_flush_tlb(); | ||
534 | } | ||
530 | } | 535 | } |
531 | 536 | ||
532 | #endif /* I460_LARGE_IO_PAGES */ | 537 | #endif /* I460_LARGE_IO_PAGES */ |
@@ -536,7 +541,7 @@ static unsigned long i460_mask_memory (struct agp_bridge_data *bridge, | |||
536 | { | 541 | { |
537 | /* Make sure the returned address is a valid GATT entry */ | 542 | /* Make sure the returned address is a valid GATT entry */ |
538 | return bridge->driver->masks[0].mask | 543 | return bridge->driver->masks[0].mask |
539 | | (((addr & ~((1 << I460_IO_PAGE_SHIFT) - 1)) & 0xffffff000) >> 12); | 544 | | (((addr & ~((1 << I460_IO_PAGE_SHIFT) - 1)) & 0xfffff000) >> 12); |
540 | } | 545 | } |
541 | 546 | ||
542 | struct agp_bridge_driver intel_i460_driver = { | 547 | struct agp_bridge_driver intel_i460_driver = { |