| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * arch/sh/mm/ioremap.c
- *
- * (C) Copyright 1995 1996 Linus Torvalds
- * (C) Copyright 2005 - 2010 Paul Mundt
- *
- * Re-map IO memory to kernel address space so that we can access it.
- * This is needed for high PCI addresses that aren't mapped in the
- * 640k-1MB IO memory area on PC's
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of this
- * archive for more details.
- */
- #include <linux/vmalloc.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/mm.h>
- #include <linux/pci.h>
- #include <linux/io.h>
- #include <asm/io_trapped.h>
- #include <asm/page.h>
- #include <asm/pgalloc.h>
- #include <asm/addrspace.h>
- #include <asm/cacheflush.h>
- #include <asm/tlbflush.h>
- #include <asm/mmu.h>
- #include "ioremap.h"
- /*
- * On 32-bit SH, we traditionally have the whole physical address space mapped
- * at all times (as MIPS does), so "ioremap()" and "iounmap()" do not need to do
- * anything but place the address in the proper segment. This is true for P1
- * and P2 addresses, as well as some P3 ones. However, most of the P3 addresses
- * and newer cores using extended addressing need to map through page tables, so
- * the ioremap() implementation becomes a bit more complicated.
- */
- #ifdef CONFIG_29BIT
- static void __iomem *
- __ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot)
- {
- phys_addr_t last_addr = offset + size - 1;
- /*
- * For P1 and P2 space this is trivial, as everything is already
- * mapped. Uncached access for P1 addresses are done through P2.
- * In the P3 case or for addresses outside of the 29-bit space,
- * mapping must be done by the PMB or by using page tables.
- */
- if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) {
- u64 flags = pgprot_val(prot);
- /*
- * Anything using the legacy PTEA space attributes needs
- * to be kicked down to page table mappings.
- */
- if (unlikely(flags & _PAGE_PCC_MASK))
- return NULL;
- if (unlikely(flags & _PAGE_CACHABLE))
- return (void __iomem *)P1SEGADDR(offset);
- return (void __iomem *)P2SEGADDR(offset);
- }
- /* P4 above the store queues are always mapped. */
- if (unlikely(offset >= P3_ADDR_MAX))
- return (void __iomem *)P4SEGADDR(offset);
- return NULL;
- }
- #else
- #define __ioremap_29bit(offset, size, prot) NULL
- #endif /* CONFIG_29BIT */
- void __iomem __ref *ioremap_prot(phys_addr_t phys_addr, size_t size,
- unsigned long prot)
- {
- void __iomem *mapped;
- pgprot_t pgprot = __pgprot(prot);
- mapped = __ioremap_trapped(phys_addr, size);
- if (mapped)
- return mapped;
- mapped = __ioremap_29bit(phys_addr, size, pgprot);
- if (mapped)
- return mapped;
- /*
- * If we can't yet use the regular approach, go the fixmap route.
- */
- if (!mem_init_done)
- return ioremap_fixed(phys_addr, size, pgprot);
- /*
- * First try to remap through the PMB.
- * PMB entries are all pre-faulted.
- */
- mapped = pmb_remap_caller(phys_addr, size, pgprot,
- __builtin_return_address(0));
- if (mapped && !IS_ERR(mapped))
- return mapped;
- return generic_ioremap_prot(phys_addr, size, pgprot);
- }
- EXPORT_SYMBOL(ioremap_prot);
- /*
- * Simple checks for non-translatable mappings.
- */
- static inline int iomapping_nontranslatable(unsigned long offset)
- {
- #ifdef CONFIG_29BIT
- /*
- * In 29-bit mode this includes the fixed P1/P2 areas, as well as
- * parts of P3.
- */
- if (PXSEG(offset) < P3SEG || offset >= P3_ADDR_MAX)
- return 1;
- #endif
- return 0;
- }
- void iounmap(volatile void __iomem *addr)
- {
- unsigned long vaddr = (unsigned long __force)addr;
- /*
- * Nothing to do if there is no translatable mapping.
- */
- if (iomapping_nontranslatable(vaddr))
- return;
- /*
- * There's no VMA if it's from an early fixed mapping.
- */
- if (iounmap_fixed((void __iomem *)addr) == 0)
- return;
- /*
- * If the PMB handled it, there's nothing else to do.
- */
- if (pmb_unmap((void __iomem *)addr) == 0)
- return;
- generic_iounmap(addr);
- }
- EXPORT_SYMBOL(iounmap);
|