1152179Sgrehan/*-
2152179Sgrehan * Copyright (c) 2005 Peter Grehan
3152179Sgrehan * All rights reserved.
4152179Sgrehan *
5152179Sgrehan * Redistribution and use in source and binary forms, with or without
6152179Sgrehan * modification, are permitted provided that the following conditions
7152179Sgrehan * are met:
8152179Sgrehan * 1. Redistributions of source code must retain the above copyright
9152179Sgrehan *    notice, this list of conditions and the following disclaimer.
10152179Sgrehan * 2. Redistributions in binary form must reproduce the above copyright
11152179Sgrehan *    notice, this list of conditions and the following disclaimer in the
12152179Sgrehan *    documentation and/or other materials provided with the distribution.
13152179Sgrehan *
14152179Sgrehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15152179Sgrehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16152179Sgrehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17152179Sgrehan * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18152179Sgrehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19152179Sgrehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20152179Sgrehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21152179Sgrehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22152179Sgrehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23152179Sgrehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24152179Sgrehan * SUCH DAMAGE.
25152179Sgrehan *
26152179Sgrehan */
27152179Sgrehan
28152179Sgrehan#include <sys/cdefs.h>
29152179Sgrehan__FBSDID("$FreeBSD: stable/11/sys/powerpc/powerpc/pmap_dispatch.c 310442 2016-12-23 03:19:48Z jhibbits $");
30152179Sgrehan
31152179Sgrehan/*
32152179Sgrehan * Dispatch MI pmap calls to the appropriate MMU implementation
33152179Sgrehan * through a previously registered kernel object.
34152179Sgrehan *
35152179Sgrehan * Before pmap_bootstrap() can be called, a CPU module must have
36152179Sgrehan * called pmap_mmu_install(). This may be called multiple times:
37152179Sgrehan * the highest priority call will be installed as the default
38152179Sgrehan * MMU handler when pmap_bootstrap() is called.
39152179Sgrehan *
40186347Snwhitehorn * It is required that mutex_init() be called before pmap_bootstrap(),
41186347Snwhitehorn * as the PMAP layer makes extensive use of mutexes.
42152179Sgrehan */
43152179Sgrehan
44152179Sgrehan#include <sys/param.h>
45152179Sgrehan#include <sys/kernel.h>
46276772Smarkj#include <sys/conf.h>
47152179Sgrehan#include <sys/lock.h>
48276772Smarkj#include <sys/kerneldump.h>
49182571Smarcel#include <sys/ktr.h>
50152179Sgrehan#include <sys/mutex.h>
51152179Sgrehan#include <sys/systm.h>
52152179Sgrehan
53152179Sgrehan#include <vm/vm.h>
54152179Sgrehan#include <vm/vm_page.h>
55152179Sgrehan
56276772Smarkj#include <machine/dump.h>
57276772Smarkj#include <machine/md_var.h>
58152179Sgrehan#include <machine/mmuvar.h>
59190681Snwhitehorn#include <machine/smp.h>
60152179Sgrehan
61152179Sgrehan#include "mmu_if.h"
62152179Sgrehan
63152179Sgrehanstatic mmu_def_t	*mmu_def_impl;
64152179Sgrehanstatic mmu_t		mmu_obj;
65152179Sgrehanstatic struct mmu_kobj	mmu_kernel_obj;
66152179Sgrehanstatic struct kobj_ops	mmu_kernel_kops;
67152179Sgrehan
68152179Sgrehan/*
69152179Sgrehan * pmap globals
70152179Sgrehan */
71152179Sgrehanstruct pmap kernel_pmap_store;
72152179Sgrehan
73152179Sgrehanstruct msgbuf *msgbufp;
74152179Sgrehanvm_offset_t    msgbuf_phys;
75152179Sgrehan
76152179Sgrehanvm_offset_t kernel_vm_end;
77292680Sjhibbitsvm_paddr_t phys_avail[PHYS_AVAIL_SZ];
78152179Sgrehanvm_offset_t virtual_avail;
79152179Sgrehanvm_offset_t virtual_end;
80152179Sgrehan
81152179Sgrehanint pmap_bootstrapped;
82152179Sgrehan
83235689Snwhitehorn#ifdef AIM
84235689Snwhitehornint
85235689Snwhitehornpvo_vaddr_compare(struct pvo_entry *a, struct pvo_entry *b)
86235689Snwhitehorn{
87235689Snwhitehorn	if (PVO_VADDR(a) < PVO_VADDR(b))
88235689Snwhitehorn		return (-1);
89235689Snwhitehorn	else if (PVO_VADDR(a) > PVO_VADDR(b))
90235689Snwhitehorn		return (1);
91235689Snwhitehorn	return (0);
92235689Snwhitehorn}
93235689SnwhitehornRB_GENERATE(pvo_tree, pvo_entry, pvo_plink, pvo_vaddr_compare);
94235689Snwhitehorn#endif
95235689Snwhitehorn
96235689Snwhitehorn
97152179Sgrehanvoid
98255028Salcpmap_advise(pmap_t pmap, vm_offset_t start, vm_offset_t end, int advice)
99255028Salc{
100255028Salc
101255028Salc	CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %d)", __func__, pmap, start, end,
102255028Salc	    advice);
103255028Salc	MMU_ADVISE(mmu_obj, pmap, start, end, advice);
104255028Salc}
105255028Salc
106255028Salcvoid
107152179Sgrehanpmap_clear_modify(vm_page_t m)
108152179Sgrehan{
109182571Smarcel
110182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
111152179Sgrehan	MMU_CLEAR_MODIFY(mmu_obj, m);
112152179Sgrehan}
113152179Sgrehan
114152179Sgrehanvoid
115152179Sgrehanpmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr,
116152179Sgrehan    vm_size_t len, vm_offset_t src_addr)
117152179Sgrehan{
118182571Smarcel
119182571Smarcel	CTR6(KTR_PMAP, "%s(%p, %p, %#x, %#x, %#x)", __func__, dst_pmap,
120182571Smarcel	    src_pmap, dst_addr, len, src_addr);
121152179Sgrehan	MMU_COPY(mmu_obj, dst_pmap, src_pmap, dst_addr, len, src_addr);
122152179Sgrehan}
123152179Sgrehan
124152179Sgrehanvoid
125152179Sgrehanpmap_copy_page(vm_page_t src, vm_page_t dst)
126152179Sgrehan{
127182571Smarcel
128182571Smarcel	CTR3(KTR_PMAP, "%s(%p, %p)", __func__, src, dst);
129152179Sgrehan	MMU_COPY_PAGE(mmu_obj, src, dst);
130152179Sgrehan}
131152179Sgrehan
132152179Sgrehanvoid
133248280Skibpmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
134248280Skib    vm_offset_t b_offset, int xfersize)
135248280Skib{
136248280Skib
137248280Skib	CTR6(KTR_PMAP, "%s(%p, %#x, %p, %#x, %#x)", __func__, ma,
138248280Skib	    a_offset, mb, b_offset, xfersize);
139248280Skib	MMU_COPY_PAGES(mmu_obj, ma, a_offset, mb, b_offset, xfersize);
140248280Skib}
141248280Skib
142269728Skibint
143269728Skibpmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t p, vm_prot_t prot,
144269728Skib    u_int flags, int8_t psind)
145152179Sgrehan{
146182571Smarcel
147269728Skib	CTR6(KTR_PMAP, "pmap_enter(%p, %#x, %p, %#x, %x, %d)", pmap, va,
148269728Skib	    p, prot, flags, psind);
149269728Skib	return (MMU_ENTER(mmu_obj, pmap, va, p, prot, flags, psind));
150152179Sgrehan}
151152179Sgrehan
152159323Salcvoid
153159323Salcpmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
154159323Salc    vm_page_t m_start, vm_prot_t prot)
155159323Salc{
156182571Smarcel
157182571Smarcel	CTR6(KTR_PMAP, "%s(%p, %#x, %#x, %p, %#x)", __func__, pmap, start,
158182571Smarcel	    end, m_start, prot);
159159323Salc	MMU_ENTER_OBJECT(mmu_obj, pmap, start, end, m_start, prot);
160159323Salc}
161159323Salc
162159627Supsvoid
163159627Supspmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
164152179Sgrehan{
165182571Smarcel
166182571Smarcel	CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, pmap, va, m, prot);
167159627Sups	MMU_ENTER_QUICK(mmu_obj, pmap, va, m, prot);
168152179Sgrehan}
169152179Sgrehan
170152179Sgrehanvm_paddr_t
171152179Sgrehanpmap_extract(pmap_t pmap, vm_offset_t va)
172152179Sgrehan{
173182571Smarcel
174182571Smarcel	CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va);
175152179Sgrehan	return (MMU_EXTRACT(mmu_obj, pmap, va));
176152179Sgrehan}
177152179Sgrehan
178152179Sgrehanvm_page_t
179152179Sgrehanpmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
180152179Sgrehan{
181182571Smarcel
182182571Smarcel	CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, va, prot);
183152179Sgrehan	return (MMU_EXTRACT_AND_HOLD(mmu_obj, pmap, va, prot));
184152179Sgrehan}
185152179Sgrehan
186152179Sgrehanvoid
187152179Sgrehanpmap_growkernel(vm_offset_t va)
188152179Sgrehan{
189182571Smarcel
190182571Smarcel	CTR2(KTR_PMAP, "%s(%#x)", __func__, va);
191152179Sgrehan	MMU_GROWKERNEL(mmu_obj, va);
192152179Sgrehan}
193152179Sgrehan
194152179Sgrehanvoid
195152179Sgrehanpmap_init(void)
196152179Sgrehan{
197182571Smarcel
198182571Smarcel	CTR1(KTR_PMAP, "%s()", __func__);
199152179Sgrehan	MMU_INIT(mmu_obj);
200152179Sgrehan}
201152179Sgrehan
202152179Sgrehanboolean_t
203152179Sgrehanpmap_is_modified(vm_page_t m)
204152179Sgrehan{
205182571Smarcel
206182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
207152179Sgrehan	return (MMU_IS_MODIFIED(mmu_obj, m));
208152179Sgrehan}
209152179Sgrehan
210152179Sgrehanboolean_t
211152179Sgrehanpmap_is_prefaultable(pmap_t pmap, vm_offset_t va)
212152179Sgrehan{
213182571Smarcel
214182571Smarcel	CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va);
215152179Sgrehan	return (MMU_IS_PREFAULTABLE(mmu_obj, pmap, va));
216152179Sgrehan}
217152179Sgrehan
218152179Sgrehanboolean_t
219207155Salcpmap_is_referenced(vm_page_t m)
220207155Salc{
221207155Salc
222207155Salc	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
223207155Salc	return (MMU_IS_REFERENCED(mmu_obj, m));
224207155Salc}
225207155Salc
226207155Salcboolean_t
227152179Sgrehanpmap_ts_referenced(vm_page_t m)
228152179Sgrehan{
229182571Smarcel
230182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
231152179Sgrehan	return (MMU_TS_REFERENCED(mmu_obj, m));
232152179Sgrehan}
233152179Sgrehan
234152179Sgrehanvm_offset_t
235152179Sgrehanpmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
236152179Sgrehan{
237182571Smarcel
238182571Smarcel	CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, virt, start, end,
239182571Smarcel	    prot);
240152179Sgrehan	return (MMU_MAP(mmu_obj, virt, start, end, prot));
241152179Sgrehan}
242152179Sgrehan
243152179Sgrehanvoid
244152179Sgrehanpmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
245152179Sgrehan    vm_pindex_t pindex, vm_size_t size)
246152179Sgrehan{
247182571Smarcel
248182571Smarcel	CTR6(KTR_PMAP, "%s(%p, %#x, %p, %u, %#x)", __func__, pmap, addr,
249182571Smarcel	    object, pindex, size);
250152179Sgrehan	MMU_OBJECT_INIT_PT(mmu_obj, pmap, addr, object, pindex, size);
251152179Sgrehan}
252152179Sgrehan
253152179Sgrehanboolean_t
254152179Sgrehanpmap_page_exists_quick(pmap_t pmap, vm_page_t m)
255152179Sgrehan{
256182571Smarcel
257182571Smarcel	CTR3(KTR_PMAP, "%s(%p, %p)", __func__, pmap, m);
258152179Sgrehan	return (MMU_PAGE_EXISTS_QUICK(mmu_obj, pmap, m));
259152179Sgrehan}
260152179Sgrehan
261152179Sgrehanvoid
262152179Sgrehanpmap_page_init(vm_page_t m)
263152179Sgrehan{
264182571Smarcel
265182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
266152179Sgrehan	MMU_PAGE_INIT(mmu_obj, m);
267152179Sgrehan}
268152179Sgrehan
269173361Skibint
270173708Salcpmap_page_wired_mappings(vm_page_t m)
271173708Salc{
272173708Salc
273182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
274173708Salc	return (MMU_PAGE_WIRED_MAPPINGS(mmu_obj, m));
275173708Salc}
276173708Salc
277173708Salcint
278152179Sgrehanpmap_pinit(pmap_t pmap)
279152179Sgrehan{
280182571Smarcel
281182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, pmap);
282152179Sgrehan	MMU_PINIT(mmu_obj, pmap);
283173361Skib	return (1);
284152179Sgrehan}
285152179Sgrehan
286152179Sgrehanvoid
287152179Sgrehanpmap_pinit0(pmap_t pmap)
288152179Sgrehan{
289182571Smarcel
290182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, pmap);
291152179Sgrehan	MMU_PINIT0(mmu_obj, pmap);
292152179Sgrehan}
293152179Sgrehan
294152179Sgrehanvoid
295152179Sgrehanpmap_protect(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_prot_t prot)
296152179Sgrehan{
297182571Smarcel
298182571Smarcel	CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, pmap, start, end,
299182571Smarcel	    prot);
300152179Sgrehan	MMU_PROTECT(mmu_obj, pmap, start, end, prot);
301152179Sgrehan}
302152179Sgrehan
303152179Sgrehanvoid
304152179Sgrehanpmap_qenter(vm_offset_t start, vm_page_t *m, int count)
305152179Sgrehan{
306182571Smarcel
307182571Smarcel	CTR4(KTR_PMAP, "%s(%#x, %p, %d)", __func__, start, m, count);
308152179Sgrehan	MMU_QENTER(mmu_obj, start, m, count);
309152179Sgrehan}
310152179Sgrehan
311152179Sgrehanvoid
312152179Sgrehanpmap_qremove(vm_offset_t start, int count)
313152179Sgrehan{
314182571Smarcel
315182571Smarcel	CTR3(KTR_PMAP, "%s(%#x, %d)", __func__, start, count);
316152179Sgrehan	MMU_QREMOVE(mmu_obj, start, count);
317152179Sgrehan}
318152179Sgrehan
319152179Sgrehanvoid
320152179Sgrehanpmap_release(pmap_t pmap)
321152179Sgrehan{
322182571Smarcel
323182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, pmap);
324152179Sgrehan	MMU_RELEASE(mmu_obj, pmap);
325152179Sgrehan}
326152179Sgrehan
327152179Sgrehanvoid
328152179Sgrehanpmap_remove(pmap_t pmap, vm_offset_t start, vm_offset_t end)
329152179Sgrehan{
330182571Smarcel
331182571Smarcel	CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end);
332152179Sgrehan	MMU_REMOVE(mmu_obj, pmap, start, end);
333152179Sgrehan}
334152179Sgrehan
335152179Sgrehanvoid
336152179Sgrehanpmap_remove_all(vm_page_t m)
337152179Sgrehan{
338182571Smarcel
339182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
340152179Sgrehan	MMU_REMOVE_ALL(mmu_obj, m);
341152179Sgrehan}
342152179Sgrehan
343152179Sgrehanvoid
344157443Speterpmap_remove_pages(pmap_t pmap)
345152179Sgrehan{
346182571Smarcel
347182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, pmap);
348157443Speter	MMU_REMOVE_PAGES(mmu_obj, pmap);
349152179Sgrehan}
350152179Sgrehan
351152179Sgrehanvoid
352160889Salcpmap_remove_write(vm_page_t m)
353160889Salc{
354182571Smarcel
355182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
356160889Salc	MMU_REMOVE_WRITE(mmu_obj, m);
357160889Salc}
358160889Salc
359160889Salcvoid
360268591Salcpmap_unwire(pmap_t pmap, vm_offset_t start, vm_offset_t end)
361268591Salc{
362268591Salc
363268591Salc	CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end);
364268591Salc	MMU_UNWIRE(mmu_obj, pmap, start, end);
365268591Salc}
366268591Salc
367268591Salcvoid
368152179Sgrehanpmap_zero_page(vm_page_t m)
369152179Sgrehan{
370182571Smarcel
371182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
372152179Sgrehan	MMU_ZERO_PAGE(mmu_obj, m);
373152179Sgrehan}
374152179Sgrehan
375152179Sgrehanvoid
376152179Sgrehanpmap_zero_page_area(vm_page_t m, int off, int size)
377152179Sgrehan{
378182571Smarcel
379182571Smarcel	CTR4(KTR_PMAP, "%s(%p, %d, %d)", __func__, m, off, size);
380152179Sgrehan	MMU_ZERO_PAGE_AREA(mmu_obj, m, off, size);
381152179Sgrehan}
382152179Sgrehan
383152179Sgrehanvoid
384152179Sgrehanpmap_zero_page_idle(vm_page_t m)
385152179Sgrehan{
386182571Smarcel
387182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
388152179Sgrehan	MMU_ZERO_PAGE_IDLE(mmu_obj, m);
389152179Sgrehan}
390152179Sgrehan
391152179Sgrehanint
392208504Salcpmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
393152179Sgrehan{
394182571Smarcel
395182571Smarcel	CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, addr);
396208504Salc	return (MMU_MINCORE(mmu_obj, pmap, addr, locked_pa));
397152179Sgrehan}
398152179Sgrehan
399152179Sgrehanvoid
400152179Sgrehanpmap_activate(struct thread *td)
401152179Sgrehan{
402182571Smarcel
403182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, td);
404152179Sgrehan	MMU_ACTIVATE(mmu_obj, td);
405152179Sgrehan}
406152179Sgrehan
407152179Sgrehanvoid
408152179Sgrehanpmap_deactivate(struct thread *td)
409152179Sgrehan{
410182571Smarcel
411182571Smarcel	CTR2(KTR_PMAP, "%s(%p)", __func__, td);
412152179Sgrehan	MMU_DEACTIVATE(mmu_obj, td);
413152179Sgrehan}
414152179Sgrehan
415178893Salc/*
416178893Salc *	Increase the starting virtual address of the given mapping if a
417178893Salc *	different alignment might result in more superpage mappings.
418178893Salc */
419178893Salcvoid
420178893Salcpmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
421178893Salc    vm_offset_t *addr, vm_size_t size)
422178893Salc{
423179081Salc
424182571Smarcel	CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, object, offset, addr,
425182571Smarcel	    size);
426179081Salc	MMU_ALIGN_SUPERPAGE(mmu_obj, object, offset, addr, size);
427178893Salc}
428152179Sgrehan
429152179Sgrehan/*
430152179Sgrehan * Routines used in machine-dependent code
431152179Sgrehan */
432152179Sgrehanvoid
433152179Sgrehanpmap_bootstrap(vm_offset_t start, vm_offset_t end)
434152179Sgrehan{
435152179Sgrehan	mmu_obj = &mmu_kernel_obj;
436152179Sgrehan
437152179Sgrehan	/*
438152179Sgrehan	 * Take care of compiling the selected class, and
439152179Sgrehan	 * then statically initialise the MMU object
440152179Sgrehan	 */
441152179Sgrehan	kobj_class_compile_static(mmu_def_impl, &mmu_kernel_kops);
442227537Smarius	kobj_init_static((kobj_t)mmu_obj, mmu_def_impl);
443152179Sgrehan
444152179Sgrehan	MMU_BOOTSTRAP(mmu_obj, start, end);
445152179Sgrehan}
446152179Sgrehan
447190681Snwhitehornvoid
448190681Snwhitehornpmap_cpu_bootstrap(int ap)
449190681Snwhitehorn{
450190681Snwhitehorn	/*
451190681Snwhitehorn	 * No KTR here because our console probably doesn't work yet
452190681Snwhitehorn	 */
453190681Snwhitehorn
454190681Snwhitehorn	return (MMU_CPU_BOOTSTRAP(mmu_obj, ap));
455190681Snwhitehorn}
456190681Snwhitehorn
457152179Sgrehanvoid *
458235936Srajpmap_mapdev(vm_paddr_t pa, vm_size_t size)
459152179Sgrehan{
460182571Smarcel
461182571Smarcel	CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size);
462152179Sgrehan	return (MMU_MAPDEV(mmu_obj, pa, size));
463152179Sgrehan}
464152179Sgrehan
465213307Snwhitehornvoid *
466287418Sjhibbitspmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t attr)
467213307Snwhitehorn{
468213307Snwhitehorn
469213360Snwhitehorn	CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, pa, size, attr);
470213307Snwhitehorn	return (MMU_MAPDEV_ATTR(mmu_obj, pa, size, attr));
471213307Snwhitehorn}
472213307Snwhitehorn
473152179Sgrehanvoid
474213307Snwhitehornpmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
475213307Snwhitehorn{
476213307Snwhitehorn
477213360Snwhitehorn	CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, m, ma);
478213307Snwhitehorn	return (MMU_PAGE_SET_MEMATTR(mmu_obj, m, ma));
479213307Snwhitehorn}
480213307Snwhitehorn
481213307Snwhitehornvoid
482152179Sgrehanpmap_unmapdev(vm_offset_t va, vm_size_t size)
483152179Sgrehan{
484182571Smarcel
485182571Smarcel	CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, size);
486152179Sgrehan	MMU_UNMAPDEV(mmu_obj, va, size);
487152179Sgrehan}
488152179Sgrehan
489235936Srajvm_paddr_t
490152179Sgrehanpmap_kextract(vm_offset_t va)
491152179Sgrehan{
492182571Smarcel
493182571Smarcel	CTR2(KTR_PMAP, "%s(%#x)", __func__, va);
494152179Sgrehan	return (MMU_KEXTRACT(mmu_obj, va));
495152179Sgrehan}
496152179Sgrehan
497152179Sgrehanvoid
498235936Srajpmap_kenter(vm_offset_t va, vm_paddr_t pa)
499152179Sgrehan{
500182571Smarcel
501182571Smarcel	CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, pa);
502152179Sgrehan	MMU_KENTER(mmu_obj, va, pa);
503152179Sgrehan}
504152179Sgrehan
505213307Snwhitehornvoid
506213307Snwhitehornpmap_kenter_attr(vm_offset_t va, vm_offset_t pa, vm_memattr_t ma)
507213307Snwhitehorn{
508213307Snwhitehorn
509213360Snwhitehorn	CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, va, pa, ma);
510213307Snwhitehorn	MMU_KENTER_ATTR(mmu_obj, va, pa, ma);
511213307Snwhitehorn}
512213307Snwhitehorn
513310442Sjhibbitsvoid
514310442Sjhibbitspmap_kremove(vm_offset_t va)
515310442Sjhibbits{
516310442Sjhibbits
517310442Sjhibbits	CTR2(KTR_PMAP, "%s(%#x)", __func__, va);
518310442Sjhibbits	return (MMU_KREMOVE(mmu_obj, va));
519310442Sjhibbits}
520310442Sjhibbits
521152179Sgrehanboolean_t
522235936Srajpmap_dev_direct_mapped(vm_paddr_t pa, vm_size_t size)
523152179Sgrehan{
524182571Smarcel
525182571Smarcel	CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size);
526152179Sgrehan	return (MMU_DEV_DIRECT_MAPPED(mmu_obj, pa, size));
527152179Sgrehan}
528152179Sgrehan
529198341Smarcelvoid
530198341Smarcelpmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
531164895Sgrehan{
532198341Smarcel
533198341Smarcel	CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pm, va, sz);
534198341Smarcel	return (MMU_SYNC_ICACHE(mmu_obj, pm, va, sz));
535164895Sgrehan}
536152179Sgrehan
537276772Smarkjvoid
538276772Smarkjdumpsys_map_chunk(vm_paddr_t pa, size_t sz, void **va)
539190684Smarcel{
540190684Smarcel
541276772Smarkj	CTR4(KTR_PMAP, "%s(%#jx, %#zx, %p)", __func__, (uintmax_t)pa, sz, va);
542276772Smarkj	return (MMU_DUMPSYS_MAP(mmu_obj, pa, sz, va));
543190684Smarcel}
544190684Smarcel
545190684Smarcelvoid
546276772Smarkjdumpsys_unmap_chunk(vm_paddr_t pa, size_t sz, void *va)
547190684Smarcel{
548190684Smarcel
549276772Smarkj	CTR4(KTR_PMAP, "%s(%#jx, %#zx, %p)", __func__, (uintmax_t)pa, sz, va);
550276772Smarkj	return (MMU_DUMPSYS_UNMAP(mmu_obj, pa, sz, va));
551190684Smarcel}
552190684Smarcel
553276772Smarkjvoid
554276772Smarkjdumpsys_pa_init(void)
555190684Smarcel{
556190684Smarcel
557276772Smarkj	CTR1(KTR_PMAP, "%s()", __func__);
558276772Smarkj	return (MMU_SCAN_INIT(mmu_obj));
559190684Smarcel}
560190684Smarcel
561286296Sjahvm_offset_t
562286296Sjahpmap_quick_enter_page(vm_page_t m)
563286296Sjah{
564286296Sjah	CTR2(KTR_PMAP, "%s(%p)", __func__, m);
565286296Sjah	return (MMU_QUICK_ENTER_PAGE(mmu_obj, m));
566286296Sjah}
567286296Sjah
568286296Sjahvoid
569286296Sjahpmap_quick_remove_page(vm_offset_t addr)
570286296Sjah{
571286296Sjah	CTR2(KTR_PMAP, "%s(%#x)", __func__, addr);
572286296Sjah	MMU_QUICK_REMOVE_PAGE(mmu_obj, addr);
573286296Sjah}
574286296Sjah
575296142Sjhibbitsint
576296142Sjhibbitspmap_change_attr(vm_offset_t addr, vm_size_t size, vm_memattr_t mode)
577296142Sjhibbits{
578296142Sjhibbits	CTR4(KTR_PMAP, "%s(%#x, %#zx, %d)", __func__, addr, size, mode);
579296142Sjhibbits	return (MMU_CHANGE_ATTR(mmu_obj, addr, size, mode));
580296142Sjhibbits}
581296142Sjhibbits
582152179Sgrehan/*
583152179Sgrehan * MMU install routines. Highest priority wins, equal priority also
584152179Sgrehan * overrides allowing last-set to win.
585152179Sgrehan */
586152179SgrehanSET_DECLARE(mmu_set, mmu_def_t);
587152179Sgrehan
588152179Sgrehanboolean_t
589152179Sgrehanpmap_mmu_install(char *name, int prio)
590152179Sgrehan{
591152179Sgrehan	mmu_def_t	**mmupp, *mmup;
592152179Sgrehan	static int	curr_prio = 0;
593152179Sgrehan
594152179Sgrehan	/*
595152179Sgrehan	 * Try and locate the MMU kobj corresponding to the name
596152179Sgrehan	 */
597152179Sgrehan	SET_FOREACH(mmupp, mmu_set) {
598152179Sgrehan		mmup = *mmupp;
599152179Sgrehan
600152179Sgrehan		if (mmup->name &&
601152179Sgrehan		    !strcmp(mmup->name, name) &&
602192067Snwhitehorn		    (prio >= curr_prio || mmu_def_impl == NULL)) {
603152179Sgrehan			curr_prio = prio;
604152179Sgrehan			mmu_def_impl = mmup;
605152179Sgrehan			return (TRUE);
606152179Sgrehan		}
607152179Sgrehan	}
608152179Sgrehan
609152179Sgrehan	return (FALSE);
610152179Sgrehan}
611248508Skib
612248508Skibint unmapped_buf_allowed;
613