1139825Simp/*-
282899Sjake * Copyright (c) 1991 Regents of the University of California.
380708Sjake * All rights reserved.
480708Sjake *
582899Sjake * This code is derived from software contributed to Berkeley by
682899Sjake * the Systems Programming Group of the University of Utah Computer
782899Sjake * Science Department and William Jolitz of UUNET Technologies Inc.
882899Sjake *
980708Sjake * Redistribution and use in source and binary forms, with or without
1080708Sjake * modification, are permitted provided that the following conditions
1180708Sjake * are met:
1280708Sjake * 1. Redistributions of source code must retain the above copyright
1380708Sjake *    notice, this list of conditions and the following disclaimer.
1480708Sjake * 2. Redistributions in binary form must reproduce the above copyright
1580708Sjake *    notice, this list of conditions and the following disclaimer in the
1680708Sjake *    documentation and/or other materials provided with the distribution.
1782899Sjake * 4. Neither the name of the University nor the names of its contributors
1882899Sjake *    may be used to endorse or promote products derived from this software
1982899Sjake *    without specific prior written permission.
2080708Sjake *
2182899Sjake * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2280708Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2380708Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2482899Sjake * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2580708Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2680708Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2780708Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2880708Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2980708Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3080708Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3180708Sjake * SUCH DAMAGE.
3280708Sjake *
3382899Sjake *	from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
3482899Sjake *	from: @(#)pmap.h        7.4 (Berkeley) 5/12/91
3582899Sjake *	from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30
3680708Sjake * $FreeBSD: releng/10.3/sys/sparc64/include/pmap.h 253940 2013-08-04 21:17:05Z attilio $
3780708Sjake */
3880708Sjake
3980708Sjake#ifndef	_MACHINE_PMAP_H_
4080708Sjake#define	_MACHINE_PMAP_H_
4180708Sjake
42104265Sjake#include <sys/queue.h>
43222813Sattilio#include <sys/_cpuset.h>
44133451Salc#include <sys/_lock.h>
45133451Salc#include <sys/_mutex.h>
46236214Salc#include <sys/_rwlock.h>
47112399Sjake#include <machine/cache.h>
4880709Sjake#include <machine/tte.h>
4980709Sjake
5080709Sjake#define	PMAP_CONTEXT_MAX	8192
5180709Sjake
5280709Sjaketypedef	struct pmap *pmap_t;
5380709Sjake
5483053Sobrienstruct md_page {
55108166Sjake	TAILQ_HEAD(, tte) tte_list;
56108166Sjake	struct	pmap *pmap;
57108166Sjake	uint32_t colors[DCACHE_COLORS];
58108166Sjake	int32_t	color;
5980708Sjake};
6080708Sjake
6183053Sobrienstruct pmap {
62133451Salc	struct	mtx pm_mtx;
6388651Sjake	struct	tte *pm_tsb;
6488651Sjake	vm_object_t pm_tsb_obj;
65222813Sattilio	cpuset_t pm_active;
6691288Sjake	u_int	pm_context[MAXCPU];
6780709Sjake	struct	pmap_statistics pm_stats;
6880708Sjake};
6980708Sjake
70133451Salc#define	PMAP_LOCK(pmap)		mtx_lock(&(pmap)->pm_mtx)
71216803Smarius#define	PMAP_LOCK_ASSERT(pmap, type)					\
72133451Salc				mtx_assert(&(pmap)->pm_mtx, (type))
73133451Salc#define	PMAP_LOCK_DESTROY(pmap)	mtx_destroy(&(pmap)->pm_mtx)
74216803Smarius#define	PMAP_LOCK_INIT(pmap)	mtx_init(&(pmap)->pm_mtx, "pmap",	\
75142045Smarius				    NULL, MTX_DEF | MTX_DUPOK)
76133451Salc#define	PMAP_LOCKED(pmap)	mtx_owned(&(pmap)->pm_mtx)
77133451Salc#define	PMAP_MTX(pmap)		(&(pmap)->pm_mtx)
78133451Salc#define	PMAP_TRYLOCK(pmap)	mtx_trylock(&(pmap)->pm_mtx)
79133451Salc#define	PMAP_UNLOCK(pmap)	mtx_unlock(&(pmap)->pm_mtx)
80133451Salc
81195649Salc#define	pmap_page_get_memattr(m)	VM_MEMATTR_DEFAULT
82237168Salc#define	pmap_page_is_write_mapped(m)	(((m)->aflags & PGA_WRITEABLE) != 0)
83195649Salc#define	pmap_page_set_memattr(m, ma)	(void)0
84195649Salc
85204152Smariusvoid	pmap_bootstrap(u_int cpu_impl);
86113238Sjakevm_paddr_t pmap_kextract(vm_offset_t va);
87113238Sjakevoid	pmap_kenter(vm_offset_t va, vm_page_t m);
88112312Sjakevoid	pmap_kremove(vm_offset_t);
89113238Sjakevoid	pmap_kenter_flags(vm_offset_t va, vm_paddr_t pa, u_long flags);
9098813Sjakevoid	pmap_kremove_flags(vm_offset_t va);
91129068Salcboolean_t pmap_page_is_mapped(vm_page_t m);
9280708Sjake
9388651Sjakeint	pmap_cache_enter(vm_page_t m, vm_offset_t va);
9488651Sjake
9597447Sjakeint	pmap_remove_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp,
9697447Sjake			vm_offset_t va);
9797447Sjake
9889041Sjakevoid	pmap_map_tsb(void);
99216803Smariusvoid	pmap_set_kctx(void);
10089041Sjake
101153179Sjhb#define	vtophys(va)	pmap_kextract((vm_offset_t)(va))
10284844Stmm
10388651Sjakeextern	struct pmap kernel_pmap_store;
10488651Sjake#define	kernel_pmap	(&kernel_pmap_store)
105242534Sattilioextern	struct rwlock_padalign tte_list_global_lock;
106113238Sjakeextern	vm_paddr_t phys_avail[];
10780708Sjakeextern	vm_offset_t virtual_avail;
10880708Sjakeextern	vm_offset_t virtual_end;
10980708Sjake
110108700Sjake#ifdef PMAP_STATS
111108700Sjake
112108700SjakeSYSCTL_DECL(_debug_pmap_stats);
113108700Sjake
114108700Sjake#define	PMAP_STATS_VAR(name) \
115108700Sjake	static long name; \
116216803Smarius	SYSCTL_LONG(_debug_pmap_stats, OID_AUTO, name, CTLFLAG_RW,	\
117108700Sjake	    &name, 0, "")
118108700Sjake
119108700Sjake#define	PMAP_STATS_INC(var) \
120108700Sjake	atomic_add_long(&var, 1)
121108700Sjake
122108700Sjake#else
123108700Sjake
124108700Sjake#define	PMAP_STATS_VAR(name)
125108700Sjake#define	PMAP_STATS_INC(var)
126108700Sjake
127108700Sjake#endif
128108700Sjake
12980708Sjake#endif /* !_MACHINE_PMAP_H_ */
130