xref: /openbsd-src/sys/arch/powerpc64/include/pmap.h (revision 551b33bfef6b7c53ceaddc2f1c22f6a9f6d18050)
1*551b33bfSkettenis /*	$OpenBSD: pmap.h,v 1.19 2023/12/11 22:12:53 kettenis Exp $	*/
2cc806928Skettenis 
3cc806928Skettenis /*
4cc806928Skettenis  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
5cc806928Skettenis  *
6cc806928Skettenis  * Permission to use, copy, modify, and distribute this software for any
7cc806928Skettenis  * purpose with or without fee is hereby granted, provided that the above
8cc806928Skettenis  * copyright notice and this permission notice appear in all copies.
9cc806928Skettenis  *
10cc806928Skettenis  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11cc806928Skettenis  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12cc806928Skettenis  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13cc806928Skettenis  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14cc806928Skettenis  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15cc806928Skettenis  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16cc806928Skettenis  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17cc806928Skettenis  */
18cc806928Skettenis 
1913861200Skettenis #ifndef _MACHINE_PMAP_H_
2013861200Skettenis #define _MACHINE_PMAP_H_
2113861200Skettenis 
22e894dd1eSvisa #include <sys/mutex.h>
23e894dd1eSvisa #include <sys/queue.h>
24e894dd1eSvisa 
25f589ab0eSkettenis #ifdef _KERNEL
26f589ab0eSkettenis 
27c9893c80Skettenis #include <machine/pte.h>
28c9893c80Skettenis 
29cc806928Skettenis /* V->P mapping data */
30cc806928Skettenis #define VP_IDX1_CNT	256
31cc806928Skettenis #define VP_IDX1_MASK	(VP_IDX1_CNT - 1)
32cc806928Skettenis #define VP_IDX1_POS 	20
33cc806928Skettenis #define VP_IDX2_CNT	256
34cc806928Skettenis #define VP_IDX2_MASK	(VP_IDX2_CNT - 1)
35cc806928Skettenis #define VP_IDX2_POS 	12
36cc806928Skettenis 
37dfe2a243Skettenis struct pmap {
38cc806928Skettenis 	LIST_HEAD(,slb_desc)	pm_slbd;
39cc806928Skettenis 	int			pm_refs;
40dfe2a243Skettenis 	struct pmap_statistics	pm_stats;
41cc806928Skettenis 	struct mutex		pm_mtx;
42dfe2a243Skettenis };
43dfe2a243Skettenis 
4413861200Skettenis typedef struct pmap *pmap_t;
4513861200Skettenis 
46dfe2a243Skettenis #define PG_PMAP_MOD	PG_PMAP0
47dfe2a243Skettenis #define PG_PMAP_REF	PG_PMAP1
48dfe2a243Skettenis #define PG_PMAP_EXE	PG_PMAP2
49dfe2a243Skettenis #define PG_PMAP_UC	PG_PMAP3
50dfe2a243Skettenis 
51dfe2a243Skettenis #define PMAP_CACHE_DEFAULT	0
52dfe2a243Skettenis #define PMAP_CACHE_CI		1	/* cache inhibit */
53dfe2a243Skettenis #define PMAP_CACHE_WB		3	/* write-back cached */
54dfe2a243Skettenis 
55dfe2a243Skettenis /*
56dfe2a243Skettenis  * MD flags that we use for pmap_enter (in the pa):
57dfe2a243Skettenis  */
58dfe2a243Skettenis #define PMAP_PA_MASK	~((paddr_t)PAGE_MASK) /* to remove the flags */
59dfe2a243Skettenis #define PMAP_NOCACHE	0x1		/* map uncached */
60dfe2a243Skettenis 
61dfe2a243Skettenis extern struct pmap kernel_pmap_store;
62dfe2a243Skettenis 
63dfe2a243Skettenis #define pmap_kernel()	(&kernel_pmap_store)
64cc806928Skettenis #define pmap_resident_count(pm) ((pm)->pm_stats.resident_count)
65e1fd8b91Skettenis #define pmap_wired_count(pm)	((pm)->pm_stats.wired_count)
66cc806928Skettenis 
67*551b33bfSkettenis #define pmap_init_percpu()		do { /* nothing */ } while (0)
6813861200Skettenis #define pmap_unuse_final(p)
6913861200Skettenis #define pmap_remove_holes(vm)
7013861200Skettenis #define pmap_update(pm)
7113861200Skettenis 
72dfe2a243Skettenis void	pmap_bootstrap(void);
7320975c6cSkettenis void	pmap_bootstrap_cpu(void);
74dfe2a243Skettenis 
755e96aed0Skettenis int	pmap_slbd_fault(pmap_t, vaddr_t);
762942dd66Skettenis int	pmap_slbd_enter(pmap_t, vaddr_t);
77a867c16fSkettenis int	pmap_set_user_slb(pmap_t, vaddr_t, vaddr_t *, vsize_t *);
78502a56d1Skettenis void	pmap_clear_user_slb(void);
7945dd89a7Skettenis void	pmap_unset_user_slb(void);
8045dd89a7Skettenis 
81fe9bb682Sgkoehler #ifdef DDB
82fe9bb682Sgkoehler struct pte;
83fe9bb682Sgkoehler struct pte *pmap_get_kernel_pte(vaddr_t);
84fe9bb682Sgkoehler #endif
85fe9bb682Sgkoehler 
86f589ab0eSkettenis #endif	/* _KERNEL */
87f589ab0eSkettenis 
88f589ab0eSkettenis struct vm_page_md {
89f589ab0eSkettenis 	struct mutex pv_mtx;
90f589ab0eSkettenis 	LIST_HEAD(,pte_desc) pv_list;
91f589ab0eSkettenis };
92f589ab0eSkettenis 
93f589ab0eSkettenis #define VM_MDPAGE_INIT(pg) do {                 \
94f589ab0eSkettenis 	mtx_init(&(pg)->mdpage.pv_mtx, IPL_VM); \
95f589ab0eSkettenis 	LIST_INIT(&((pg)->mdpage.pv_list)); 	\
96f589ab0eSkettenis } while (0)
97f589ab0eSkettenis 
9813861200Skettenis #endif /* _MACHINE_PMAP_H_ */
99