153451Speter/* SPDX-License-Identifier: GPL-2.0 */ 256918Sru#ifndef __ASM_SH_PGTABLE_3LEVEL_H 353451Speter#define __ASM_SH_PGTABLE_3LEVEL_H 456918Sru 553475Sobrien#include <asm-generic/pgtable-nopud.h> 653475Sobrien 756918Sru/* 856918Sru * Some cores need a 3-level page table layout, for example when using 956918Sru * 64-bit PTEs and 4K pages. 1056918Sru */ 1153475Sobrien#define PAGETABLE_LEVELS 3 1256918Sru 1356918Sru#define PTE_MAGNITUDE 3 /* 64-bit PTEs on SH-X2 TLB */ 1456918Sru 1556918Sru/* PGD bits */ 1653451Speter#define PGDIR_SHIFT 30 1756918Sru 1856918Sru#define PTRS_PER_PGD 4 1956918Sru#define USER_PTRS_PER_PGD 2 2056918Sru 2153451Speter/* PMD bits */ 2253451Speter#define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - PTE_MAGNITUDE)) 2353451Speter#define PMD_SIZE (1UL << PMD_SHIFT) 2453451Speter#define PMD_MASK (~(PMD_SIZE-1)) 2553451Speter 2653451Speter#define PTRS_PER_PMD ((1 << PGDIR_SHIFT) / PMD_SIZE) 2753451Speter 2853451Speter#define pmd_ERROR(e) \ 2953451Speter printk("%s:%d: bad pmd %016llx.\n", __FILE__, __LINE__, pmd_val(e)) 3053451Speter 3153451Spetertypedef union { 3253451Speter struct { 3353451Speter unsigned long pmd_low; 3453451Speter unsigned long pmd_high; 3553451Speter }; 3653451Speter unsigned long long pmd; 3753451Speter} pmd_t; 3853451Speter#define pmd_val(x) ((x).pmd) 3953451Speter#define __pmd(x) ((pmd_t) { .pmd = (x) } ) 4053451Speter 4153451Speterstatic inline pmd_t *pud_pgtable(pud_t pud) 4253451Speter{ 4353451Speter return (pmd_t *)(unsigned long)pud_val(pud); 4453451Speter} 4553451Speter 4653451Speter/* only used by the stubbed out hugetlb gup code, should never be called */ 4753451Speter#define pud_page(pud) NULL 4853451Speter#define pud_none(x) (!pud_val(x)) 4953451Speter#define pud_present(x) (pud_val(x)) 5053451Speter#define pud_clear(xp) do { set_pud(xp, __pud(0)); } while (0) 5153451Speter#define pud_bad(x) (pud_val(x) & ~PAGE_MASK) 5253451Speter 5353451Speter/* 5453451Speter * (puds are folded into pgds so this doesn't get actually called, 5553451Speter * but the define is needed for a generic inline function.) 5653451Speter */ 5753451Speter#define set_pud(pudptr, pudval) do { *(pudptr) = (pudval); } while(0) 5853451Speter 5953451Speter#endif /* __ASM_SH_PGTABLE_3LEVEL_H */ 6053451Speter