Skip to content

Commit 7235db2

Browse files
rppttorvalds
authored andcommitted
sparc32: use pgtable-nopud instead of 4level-fixup
32-bit version of sparc has three-level page tables and can use pgtable-nopud and folding of the upper layers. Replace usage of include/asm-generic/4level-fixup.h with include/asm-generic/pgtable-nopud.h and adjust page table manipulation macros and functions accordingly. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Mike Rapoport <[email protected]> Acked-by: David S. Miller <[email protected]> Tested-by: Anatoly Pugachev <[email protected]> Cc: Anton Ivanov <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Geert Uytterhoeven <[email protected]> Cc: Greentime Hu <[email protected]> Cc: Greg Ungerer <[email protected]> Cc: Helge Deller <[email protected]> Cc: "James E.J. Bottomley" <[email protected]> Cc: Jeff Dike <[email protected]> Cc: "Kirill A. Shutemov" <[email protected]> Cc: Mark Salter <[email protected]> Cc: Matt Turner <[email protected]> Cc: Michal Simek <[email protected]> Cc: Peter Rosin <[email protected]> Cc: Richard Weinberger <[email protected]> Cc: Rolf Eike Beer <[email protected]> Cc: Russell King <[email protected]> Cc: Russell King <[email protected]> Cc: Sam Creasey <[email protected]> Cc: Vincent Chen <[email protected]> Cc: Vineet Gupta <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 2fa245c commit 7235db2

File tree

7 files changed

+81
-33
lines changed

7 files changed

+81
-33
lines changed

arch/sparc/include/asm/pgalloc_32.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ static inline void free_pgd_fast(pgd_t *pgd)
2626
#define pgd_free(mm, pgd) free_pgd_fast(pgd)
2727
#define pgd_alloc(mm) get_pgd_fast()
2828

29-
static inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
29+
static inline void pud_set(pud_t * pudp, pmd_t * pmdp)
3030
{
3131
unsigned long pa = __nocache_pa(pmdp);
3232

33-
set_pte((pte_t *)pgdp, __pte((SRMMU_ET_PTD | (pa >> 4))));
33+
set_pte((pte_t *)pudp, __pte((SRMMU_ET_PTD | (pa >> 4))));
3434
}
3535

36-
#define pgd_populate(MM, PGD, PMD) pgd_set(PGD, PMD)
36+
#define pud_populate(MM, PGD, PMD) pud_set(PGD, PMD)
3737

3838
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm,
3939
unsigned long address)

arch/sparc/include/asm/pgtable_32.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <linux/const.h>
1313

1414
#ifndef __ASSEMBLY__
15-
#include <asm-generic/4level-fixup.h>
15+
#include <asm-generic/pgtable-nopud.h>
1616

1717
#include <linux/spinlock.h>
1818
#include <linux/mm_types.h>
@@ -132,12 +132,12 @@ static inline struct page *pmd_page(pmd_t pmd)
132132
return pfn_to_page((pmd_val(pmd) & SRMMU_PTD_PMASK) >> (PAGE_SHIFT-4));
133133
}
134134

135-
static inline unsigned long pgd_page_vaddr(pgd_t pgd)
135+
static inline unsigned long pud_page_vaddr(pud_t pud)
136136
{
137-
if (srmmu_device_memory(pgd_val(pgd))) {
137+
if (srmmu_device_memory(pud_val(pud))) {
138138
return ~0;
139139
} else {
140-
unsigned long v = pgd_val(pgd) & SRMMU_PTD_PMASK;
140+
unsigned long v = pud_val(pud) & SRMMU_PTD_PMASK;
141141
return (unsigned long)__nocache_va(v << 4);
142142
}
143143
}
@@ -184,24 +184,24 @@ static inline void pmd_clear(pmd_t *pmdp)
184184
set_pte((pte_t *)&pmdp->pmdv[i], __pte(0));
185185
}
186186

187-
static inline int pgd_none(pgd_t pgd)
187+
static inline int pud_none(pud_t pud)
188188
{
189-
return !(pgd_val(pgd) & 0xFFFFFFF);
189+
return !(pud_val(pud) & 0xFFFFFFF);
190190
}
191191

