1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2005 Peter Grehan
  5 * All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 *
 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 26 * SUCH DAMAGE.
 27 */
 28
 29#ifndef _MACHINE_MMUVAR_H_
 30#define _MACHINE_MMUVAR_H_
 31
 32typedef	void	(*pmap_bootstrap_t)(vm_offset_t, vm_offset_t);
 33typedef	void	(*pmap_cpu_bootstrap_t)(int);
 34typedef	void	(*pmap_kenter_t)(vm_offset_t, vm_paddr_t pa);
 35typedef	void	(*pmap_kenter_attr_t)(vm_offset_t, vm_paddr_t, vm_memattr_t);
 36typedef	void	(*pmap_kremove_t)(vm_offset_t);
 37typedef	void	*(*pmap_mapdev_t)(vm_paddr_t, vm_size_t);
 38typedef	void	*(*pmap_mapdev_attr_t)(vm_paddr_t, vm_size_t, vm_memattr_t);
 39typedef	void	(*pmap_unmapdev_t)(void *, vm_size_t);
 40typedef	void	(*pmap_page_set_memattr_t)(vm_page_t, vm_memattr_t);
 41typedef	int	(*pmap_change_attr_t)(vm_offset_t, vm_size_t, vm_memattr_t);
 42typedef	int	(*pmap_map_user_ptr_t)(pmap_t, volatile const void *,
 43 		    void **, size_t, size_t *);
 44typedef	int	(*pmap_decode_kernel_ptr_t)(vm_offset_t, int *, vm_offset_t *);
 45typedef	vm_paddr_t	(*pmap_kextract_t)(vm_offset_t);
 46typedef	int	(*pmap_dev_direct_mapped_t)(vm_paddr_t, vm_size_t);
 47
 48typedef	void	(*pmap_page_array_startup_t)(long);
 49typedef	void	(*pmap_advise_t)(pmap_t, vm_offset_t, vm_offset_t, int);
 50typedef	void	(*pmap_clear_modify_t)(vm_page_t);
 51typedef	void	(*pmap_remove_write_t)(vm_page_t);
 52typedef	void	(*pmap_copy_t)(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t);
 53typedef	void	(*pmap_copy_page_t)(vm_page_t, vm_page_t);
 54typedef	void	(*pmap_copy_pages_t)(vm_page_t *, vm_offset_t,
 55		    vm_page_t *, vm_offset_t, int);
 56typedef	int	(*pmap_enter_t)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t,
 57		    u_int, int8_t);
 58typedef	void	(*pmap_enter_object_t)(pmap_t, vm_offset_t, vm_offset_t,
 59		    vm_page_t, vm_prot_t);
 60typedef	void	(*pmap_enter_quick_t)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t);
 61typedef	vm_paddr_t	(*pmap_extract_t)(pmap_t, vm_offset_t);
 62typedef	vm_page_t	(*pmap_extract_and_hold_t)(pmap_t, vm_offset_t, vm_prot_t);
 63typedef	void	(*pmap_growkernel_t)(vm_offset_t);
 64typedef	void	(*pmap_init_t)(void);
 65typedef	boolean_t	(*pmap_is_modified_t)(vm_page_t);
 66typedef	boolean_t	(*pmap_is_prefaultable_t)(pmap_t, vm_offset_t);
 67typedef	boolean_t	(*pmap_is_referenced_t)(vm_page_t);
 68typedef	int	(*pmap_ts_referenced_t)(vm_page_t);
 69typedef	vm_offset_t	(*pmap_map_t)(vm_offset_t *, vm_paddr_t, vm_paddr_t, int);
 70typedef	void	(*pmap_object_init_pt_t)(pmap_t, vm_offset_t, vm_object_t,
 71		    vm_pindex_t, vm_size_t);
 72typedef	boolean_t	(*pmap_page_exists_quick_t)(pmap_t, vm_page_t);
 73typedef	boolean_t	(*pmap_page_is_mapped_t)(vm_page_t);
 74typedef	void	(*pmap_page_init_t)(vm_page_t);
 75typedef	int	(*pmap_page_wired_mappings_t)(vm_page_t);
 76typedef	void	(*pmap_pinit0_t)(pmap_t);
 77typedef	void	(*pmap_protect_t)(pmap_t, vm_offset_t, vm_offset_t, vm_prot_t);
 78typedef	void	(*pmap_qenter_t)(vm_offset_t, vm_page_t *, int);
 79typedef	void	(*pmap_qremove_t)(vm_offset_t, int);
 80typedef	void	(*pmap_release_t)(pmap_t);
 81typedef	void	(*pmap_remove_t)(pmap_t, vm_offset_t, vm_offset_t);
 82typedef	void	(*pmap_remove_all_t)(vm_page_t);
 83typedef	void	(*pmap_remove_pages_t)(pmap_t);
 84typedef	void	(*pmap_unwire_t)(pmap_t, vm_offset_t, vm_offset_t);
 85typedef	void	(*pmap_zero_page_t)(vm_page_t);
 86typedef	void	(*pmap_zero_page_area_t)(vm_page_t, int, int);
 87typedef	int	(*pmap_mincore_t)(pmap_t, vm_offset_t, vm_paddr_t *);
 88typedef	void	(*pmap_activate_t)(struct thread	*);
 89typedef void	(*pmap_deactivate_t)(struct thread	*);
 90typedef	void	(*pmap_align_superpage_t)(vm_object_t, vm_ooffset_t,
 91		    vm_offset_t *, vm_size_t);
 92
 93typedef	void	(*pmap_sync_icache_t)(pmap_t, vm_offset_t, vm_size_t);
 94typedef	void	(*pmap_dumpsys_map_chunk_t)(vm_paddr_t, size_t, void **);
 95typedef	void	(*pmap_dumpsys_unmap_chunk_t)(vm_paddr_t, size_t, void *);
 96typedef	void	(*pmap_dumpsys_pa_init_t)(void);
 97typedef	size_t	(*pmap_dumpsys_scan_pmap_t)(struct bitset *dump_bitset);
 98typedef	void	*(*pmap_dumpsys_dump_pmap_init_t)(unsigned);
 99typedef	void	*(*pmap_dumpsys_dump_pmap_t)(void *, void *, u_long *);
