Commit c766ee72 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc: handover page flags with a pgprot_t parameter

In order to avoid multiple conversions, handover directly a
pgprot_t to map_kernel_page() as already done for radix.

Do the same for __ioremap_caller() and __ioremap_at().
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 56f3c141
...@@ -292,7 +292,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma, ...@@ -292,7 +292,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 }) #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 })
#define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 }) #define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 })
int map_kernel_page(unsigned long va, phys_addr_t pa, int flags); int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
/* Generic accessors to PTE bits */ /* Generic accessors to PTE bits */
static inline int pte_write(pte_t pte) { return !!(pte_val(pte) & _PAGE_RW);} static inline int pte_write(pte_t pte) { return !!(pte_val(pte) & _PAGE_RW);}
......
...@@ -201,8 +201,7 @@ static inline void hpte_do_hugepage_flush(struct mm_struct *mm, ...@@ -201,8 +201,7 @@ static inline void hpte_do_hugepage_flush(struct mm_struct *mm,
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
extern int hash__map_kernel_page(unsigned long ea, unsigned long pa, int hash__map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot);
unsigned long flags);
extern int __meminit hash__vmemmap_create_mapping(unsigned long start, extern int __meminit hash__vmemmap_create_mapping(unsigned long start,
unsigned long page_size, unsigned long page_size,
unsigned long phys); unsigned long phys);
......
...@@ -1030,17 +1030,16 @@ extern struct page *pgd_page(pgd_t pgd); ...@@ -1030,17 +1030,16 @@ extern struct page *pgd_page(pgd_t pgd);
#define pgd_ERROR(e) \ #define pgd_ERROR(e) \
pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
static inline int map_kernel_page(unsigned long ea, unsigned long pa, static inline int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
unsigned long flags)
{ {
if (radix_enabled()) { if (radix_enabled()) {
#if defined(CONFIG_PPC_RADIX_MMU) && defined(DEBUG_VM) #if defined(CONFIG_PPC_RADIX_MMU) && defined(DEBUG_VM)
unsigned long page_size = 1 << mmu_psize_defs[mmu_io_psize].shift; unsigned long page_size = 1 << mmu_psize_defs[mmu_io_psize].shift;
WARN((page_size != PAGE_SIZE), "I/O page size != PAGE_SIZE"); WARN((page_size != PAGE_SIZE), "I/O page size != PAGE_SIZE");
#endif #endif
return radix__map_kernel_page(ea, pa, __pgprot(flags), PAGE_SIZE); return radix__map_kernel_page(ea, pa, prot, PAGE_SIZE);
} }
return hash__map_kernel_page(ea, pa, flags); return hash__map_kernel_page(ea, pa, prot);
} }
static inline int __meminit vmemmap_create_mapping(unsigned long start, static inline int __meminit vmemmap_create_mapping(unsigned long start,
......
...@@ -72,7 +72,7 @@ enum fixed_addresses { ...@@ -72,7 +72,7 @@ enum fixed_addresses {
static inline void __set_fixmap(enum fixed_addresses idx, static inline void __set_fixmap(enum fixed_addresses idx,
phys_addr_t phys, pgprot_t flags) phys_addr_t phys, pgprot_t flags)
{ {
map_kernel_page(fix_to_virt(idx), phys, pgprot_val(flags)); map_kernel_page(fix_to_virt(idx), phys, flags);
} }
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
......
...@@ -786,12 +786,12 @@ extern void iounmap(volatile void __iomem *addr); ...@@ -786,12 +786,12 @@ extern void iounmap(volatile void __iomem *addr);
extern void __iomem *__ioremap(phys_addr_t, unsigned long size, extern void __iomem *__ioremap(phys_addr_t, unsigned long size,
unsigned long flags); unsigned long flags);
extern void __iomem *__ioremap_caller(phys_addr_t, unsigned long size, extern void __iomem *__ioremap_caller(phys_addr_t, unsigned long size,
unsigned long flags, void *caller); pgprot_t prot, void *caller);
extern void __iounmap(volatile void __iomem *addr); extern void __iounmap(volatile void __iomem *addr);
extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea, extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea,
unsigned long size, unsigned long flags); unsigned long size, pgprot_t prot);
extern void __iounmap_at(void *ea, unsigned long size); extern void __iounmap_at(void *ea, unsigned long size);
/* /*
......
...@@ -35,7 +35,7 @@ struct machdep_calls { ...@@ -35,7 +35,7 @@ struct machdep_calls {
char *name; char *name;
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
void __iomem * (*ioremap)(phys_addr_t addr, unsigned long size, void __iomem * (*ioremap)(phys_addr_t addr, unsigned long size,
unsigned long flags, void *caller); pgprot_t prot, void *caller);
void (*iounmap)(volatile void __iomem *token); void (*iounmap)(volatile void __iomem *token);
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -323,7 +323,7 @@ static inline int pte_young(pte_t pte) ...@@ -323,7 +323,7 @@ static inline int pte_young(pte_t pte)
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 }) #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 })
#define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 }) #define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 })
int map_kernel_page(unsigned long va, phys_addr_t pa, int flags); int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
......
...@@ -327,8 +327,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma, ...@@ -327,8 +327,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) }) #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) })
#define __swp_entry_to_pte(x) __pte((x).val) #define __swp_entry_to_pte(x) __pte((x).val)
extern int map_kernel_page(unsigned long ea, unsigned long pa, int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot);
unsigned long flags);
extern int __meminit vmemmap_create_mapping(unsigned long start, extern int __meminit vmemmap_create_mapping(unsigned long start,
unsigned long page_size, unsigned long page_size,
unsigned long phys); unsigned long phys);
......
...@@ -153,10 +153,10 @@ static const struct ppc_pci_io iowa_pci_io = { ...@@ -153,10 +153,10 @@ static const struct ppc_pci_io iowa_pci_io = {
#ifdef CONFIG_PPC_INDIRECT_MMIO #ifdef CONFIG_PPC_INDIRECT_MMIO
static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size, static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
unsigned long flags, void *caller) pgprot_t prot, void *caller)
{ {
struct iowa_bus *bus; struct iowa_bus *bus;
void __iomem *res = __ioremap_caller(addr, size, flags, caller); void __iomem *res = __ioremap_caller(addr, size, prot, caller);
int busno; int busno;
bus = iowa_pci_find(0, (unsigned long)addr); bus = iowa_pci_find(0, (unsigned long)addr);
......
...@@ -110,14 +110,14 @@ static void pci_process_ISA_OF_ranges(struct device_node *isa_node, ...@@ -110,14 +110,14 @@ static void pci_process_ISA_OF_ranges(struct device_node *isa_node,
size = 0x10000; size = 0x10000;
__ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE, __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
size, pgprot_val(pgprot_noncached(PAGE_KERNEL))); size, pgprot_noncached(PAGE_KERNEL));
return; return;
inval_range: inval_range:
printk(KERN_ERR "no ISA IO ranges or unexpected isa range, " printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
"mapping 64k\n"); "mapping 64k\n");
__ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE, __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
0x10000, pgprot_val(pgprot_noncached(PAGE_KERNEL))); 0x10000, pgprot_noncached(PAGE_KERNEL));
} }
...@@ -253,7 +253,7 @@ void __init isa_bridge_init_non_pci(struct device_node *np) ...@@ -253,7 +253,7 @@ void __init isa_bridge_init_non_pci(struct device_node *np)
*/ */
isa_io_base = ISA_IO_BASE; isa_io_base = ISA_IO_BASE;
__ioremap_at(pbase, (void *)ISA_IO_BASE, __ioremap_at(pbase, (void *)ISA_IO_BASE,
size, pgprot_val(pgprot_noncached(PAGE_KERNEL))); size, pgprot_noncached(PAGE_KERNEL));
pr_debug("ISA: Non-PCI bridge is %pOF\n", np); pr_debug("ISA: Non-PCI bridge is %pOF\n", np);
} }
......
...@@ -159,7 +159,7 @@ static int pcibios_map_phb_io_space(struct pci_controller *hose) ...@@ -159,7 +159,7 @@ static int pcibios_map_phb_io_space(struct pci_controller *hose)
/* Establish the mapping */ /* Establish the mapping */
if (__ioremap_at(phys_page, area->addr, size_page, if (__ioremap_at(phys_page, area->addr, size_page,
pgprot_val(pgprot_noncached(PAGE_KERNEL))) == NULL) pgprot_noncached(PAGE_KERNEL)) == NULL)
return -ENOMEM; return -ENOMEM;
/* Fixup hose IO resource */ /* Fixup hose IO resource */
......
...@@ -98,8 +98,7 @@ static int map_patch_area(void *addr, unsigned long text_poke_addr) ...@@ -98,8 +98,7 @@ static int map_patch_area(void *addr, unsigned long text_poke_addr)
else else
pfn = __pa_symbol(addr) >> PAGE_SHIFT; pfn = __pa_symbol(addr) >> PAGE_SHIFT;
err = map_kernel_page(text_poke_addr, (pfn << PAGE_SHIFT), err = map_kernel_page(text_poke_addr, (pfn << PAGE_SHIFT), PAGE_KERNEL);
pgprot_val(PAGE_KERNEL));
pr_devel("Mapped addr %lx with pfn %lx:%d\n", text_poke_addr, pfn, err); pr_devel("Mapped addr %lx with pfn %lx:%d\n", text_poke_addr, pfn, err);
if (err) if (err)
......
...@@ -91,11 +91,10 @@ static void __init mmu_mapin_immr(void) ...@@ -91,11 +91,10 @@ static void __init mmu_mapin_immr(void)
{ {
unsigned long p = PHYS_IMMR_BASE; unsigned long p = PHYS_IMMR_BASE;
unsigned long v = VIRT_IMMR_BASE; unsigned long v = VIRT_IMMR_BASE;
unsigned long f = pgprot_val(PAGE_KERNEL_NCG);
int offset; int offset;
for (offset = 0; offset < IMMR_SIZE; offset += PAGE_SIZE) for (offset = 0; offset < IMMR_SIZE; offset += PAGE_SIZE)
map_kernel_page(v + offset, p + offset, f); map_kernel_page(v + offset, p + offset, PAGE_KERNEL_NCG);
} }
/* Address of instructions to patch */ /* Address of instructions to patch */
......
...@@ -228,7 +228,7 @@ __dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t ...@@ -228,7 +228,7 @@ __dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t
do { do {
SetPageReserved(page); SetPageReserved(page);
map_kernel_page(vaddr, page_to_phys(page), map_kernel_page(vaddr, page_to_phys(page),
pgprot_val(pgprot_noncached(PAGE_KERNEL))); pgprot_noncached(PAGE_KERNEL));
page++; page++;
vaddr += PAGE_SIZE; vaddr += PAGE_SIZE;
} while (size -= PAGE_SIZE); } while (size -= PAGE_SIZE);
......
...@@ -309,11 +309,11 @@ void __init paging_init(void) ...@@ -309,11 +309,11 @@ void __init paging_init(void)
unsigned long end = __fix_to_virt(FIX_HOLE); unsigned long end = __fix_to_virt(FIX_HOLE);
for (; v < end; v += PAGE_SIZE) for (; v < end; v += PAGE_SIZE)
map_kernel_page(v, 0, 0); /* XXX gross */ map_kernel_page(v, 0, __pgprot(0)); /* XXX gross */
#endif #endif
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
map_kernel_page(PKMAP_BASE, 0, 0); /* XXX gross */ map_kernel_page(PKMAP_BASE, 0, __pgprot(0)); /* XXX gross */
pkmap_page_table = virt_to_kpte(PKMAP_BASE); pkmap_page_table = virt_to_kpte(PKMAP_BASE);
kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN));
......
...@@ -42,7 +42,7 @@ int __meminit vmemmap_create_mapping(unsigned long start, ...@@ -42,7 +42,7 @@ int __meminit vmemmap_create_mapping(unsigned long start,
* thus must have the low bits clear * thus must have the low bits clear
*/ */
for (i = 0; i < page_size; i += PAGE_SIZE) for (i = 0; i < page_size; i += PAGE_SIZE)
BUG_ON(map_kernel_page(start + i, phys, flags)); BUG_ON(map_kernel_page(start + i, phys, __pgprot(flags)));
return 0; return 0;
} }
...@@ -70,7 +70,7 @@ static __ref void *early_alloc_pgtable(unsigned long size) ...@@ -70,7 +70,7 @@ static __ref void *early_alloc_pgtable(unsigned long size)
* map_kernel_page adds an entry to the ioremap page table * map_kernel_page adds an entry to the ioremap page table
* and adds an entry to the HPT, possibly bolting it * and adds an entry to the HPT, possibly bolting it
*/ */
int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags) int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
{ {
pgd_t *pgdp; pgd_t *pgdp;
pud_t *pudp; pud_t *pudp;
...@@ -89,8 +89,6 @@ int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags) ...@@ -89,8 +89,6 @@ int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
ptep = pte_alloc_kernel(pmdp, ea); ptep = pte_alloc_kernel(pmdp, ea);
if (!ptep) if (!ptep)
return -ENOMEM; return -ENOMEM;
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
__pgprot(flags)));
} else { } else {
pgdp = pgd_offset_k(ea); pgdp = pgd_offset_k(ea);
#ifndef __PAGETABLE_PUD_FOLDED #ifndef __PAGETABLE_PUD_FOLDED
...@@ -113,9 +111,8 @@ int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags) ...@@ -113,9 +111,8 @@ int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
pmd_populate_kernel(&init_mm, pmdp, ptep); pmd_populate_kernel(&init_mm, pmdp, ptep);
} }
ptep = pte_offset_kernel(pmdp, ea); ptep = pte_offset_kernel(pmdp, ea);
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
__pgprot(flags)));
} }
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, prot));
smp_wmb(); smp_wmb();
return 0; return 0;
......
...@@ -142,7 +142,7 @@ void hash__vmemmap_remove_mapping(unsigned long start, ...@@ -142,7 +142,7 @@ void hash__vmemmap_remove_mapping(unsigned long start,
* map_kernel_page adds an entry to the ioremap page table * map_kernel_page adds an entry to the ioremap page table
* and adds an entry to the HPT, possibly bolting it * and adds an entry to the HPT, possibly bolting it
*/ */
int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags) int hash__map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
{ {
pgd_t *pgdp; pgd_t *pgdp;
pud_t *pudp; pud_t *pudp;
...@@ -161,8 +161,7 @@ int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flag ...@@ -161,8 +161,7 @@ int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flag
ptep = pte_alloc_kernel(pmdp, ea); ptep = pte_alloc_kernel(pmdp, ea);
if (!ptep) if (!ptep)
return -ENOMEM; return -ENOMEM;
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, prot));
__pgprot(flags)));
} else { } else {
/* /*
* If the mm subsystem is not fully up, we cannot create a * If the mm subsystem is not fully up, we cannot create a
...@@ -170,7 +169,7 @@ int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flag ...@@ -170,7 +169,7 @@ int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flag
* entry in the hardware page table. * entry in the hardware page table.
* *
*/ */
if (htab_bolt_mapping(ea, ea + PAGE_SIZE, pa, flags, if (htab_bolt_mapping(ea, ea + PAGE_SIZE, pa, pgprot_val(prot),
mmu_io_psize, mmu_kernel_ssize)) { mmu_io_psize, mmu_kernel_ssize)) {
printk(KERN_ERR "Failed to do bolted mapping IO " printk(KERN_ERR "Failed to do bolted mapping IO "
"memory at %016lx !\n", pa); "memory at %016lx !\n", pa);
......
...@@ -76,36 +76,36 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) ...@@ -76,36 +76,36 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
void __iomem * void __iomem *
ioremap(phys_addr_t addr, unsigned long size) ioremap(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_noncached(PAGE_KERNEL)); pgprot_t prot = pgprot_noncached(PAGE_KERNEL);
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap); EXPORT_SYMBOL(ioremap);
void __iomem * void __iomem *
ioremap_wc(phys_addr_t addr, unsigned long size) ioremap_wc(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_noncached_wc(PAGE_KERNEL)); pgprot_t prot = pgprot_noncached_wc(PAGE_KERNEL);
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_wc); EXPORT_SYMBOL(ioremap_wc);
void __iomem * void __iomem *
ioremap_wt(phys_addr_t addr, unsigned long size) ioremap_wt(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_cached_wthru(PAGE_KERNEL)); pgprot_t prot = pgprot_cached_wthru(PAGE_KERNEL);
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_wt); EXPORT_SYMBOL(ioremap_wt);
void __iomem * void __iomem *
ioremap_coherent(phys_addr_t addr, unsigned long size) ioremap_coherent(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_cached(PAGE_KERNEL)); pgprot_t prot = pgprot_cached(PAGE_KERNEL);
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_coherent); EXPORT_SYMBOL(ioremap_coherent);
...@@ -120,19 +120,18 @@ ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags) ...@@ -120,19 +120,18 @@ ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags)
flags &= ~(_PAGE_USER | _PAGE_EXEC); flags &= ~(_PAGE_USER | _PAGE_EXEC);
flags |= _PAGE_PRIVILEGED; flags |= _PAGE_PRIVILEGED;
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, __pgprot(flags), __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_prot); EXPORT_SYMBOL(ioremap_prot);
void __iomem * void __iomem *
__ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
{ {
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, __pgprot(flags), __builtin_return_address(0));
} }
void __iomem * void __iomem *
__ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags, __ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *caller)
void *caller)
{ {
unsigned long v, i; unsigned long v, i;
phys_addr_t p; phys_addr_t p;
...@@ -195,7 +194,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags, ...@@ -195,7 +194,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,
err = 0; err = 0;
for (i = 0; i < size && err == 0; i += PAGE_SIZE) for (i = 0; i < size && err == 0; i += PAGE_SIZE)
err = map_kernel_page(v+i, p+i, flags); err = map_kernel_page(v + i, p + i, prot);
if (err) { if (err) {
if (slab_is_available()) if (slab_is_available())
vunmap((void *)v); vunmap((void *)v);
...@@ -221,7 +220,7 @@ void iounmap(volatile void __iomem *addr) ...@@ -221,7 +220,7 @@ void iounmap(volatile void __iomem *addr)
} }
EXPORT_SYMBOL(iounmap); EXPORT_SYMBOL(iounmap);
int map_kernel_page(unsigned long va, phys_addr_t pa, int flags) int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot)
{ {
pmd_t *pd; pmd_t *pd;
pte_t *pg; pte_t *pg;
...@@ -237,9 +236,8 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, int flags) ...@@ -237,9 +236,8 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, int flags)
* hash table * hash table
*/ */
BUG_ON((pte_val(*pg) & (_PAGE_PRESENT | _PAGE_HASHPTE)) && BUG_ON((pte_val(*pg) & (_PAGE_PRESENT | _PAGE_HASHPTE)) &&
flags); pgprot_val(prot));
set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT, set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT, prot));
__pgprot(flags)));
} }
smp_wmb(); smp_wmb();
return err; return err;
...@@ -250,7 +248,7 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, int flags) ...@@ -250,7 +248,7 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, int flags)
*/ */
static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top) static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top)
{ {
unsigned long v, s, f; unsigned long v, s;
phys_addr_t p; phys_addr_t p;
int ktext; int ktext;
...@@ -260,8 +258,7 @@ static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top) ...@@ -260,8 +258,7 @@ static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top)
for (; s < top; s += PAGE_SIZE) { for (; s < top; s += PAGE_SIZE) {
ktext = ((char *)v >= _stext && (char *)v < etext) || ktext = ((char *)v >= _stext && (char *)v < etext) ||
((char *)v >= _sinittext && (char *)v < _einittext); ((char *)v >= _sinittext && (char *)v < _einittext);
f = ktext ? pgprot_val(PAGE_KERNEL_TEXT) : pgprot_val(PAGE_KERNEL); map_kernel_page(v, p, ktext ? PAGE_KERNEL_TEXT : PAGE_KERNEL);
map_kernel_page(v, p, f);
#ifdef CONFIG_PPC_STD_MMU_32 #ifdef CONFIG_PPC_STD_MMU_32
if (ktext) if (ktext)
hash_preload(&init_mm, v, 0, 0x300); hash_preload(&init_mm, v, 0, 0x300);
......
...@@ -113,13 +113,12 @@ unsigned long ioremap_bot = IOREMAP_BASE; ...@@ -113,13 +113,12 @@ unsigned long ioremap_bot = IOREMAP_BASE;
* __ioremap_at - Low level function to establish the page tables * __ioremap_at - Low level function to establish the page tables
* for an IO mapping * for an IO mapping
*/ */
void __iomem * __ioremap_at(phys_addr_t pa, void *ea, unsigned long size, void __iomem *__ioremap_at(phys_addr_t pa, void *ea, unsigned long size, pgprot_t prot)
unsigned long flags)
{ {
unsigned long i; unsigned long i;
/* We don't support the 4K PFN hack with ioremap */ /* We don't support the 4K PFN hack with ioremap */
if (flags & H_PAGE_4K_PFN) if (pgprot_val(prot) & H_PAGE_4K_PFN)
return NULL; return NULL;
WARN_ON(pa & ~PAGE_MASK); WARN_ON(pa & ~PAGE_MASK);
...@@ -127,7 +126,7 @@ void __iomem * __ioremap_at(phys_addr_t pa, void *ea, unsigned long size, ...@@ -127,7 +126,7 @@ void __iomem * __ioremap_at(phys_addr_t pa, void *ea, unsigned long size,
WARN_ON(size & ~PAGE_MASK); WARN_ON(size & ~PAGE_MASK);
for (i = 0; i < size; i += PAGE_SIZE) for (i = 0; i < size; i += PAGE_SIZE)
if (map_kernel_page((unsigned long)ea+i, pa+i, flags)) if (map_kernel_page((unsigned long)ea + i, pa + i, prot))
return NULL; return NULL;
return (void __iomem *)ea; return (void __iomem *)ea;
...@@ -148,7 +147,7 @@ void __iounmap_at(void *ea, unsigned long size) ...@@ -148,7 +147,7 @@ void __iounmap_at(void *ea, unsigned long size)
} }
void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size, void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size,
unsigned long flags, void *caller) pgprot_t prot, void *caller)
{ {
phys_addr_t paligned; phys_addr_t paligned;
void __iomem *ret; void __iomem *ret;
...@@ -178,11 +177,11 @@ void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size, ...@@ -178,11 +177,11 @@ void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size,
return NULL; return NULL;
area->phys_addr = paligned; area->phys_addr = paligned;
ret = __ioremap_at(paligned, area->addr, size, flags); ret = __ioremap_at(paligned, area->addr, size, prot);
if (!ret) if (!ret)
vunmap(area->addr); vunmap(area->addr);
} else { } else {
ret = __ioremap_at(paligned, (void *)ioremap_bot, size, flags); ret = __ioremap_at(paligned, (void *)ioremap_bot, size, prot);
if (ret) if (ret)
ioremap_bot += size; ioremap_bot += size;
} }
...@@ -195,37 +194,37 @@ void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size, ...@@ -195,37 +194,37 @@ void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size,
void __iomem * __ioremap(phys_addr_t addr, unsigned long size, void __iomem * __ioremap(phys_addr_t addr, unsigned long size,
unsigned long flags) unsigned long flags)
{ {
return __ioremap_caller(addr, size, flags, __builtin_return_address(0)); return __ioremap_caller(addr, size, __pgprot(flags), __builtin_return_address(0));
} }
void __iomem * ioremap(phys_addr_t addr, unsigned long size) void __iomem * ioremap(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_noncached(PAGE_KERNEL)); pgprot_t prot = pgprot_noncached(PAGE_KERNEL);
void *caller = __builtin_return_address(0); void *caller = __builtin_return_address(0);
if (ppc_md.ioremap) if (ppc_md.ioremap)
return ppc_md.ioremap(addr, size, flags, caller); return ppc_md.ioremap(addr, size, prot, caller);
return __ioremap_caller(addr, size, flags, caller); return __ioremap_caller(addr, size, prot, caller);
} }
void __iomem * ioremap_wc(phys_addr_t addr, unsigned long size) void __iomem * ioremap_wc(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_noncached_wc(PAGE_KERNEL)); pgprot_t prot = pgprot_noncached_wc(PAGE_KERNEL);
void *caller = __builtin_return_address(0); void *caller = __builtin_return_address(0);
if (ppc_md.ioremap) if (ppc_md.ioremap)
return ppc_md.ioremap(addr, size, flags, caller); return ppc_md.ioremap(addr, size, prot, caller);
return __ioremap_caller(addr, size, flags, caller); return __ioremap_caller(addr, size, prot, caller);
} }
void __iomem *ioremap_coherent(phys_addr_t addr, unsigned long size) void __iomem *ioremap_coherent(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = pgprot_val(pgprot_cached(PAGE_KERNEL)); pgprot_t prot = pgprot_cached(PAGE_KERNEL);
void *caller = __builtin_return_address(0); void *caller = __builtin_return_address(0);
if (ppc_md.ioremap) if (ppc_md.ioremap)
return ppc_md.ioremap(addr, size, flags, caller); return ppc_md.ioremap(addr, size, prot, caller);
return __ioremap_caller(addr, size, flags, caller); return __ioremap_caller(addr, size, prot, caller);
} }
void __iomem * ioremap_prot(phys_addr_t addr, unsigned long size, void __iomem * ioremap_prot(phys_addr_t addr, unsigned long size,
...@@ -246,8 +245,8 @@ void __iomem * ioremap_prot(phys_addr_t addr, unsigned long size, ...@@ -246,8 +245,8 @@ void __iomem * ioremap_prot(phys_addr_t addr, unsigned long size,
flags |= _PAGE_PRIVILEGED; flags |= _PAGE_PRIVILEGED;
if (ppc_md.ioremap) if (ppc_md.ioremap)
return ppc_md.ioremap(addr, size, flags, caller); return ppc_md.ioremap(addr, size, __pgprot(flags), caller);
return __ioremap_caller(addr, size, flags, caller); return __ioremap_caller(addr, size, __pgprot(flags), caller);
} }
......
...@@ -230,7 +230,7 @@ static int electra_cf_probe(struct platform_device *ofdev) ...@@ -230,7 +230,7 @@ static int electra_cf_probe(struct platform_device *ofdev)
if (!cf->mem_base || !cf->io_virt || !cf->gpio_base || if (!cf->mem_base || !cf->io_virt || !cf->gpio_base ||
(__ioremap_at(io.start, cf->io_virt, cf->io_size, (__ioremap_at(io.start, cf->io_virt, cf->io_size,
pgprot_val(pgprot_noncached(PAGE_KERNEL))) == NULL)) { pgprot_noncached(PAGE_KERNEL)) == NULL)) {
dev_err(device, "can't ioremap ranges\n"); dev_err(device, "can't ioremap ranges\n");
status = -ENOMEM; status = -ENOMEM;
goto fail1; goto fail1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment