1*d4c8e725SNicholas Piggin /* SPDX-License-Identifier: GPL-2.0-only */ 2*d4c8e725SNicholas Piggin #ifndef _ASMPPC64_PAGE_H_ 3*d4c8e725SNicholas Piggin #define _ASMPPC64_PAGE_H_ 4*d4c8e725SNicholas Piggin /* 5*d4c8e725SNicholas Piggin * Adapted from 6*d4c8e725SNicholas Piggin * lib/arm64/asm/page.h and Linux kernel defines. 7*d4c8e725SNicholas Piggin * 8*d4c8e725SNicholas Piggin * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com> 9*d4c8e725SNicholas Piggin */ 10*d4c8e725SNicholas Piggin 11*d4c8e725SNicholas Piggin #include <config.h> 12*d4c8e725SNicholas Piggin #include <linux/const.h> 13*d4c8e725SNicholas Piggin #include <libcflat.h> 14*d4c8e725SNicholas Piggin 15*d4c8e725SNicholas Piggin #define VA_BITS 52 16*d4c8e725SNicholas Piggin 17*d4c8e725SNicholas Piggin #define PAGE_SIZE CONFIG_PAGE_SIZE 18*d4c8e725SNicholas Piggin #if PAGE_SIZE == SZ_64K 19*d4c8e725SNicholas Piggin #define PAGE_SHIFT 16 20*d4c8e725SNicholas Piggin #elif PAGE_SIZE == SZ_4K 21*d4c8e725SNicholas Piggin #define PAGE_SHIFT 12 22*d4c8e725SNicholas Piggin #else 23*d4c8e725SNicholas Piggin #error Unsupported PAGE_SIZE 24*d4c8e725SNicholas Piggin #endif 25*d4c8e725SNicholas Piggin #define PAGE_MASK (~(PAGE_SIZE-1)) 26*d4c8e725SNicholas Piggin 27*d4c8e725SNicholas Piggin #ifndef __ASSEMBLY__ 28*d4c8e725SNicholas Piggin 29*d4c8e725SNicholas Piggin #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE) 30*d4c8e725SNicholas Piggin 31*d4c8e725SNicholas Piggin typedef u64 pteval_t; 32*d4c8e725SNicholas Piggin typedef u64 pmdval_t; 33*d4c8e725SNicholas Piggin typedef u64 pudval_t; 34*d4c8e725SNicholas Piggin typedef u64 pgdval_t; 35*d4c8e725SNicholas Piggin typedef struct { pteval_t pte; } pte_t; 36*d4c8e725SNicholas Piggin typedef struct { pmdval_t pmd; } pmd_t; 37*d4c8e725SNicholas Piggin typedef struct { pudval_t pud; } pud_t; 38*d4c8e725SNicholas Piggin typedef struct { pgdval_t pgd; } pgd_t; 39*d4c8e725SNicholas Piggin typedef struct { pteval_t pgprot; } pgprot_t; 40*d4c8e725SNicholas Piggin 41*d4c8e725SNicholas Piggin #define pte_val(x) ((x).pte) 42*d4c8e725SNicholas Piggin #define pmd_val(x) ((x).pmd) 43*d4c8e725SNicholas Piggin #define pud_val(x) ((x).pud) 44*d4c8e725SNicholas Piggin #define pgd_val(x) ((x).pgd) 45*d4c8e725SNicholas Piggin #define pgprot_val(x) ((x).pgprot) 46*d4c8e725SNicholas Piggin 47*d4c8e725SNicholas Piggin #define __pte(x) ((pte_t) { (x) } ) 48*d4c8e725SNicholas Piggin #define __pmd(x) ((pmd_t) { (x) } ) 49*d4c8e725SNicholas Piggin #define __pud(x) ((pud_t) { (x) } ) 50*d4c8e725SNicholas Piggin #define __pgd(x) ((pgd_t) { (x) } ) 51*d4c8e725SNicholas Piggin #define __pgprot(x) ((pgprot_t) { (x) } ) 52*d4c8e725SNicholas Piggin 53*d4c8e725SNicholas Piggin #define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x))) 54*d4c8e725SNicholas Piggin #define __pa(x) __virt_to_phys((unsigned long)(x)) 55*d4c8e725SNicholas Piggin 56*d4c8e725SNicholas Piggin #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) 57*d4c8e725SNicholas Piggin #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) 58*d4c8e725SNicholas Piggin 59*d4c8e725SNicholas Piggin extern phys_addr_t __virt_to_phys(unsigned long addr); 60*d4c8e725SNicholas Piggin extern unsigned long __phys_to_virt(phys_addr_t addr); 61*d4c8e725SNicholas Piggin 62*d4c8e725SNicholas Piggin extern void *__ioremap(phys_addr_t phys_addr, size_t size); 63*d4c8e725SNicholas Piggin 64*d4c8e725SNicholas Piggin #endif /* !__ASSEMBLY__ */ 65*d4c8e725SNicholas Piggin #endif /* _ASMPPC64_PAGE_H_ */ 66