Skip to content

Commit c766ee7

Browse files
chleroympe
authored andcommitted
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: Christophe Leroy <christophe.leroy@c-s.fr> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
1 parent 56f3c14 commit c766ee7

File tree

20 files changed

+64
-77
lines changed

20 files changed

+64
-77
lines changed

arch/powerpc/include/asm/book3s/32/pgtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
292292
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 })
293293
#define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 })
294294

295-
int map_kernel_page(unsigned long va, phys_addr_t pa, int flags);
295+
int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
296296

297297
/* Generic accessors to PTE bits */
298298
static inline int pte_write(pte_t pte) { return !!(pte_val(pte) & _PAGE_RW);}

arch/powerpc/include/asm/book3s/64/hash.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,7 @@ static inline void hpte_do_hugepage_flush(struct mm_struct *mm,
201201
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
202202

203203

204-
extern int hash__map_kernel_page(unsigned long ea, unsigned long pa,
205-
unsigned long flags);
204+
int hash__map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot);
206205
extern int __meminit hash__vmemmap_create_mapping(unsigned long start,
207206
unsigned long page_size,
208207
unsigned long phys);

arch/powerpc/include/asm/book3s/64/pgtable.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,17 +1030,16 @@ extern struct page *pgd_page(pgd_t pgd);
10301030
#define pgd_ERROR(e) \
10311031
pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
10321032

1033-
static inline int map_kernel_page(unsigned long ea, unsigned long pa,
1034-
unsigned long flags)
1033+
static inline int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
10351034
{
10361035
if (radix_enabled()) {
10371036
#if defined(CONFIG_PPC_RADIX_MMU) && defined(DEBUG_VM)
10381037
unsigned long page_size = 1 << mmu_psize_defs[mmu_io_psize].shift;
10391038
WARN((page_size != PAGE_SIZE), "I/O page size != PAGE_SIZE");
10401039
#endif
1041-
return radix__map_kernel_page(ea, pa, __pgprot(flags), PAGE_SIZE);
1040+
return radix__map_kernel_page(ea, pa, prot, PAGE_SIZE);
10421041
}
1043-
return hash__map_kernel_page(ea, pa, flags);
1042+
return hash__map_kernel_page(ea, pa, prot);
10441043
}
10451044

10461045
static inline int __meminit vmemmap_create_mapping(unsigned long start,

arch/powerpc/include/asm/fixmap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ enum fixed_addresses {
7272
static inline void __set_fixmap(enum fixed_addresses idx,
7373
phys_addr_t phys, pgprot_t flags)
7474
{
75-
map_kernel_page(fix_to_virt(idx), phys, pgprot_val(flags));
75+
map_kernel_page(fix_to_virt(idx), phys, flags);
7676
}
7777

7878
#endif /* !__ASSEMBLY__ */

arch/powerpc/include/asm/io.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -786,12 +786,12 @@ extern void iounmap(volatile void __iomem *addr);
786786
extern void __iomem *__ioremap(phys_addr_t, unsigned long size,
787787
unsigned long flags);
788788
extern void __iomem *__ioremap_caller(phys_addr_t, unsigned long size,
789-
unsigned long flags, void *caller);
789+
pgprot_t prot, void *caller);
790790

791791
extern void __iounmap(volatile void __iomem *addr);
792792

793793
extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea,
794-
unsigned long size, unsigned long flags);
794+
unsigned long size, pgprot_t prot);
795795
extern void __iounmap_at(void *ea, unsigned long size);
796796

797797
/*

arch/powerpc/include/asm/machdep.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct machdep_calls {
3535
char *name;
3636
#ifdef CONFIG_PPC64
3737
void __iomem * (*ioremap)(phys_addr_t addr, unsigned long size,
38-
unsigned long flags, void *caller);
38+
pgprot_t prot, void *caller);
3939
void (*iounmap)(volatile void __iomem *token);
4040

4141
#ifdef CONFIG_PM

arch/powerpc/include/asm/nohash/32/pgtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ static inline int pte_young(pte_t pte)
323323
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 })
324324
#define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 })
325325

326-
int map_kernel_page(unsigned long va, phys_addr_t pa, int flags);
326+
int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
327327

328328
#endif /* !__ASSEMBLY__ */
329329

