xref: /freebsd/sys/powerpc/include/mmuvar.h (revision 10fe6f80a6c871ba317ddc2684cecb8f02096943)
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