100typedef	vm_offset_t	(*pmap_quick_enter_page_t)(vm_page_t);
101typedef	void	(*pmap_quick_remove_page_t)(vm_offset_t);
102typedef	bool	(*pmap_ps_enabled_t)(pmap_t);
103typedef	void	(*pmap_tlbie_all_t)(void);
104typedef void	(*pmap_installer_t)(void);
105
106struct pmap_funcs {
107	pmap_installer_t	install;
108	pmap_bootstrap_t	bootstrap;
109	pmap_cpu_bootstrap_t	cpu_bootstrap;
110	pmap_kenter_t		kenter;
111	pmap_kenter_attr_t	kenter_attr;
112	pmap_kremove_t		kremove;
113	pmap_mapdev_t		mapdev;
114	pmap_mapdev_attr_t	mapdev_attr;
115	pmap_unmapdev_t		unmapdev;
116	pmap_page_set_memattr_t	page_set_memattr;
117	pmap_change_attr_t	change_attr;
118	pmap_map_user_ptr_t	map_user_ptr;
119	pmap_decode_kernel_ptr_t	decode_kernel_ptr;
120	pmap_kextract_t		kextract;
121	pmap_dev_direct_mapped_t	dev_direct_mapped;
122	pmap_advise_t		advise;
123	pmap_clear_modify_t	clear_modify;
124	pmap_remove_write_t	remove_write;
125	pmap_copy_t	copy;
126	pmap_copy_page_t	copy_page;
127	pmap_copy_pages_t	copy_pages;
128	pmap_enter_t	enter;
129	pmap_enter_object_t	enter_object;
130	pmap_enter_quick_t	enter_quick;
131	pmap_extract_t	extract;
132	pmap_extract_and_hold_t	extract_and_hold;
133	pmap_growkernel_t	growkernel;
134	pmap_init_t	init;
135	pmap_is_modified_t	is_modified;
136	pmap_is_prefaultable_t	is_prefaultable;
137	pmap_is_referenced_t	is_referenced;
138	pmap_ts_referenced_t	ts_referenced;
139	pmap_page_is_mapped_t	page_is_mapped;
140	pmap_ps_enabled_t	ps_enabled;
141	pmap_map_t	map;
142	pmap_object_init_pt_t	object_init_pt;
143	pmap_page_exists_quick_t	page_exists_quick;
144	pmap_page_init_t	page_init;
145	pmap_page_wired_mappings_t	page_wired_mappings;
146	pmap_pinit_t	pinit;
147	pmap_pinit0_t	pinit0;
148	pmap_protect_t	protect;
149	pmap_qenter_t	qenter;
150	pmap_qremove_t	qremove;
151	pmap_release_t	release;
152	pmap_remove_t	remove;
153	pmap_remove_all_t	remove_all;
154	pmap_remove_pages_t	remove_pages;
155	pmap_unwire_t	unwire;
156	pmap_zero_page_t	zero_page;
157	pmap_zero_page_area_t	zero_page_area;
158	pmap_mincore_t	mincore;
159	pmap_activate_t	activate;
160	pmap_deactivate_t	deactivate;
161	pmap_align_superpage_t	align_superpage;
162	pmap_sync_icache_t	sync_icache;
163	pmap_quick_enter_page_t	quick_enter_page;
164	pmap_quick_remove_page_t	quick_remove_page;
165	pmap_page_array_startup_t	page_array_startup;
166	pmap_dumpsys_map_chunk_t	dumpsys_map_chunk;
167	pmap_dumpsys_unmap_chunk_t	dumpsys_unmap_chunk;
168	pmap_dumpsys_pa_init_t	dumpsys_pa_init;
169	pmap_dumpsys_scan_pmap_t	dumpsys_scan_pmap;
170	pmap_dumpsys_dump_pmap_init_t	dumpsys_dump_pmap_init;
171	pmap_dumpsys_dump_pmap_t	dumpsys_dump_pmap;
172	pmap_tlbie_all_t	tlbie_all;
173
174};
175struct mmu_kobj {
176	const char *name;
177	const struct mmu_kobj *base;
178	const struct pmap_funcs *funcs;
179};
180
181typedef struct mmu_kobj		*mmu_t;
182
183/* The currently installed pmap object. */
184extern mmu_t	mmu_obj;
185
186/*
187 * Resolve a given pmap function.
188 * 'func' is the function name less the 'pmap_' * prefix.
189 */
190#define PMAP_RESOLVE_FUNC(func) 		\
191	({					\
192	 pmap_##func##_t f;			\
193	 const struct mmu_kobj	*mmu = mmu_obj;	\
194	 do {					\
195	    f = mmu->funcs->func;		\
196	    if (f != NULL) break;		\
197	    mmu = mmu->base;			\
198	} while (mmu != NULL);			\
199	f;})
200
201#define MMU_DEF(name, ident, methods)		\
202						\
203const struct mmu_kobj name = {		\
204	ident, NULL, &methods			\
205};						\
206DATA_SET(mmu_set, name)
207
208#define MMU_DEF_INHERIT(name, ident, methods, base1)	\
209						\
210const struct mmu_kobj name = {			\
211	ident, &base1, &methods,		\
212};						\
213DATA_SET(mmu_set, name)
214
215/*
216 * Known MMU names
217 */
218#define MMU_TYPE_BOOKE	"mmu_booke"	/* Book-E MMU specification */
219#define MMU_TYPE_OEA	"mmu_oea"	/* 32-bit OEA */
220#define MMU_TYPE_G5	"mmu_g5"	/* 64-bit bridge (ibm 970) */
221#define MMU_TYPE_RADIX	"mmu_radix"	/* 64-bit native ISA 3.0 (POWER9) radix */
222#define MMU_TYPE_8xx	"mmu_8xx"	/* 8xx quicc TLB */
223
224#endif /* _MACHINE_MMUVAR_H_ */