arch/powerpc/include/asm/nohash/64/pgtable.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
327327
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) })
328328
#define __swp_entry_to_pte(x) __pte((x).val)
329329

330-
extern int map_kernel_page(unsigned long ea, unsigned long pa,
331-
unsigned long flags);
330+
int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot);
332331
extern int __meminit vmemmap_create_mapping(unsigned long start,
333332
unsigned long page_size,
334333
unsigned long phys);

arch/powerpc/kernel/io-workarounds.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,10 @@ static const struct ppc_pci_io iowa_pci_io = {
153153

154154
#ifdef CONFIG_PPC_INDIRECT_MMIO
155155
static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
156-
unsigned long flags, void *caller)
156+
pgprot_t prot, void *caller)
157157
{
158158
struct iowa_bus *bus;
159-
void __iomem *res = __ioremap_caller(addr, size, flags, caller);
159+
void __iomem *res = __ioremap_caller(addr, size, prot, caller);
160160
int busno;
161161

162162
bus = iowa_pci_find(0, (unsigned long)addr);

arch/powerpc/kernel/isa-bridge.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,14 @@ static void pci_process_ISA_OF_ranges(struct device_node *isa_node,
110110
size = 0x10000;
111111

112112
__ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
113-
size, pgprot_val(pgprot_noncached(PAGE_KERNEL)));
113+
size, pgprot_noncached(PAGE_KERNEL));
114114
return;
115115

116116
inval_range:
117117
printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
118118
"mapping 64k\n");
119119
__ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
120-
0x10000, pgprot_val(pgprot_noncached(PAGE_KERNEL)));
120+
0x10000, pgprot_noncached(PAGE_KERNEL));
121121
}
122122

123123

@@ -253,7 +253,7 @@ void __init isa_bridge_init_non_pci(struct device_node *np)
253253
*/
254254
isa_io_base = ISA_IO_BASE;
255255
__ioremap_at(pbase, (void *)ISA_IO_BASE,
256-
size, pgprot_val(pgprot_noncached(PAGE_KERNEL)));
256+
size, pgprot_noncached(PAGE_KERNEL));
257257

258258
pr_debug("ISA: Non-PCI bridge is %pOF\n", np);
259259
}

arch/powerpc/kernel/pci_64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static int pcibios_map_phb_io_space(struct pci_controller *hose)
159159

160160
/* Establish the mapping */
161161
if (__ioremap_at(phys_page, area->addr, size_page,
162-
pgprot_val(pgprot_noncached(PAGE_KERNEL))) == NULL)
162+
pgprot_noncached(PAGE_KERNEL)) == NULL)
163163
return -ENOMEM;
164164

165165
/* Fixup hose IO resource */

arch/powerpc/lib/code-patching.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ static int map_patch_area(void *addr, unsigned long text_poke_addr)
9898
else
9999
pfn = __pa_symbol(addr) >> PAGE_SHIFT;
100100

101-
err = map_kernel_page(text_poke_addr, (pfn << PAGE_SHIFT),
102-
pgprot_val(PAGE_KERNEL));
101+
err = map_kernel_page(text_poke_addr, (pfn << PAGE_SHIFT), PAGE_KERNEL);
103102

104103
pr_devel("Mapped addr %lx with pfn %lx:%d\n", text_poke_addr, pfn, err);
105104
if (err)

arch/powerpc/mm/8xx_mmu.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,10 @@ static void __init mmu_mapin_immr(void)
9191
{
9292
unsigned long p = PHYS_IMMR_BASE;
9393
unsigned long v = VIRT_IMMR_BASE;
94-
unsigned long f = pgprot_val(PAGE_KERNEL_NCG);
9594
int offset;
9695

9796
for (offset = 0; offset < IMMR_SIZE; offset += PAGE_SIZE)
98-
map_kernel_page(v + offset, p + offset, f);
97+
map_kernel_page(v + offset, p + offset, PAGE_KERNEL_NCG);
9998
}
10099

101100
/* Address of instructions to patch */

