mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	nds32: use pgtable-nopmd instead of 4level-fixup
nds32 has only two-level page tables and can use pgtable-nopmd and folding of the upper layers. Replace usage of include/asm-generic/4level-fixup.h and explicit definition of __PAGETABLE_PMD_FOLDED in nds32 with include/asm-generic/pgtable-nopmd.h and adjust page table manipulation macros and functions accordingly. Link: http://lkml.kernel.org/r/1572938135-31886-8-git-send-email-rppt@kernel.org Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> Cc: Anatoly Pugachev <matorola@gmail.com> Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: "David S. Miller" <davem@davemloft.net> 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									ed48e1f812
								
							
						
					
					
						commit
						7c2763c423
					
				| @ -41,17 +41,14 @@ void clear_page(void *page); | ||||
| void copy_page(void *to, void *from); | ||||
| 
 | ||||
| typedef unsigned long pte_t; | ||||
| typedef unsigned long pmd_t; | ||||
| typedef unsigned long pgd_t; | ||||
| typedef unsigned long pgprot_t; | ||||
| 
 | ||||
| #define pte_val(x)      (x) | ||||
| #define pmd_val(x)      (x) | ||||
| #define pgd_val(x)	(x) | ||||
| #define pgprot_val(x)   (x) | ||||
| 
 | ||||
| #define __pte(x)        (x) | ||||
| #define __pmd(x)        (x) | ||||
| #define __pgd(x)        (x) | ||||
| #define __pgprot(x)     (x) | ||||
| 
 | ||||
|  | ||||
| @ -15,9 +15,6 @@ | ||||
| /*
 | ||||
|  * Since we have only two-level page tables, these are trivial | ||||
|  */ | ||||
| #define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); }) | ||||
| #define pmd_free(mm, pmd)			do { } while (0) | ||||
| #define pgd_populate(mm, pmd, pte)	BUG() | ||||
| #define pmd_pgtable(pmd) pmd_page(pmd) | ||||
| 
 | ||||
| extern pgd_t *pgd_alloc(struct mm_struct *mm); | ||||
|  | ||||
| @ -4,8 +4,7 @@ | ||||
| #ifndef _ASMNDS32_PGTABLE_H | ||||
| #define _ASMNDS32_PGTABLE_H | ||||
| 
 | ||||
| #define __PAGETABLE_PMD_FOLDED 1 | ||||
| #include <asm-generic/4level-fixup.h> | ||||
| #include <asm-generic/pgtable-nopmd.h> | ||||
| #include <linux/sizes.h> | ||||
| 
 | ||||
| #include <asm/memory.h> | ||||
| @ -18,26 +17,20 @@ | ||||
| #ifdef CONFIG_ANDES_PAGE_SIZE_4KB | ||||
| #define PGDIR_SHIFT      22 | ||||
| #define PTRS_PER_PGD     1024 | ||||
| #define PMD_SHIFT        22 | ||||
| #define PTRS_PER_PMD     1 | ||||
| #define PTRS_PER_PTE     1024 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_ANDES_PAGE_SIZE_8KB | ||||
| #define PGDIR_SHIFT      24 | ||||
| #define PTRS_PER_PGD     256 | ||||
| #define PMD_SHIFT        24 | ||||
| #define PTRS_PER_PMD     1 | ||||
| #define PTRS_PER_PTE     2048 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| extern void __pte_error(const char *file, int line, unsigned long val); | ||||
| extern void __pmd_error(const char *file, int line, unsigned long val); | ||||
| extern void __pgd_error(const char *file, int line, unsigned long val); | ||||
| 
 | ||||
| #define pte_ERROR(pte)		__pte_error(__FILE__, __LINE__, pte_val(pte)) | ||||
| #define pmd_ERROR(pmd)		__pmd_error(__FILE__, __LINE__, pmd_val(pmd)) | ||||
| #define pgd_ERROR(pgd)		__pgd_error(__FILE__, __LINE__, pgd_val(pgd)) | ||||
| #endif /* !__ASSEMBLY__ */ | ||||
| 
 | ||||
| @ -368,9 +361,6 @@ static inline pmd_t __mk_pmd(pte_t * ptep, unsigned long prot) | ||||
| /* to find an entry in a kernel page-table-directory */ | ||||
| #define pgd_offset_k(addr)      pgd_offset(&init_mm, addr) | ||||
| 
 | ||||
| /* Find an entry in the second-level page table.. */ | ||||
| #define pmd_offset(dir, addr)	((pmd_t *)(dir)) | ||||
| 
 | ||||
