Commit 7235db26 authored by Mike Rapoport's avatar Mike Rapoport Committed by Linus Torvalds
Browse files

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/1572938135-31886-11-git-send-email-rppt@kernel.org


Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Tested-by: default avatarAnatoly Pugachev <matorola@gmail.com>
Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Greentime Hu <green.hu@gmail.com>
Cc: Greg Ungerer <gerg@linux-m68k.org>
Cc: Helge Deller <deller@gmx.de>
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Mark Salter <msalter@redhat.com>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Peter Rosin <peda@axentia.se>
Cc: Richard Weinberger <richard@nod.at>
Cc: Rolf Eike Beer <eike-kernel@sf-tec.de>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Russell King <rmk+kernel@armlinux.org.uk>
Cc: Sam Creasey <sammy@sammy.net>
Cc: Vincent Chen <deanbo422@gmail.com>
Cc: Vineet Gupta <Vineet.Gupta1@synopsys.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2fa245c1
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -26,14 +26,14 @@ static inline void free_pgd_fast(pgd_t *pgd)
#define pgd_free(mm, pgd)	free_pgd_fast(pgd)
#define pgd_alloc(mm)	get_pgd_fast()

static inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
static inline void pud_set(pud_t * pudp, pmd_t * pmdp)
{
	unsigned long pa = __nocache_pa(pmdp);

	set_pte((pte_t *)pgdp, __pte((SRMMU_ET_PTD | (pa >> 4))));
	set_pte((pte_t *)pudp, __pte((SRMMU_ET_PTD | (pa >> 4))));
}

#define pgd_populate(MM, PGD, PMD)      pgd_set(PGD, PMD)
#define pud_populate(MM, PGD, PMD)      pud_set(PGD, PMD)

static inline pmd_t *pmd_alloc_one(struct mm_struct *mm,
				   unsigned long address)
+14 −14
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@
#include <linux/const.h>

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

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

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

static inline int pgd_none(pgd_t pgd)          
static inline int pud_none(pud_t pud)
{
	return !(pgd_val(pgd) & 0xFFFFFFF);
	return !(pud_val(pud) & 0xFFFFFFF);
}

static inline int pgd_bad(pgd_t pgd)
static inline int pud_bad(pud_t pud)
{
	return (pgd_val(pgd) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
	return (pud_val(pud) & SRMMU_ET_MASK) != SRMMU_ET_PTD;
}

static inline int pgd_present(pgd_t pgd)
static inline int pud_present(pud_t pud)
{
	return ((pgd_val(pgd) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
	return ((pud_val(pud) & SRMMU_ET_MASK) == SRMMU_ET_PTD);
}

static inline void pgd_clear(pgd_t *pgdp)
static inline void pud_clear(pud_t *pudp)
{
	set_pte((pte_t *)pgdp, __pte(0));
	set_pte((pte_t *)pudp, __pte(0));
}

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

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

+9 −2
Original line number Diff line number Diff line
@@ -351,6 +351,8 @@ vmalloc_fault:
		 */
		int offset = pgd_index(address);
		pgd_t *pgd, *pgd_k;
		p4d_t *p4d, *p4d_k;
		pud_t *pud, *pud_k;
		pmd_t *pmd, *pmd_k;

		pgd = tsk->active_mm->pgd + offset;
@@ -363,8 +365,13 @@ vmalloc_fault:
			return;
		}

		pmd = pmd_offset(pgd, address);
		pmd_k = pmd_offset(pgd_k, address);
		p4d = p4d_offset(pgd, address);
		pud = pud_offset(p4d, address);
		pmd = pmd_offset(pud, address);

		p4d_k = p4d_offset(pgd_k, address);
		pud_k = pud_offset(p4d_k, address);
		pmd_k = pmd_offset(pud_k, address);

		if (pmd_present(*pmd) || !pmd_present(*pmd_k))
			goto bad_area_nosemaphore;
+5 −1
Original line number Diff line number Diff line
@@ -39,10 +39,14 @@ static pte_t *kmap_pte;
void __init kmap_init(void)
{
	unsigned long address;
	p4d_t *p4d;
	pud_t *pud;
	pmd_t *dir;

	address = __fix_to_virt(FIX_KMAP_BEGIN);
	dir = pmd_offset(pgd_offset_k(address), address);
	p4d = p4d_offset(pgd_offset_k(address), address);
	pud = pud_offset(p4d, address);
	dir = pmd_offset(pud, address);

        /* cache the first kmap pte */
        kmap_pte = pte_offset_kernel(dir, address);
+5 −1
Original line number Diff line number Diff line
@@ -239,12 +239,16 @@ static void *iounit_alloc(struct device *dev, size_t len,
		page = va;
		{
			pgd_t *pgdp;
			p4d_t *p4dp;
			pud_t *pudp;
			pmd_t *pmdp;
			pte_t *ptep;
			long i;

			pgdp = pgd_offset(&init_mm, addr);
			pmdp = pmd_offset(pgdp, addr);
			p4dp = p4d_offset(pgdp, addr);
			pudp = pud_offset(p4dp, addr);
			pmdp = pmd_offset(pudp, addr);
			ptep = pte_offset_map(pmdp, addr);

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