arch/powerpc/mm/dma-noncoherent.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ __dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t
228228
do {
229229
SetPageReserved(page);
230230
map_kernel_page(vaddr, page_to_phys(page),
231-
pgprot_val(pgprot_noncached(PAGE_KERNEL)));
231+
pgprot_noncached(PAGE_KERNEL));
232232
page++;
233233
vaddr += PAGE_SIZE;
234234
} while (size -= PAGE_SIZE);

arch/powerpc/mm/mem.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,11 @@ void __init paging_init(void)
309309
unsigned long end = __fix_to_virt(FIX_HOLE);
310310

311311
for (; v < end; v += PAGE_SIZE)
312-
map_kernel_page(v, 0, 0); /* XXX gross */
312+
map_kernel_page(v, 0, __pgprot(0)); /* XXX gross */
313313
#endif
314314

315315
#ifdef CONFIG_HIGHMEM
316-
map_kernel_page(PKMAP_BASE, 0, 0); /* XXX gross */
316+
map_kernel_page(PKMAP_BASE, 0, __pgprot(0)); /* XXX gross */
317317
pkmap_page_table = virt_to_kpte(PKMAP_BASE);
318318

319319
kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN));

arch/powerpc/mm/pgtable-book3e.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ int __meminit vmemmap_create_mapping(unsigned long start,
4242
* thus must have the low bits clear
4343
*/
4444
for (i = 0; i < page_size; i += PAGE_SIZE)
45-
BUG_ON(map_kernel_page(start + i, phys, flags));
45+
BUG_ON(map_kernel_page(start + i, phys, __pgprot(flags)));
4646

4747
return 0;
4848
}
@@ -70,7 +70,7 @@ static __ref void *early_alloc_pgtable(unsigned long size)
7070
* map_kernel_page adds an entry to the ioremap page table
7171
* and adds an entry to the HPT, possibly bolting it
7272
*/
73-
int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
73+
int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
7474
{
7575
pgd_t *pgdp;
7676
pud_t *pudp;
@@ -89,8 +89,6 @@ int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
8989
ptep = pte_alloc_kernel(pmdp, ea);
9090
if (!ptep)
9191
return -ENOMEM;
92-
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
93-
__pgprot(flags)));
9492
} else {
9593
pgdp = pgd_offset_k(ea);
9694
#ifndef __PAGETABLE_PUD_FOLDED
@@ -113,9 +111,8 @@ int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
113111
pmd_populate_kernel(&init_mm, pmdp, ptep);
114112
}
115113
ptep = pte_offset_kernel(pmdp, ea);
116-
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
117-
__pgprot(flags)));
118114
}
115+
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, prot));
119116

120117
smp_wmb();
121118
return 0;

