diff options
Diffstat (limited to 'arch/powerpc/mm/pgtable_32.c')
-rw-r--r-- | arch/powerpc/mm/pgtable_32.c | 123 |
1 files changed, 0 insertions, 123 deletions
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index f6ae1a57d652..64488723162a 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c | |||
@@ -8,7 +8,6 @@ | |||
8 | * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) | 8 | * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) |
9 | * and Cort Dougan (PReP) (cort@cs.nmt.edu) | 9 | * and Cort Dougan (PReP) (cort@cs.nmt.edu) |
10 | * Copyright (C) 1996 Paul Mackerras | 10 | * Copyright (C) 1996 Paul Mackerras |
11 | * Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk). | ||
12 | * | 11 | * |
13 | * Derived from "arch/i386/mm/init.c" | 12 | * Derived from "arch/i386/mm/init.c" |
14 | * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds | 13 | * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds |
@@ -37,7 +36,6 @@ | |||
37 | unsigned long ioremap_base; | 36 | unsigned long ioremap_base; |
38 | unsigned long ioremap_bot; | 37 | unsigned long ioremap_bot; |
39 | EXPORT_SYMBOL(ioremap_bot); /* aka VMALLOC_END */ | 38 | EXPORT_SYMBOL(ioremap_bot); /* aka VMALLOC_END */ |
40 | int io_bat_index; | ||
41 | 39 | ||
42 | #if defined(CONFIG_6xx) || defined(CONFIG_POWER3) | 40 | #if defined(CONFIG_6xx) || defined(CONFIG_POWER3) |
43 | #define HAVE_BATS 1 | 41 | #define HAVE_BATS 1 |
@@ -300,51 +298,6 @@ void __init mapin_ram(void) | |||
300 | } | 298 | } |
301 | } | 299 | } |
302 | 300 | ||
303 | /* is x a power of 4? */ | ||
304 | #define is_power_of_4(x) is_power_of_2(x) && (ffs(x) & 1) | ||
305 | |||
306 | /* | ||
307 | * Set up a mapping for a block of I/O. | ||
308 | * virt, phys, size must all be page-aligned. | ||
309 | * This should only be called before ioremap is called. | ||
310 | */ | ||
311 | void __init io_block_mapping(unsigned long virt, phys_addr_t phys, | ||
312 | unsigned int size, int flags) | ||
313 | { | ||
314 | int i; | ||
315 | |||
316 | if (virt > KERNELBASE && virt < ioremap_bot) | ||
317 | ioremap_bot = ioremap_base = virt; | ||
318 | |||
319 | #ifdef HAVE_BATS | ||
320 | /* | ||
321 | * Use a BAT for this if possible... | ||
322 | */ | ||
323 | if (io_bat_index < 2 && is_power_of_2(size) | ||
324 | && (virt & (size - 1)) == 0 && (phys & (size - 1)) == 0) { | ||
325 | setbat(io_bat_index, virt, phys, size, flags); | ||
326 | ++io_bat_index; | ||
327 | return; | ||
328 | } | ||
329 | #endif /* HAVE_BATS */ | ||
330 | |||
331 | #ifdef HAVE_TLBCAM | ||
332 | /* | ||
333 | * Use a CAM for this if possible... | ||
334 | */ | ||
335 | if (tlbcam_index < num_tlbcam_entries && is_power_of_4(size) | ||
336 | && (virt & (size - 1)) == 0 && (phys & (size - 1)) == 0) { | ||
337 | settlbcam(tlbcam_index, virt, phys, size, flags, 0); | ||
338 | ++tlbcam_index; | ||
339 | return; | ||
340 | } | ||
341 | #endif /* HAVE_TLBCAM */ | ||
342 | |||
343 | /* No BATs available, put it in the page tables. */ | ||
344 | for (i = 0; i < size; i += PAGE_SIZE) | ||
345 | map_page(virt + i, phys + i, flags); | ||
346 | } | ||
347 | |||
348 | /* Scan the real Linux page tables and return a PTE pointer for | 301 | /* Scan the real Linux page tables and return a PTE pointer for |
349 | * a virtual address in a context. | 302 | * a virtual address in a context. |
350 | * Returns true (1) if PTE was found, zero otherwise. The pointer to | 303 | * Returns true (1) if PTE was found, zero otherwise. The pointer to |
@@ -379,82 +332,6 @@ get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep, pmd_t **pmdp) | |||
379 | return(retval); | 332 | return(retval); |
380 | } | 333 | } |
381 | 334 | ||
382 | /* Find physical address for this virtual address. Normally used by | ||
383 | * I/O functions, but anyone can call it. | ||
384 | */ | ||
385 | unsigned long iopa(unsigned long addr) | ||
386 | { | ||
387 | unsigned long pa; | ||
388 | |||
389 | /* I don't know why this won't work on PMacs or CHRP. It | ||
390 | * appears there is some bug, or there is some implicit | ||
391 | * mapping done not properly represented by BATs or in page | ||
392 | * tables.......I am actively working on resolving this, but | ||
393 | * can't hold up other stuff. -- Dan | ||
394 | */ | ||
395 | pte_t *pte; | ||
396 | struct mm_struct *mm; | ||
397 | |||
398 | /* Check the BATs */ | ||
399 | pa = v_mapped_by_bats(addr); | ||
400 | if (pa) | ||
401 | return pa; | ||
402 | |||
403 | /* Allow mapping of user addresses (within the thread) | ||
404 | * for DMA if necessary. | ||
405 | */ | ||
406 | if (addr < TASK_SIZE) | ||
407 | mm = current->mm; | ||
408 | else | ||
409 | mm = &init_mm; | ||
410 | |||
411 | pa = 0; | ||
412 | if (get_pteptr(mm, addr, &pte, NULL)) { | ||
413 | pa = (pte_val(*pte) & PAGE_MASK) | (addr & ~PAGE_MASK); | ||
414 | pte_unmap(pte); | ||
415 | } | ||
416 | |||
417 | return(pa); | ||
418 | } | ||
419 | |||
420 | /* This is will find the virtual address for a physical one.... | ||
421 | * Swiped from APUS, could be dangerous :-). | ||
422 | * This is only a placeholder until I really find a way to make this | ||
423 | * work. -- Dan | ||
424 | */ | ||
425 | unsigned long | ||
426 | mm_ptov (unsigned long paddr) | ||
427 | { | ||
428 | unsigned long ret; | ||
429 | #if 0 | ||
430 | if (paddr < 16*1024*1024) | ||
431 | ret = ZTWO_VADDR(paddr); | ||
432 | else { | ||
433 | int i; | ||
434 | |||
435 | for (i = 0; i < kmap_chunk_count;){ | ||
436 | unsigned long phys = kmap_chunks[i++]; | ||
437 | unsigned long size = kmap_chunks[i++]; | ||
438 | unsigned long virt = kmap_chunks[i++]; | ||
439 | if (paddr >= phys | ||
440 | && paddr < (phys + size)){ | ||
441 | ret = virt + paddr - phys; | ||
442 | goto exit; | ||
443 | } | ||
444 | } | ||
445 | |||
446 | ret = (unsigned long) __va(paddr); | ||
447 | } | ||
448 | exit: | ||
449 | #ifdef DEBUGPV | ||
450 | printk ("PTOV(%lx)=%lx\n", paddr, ret); | ||
451 | #endif | ||
452 | #else | ||
453 | ret = (unsigned long)paddr + KERNELBASE; | ||
454 | #endif | ||
455 | return ret; | ||
456 | } | ||
457 | |||
458 | #ifdef CONFIG_DEBUG_PAGEALLOC | 335 | #ifdef CONFIG_DEBUG_PAGEALLOC |
459 | 336 | ||
460 | static int __change_page_attr(struct page *page, pgprot_t prot) | 337 | static int __change_page_attr(struct page *page, pgprot_t prot) |