1f9c702dbSPeter Grehan /*- 271e3c308SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 371e3c308SPedro F. Giffuni * 4f9c702dbSPeter Grehan * Copyright (c) 2005 Peter Grehan 5f9c702dbSPeter Grehan * All rights reserved. 6f9c702dbSPeter Grehan * 7f9c702dbSPeter Grehan * Redistribution and use in source and binary forms, with or without 8f9c702dbSPeter Grehan * modification, are permitted provided that the following conditions 9f9c702dbSPeter Grehan * are met: 10f9c702dbSPeter Grehan * 1. Redistributions of source code must retain the above copyright 11f9c702dbSPeter Grehan * notice, this list of conditions and the following disclaimer. 12f9c702dbSPeter Grehan * 2. Redistributions in binary form must reproduce the above copyright 13f9c702dbSPeter Grehan * notice, this list of conditions and the following disclaimer in the 14f9c702dbSPeter Grehan * documentation and/or other materials provided with the distribution. 15f9c702dbSPeter Grehan * 16f9c702dbSPeter Grehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17f9c702dbSPeter Grehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18f9c702dbSPeter Grehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19f9c702dbSPeter Grehan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20f9c702dbSPeter Grehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21f9c702dbSPeter Grehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22f9c702dbSPeter Grehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23f9c702dbSPeter Grehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24f9c702dbSPeter Grehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25f9c702dbSPeter Grehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26f9c702dbSPeter Grehan * SUCH DAMAGE. 27f9c702dbSPeter Grehan * 28f9c702dbSPeter Grehan * $FreeBSD$ 29f9c702dbSPeter Grehan */ 30f9c702dbSPeter Grehan 31f9c702dbSPeter Grehan #ifndef _MACHINE_MMUVAR_H_ 32f9c702dbSPeter Grehan #define _MACHINE_MMUVAR_H_ 33f9c702dbSPeter Grehan 3445b69dd6SJustin Hibbits typedef void (*pmap_bootstrap_t)(vm_offset_t, vm_offset_t); 3545b69dd6SJustin Hibbits typedef void (*pmap_cpu_bootstrap_t)(int); 3645b69dd6SJustin Hibbits typedef void (*pmap_kenter_t)(vm_offset_t, vm_paddr_t pa); 3745b69dd6SJustin Hibbits typedef void (*pmap_kenter_attr_t)(vm_offset_t, vm_paddr_t, vm_memattr_t); 3845b69dd6SJustin Hibbits typedef void (*pmap_kremove_t)(vm_offset_t); 3945b69dd6SJustin Hibbits typedef void *(*pmap_mapdev_t)(vm_paddr_t, vm_size_t); 4045b69dd6SJustin Hibbits typedef void *(*pmap_mapdev_attr_t)(vm_paddr_t, vm_size_t, vm_memattr_t); 4145b69dd6SJustin Hibbits typedef void (*pmap_unmapdev_t)(vm_offset_t, vm_size_t); 4245b69dd6SJustin Hibbits typedef void (*pmap_page_set_memattr_t)(vm_page_t, vm_memattr_t); 4345b69dd6SJustin Hibbits typedef int (*pmap_change_attr_t)(vm_offset_t, vm_size_t, vm_memattr_t); 4445b69dd6SJustin Hibbits typedef int (*pmap_map_user_ptr_t)(pmap_t, volatile const void *, 4545b69dd6SJustin Hibbits void **, size_t, size_t *); 4645b69dd6SJustin Hibbits typedef int (*pmap_decode_kernel_ptr_t)(vm_offset_t, int *, vm_offset_t *); 4745b69dd6SJustin Hibbits typedef vm_paddr_t (*pmap_kextract_t)(vm_offset_t); 4845b69dd6SJustin Hibbits typedef int (*pmap_dev_direct_mapped_t)(vm_paddr_t, vm_size_t); 49f9c702dbSPeter Grehan 5045b69dd6SJustin Hibbits typedef void (*pmap_page_array_startup_t)(long); 5145b69dd6SJustin Hibbits typedef void (*pmap_advise_t)(pmap_t, vm_offset_t, vm_offset_t, int); 5245b69dd6SJustin Hibbits typedef void (*pmap_clear_modify_t)(vm_page_t); 5345b69dd6SJustin Hibbits typedef void (*pmap_remove_write_t)(vm_page_t); 5445b69dd6SJustin Hibbits typedef void (*pmap_copy_t)(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t); 5545b69dd6SJustin Hibbits typedef void (*pmap_copy_page_t)(vm_page_t, vm_page_t); 5645b69dd6SJustin Hibbits typedef void (*pmap_copy_pages_t)(vm_page_t *, vm_offset_t, 5745b69dd6SJustin Hibbits vm_page_t *, vm_offset_t, int); 5845b69dd6SJustin Hibbits typedef int (*pmap_enter_t)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, 5945b69dd6SJustin Hibbits u_int, int8_t); 6045b69dd6SJustin Hibbits typedef void (*pmap_enter_object_t)(pmap_t, vm_offset_t, vm_offset_t, 6145b69dd6SJustin Hibbits vm_page_t, vm_prot_t); 6245b69dd6SJustin Hibbits typedef void (*pmap_enter_quick_t)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t); 6345b69dd6SJustin Hibbits typedef vm_paddr_t (*pmap_extract_t)(pmap_t, vm_offset_t); 6445b69dd6SJustin Hibbits typedef vm_page_t (*pmap_extract_and_hold_t)(pmap_t, vm_offset_t, vm_prot_t); 6545b69dd6SJustin Hibbits typedef void (*pmap_growkernel_t)(vm_offset_t); 6645b69dd6SJustin Hibbits typedef void (*pmap_init_t)(void); 6745b69dd6SJustin Hibbits typedef boolean_t (*pmap_is_modified_t)(vm_page_t); 6845b69dd6SJustin Hibbits typedef boolean_t (*pmap_is_prefaultable_t)(pmap_t, vm_offset_t); 6945b69dd6SJustin Hibbits typedef boolean_t (*pmap_is_referenced_t)(vm_page_t); 7045b69dd6SJustin Hibbits typedef int (*pmap_ts_referenced_t)(vm_page_t); 7145b69dd6SJustin Hibbits typedef vm_offset_t (*pmap_map_t)(vm_offset_t *, vm_paddr_t, vm_paddr_t, int); 7245b69dd6SJustin Hibbits typedef void (*pmap_object_init_pt_t)(pmap_t, vm_offset_t, vm_object_t, 7345b69dd6SJustin Hibbits vm_pindex_t, vm_size_t); 7445b69dd6SJustin Hibbits typedef boolean_t (*pmap_page_exists_quick_t)(pmap_t, vm_page_t); 7545b69dd6SJustin Hibbits typedef boolean_t (*pmap_page_is_mapped_t)(vm_page_t); 7645b69dd6SJustin Hibbits typedef void (*pmap_page_init_t)(vm_page_t); 7745b69dd6SJustin Hibbits typedef int (*pmap_page_wired_mappings_t)(vm_page_t); 7845b69dd6SJustin Hibbits typedef void (*pmap_pinit0_t)(pmap_t); 7945b69dd6SJustin Hibbits typedef void (*pmap_protect_t)(pmap_t, vm_offset_t, vm_offset_t, vm_prot_t); 8045b69dd6SJustin Hibbits typedef void (*pmap_qenter_t)(vm_offset_t, vm_page_t *, int); 8145b69dd6SJustin Hibbits typedef void (*pmap_qremove_t)(vm_offset_t, int); 8245b69dd6SJustin Hibbits typedef void (*pmap_release_t)(pmap_t); 8345b69dd6SJustin Hibbits typedef void (*pmap_remove_t)(pmap_t, vm_offset_t, vm_offset_t); 8445b69dd6SJustin Hibbits typedef void (*pmap_remove_all_t)(vm_page_t); 8545b69dd6SJustin Hibbits typedef void (*pmap_remove_pages_t)(pmap_t); 8645b69dd6SJustin Hibbits typedef void (*pmap_unwire_t)(pmap_t, vm_offset_t, vm_offset_t); 8745b69dd6SJustin Hibbits typedef void (*pmap_zero_page_t)(vm_page_t); 8845b69dd6SJustin Hibbits typedef void (*pmap_zero_page_area_t)(vm_page_t, int, int); 8945b69dd6SJustin Hibbits typedef int (*pmap_mincore_t)(pmap_t, vm_offset_t, vm_paddr_t *); 9045b69dd6SJustin Hibbits typedef void (*pmap_activate_t)(struct thread *); 9145b69dd6SJustin Hibbits typedef void (*pmap_deactivate_t)(struct thread *); 9245b69dd6SJustin Hibbits typedef void (*pmap_align_superpage_t)(vm_object_t, vm_ooffset_t, 9345b69dd6SJustin Hibbits vm_offset_t *, vm_size_t); 94f9c702dbSPeter Grehan 9545b69dd6SJustin Hibbits typedef void (*pmap_sync_icache_t)(pmap_t, vm_offset_t, vm_size_t); 9645b69dd6SJustin Hibbits typedef void (*pmap_dumpsys_map_chunk_t)(vm_paddr_t, size_t, void **); 9745b69dd6SJustin Hibbits typedef void (*pmap_dumpsys_unmap_chunk_t)(vm_paddr_t, size_t, void *); 9845b69dd6SJustin Hibbits typedef void (*pmap_dumpsys_pa_init_t)(void); 99*10fe6f80SMitchell Horne typedef size_t (*pmap_dumpsys_scan_pmap_t)(struct bitset *dump_bitset); 10045b69dd6SJustin Hibbits typedef void *(*pmap_dumpsys_dump_pmap_init_t)(unsigned); 10145b69dd6SJustin Hibbits typedef void *(*pmap_dumpsys_dump_pmap_t)(void *, void *, u_long *); 10245b69dd6SJustin Hibbits typedef vm_offset_t (*pmap_quick_enter_page_t)(vm_page_t); 10345b69dd6SJustin Hibbits typedef void (*pmap_quick_remove_page_t)(vm_offset_t); 10445b69dd6SJustin Hibbits typedef bool (*pmap_ps_enabled_t)(pmap_t); 10545b69dd6SJustin Hibbits typedef void (*pmap_tlbie_all_t)(void); 10645b69dd6SJustin Hibbits typedef void (*pmap_installer_t)(void); 10745b69dd6SJustin Hibbits 10845b69dd6SJustin Hibbits struct pmap_funcs { 10945b69dd6SJustin Hibbits pmap_installer_t install; 11045b69dd6SJustin Hibbits pmap_bootstrap_t bootstrap; 11145b69dd6SJustin Hibbits pmap_cpu_bootstrap_t cpu_bootstrap; 11245b69dd6SJustin Hibbits pmap_kenter_t kenter; 11345b69dd6SJustin Hibbits pmap_kenter_attr_t kenter_attr; 11445b69dd6SJustin Hibbits pmap_kremove_t kremove; 11545b69dd6SJustin Hibbits pmap_mapdev_t mapdev; 11645b69dd6SJustin Hibbits pmap_mapdev_attr_t mapdev_attr; 11745b69dd6SJustin Hibbits pmap_unmapdev_t unmapdev; 11845b69dd6SJustin Hibbits pmap_page_set_memattr_t page_set_memattr; 11945b69dd6SJustin Hibbits pmap_change_attr_t change_attr; 12045b69dd6SJustin Hibbits pmap_map_user_ptr_t map_user_ptr; 12145b69dd6SJustin Hibbits pmap_decode_kernel_ptr_t decode_kernel_ptr; 12245b69dd6SJustin Hibbits pmap_kextract_t kextract; 12345b69dd6SJustin Hibbits pmap_dev_direct_mapped_t dev_direct_mapped; 12445b69dd6SJustin Hibbits pmap_advise_t advise; 12545b69dd6SJustin Hibbits pmap_clear_modify_t clear_modify; 12645b69dd6SJustin Hibbits pmap_remove_write_t remove_write; 12745b69dd6SJustin Hibbits pmap_copy_t copy; 12845b69dd6SJustin Hibbits pmap_copy_page_t copy_page; 12945b69dd6SJustin Hibbits pmap_copy_pages_t copy_pages; 13045b69dd6SJustin Hibbits pmap_enter_t enter; 13145b69dd6SJustin Hibbits pmap_enter_object_t enter_object; 13245b69dd6SJustin Hibbits pmap_enter_quick_t enter_quick; 13345b69dd6SJustin Hibbits pmap_extract_t extract; 13445b69dd6SJustin Hibbits pmap_extract_and_hold_t extract_and_hold; 13545b69dd6SJustin Hibbits pmap_growkernel_t growkernel; 13645b69dd6SJustin Hibbits pmap_init_t init; 13745b69dd6SJustin Hibbits pmap_is_modified_t is_modified; 13845b69dd6SJustin Hibbits pmap_is_prefaultable_t is_prefaultable; 13945b69dd6SJustin Hibbits pmap_is_referenced_t is_referenced; 14045b69dd6SJustin Hibbits pmap_ts_referenced_t ts_referenced; 14145b69dd6SJustin Hibbits pmap_page_is_mapped_t page_is_mapped; 14245b69dd6SJustin Hibbits pmap_ps_enabled_t ps_enabled; 14345b69dd6SJustin Hibbits pmap_map_t map; 14445b69dd6SJustin Hibbits pmap_object_init_pt_t object_init_pt; 14545b69dd6SJustin Hibbits pmap_page_exists_quick_t page_exists_quick; 14645b69dd6SJustin Hibbits pmap_page_init_t page_init; 14745b69dd6SJustin Hibbits pmap_page_wired_mappings_t page_wired_mappings; 14845b69dd6SJustin Hibbits pmap_pinit_t pinit; 14945b69dd6SJustin Hibbits pmap_pinit0_t pinit0; 15045b69dd6SJustin Hibbits pmap_protect_t protect; 15145b69dd6SJustin Hibbits pmap_qenter_t qenter; 15245b69dd6SJustin Hibbits pmap_qremove_t qremove; 15345b69dd6SJustin Hibbits pmap_release_t release; 15445b69dd6SJustin Hibbits pmap_remove_t remove; 15545b69dd6SJustin Hibbits pmap_remove_all_t remove_all; 15645b69dd6SJustin Hibbits pmap_remove_pages_t remove_pages; 15745b69dd6SJustin Hibbits pmap_unwire_t unwire; 15845b69dd6SJustin Hibbits pmap_zero_page_t zero_page; 15945b69dd6SJustin Hibbits pmap_zero_page_area_t zero_page_area; 16045b69dd6SJustin Hibbits pmap_mincore_t mincore; 16145b69dd6SJustin Hibbits pmap_activate_t activate; 16245b69dd6SJustin Hibbits pmap_deactivate_t deactivate; 16345b69dd6SJustin Hibbits pmap_align_superpage_t align_superpage; 16445b69dd6SJustin Hibbits pmap_sync_icache_t sync_icache; 16545b69dd6SJustin Hibbits pmap_quick_enter_page_t quick_enter_page; 16645b69dd6SJustin Hibbits pmap_quick_remove_page_t quick_remove_page; 16745b69dd6SJustin Hibbits pmap_page_array_startup_t page_array_startup; 16845b69dd6SJustin Hibbits pmap_dumpsys_map_chunk_t dumpsys_map_chunk; 16945b69dd6SJustin Hibbits pmap_dumpsys_unmap_chunk_t dumpsys_unmap_chunk; 17045b69dd6SJustin Hibbits pmap_dumpsys_pa_init_t dumpsys_pa_init; 17145b69dd6SJustin Hibbits pmap_dumpsys_scan_pmap_t dumpsys_scan_pmap; 17245b69dd6SJustin Hibbits pmap_dumpsys_dump_pmap_init_t dumpsys_dump_pmap_init; 17345b69dd6SJustin Hibbits pmap_dumpsys_dump_pmap_t dumpsys_dump_pmap; 17445b69dd6SJustin Hibbits pmap_tlbie_all_t tlbie_all; 17545b69dd6SJustin Hibbits 17645b69dd6SJustin Hibbits }; 177f9c702dbSPeter Grehan struct mmu_kobj { 17845b69dd6SJustin Hibbits const char *name; 17945b69dd6SJustin Hibbits const struct mmu_kobj *base; 18045b69dd6SJustin Hibbits const struct pmap_funcs *funcs; 181f9c702dbSPeter Grehan }; 182f9c702dbSPeter Grehan 183f9c702dbSPeter Grehan typedef struct mmu_kobj *mmu_t; 184f9c702dbSPeter Grehan 185d3111144SJustin Hibbits /* The currently installed pmap object. */ 186d3111144SJustin Hibbits extern mmu_t mmu_obj; 187d3111144SJustin Hibbits 188d3111144SJustin Hibbits /* 189d3111144SJustin Hibbits * Resolve a given pmap function. 190d3111144SJustin Hibbits * 'func' is the function name less the 'pmap_' * prefix. 191d3111144SJustin Hibbits */ 192d3111144SJustin Hibbits #define PMAP_RESOLVE_FUNC(func) \ 193d3111144SJustin Hibbits ({ \ 194d3111144SJustin Hibbits pmap_##func##_t f; \ 195d3111144SJustin Hibbits const struct mmu_kobj *mmu = mmu_obj; \ 196d3111144SJustin Hibbits do { \ 197d3111144SJustin Hibbits f = mmu->funcs->func; \ 198d3111144SJustin Hibbits if (f != NULL) break; \ 199d3111144SJustin Hibbits mmu = mmu->base; \ 200d3111144SJustin Hibbits } while (mmu != NULL); \ 201d3111144SJustin Hibbits f;}) 202d3111144SJustin Hibbits 20345b69dd6SJustin Hibbits #define MMU_DEF(name, ident, methods) \ 20433529b98SPeter Grehan \ 20545b69dd6SJustin Hibbits const struct mmu_kobj name = { \ 20645b69dd6SJustin Hibbits ident, NULL, &methods \ 20733529b98SPeter Grehan }; \ 20833529b98SPeter Grehan DATA_SET(mmu_set, name) 20933529b98SPeter Grehan 21045b69dd6SJustin Hibbits #define MMU_DEF_INHERIT(name, ident, methods, base1) \ 21133529b98SPeter Grehan \ 21245b69dd6SJustin Hibbits const struct mmu_kobj name = { \ 21345b69dd6SJustin Hibbits ident, &base1, &methods, \ 21433529b98SPeter Grehan }; \ 21533529b98SPeter Grehan DATA_SET(mmu_set, name) 21633529b98SPeter Grehan 217f9c702dbSPeter Grehan /* 218f9c702dbSPeter Grehan * Known MMU names 219f9c702dbSPeter Grehan */ 2206b7ba544SRafal Jaworowski #define MMU_TYPE_BOOKE "mmu_booke" /* Book-E MMU specification */ 221f9c702dbSPeter Grehan #define MMU_TYPE_OEA "mmu_oea" /* 32-bit OEA */ 222f9c702dbSPeter Grehan #define MMU_TYPE_G5 "mmu_g5" /* 64-bit bridge (ibm 970) */ 22365bbba25SJustin Hibbits #define MMU_TYPE_RADIX "mmu_radix" /* 64-bit native ISA 3.0 (POWER9) radix */ 224f9c702dbSPeter Grehan #define MMU_TYPE_8xx "mmu_8xx" /* 8xx quicc TLB */ 225f9c702dbSPeter Grehan 226f9c702dbSPeter Grehan #endif /* _MACHINE_MMUVAR_H_ */ 227