16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 249a732c7SJanosch Frank /* 349a732c7SJanosch Frank * s390x mmu functions 449a732c7SJanosch Frank * 549a732c7SJanosch Frank * Copyright (c) 2018 IBM Corp 649a732c7SJanosch Frank * 749a732c7SJanosch Frank * Authors: 849a732c7SJanosch Frank * Janosch Frank <frankja@de.ibm.com> 949a732c7SJanosch Frank */ 10eb5a1bbaSCornelia Huck #ifndef _S390X_MMU_H_ 11eb5a1bbaSCornelia Huck #define _S390X_MMU_H_ 1249a732c7SJanosch Frank 13*cd87c813SClaudio Imbrenda enum pgt_level { 14*cd87c813SClaudio Imbrenda pgtable_level_pgd = 1, 15*cd87c813SClaudio Imbrenda pgtable_level_p4d, 16*cd87c813SClaudio Imbrenda pgtable_level_pud, 17*cd87c813SClaudio Imbrenda pgtable_level_pmd, 18*cd87c813SClaudio Imbrenda pgtable_level_pte, 19*cd87c813SClaudio Imbrenda }; 20*cd87c813SClaudio Imbrenda 21*cd87c813SClaudio Imbrenda /* 22*cd87c813SClaudio Imbrenda * Splits the pagetables down to the given DAT tables level. 23*cd87c813SClaudio Imbrenda * Returns a pointer to the DAT table entry of the given level. 24*cd87c813SClaudio Imbrenda * @pgtable root of the page table tree 25*cd87c813SClaudio Imbrenda * @vaddr address whose page tables are to split 26*cd87c813SClaudio Imbrenda * @level 3 (for 2GB pud), 4 (for 1 MB pmd) or 5 (for 4KB pages) 27*cd87c813SClaudio Imbrenda */ 28*cd87c813SClaudio Imbrenda void *split_page(pgd_t *pgtable, void *vaddr, enum pgt_level level); 29*cd87c813SClaudio Imbrenda 30*cd87c813SClaudio Imbrenda /* 31*cd87c813SClaudio Imbrenda * Applies the given protection bits to the given DAT tables level, 32*cd87c813SClaudio Imbrenda * splitting if necessary. 33*cd87c813SClaudio Imbrenda * @pgtable root of the page table tree 34*cd87c813SClaudio Imbrenda * @vaddr address whose protection bits are to be changed 35*cd87c813SClaudio Imbrenda * @prot the protection bits to set 36*cd87c813SClaudio Imbrenda * @level 3 (for 2GB pud), 4 (for 1MB pmd) or 5 (for 4KB pages) 37*cd87c813SClaudio Imbrenda */ 38*cd87c813SClaudio Imbrenda void protect_dat_entry(void *vaddr, unsigned long prot, enum pgt_level level); 39*cd87c813SClaudio Imbrenda 40*cd87c813SClaudio Imbrenda /* 41*cd87c813SClaudio Imbrenda * Clears the given protection bits from the given DAT tables level, 42*cd87c813SClaudio Imbrenda * splitting if necessary. 43*cd87c813SClaudio Imbrenda * @pgtable root of the page table tree 44*cd87c813SClaudio Imbrenda * @vaddr address whose protection bits are to be changed 45*cd87c813SClaudio Imbrenda * @prot the protection bits to clear 46*cd87c813SClaudio Imbrenda * @level 3 (for 2GB pud), 4 (for 1MB pmd) or 5 (for 4kB pages) 47*cd87c813SClaudio Imbrenda */ 48*cd87c813SClaudio Imbrenda void unprotect_dat_entry(void *vaddr, unsigned long prot, enum pgt_level level); 49*cd87c813SClaudio Imbrenda 50*cd87c813SClaudio Imbrenda /* 51*cd87c813SClaudio Imbrenda * Applies the given protection bits to the given 4kB pages range, 52*cd87c813SClaudio Imbrenda * splitting if necessary. 53*cd87c813SClaudio Imbrenda * @start starting address whose protection bits are to be changed 54*cd87c813SClaudio Imbrenda * @len size in bytes 55*cd87c813SClaudio Imbrenda * @prot the protection bits to set 56*cd87c813SClaudio Imbrenda */ 5749a732c7SJanosch Frank void protect_range(void *start, unsigned long len, unsigned long prot); 58*cd87c813SClaudio Imbrenda 59*cd87c813SClaudio Imbrenda /* 60*cd87c813SClaudio Imbrenda * Clears the given protection bits from the given 4kB pages range, 61*cd87c813SClaudio Imbrenda * splitting if necessary. 62*cd87c813SClaudio Imbrenda * @start starting address whose protection bits are to be changed 63*cd87c813SClaudio Imbrenda * @len size in bytes 64*cd87c813SClaudio Imbrenda * @prot the protection bits to set 65*cd87c813SClaudio Imbrenda */ 6649a732c7SJanosch Frank void unprotect_range(void *start, unsigned long len, unsigned long prot); 6749a732c7SJanosch Frank 68*cd87c813SClaudio Imbrenda /* Similar to install_page, maps the virtual address to the physical address 69*cd87c813SClaudio Imbrenda * for the given page tables, using 1MB large pages. 70*cd87c813SClaudio Imbrenda * Returns a pointer to the DAT table entry. 71*cd87c813SClaudio Imbrenda * @pgtable root of the page table tree 72*cd87c813SClaudio Imbrenda * @phys physical address to map, must be 1MB aligned! 73*cd87c813SClaudio Imbrenda * @vaddr virtual address to map, must be 1MB aligned! 74*cd87c813SClaudio Imbrenda */ 75*cd87c813SClaudio Imbrenda pmdval_t *install_large_page(pgd_t *pgtable, phys_addr_t phys, void *vaddr); 76*cd87c813SClaudio Imbrenda 77*cd87c813SClaudio Imbrenda /* Similar to install_page, maps the virtual address to the physical address 78*cd87c813SClaudio Imbrenda * for the given page tables, using 2GB huge pages. 79*cd87c813SClaudio Imbrenda * Returns a pointer to the DAT table entry. 80*cd87c813SClaudio Imbrenda * @pgtable root of the page table tree 81*cd87c813SClaudio Imbrenda * @phys physical address to map, must be 2GB aligned! 82*cd87c813SClaudio Imbrenda * @vaddr virtual address to map, must be 2GB aligned! 83*cd87c813SClaudio Imbrenda */ 84*cd87c813SClaudio Imbrenda pudval_t *install_huge_page(pgd_t *pgtable, phys_addr_t phys, void *vaddr); 85*cd87c813SClaudio Imbrenda 86*cd87c813SClaudio Imbrenda static inline void protect_page(void *vaddr, unsigned long prot) 87*cd87c813SClaudio Imbrenda { 88*cd87c813SClaudio Imbrenda protect_dat_entry(vaddr, prot, pgtable_level_pte); 89*cd87c813SClaudio Imbrenda } 90*cd87c813SClaudio Imbrenda 91*cd87c813SClaudio Imbrenda static inline void unprotect_page(void *vaddr, unsigned long prot) 92*cd87c813SClaudio Imbrenda { 93*cd87c813SClaudio Imbrenda unprotect_dat_entry(vaddr, prot, pgtable_level_pte); 94*cd87c813SClaudio Imbrenda } 95*cd87c813SClaudio Imbrenda 96*cd87c813SClaudio Imbrenda void *get_dat_entry(pgd_t *pgtable, void *vaddr, unsigned int level); 97*cd87c813SClaudio Imbrenda 9849a732c7SJanosch Frank #endif /* _ASMS390X_MMU_H_ */ 99