192-
static inline int pgd_bad(pgd_t pgd)
192+
static inline int pud_bad(pud_t pud)
193193
{
194-
return (pgd_val(pgd) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
194+
return (pud_val(pud) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
195195
}
196196

197-
static inline int pgd_present(pgd_t pgd)
197+
static inline int pud_present(pud_t pud)
198198
{
199-
return ((pgd_val(pgd) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
199+
return ((pud_val(pud) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
200200
}
201201

202-
static inline void pgd_clear(pgd_t *pgdp)
202+
static inline void pud_clear(pud_t *pudp)
203203
{
204-
set_pte((pte_t *)pgdp, __pte(0));
204+
set_pte((pte_t *)pudp, __pte(0));
205205
}
206206

207207
/*
@@ -319,9 +319,9 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
319319
#define pgd_offset_k(address) pgd_offset(&init_mm, address)
320320

321321
/* Find an entry in the second-level page table.. */
322-
static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address)
322+
static inline pmd_t *pmd_offset(pud_t * dir, unsigned long address)
323323
{
324-
return (pmd_t *) pgd_page_vaddr(*dir) +
324+
return (pmd_t *) pud_page_vaddr(*dir) +
325325
((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
326326
}
327327

arch/sparc/mm/fault_32.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
351351
*/
352352
int offset = pgd_index(address);
353353
pgd_t *pgd, *pgd_k;
354+
p4d_t *p4d, *p4d_k;
355+
pud_t *pud, *pud_k;
354356
pmd_t *pmd, *pmd_k;
355357

356358
pgd = tsk->active_mm->pgd + offset;
@@ -363,8 +365,13 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
363365
return;
364366
}
365367

366-
pmd = pmd_offset(pgd, address);
367-
pmd_k = pmd_offset(pgd_k, address);
368+
p4d = p4d_offset(pgd, address);
369+
pud = pud_offset(p4d, address);
370+
pmd = pmd_offset(pud, address);
371+
372+
p4d_k = p4d_offset(pgd_k, address);
373+
pud_k = pud_offset(p4d_k, address);
374+
pmd_k = pmd_offset(pud_k, address);
368375

369376
if (pmd_present(*pmd) || !pmd_present(*pmd_k))
370377
goto bad_area_nosemaphore;

arch/sparc/mm/highmem.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,14 @@ static pte_t *kmap_pte;
3939
void __init kmap_init(void)
4040
{
4141
unsigned long address;
42+
p4d_t *p4d;
43+
pud_t *pud;
4244
pmd_t *dir;
4345

4446
address = __fix_to_virt(FIX_KMAP_BEGIN);
45-
dir = pmd_offset(pgd_offset_k(address), address);
47+
p4d = p4d_offset(pgd_offset_k(address), address);
48+
pud = pud_offset(p4d, address);
49+
dir = pmd_offset(pud, address);
4650

4751
/* cache the first kmap pte */
4852
kmap_pte = pte_offset_kernel(dir, address);

arch/sparc/mm/io-unit.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,16 @@ static void *iounit_alloc(struct device *dev, size_t len,
239239
page = va;
240240
{
241241
pgd_t *pgdp;
242+
p4d_t *p4dp;
243+
pud_t *pudp;
242244
pmd_t *pmdp;
243245
pte_t *ptep;
244246
long i;
245247

246248
pgdp = pgd_offset(&init_mm, addr);
247-
pmdp = pmd_offset(pgdp, addr);
249+
p4dp = p4d_offset(pgdp, addr);
250+
pudp = pud_offset(p4dp, addr);
251+
pmdp = pmd_offset(pudp, addr);
248252
ptep = pte_offset_map(pmdp, addr);
249253

250254
set_pte(ptep, mk_pte(virt_to_page(page), dvma_prot));

arch/sparc/mm/iommu.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ static void *sbus_iommu_alloc(struct device *dev, size_t len,
343343
page = va;
344344
{
345345
pgd_t *pgdp;
346+
p4d_t *p4dp;
347+
pud_t *pudp;
346348
pmd_t *pmdp;
347349
pte_t *ptep;
348350

@@ -354,7 +356,9 @@ static void *sbus_iommu_alloc(struct device *dev, size_t len,
354356
__flush_page_to_ram(page);
355357

356358
pgdp = pgd_offset(&init_mm, addr);
357-
pmdp = pmd_offset(pgdp, addr);
359+
p4dp = p4d_offset(pgdp, addr);
360+
pudp = pud_offset(p4dp, addr);
361+
pmdp = pmd_offset(pudp, addr);
358362
ptep = pte_offset_map(pmdp, addr);
359363

360364
set_pte(ptep, mk_pte(virt_to_page(page), dvma_prot));

arch/sparc/mm/srmmu.c

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ static void __init srmmu_nocache_init(void)
296296
void *srmmu_nocache_bitmap;
297297
unsigned int bitmap_bits;
298298
pgd_t *pgd;
299+
p4d_t *p4d;
300+
pud_t *pud;
299301
pmd_t *pmd;
300302
pte_t *pte;
301303
unsigned long paddr, vaddr;
@@ -329,6 +331,8 @@ static void __init srmmu_nocache_init(void)
329331

330332
while (vaddr < srmmu_nocache_end) {
331333
pgd = pgd_offset_k(vaddr);
334+
p4d = p4d_offset(__nocache_fix(pgd), vaddr);
335+
pud = pud_offset(__nocache_fix(p4d), vaddr);
332336
pmd = pmd_offset(__nocache_fix(pgd), vaddr);
333337
pte = pte_offset_kernel(__nocache_fix(pmd), vaddr);
334338

@@ -516,13 +520,17 @@ static inline void srmmu_mapioaddr(unsigned long physaddr,
516520
unsigned long virt_addr, int bus_type)
517521
{
518522
pgd_t *pgdp;
523+
p4d_t *p4dp;
524+
pud_t *pudp;
519525
pmd_t *pmdp;
520526
pte_t *ptep;
521527
unsigned long tmp;
522528

523529
physaddr &= PAGE_MASK;
524530
pgdp = pgd_offset_k(virt_addr);
525-
pmdp = pmd_offset(pgdp, virt_addr);
531+
p4dp = p4d_offset(pgdp, virt_addr);
532+
pudp = pud_offset(p4dp, virt_addr);
533+
pmdp = pmd_offset(pudp, virt_addr);
526534
ptep = pte_offset_kernel(pmdp, virt_addr);
527535
tmp = (physaddr >> 4) | SRMMU_ET_PTE;
528536

@@ -551,11 +559,16 @@ void srmmu_mapiorange(unsigned int bus, unsigned long xpa,
551559
static inline void srmmu_unmapioaddr(unsigned long virt_addr)
552560
{
553561
pgd_t *pgdp;
562+
p4d_t *p4dp;
563+
pud_t *pudp;
554564
pmd_t *pmdp;
555565
pte_t *ptep;
556566

567+
557568
pgdp = pgd_offset_k(virt_addr);
558-
pmdp = pmd_offset(pgdp, virt_addr);
569+
p4dp = p4d_offset(pgdp, virt_addr);
570+
pudp = pud_offset(p4dp, virt_addr);
571+
pmdp = pmd_offset(pudp, virt_addr);
559572
ptep = pte_offset_kernel(pmdp, virt_addr);
560573

561574
/* No need to flush uncacheable page. */
@@ -693,20 +706,24 @@ static void __init srmmu_early_allocate_ptable_skeleton(unsigned long start,
693706
unsigned long end)
694707
{
695708
pgd_t *pgdp;
709+
p4d_t *p4dp;
710+
pud_t *pudp;
696711
pmd_t *pmdp;
697712
pte_t *ptep;
698713

699714
while (start < end) {
700715
pgdp = pgd_offset_k(start);
701-
if (pgd_none(*(pgd_t *)__nocache_fix(pgdp))) {
716+
p4dp = p4d_offset(pgdp, start);
717+
pudp = pud_offset(p4dp, start);
718+
if (pud_none(*(pud_t *)__nocache_fix(pudp))) {
702719
pmdp = __srmmu_get_nocache(
703720
SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
704721
if (pmdp == NULL)
705722
early_pgtable_allocfail("pmd");
706723
memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
707-
pgd_set(__nocache_fix(pgdp), pmdp);
724+
pud_set(__nocache_fix(pudp), pmdp);
708725
}
709-
pmdp = pmd_offset(__nocache_fix(pgdp), start);
726+
pmdp = pmd_offset(__nocache_fix(pudp), start);
710727
if (srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
711728
ptep = __srmmu_get_nocache(PTE_SIZE, PTE_SIZE);
712729
if (ptep == NULL)
@@ -724,19 +741,23 @@ static void __init srmmu_allocate_ptable_skeleton(unsigned long start,
724741
unsigned long end)
725742
{
726743
pgd_t *pgdp;
744+
p4d_t *p4dp;
745+
pud_t *pudp;
727746
pmd_t *pmdp;
728747
pte_t *ptep;
729748

730749
while (start < end) {
731750
pgdp = pgd_offset_k(start);
732-
if (pgd_none(*pgdp)) {
751+
p4dp = p4d_offset(pgdp, start);
752+
pudp = pud_offset(p4dp, start);
753+
if (pud_none(*pudp)) {
733754
pmdp = __srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
734755
if (pmdp == NULL)
735756
early_pgtable_allocfail("pmd");
736757
memset(pmdp, 0, SRMMU_PMD_TABLE_SIZE);
737-
pgd_set(pgdp, pmdp);
758+
pud_set((pud_t *)pgdp, pmdp);
738759
}
739-
pmdp = pmd_offset(pgdp, start);
760+
pmdp = pmd_offset(pudp, start);
740761
if (srmmu_pmd_none(*pmdp)) {
741762
ptep = __srmmu_get_nocache(PTE_SIZE,
742763
PTE_SIZE);
@@ -779,6 +800,8 @@ static void __init srmmu_inherit_prom_mappings(unsigned long start,
779800
unsigned long probed;
780801
unsigned long addr;
781802
pgd_t *pgdp;
803+
p4d_t *p4dp;
804+
pud_t *pudp;
782805
pmd_t *pmdp;
783806
pte_t *ptep;
784807
int what; /* 0 = normal-pte, 1 = pmd-level pte, 2 = pgd-level pte */
@@ -810,18 +833,20 @@ static void __init srmmu_inherit_prom_mappings(unsigned long start,
810833
}
811834

812835
pgdp = pgd_offset_k(start);
836+
p4dp = p4d_offset(pgdp, start);
837+
pudp = pud_offset(p4dp, start);
813838
if (what == 2) {
814839
*(pgd_t *)__nocache_fix(pgdp) = __pgd(probed);
815840
start += SRMMU_PGDIR_SIZE;
816841
continue;
817842
}
818-
if (pgd_none(*(pgd_t *)__nocache_fix(pgdp))) {
843+
if (pud_none(*(pud_t *)__nocache_fix(pudp))) {
819844
pmdp = __srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE,
820845
SRMMU_PMD_TABLE_SIZE);
821846
if (pmdp == NULL)
822847
early_pgtable_allocfail("pmd");
823848
memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
824-
pgd_set(__nocache_fix(pgdp), pmdp);
849+
pud_set(__nocache_fix(pudp), pmdp);
825850
}
826851
pmdp = pmd_offset(__nocache_fix(pgdp), start);
827852
if (srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
@@ -906,6 +931,8 @@ void __init srmmu_paging_init(void)
906931
phandle cpunode;
907932
char node_str[128];
908933
pgd_t *pgd;
934+
p4d_t *p4d;
935+
pud_t *pud;
909936
pmd_t *pmd;
910937
pte_t *pte;
911938
unsigned long pages_avail;
@@ -967,7 +994,9 @@ void __init srmmu_paging_init(void)
967994
srmmu_allocate_ptable_skeleton(PKMAP_BASE, PKMAP_END);
968995

969996
pgd = pgd_offset_k(PKMAP_BASE);
970-
pmd = pmd_offset(pgd, PKMAP_BASE);
997+
p4d = p4d_offset(pgd, PKMAP_BASE);
998+
pud = pud_offset(p4d, PKMAP_BASE);
999+
pmd = pmd_offset(pud, PKMAP_BASE);
9711000
pte = pte_offset_kernel(pmd, PKMAP_BASE);
9721001
pkmap_page_table = pte;
9731002

0 commit comments

Comments
 (0)