arch/powerpc/mm/pgtable-hash64.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void hash__vmemmap_remove_mapping(unsigned long start,
142142
* map_kernel_page adds an entry to the ioremap page table
143143
* and adds an entry to the HPT, possibly bolting it
144144
*/
145-
int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
145+
int hash__map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)
146146
{
147147
pgd_t *pgdp;
148148
pud_t *pudp;
@@ -161,16 +161,15 @@ int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flag
161161
ptep = pte_alloc_kernel(pmdp, ea);
162162
if (!ptep)
163163
return -ENOMEM;
164-
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
165-
__pgprot(flags)));
164+
set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, prot));
166165
} else {
167166
/*
168167
* If the mm subsystem is not fully up, we cannot create a
169168
* linux page table entry for this mapping. Simply bolt an
170169
* entry in the hardware page table.
171170
*
172171
*/
173-
if (htab_bolt_mapping(ea, ea + PAGE_SIZE, pa, flags,
172+
if (htab_bolt_mapping(ea, ea + PAGE_SIZE, pa, pgprot_val(prot),
174173
mmu_io_psize, mmu_kernel_ssize)) {
175174
printk(KERN_ERR "Failed to do bolted mapping IO "
176175
"memory at %016lx !\n", pa);

arch/powerpc/mm/pgtable_32.c

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,36 +76,36 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
7676
void __iomem *
7777
ioremap(phys_addr_t addr, unsigned long size)
7878
{
79-
unsigned long flags = pgprot_val(pgprot_noncached(PAGE_KERNEL));
79+
pgprot_t prot = pgprot_noncached(PAGE_KERNEL);
8080

81-
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
81+
return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
8282
}
8383
EXPORT_SYMBOL(ioremap);
8484

8585
void __iomem *
8686
ioremap_wc(phys_addr_t addr, unsigned long size)
8787
{
88-
unsigned long flags = pgprot_val(pgprot_noncached_wc(PAGE_KERNEL));
88+
pgprot_t prot = pgprot_noncached_wc(PAGE_KERNEL);
8989

90-
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
90+
return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
9191
}
9292
EXPORT_SYMBOL(ioremap_wc);
9393

9494
void __iomem *
9595
ioremap_wt(phys_addr_t addr, unsigned long size)
9696
{
97-
unsigned long flags = pgprot_val(pgprot_cached_wthru(PAGE_KERNEL));
97+
pgprot_t prot = pgprot_cached_wthru(PAGE_KERNEL);
9898

99-
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
99+
return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
100100
}
101101
EXPORT_SYMBOL(ioremap_wt);
102102

103103
void __iomem *
104104
ioremap_coherent(phys_addr_t addr, unsigned long size)
105105
{
106-
unsigned long flags = pgprot_val(pgprot_cached(PAGE_KERNEL));
106+
pgprot_t prot = pgprot_cached(PAGE_KERNEL);
107107

108-
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
108+
return __ioremap_caller(addr, size, prot, __builtin_return_address(0));
109109
}
110110
EXPORT_SYMBOL(ioremap_coherent);
111111

@@ -120,19 +120,18 @@ ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags)
120120
flags &= ~(_PAGE_USER | _PAGE_EXEC);
121121
flags |= _PAGE_PRIVILEGED;
122122

123-
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
123+
return __ioremap_caller(addr, size, __pgprot(flags), __builtin_return_address(0));
124124
}
125125
EXPORT_SYMBOL(ioremap_prot);
126126

127127
void __iomem *
128128
__ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
129129
{
130-
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
130+
return __ioremap_caller(addr, size, __pgprot(flags), __builtin_return_address(0));
131131
}
132132

133133
void __iomem *
134-
__ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,
135-
void *caller)
134+
__ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *caller)
136135
{
137136
unsigned long v, i;
138137
phys_addr_t p;
@@ -195,7 +194,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,
195194

196195
err = 0;
197196
for (i = 0; i < size && err == 0; i += PAGE_SIZE)
198-
err = map_kernel_page(v+i, p+i, flags);
197+
err = map_kernel_page(v + i, p + i, prot);
199198
if (err) {
200199
if (slab_is_available())
201200
vunmap((void *)v);
@@ -221,7 +220,7 @@ void iounmap(volatile void __iomem *addr)
221220
}
222221
EXPORT_SYMBOL(iounmap);
223222

224-
int map_kernel_page(unsigned long va, phys_addr_t pa, int flags)
223+
int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot)
225224
{
226225
pmd_t *pd;
227226
pte_t *pg;
@@ -237,9 +236,8 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, int flags)
237236
* hash table
238237
*/
239238
BUG_ON((pte_val(*pg) & (_PAGE_PRESENT | _PAGE_HASHPTE)) &&
240-
flags);
241-
set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT,
242-
__pgprot(flags)));
239+
pgprot_val(prot));
240+
set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT, prot));
243241
}
244242
smp_wmb();
245243
return err;
@@ -250,7 +248,7 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, int flags)
250248
*/
251249
static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top)
252250
{
253-
unsigned long v, s, f;
251+
unsigned long v, s;
254252
phys_addr_t p;
255253
int ktext;
256254

@@ -260,8 +258,7 @@ static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top)
260258
for (; s < top; s += PAGE_SIZE) {
261259
ktext = ((char *)v >= _stext && (char *)v < etext) ||
262260
((char *)v >= _sinittext && (char *)v < _einittext);
263-
f = ktext ? pgprot_val(PAGE_KERNEL_TEXT) : pgprot_val(PAGE_KERNEL);
264-
map_kernel_page(v, p, f);
261+
map_kernel_page(v, p, ktext ? PAGE_KERNEL_TEXT : PAGE_KERNEL);
265262
#ifdef CONFIG_PPC_STD_MMU_32
266263
if (ktext)
267264
hash_preload(&init_mm, v, 0, 0x300);

0 commit comments

Comments
 (0)