| static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | ||||
| { | ||||
| 	const unsigned long mask = 0xfff; | ||||
|  | ||||
| @ -7,6 +7,5 @@ | ||||
| #include <asm-generic/tlb.h> | ||||
| 
 | ||||
| #define __pte_free_tlb(tlb, pte, addr)	pte_free((tlb)->mm, pte) | ||||
| #define __pmd_free_tlb(tlb, pmd, addr)	pmd_free((tln)->mm, pmd) | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -14,6 +14,7 @@ unsigned int *phy_addr_sp_tmp; | ||||
| static void nds32_suspend2ram(void) | ||||
| { | ||||
| 	pgd_t *pgdv; | ||||
| 	p4d_t *p4dv; | ||||
| 	pud_t *pudv; | ||||
| 	pmd_t *pmdv; | ||||
| 	pte_t *ptev; | ||||
| @ -21,7 +22,8 @@ static void nds32_suspend2ram(void) | ||||
| 	pgdv = (pgd_t *)__va((__nds32__mfsr(NDS32_SR_L1_PPTB) & | ||||
| 		L1_PPTB_mskBASE)) + pgd_index((unsigned int)cpu_resume); | ||||
| 
 | ||||
| 	pudv = pud_offset(pgdv, (unsigned int)cpu_resume); | ||||
| 	p4dv = p4d_offset(pgdv, (unsigned int)cpu_resume); | ||||
| 	pudv = pud_offset(p4dv, (unsigned int)cpu_resume); | ||||
| 	pmdv = pmd_offset(pudv, (unsigned int)cpu_resume); | ||||
| 	ptev = pte_offset_map(pmdv, (unsigned int)cpu_resume); | ||||
| 
 | ||||
|  | ||||
| @ -31,6 +31,8 @@ void show_pte(struct mm_struct *mm, unsigned long addr) | ||||
| 	pr_alert("[%08lx] *pgd=%08lx", addr, pgd_val(*pgd)); | ||||
| 
 | ||||
| 	do { | ||||
| 		p4d_t *p4d; | ||||
| 		pud_t *pud; | ||||
| 		pmd_t *pmd; | ||||
| 
 | ||||
| 		if (pgd_none(*pgd)) | ||||
| @ -41,7 +43,9 @@ void show_pte(struct mm_struct *mm, unsigned long addr) | ||||
| 			break; | ||||
| 		} | ||||
| 
 | ||||
| 		pmd = pmd_offset(pgd, addr); | ||||
| 		p4d = p4d_offset(pgd, addr); | ||||
| 		pud = pud_offset(p4d, addr); | ||||
| 		pmd = pmd_offset(pud, addr); | ||||
| #if PTRS_PER_PMD != 1 | ||||
| 		pr_alert(", *pmd=%08lx", pmd_val(*pmd)); | ||||
| #endif | ||||
| @ -359,6 +363,7 @@ vmalloc_fault: | ||||
| 
 | ||||
| 		unsigned int index = pgd_index(addr); | ||||
| 		pgd_t *pgd, *pgd_k; | ||||
| 		p4d_t *p4d, *p4d_k; | ||||
| 		pud_t *pud, *pud_k; | ||||
| 		pmd_t *pmd, *pmd_k; | ||||
| 		pte_t *pte_k; | ||||
| @ -369,8 +374,13 @@ vmalloc_fault: | ||||
| 		if (!pgd_present(*pgd_k)) | ||||
| 			goto no_context; | ||||
| 
 | ||||
| 		pud = pud_offset(pgd, addr); | ||||
| 		pud_k = pud_offset(pgd_k, addr); | ||||
| 		p4d = p4d_offset(pgd, addr); | ||||
| 		p4d_k = p4d_offset(pgd_k, addr); | ||||
| 		if (!p4d_present(*p4d_k)) | ||||
| 			goto no_context; | ||||
| 
 | ||||
| 		pud = pud_offset(p4d, addr); | ||||
| 		pud_k = pud_offset(p4d_k, addr); | ||||
| 		if (!pud_present(*pud_k)) | ||||
| 			goto no_context; | ||||
| 
 | ||||
|  | ||||
| @ -54,6 +54,7 @@ static void __init map_ram(void) | ||||
| { | ||||
| 	unsigned long v, p, e; | ||||
| 	pgd_t *pge; | ||||
| 	p4d_t *p4e; | ||||
| 	pud_t *pue; | ||||
| 	pmd_t *pme; | ||||
| 	pte_t *pte; | ||||
| @ -69,7 +70,8 @@ static void __init map_ram(void) | ||||
| 
 | ||||
| 	while (p < e) { | ||||
| 		int j; | ||||
| 		pue = pud_offset(pge, v); | ||||
| 		p4e = p4d_offset(pge, v); | ||||
| 		pue = pud_offset(p4e, v); | ||||
| 		pme = pmd_offset(pue, v); | ||||
| 
 | ||||
| 		if ((u32) pue != (u32) pge || (u32) pme != (u32) pge) { | ||||
| @ -100,6 +102,7 @@ static void __init fixedrange_init(void) | ||||
| { | ||||
| 	unsigned long vaddr; | ||||
| 	pgd_t *pgd; | ||||
| 	p4d_t *p4d; | ||||
| 	pud_t *pud; | ||||
| 	pmd_t *pmd; | ||||
| #ifdef CONFIG_HIGHMEM | ||||
| @ -111,7 +114,8 @@ static void __init fixedrange_init(void) | ||||
| 	 */ | ||||
| 	vaddr = __fix_to_virt(__end_of_fixed_addresses - 1); | ||||
| 	pgd = swapper_pg_dir + pgd_index(vaddr); | ||||
| 	pud = pud_offset(pgd, vaddr); | ||||
| 	p4d = p4d_offset(pgd, vaddr); | ||||
| 	pud = pud_offset(p4d, vaddr); | ||||
| 	pmd = pmd_offset(pud, vaddr); | ||||
| 	fixmap_pmd_p = memblock_alloc(PAGE_SIZE, PAGE_SIZE); | ||||
| 	if (!fixmap_pmd_p) | ||||
| @ -126,7 +130,8 @@ static void __init fixedrange_init(void) | ||||
| 	vaddr = PKMAP_BASE; | ||||
| 
 | ||||
| 	pgd = swapper_pg_dir + pgd_index(vaddr); | ||||
| 	pud = pud_offset(pgd, vaddr); | ||||
| 	p4d = p4d_offset(pgd, vaddr); | ||||
| 	pud = pud_offset(p4d, vaddr); | ||||
| 	pmd = pmd_offset(pud, vaddr); | ||||
| 	pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE); | ||||
| 	if (!pte) | ||||
|  | ||||
| @ -74,6 +74,8 @@ void setup_mm_for_reboot(char mode) | ||||
| { | ||||
| 	unsigned long pmdval; | ||||
| 	pgd_t *pgd; | ||||
| 	p4d_t *p4d; | ||||
| 	pud_t *pud; | ||||
| 	pmd_t *pmd; | ||||
| 	int i; | ||||
| 
 | ||||
| @ -84,7 +86,9 @@ void setup_mm_for_reboot(char mode) | ||||
| 
 | ||||
| 	for (i = 0; i < USER_PTRS_PER_PGD; i++) { | ||||
| 		pmdval = (i << PGDIR_SHIFT); | ||||
| 		pmd = pmd_offset(pgd + i, i << PGDIR_SHIFT); | ||||
| 		p4d = p4d_offset(pgd, i << PGDIR_SHIFT); | ||||
| 		pud = pud_offset(p4d, i << PGDIR_SHIFT); | ||||
| 		pmd = pmd_offset(pud + i, i << PGDIR_SHIFT); | ||||
| 		set_pmd(pmd, __pmd(pmdval)); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -16,10 +16,14 @@ extern struct cache_info L1_cache_info[2]; | ||||
| 
 | ||||
| int va_kernel_present(unsigned long addr) | ||||
| { | ||||
| 	p4d_t *p4d; | ||||
| 	pud_t *pud; | ||||
| 	pmd_t *pmd; | ||||
| 	pte_t *ptep, pte; | ||||
| 
 | ||||
| 	pmd = pmd_offset(pgd_offset_k(addr), addr); | ||||
| 	p4d = p4d_offset(pgd_offset_k(addr), addr); | ||||
| 	pud = pud_offset(p4d, addr); | ||||
| 	pmd = pmd_offset(pud, addr); | ||||
| 	if (!pmd_none(*pmd)) { | ||||
| 		ptep = pte_offset_map(pmd, addr); | ||||
| 		pte = *ptep; | ||||
| @ -32,20 +36,24 @@ int va_kernel_present(unsigned long addr) | ||||
| pte_t va_present(struct mm_struct * mm, unsigned long addr) | ||||
| { | ||||
| 	pgd_t *pgd; | ||||
| 	p4d_t *p4d; | ||||
| 	pud_t *pud; | ||||
| 	pmd_t *pmd; | ||||
| 	pte_t *ptep, pte; | ||||
| 
 | ||||
| 	pgd = pgd_offset(mm, addr); | ||||
| 	if (!pgd_none(*pgd)) { | ||||
| 		pud = pud_offset(pgd, addr); | ||||
| 		if (!pud_none(*pud)) { | ||||
| 			pmd = pmd_offset(pud, addr); | ||||
| 			if (!pmd_none(*pmd)) { | ||||
| 				ptep = pte_offset_map(pmd, addr); | ||||
| 				pte = *ptep; | ||||
| 				if (pte_present(pte)) | ||||
| 					return pte; | ||||
| 		p4d = p4d_offset(pgd, addr); | ||||
| 		if (!p4d_none(*p4d)) { | ||||
| 			pud = pud_offset(p4d, addr); | ||||
| 			if (!pud_none(*pud)) { | ||||
| 				pmd = pmd_offset(pud, addr); | ||||
| 				if (!pmd_none(*pmd)) { | ||||
| 					ptep = pte_offset_map(pmd, addr); | ||||
| 					pte = *ptep; | ||||
| 					if (pte_present(pte)) | ||||
| 						return pte; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Mike Rapoport
						Mike Rapoport