Loading arch/arm/mm/ioremap.c +4 −70 Original line number Diff line number Diff line Loading @@ -42,78 +42,11 @@ */ #define VM_ARM_SECTION_MAPPING 0x80000000 static int remap_area_pte(pmd_t *pmd, unsigned long addr, unsigned long end, unsigned long phys_addr, const struct mem_type *type) { pgprot_t prot = __pgprot(type->prot_pte); pte_t *pte; pte = pte_alloc_kernel(pmd, addr); if (!pte) return -ENOMEM; do { if (!pte_none(*pte)) goto bad; set_pte_ext(pte, pfn_pte(phys_addr >> PAGE_SHIFT, prot), 0); phys_addr += PAGE_SIZE; } while (pte++, addr += PAGE_SIZE, addr != end); return 0; bad: printk(KERN_CRIT "remap_area_pte: page already exists\n"); BUG(); } static inline int remap_area_pmd(pgd_t *pgd, unsigned long addr, unsigned long end, unsigned long phys_addr, const struct mem_type *type) { unsigned long next; pmd_t *pmd; int ret = 0; pmd = pmd_alloc(&init_mm, pgd, addr); if (!pmd) return -ENOMEM; do { next = pmd_addr_end(addr, end); ret = remap_area_pte(pmd, addr, next, phys_addr, type); if (ret) return ret; phys_addr += next - addr; } while (pmd++, addr = next, addr != end); return ret; } static int remap_area_pages(unsigned long start, unsigned long pfn, size_t size, const struct mem_type *type) { unsigned long addr = start; unsigned long next, end = start + size; unsigned long phys_addr = __pfn_to_phys(pfn); pgd_t *pgd; int err = 0; BUG_ON(addr >= end); pgd = pgd_offset_k(addr); do { next = pgd_addr_end(addr, end); err = remap_area_pmd(pgd, addr, next, phys_addr, type); if (err) break; phys_addr += next - addr; } while (pgd++, addr = next, addr != end); return err; } int ioremap_page(unsigned long virt, unsigned long phys, const struct mem_type *mtype) { return remap_area_pages(virt, __phys_to_pfn(phys), PAGE_SIZE, mtype); return ioremap_page_range(virt, virt + PAGE_SIZE, phys, __pgprot(mtype->prot_pte)); } EXPORT_SYMBOL(ioremap_page); Loading Loading @@ -300,7 +233,8 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, err = remap_area_sections(addr, pfn, size, type); } else #endif err = remap_area_pages(addr, pfn, size, type); err = ioremap_page_range(addr, addr + size, __pfn_to_phys(pfn), __pgprot(type->prot_pte)); if (err) { vunmap((void *)addr); Loading Loading
arch/arm/mm/ioremap.c +4 −70 Original line number Diff line number Diff line Loading @@ -42,78 +42,11 @@ */ #define VM_ARM_SECTION_MAPPING 0x80000000 static int remap_area_pte(pmd_t *pmd, unsigned long addr, unsigned long end, unsigned long phys_addr, const struct mem_type *type) { pgprot_t prot = __pgprot(type->prot_pte); pte_t *pte; pte = pte_alloc_kernel(pmd, addr); if (!pte) return -ENOMEM; do { if (!pte_none(*pte)) goto bad; set_pte_ext(pte, pfn_pte(phys_addr >> PAGE_SHIFT, prot), 0); phys_addr += PAGE_SIZE; } while (pte++, addr += PAGE_SIZE, addr != end); return 0; bad: printk(KERN_CRIT "remap_area_pte: page already exists\n"); BUG(); } static inline int remap_area_pmd(pgd_t *pgd, unsigned long addr, unsigned long end, unsigned long phys_addr, const struct mem_type *type) { unsigned long next; pmd_t *pmd; int ret = 0; pmd = pmd_alloc(&init_mm, pgd, addr); if (!pmd) return -ENOMEM; do { next = pmd_addr_end(addr, end); ret = remap_area_pte(pmd, addr, next, phys_addr, type); if (ret) return ret; phys_addr += next - addr; } while (pmd++, addr = next, addr != end); return ret; } static int remap_area_pages(unsigned long start, unsigned long pfn, size_t size, const struct mem_type *type) { unsigned long addr = start; unsigned long next, end = start + size; unsigned long phys_addr = __pfn_to_phys(pfn); pgd_t *pgd; int err = 0; BUG_ON(addr >= end); pgd = pgd_offset_k(addr); do { next = pgd_addr_end(addr, end); err = remap_area_pmd(pgd, addr, next, phys_addr, type); if (err) break; phys_addr += next - addr; } while (pgd++, addr = next, addr != end); return err; } int ioremap_page(unsigned long virt, unsigned long phys, const struct mem_type *mtype) { return remap_area_pages(virt, __phys_to_pfn(phys), PAGE_SIZE, mtype); return ioremap_page_range(virt, virt + PAGE_SIZE, phys, __pgprot(mtype->prot_pte)); } EXPORT_SYMBOL(ioremap_page); Loading Loading @@ -300,7 +233,8 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, err = remap_area_sections(addr, pfn, size, type); } else #endif err = remap_area_pages(addr, pfn, size, type); err = ioremap_page_range(addr, addr + size, __pfn_to_phys(pfn), __pgprot(type->prot_pte)); if (err) { vunmap((void *)addr); Loading