xref: /freebsd/sys/arm/include/pmap.h (revision 1f1b2286fd5ae4cd7f8e6412723201e92d28771a)
1d8315c79SWarner Losh /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
351369649SPedro F. Giffuni  *
41e7dfc94SAndrew Turner  * Copyright (c) 2014,2016 Svatopluk Kraus <onwahe@gmail.com>
51e7dfc94SAndrew Turner  * Copyright (c) 2014,2016 Michal Meloun <meloun@miracle.cz>
61e7dfc94SAndrew Turner  * Copyright (c) 1991 Regents of the University of California.
76fc729afSOlivier Houchard  * All rights reserved.
86fc729afSOlivier Houchard  *
91e7dfc94SAndrew Turner  * This code is derived from software contributed to Berkeley by
101e7dfc94SAndrew Turner  * the Systems Programming Group of the University of Utah Computer
111e7dfc94SAndrew Turner  * Science Department and William Jolitz of UUNET Technologies Inc.
121e7dfc94SAndrew Turner  *
136fc729afSOlivier Houchard  * Redistribution and use in source and binary forms, with or without
146fc729afSOlivier Houchard  * modification, are permitted provided that the following conditions
156fc729afSOlivier Houchard  * are met:
166fc729afSOlivier Houchard  * 1. Redistributions of source code must retain the above copyright
176fc729afSOlivier Houchard  *    notice, this list of conditions and the following disclaimer.
186fc729afSOlivier Houchard  * 2. Redistributions in binary form must reproduce the above copyright
196fc729afSOlivier Houchard  *    notice, this list of conditions and the following disclaimer in the
206fc729afSOlivier Houchard  *    documentation and/or other materials provided with the distribution.
216fc729afSOlivier Houchard  *
223e1cfdddSSvatopluk Kraus  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
236fc729afSOlivier Houchard  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
246fc729afSOlivier Houchard  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
253e1cfdddSSvatopluk Kraus  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
266fc729afSOlivier Houchard  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
276fc729afSOlivier Houchard  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
286fc729afSOlivier Houchard  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
296fc729afSOlivier Houchard  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
306fc729afSOlivier Houchard  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
316fc729afSOlivier Houchard  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
326fc729afSOlivier Houchard  * SUCH DAMAGE.
336fc729afSOlivier Houchard  *
341e7dfc94SAndrew Turner  * The ARM version of this file was more or less based on the i386 version,
351e7dfc94SAndrew Turner  * which has the following provenance...
361e7dfc94SAndrew Turner  *
371e7dfc94SAndrew Turner  * Derived from hp300 version by Mike Hibler, this version by William
381e7dfc94SAndrew Turner  * Jolitz uses a recursive map [a pde points to the page directory] to
391e7dfc94SAndrew Turner  * map the page tables using the pagetables themselves. This is done to
401e7dfc94SAndrew Turner  * reduce the impact on kernel virtual memory for lots of sparse address
411e7dfc94SAndrew Turner  * space, and to reduce the cost of memory to each process.
421e7dfc94SAndrew Turner  * 	from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30
436fc729afSOlivier Houchard  */
446fc729afSOlivier Houchard 
456fc729afSOlivier Houchard #ifndef _MACHINE_PMAP_H_
466fc729afSOlivier Houchard #define _MACHINE_PMAP_H_
476fc729afSOlivier Houchard 
481e7dfc94SAndrew Turner #include <sys/systm.h>
491e7dfc94SAndrew Turner #include <sys/queue.h>
501e7dfc94SAndrew Turner #include <sys/_cpuset.h>
511e7dfc94SAndrew Turner #include <sys/_lock.h>
521e7dfc94SAndrew Turner #include <sys/_mutex.h>
531e7dfc94SAndrew Turner #include <sys/_pv_entry.h>
541e7dfc94SAndrew Turner 
551e7dfc94SAndrew Turner typedef	uint32_t	pt1_entry_t;		/* L1 table entry */
561e7dfc94SAndrew Turner typedef	uint32_t	pt2_entry_t;		/* L2 table entry */
571e7dfc94SAndrew Turner typedef uint32_t	ttb_entry_t;		/* TTB entry */
586fc729afSOlivier Houchard 
5912fdcefcSSvatopluk Kraus #ifdef _KERNEL
601e7dfc94SAndrew Turner 
611e7dfc94SAndrew Turner #if 0
621e7dfc94SAndrew Turner #define PMAP_PTE_NOCACHE // Use uncached page tables
631e7dfc94SAndrew Turner #endif
641e7dfc94SAndrew Turner 
651e7dfc94SAndrew Turner /*
661e7dfc94SAndrew Turner  *  (1) During pmap bootstrap, physical pages for L2 page tables are
671e7dfc94SAndrew Turner  *      allocated in advance which are used for KVA continuous mapping
681e7dfc94SAndrew Turner  *      starting from KERNBASE. This makes things more simple.
691e7dfc94SAndrew Turner  *  (2) During vm subsystem initialization, only vm subsystem itself can
701e7dfc94SAndrew Turner  *      allocate physical memory safely. As pmap_map() is called during
711e7dfc94SAndrew Turner  *      this initialization, we must be prepared for that and have some
721e7dfc94SAndrew Turner  *      preallocated physical pages for L2 page tables.
731e7dfc94SAndrew Turner  *
741e7dfc94SAndrew Turner  *  Note that some more pages for L2 page tables are preallocated too
751e7dfc94SAndrew Turner  *  for mappings laying above VM_MAX_KERNEL_ADDRESS.
761e7dfc94SAndrew Turner  */
771e7dfc94SAndrew Turner #ifndef NKPT2PG
781e7dfc94SAndrew Turner /*
791e7dfc94SAndrew Turner  *  The optimal way is to define this in board configuration as
801e7dfc94SAndrew Turner  *  definition here must be safe enough. It means really big.
811e7dfc94SAndrew Turner  *
821e7dfc94SAndrew Turner  *  1 GB KVA <=> 256 kernel L2 page table pages
831e7dfc94SAndrew Turner  *
841e7dfc94SAndrew Turner  *  From real platforms:
851e7dfc94SAndrew Turner  *	1 GB physical memory <=> 10 pages is enough
861e7dfc94SAndrew Turner  *	2 GB physical memory <=> 21 pages is enough
871e7dfc94SAndrew Turner  */
881e7dfc94SAndrew Turner #define NKPT2PG		32
891e7dfc94SAndrew Turner #endif
901e7dfc94SAndrew Turner #endif	/* _KERNEL */
911e7dfc94SAndrew Turner 
921e7dfc94SAndrew Turner /*
931e7dfc94SAndrew Turner  * Pmap stuff
941e7dfc94SAndrew Turner  */
951e7dfc94SAndrew Turner struct	md_page {
961e7dfc94SAndrew Turner 	TAILQ_HEAD(,pv_entry)	pv_list;
971e7dfc94SAndrew Turner 	uint16_t		pt2_wirecount[4];
981e7dfc94SAndrew Turner 	vm_memattr_t		pat_mode;
991e7dfc94SAndrew Turner };
1001e7dfc94SAndrew Turner 
1011e7dfc94SAndrew Turner struct	pmap {
1021e7dfc94SAndrew Turner 	struct mtx		pm_mtx;
1031e7dfc94SAndrew Turner 	pt1_entry_t		*pm_pt1;	/* KVA of pt1 */
1041e7dfc94SAndrew Turner 	pt2_entry_t		*pm_pt2tab;	/* KVA of pt2 pages table */
1051e7dfc94SAndrew Turner 	TAILQ_HEAD(,pv_chunk)	pm_pvchunk;	/* list of mappings in pmap */
1061e7dfc94SAndrew Turner 	cpuset_t		pm_active;	/* active on cpus */
1071e7dfc94SAndrew Turner 	struct pmap_statistics	pm_stats;	/* pmap statictics */
1081e7dfc94SAndrew Turner 	LIST_ENTRY(pmap) 	pm_list;	/* List of all pmaps */
1091e7dfc94SAndrew Turner };
1101e7dfc94SAndrew Turner 
1111e7dfc94SAndrew Turner typedef struct pmap *pmap_t;
1121e7dfc94SAndrew Turner 
1131e7dfc94SAndrew Turner #ifdef _KERNEL
1141e7dfc94SAndrew Turner extern struct pmap	        kernel_pmap_store;
1151e7dfc94SAndrew Turner #define kernel_pmap	        (&kernel_pmap_store)
1161e7dfc94SAndrew Turner 
1171e7dfc94SAndrew Turner #define	PMAP_LOCK(pmap)		mtx_lock(&(pmap)->pm_mtx)
1181e7dfc94SAndrew Turner #define	PMAP_LOCK_ASSERT(pmap, type) \
1191e7dfc94SAndrew Turner 				mtx_assert(&(pmap)->pm_mtx, (type))
1201e7dfc94SAndrew Turner #define	PMAP_LOCK_DESTROY(pmap)	mtx_destroy(&(pmap)->pm_mtx)
1211e7dfc94SAndrew Turner #define	PMAP_LOCK_INIT(pmap)	mtx_init(&(pmap)->pm_mtx, "pmap", \
1221e7dfc94SAndrew Turner 				    NULL, MTX_DEF | MTX_DUPOK)
1231e7dfc94SAndrew Turner #define	PMAP_LOCKED(pmap)	mtx_owned(&(pmap)->pm_mtx)
1241e7dfc94SAndrew Turner #define	PMAP_MTX(pmap)		(&(pmap)->pm_mtx)
1251e7dfc94SAndrew Turner #define	PMAP_TRYLOCK(pmap)	mtx_trylock(&(pmap)->pm_mtx)
1261e7dfc94SAndrew Turner #define	PMAP_UNLOCK(pmap)	mtx_unlock(&(pmap)->pm_mtx)
1271e7dfc94SAndrew Turner 
1281e7dfc94SAndrew Turner extern ttb_entry_t pmap_kern_ttb; 	/* TTB for kernel pmap */
1291e7dfc94SAndrew Turner 
1301e7dfc94SAndrew Turner #define	pmap_page_get_memattr(m)	((m)->md.pat_mode)
1311e7dfc94SAndrew Turner 
1321e7dfc94SAndrew Turner /*
1331e7dfc94SAndrew Turner  * Only the following functions or macros may be used before pmap_bootstrap()
1341e7dfc94SAndrew Turner  * is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and
1351e7dfc94SAndrew Turner  * vtopte2().
1361e7dfc94SAndrew Turner  */
1371e7dfc94SAndrew Turner void pmap_bootstrap(vm_offset_t);
1381e7dfc94SAndrew Turner void pmap_kenter(vm_offset_t, vm_paddr_t);
1391e7dfc94SAndrew Turner void pmap_kremove(vm_offset_t);
140*1f1b2286SJohn Baldwin bool pmap_page_is_mapped(vm_page_t);
1411e7dfc94SAndrew Turner bool	pmap_ps_enabled(pmap_t pmap);
1421e7dfc94SAndrew Turner 
1431e7dfc94SAndrew Turner void pmap_tlb_flush(pmap_t, vm_offset_t);
1441e7dfc94SAndrew Turner void pmap_tlb_flush_range(pmap_t, vm_offset_t, vm_size_t);
1451e7dfc94SAndrew Turner 
1461e7dfc94SAndrew Turner vm_paddr_t pmap_dump_kextract(vm_offset_t, pt2_entry_t *);
1471e7dfc94SAndrew Turner 
1481e7dfc94SAndrew Turner int pmap_fault(pmap_t, vm_offset_t, uint32_t, int, bool);
1491e7dfc94SAndrew Turner 
1501e7dfc94SAndrew Turner void pmap_set_tex(void);
1511e7dfc94SAndrew Turner 
1521e7dfc94SAndrew Turner /*
1531e7dfc94SAndrew Turner  * Pre-bootstrap epoch functions set.
1541e7dfc94SAndrew Turner  */
1551e7dfc94SAndrew Turner void pmap_bootstrap_prepare(vm_paddr_t);
1561e7dfc94SAndrew Turner vm_paddr_t pmap_preboot_get_pages(u_int);
1571e7dfc94SAndrew Turner void pmap_preboot_map_pages(vm_paddr_t, vm_offset_t, u_int);
1581e7dfc94SAndrew Turner vm_offset_t pmap_preboot_reserve_pages(u_int);
1591e7dfc94SAndrew Turner vm_offset_t pmap_preboot_get_vpages(u_int);
1601e7dfc94SAndrew Turner void pmap_preboot_map_attr(vm_paddr_t, vm_offset_t, vm_size_t, vm_prot_t,
1611e7dfc94SAndrew Turner     vm_memattr_t);
1621e7dfc94SAndrew Turner void pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr);
16312fdcefcSSvatopluk Kraus 
16412fdcefcSSvatopluk Kraus extern char *_tmppt;	/* poor name! */
16512fdcefcSSvatopluk Kraus 
16612fdcefcSSvatopluk Kraus extern vm_offset_t virtual_avail;
16712fdcefcSSvatopluk Kraus extern vm_offset_t virtual_end;
16812fdcefcSSvatopluk Kraus 
16912fdcefcSSvatopluk Kraus void *pmap_kenter_temporary(vm_paddr_t, int);
1705cff1f4dSMark Johnston #define	pmap_page_is_write_mapped(m)	(((m)->a.flags & PGA_WRITEABLE) != 0)
17112fdcefcSSvatopluk Kraus void pmap_page_set_memattr(vm_page_t, vm_memattr_t);
1721e0e335bSKonstantin Belousov #define	pmap_map_delete(pmap, sva, eva)	pmap_remove(pmap, sva, eva)
17312fdcefcSSvatopluk Kraus 
17412fdcefcSSvatopluk Kraus void *pmap_mapdev(vm_paddr_t, vm_size_t);
1757ae99f80SJohn Baldwin void pmap_unmapdev(void *, vm_size_t);
17612fdcefcSSvatopluk Kraus 
177bdbc1b76SMichal Meloun static inline void *
pmap_mapdev_attr(vm_paddr_t addr __unused,vm_size_t size __unused,int attr __unused)178daa0b64aSDavid E. O'Brien pmap_mapdev_attr(vm_paddr_t addr __unused, vm_size_t size __unused,
179daa0b64aSDavid E. O'Brien     int attr __unused)
180bdbc1b76SMichal Meloun {
181bdbc1b76SMichal Meloun 	panic("%s is not implemented yet!\n", __func__);
182bdbc1b76SMichal Meloun }
183bdbc1b76SMichal Meloun 
18412fdcefcSSvatopluk Kraus struct pcb;
18512fdcefcSSvatopluk Kraus void pmap_set_pcb_pagedir(pmap_t, struct pcb *);
18612fdcefcSSvatopluk Kraus 
18712fdcefcSSvatopluk Kraus void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
18812fdcefcSSvatopluk Kraus void pmap_kremove_device(vm_offset_t, vm_size_t);
18912fdcefcSSvatopluk Kraus 
19012fdcefcSSvatopluk Kraus vm_paddr_t pmap_kextract(vm_offset_t);
19112fdcefcSSvatopluk Kraus #define vtophys(va)	pmap_kextract((vm_offset_t)(va))
19212fdcefcSSvatopluk Kraus 
193e7a9df16SKonstantin Belousov static inline int
pmap_vmspace_copy(pmap_t dst_pmap __unused,pmap_t src_pmap __unused)194e7a9df16SKonstantin Belousov pmap_vmspace_copy(pmap_t dst_pmap __unused, pmap_t src_pmap __unused)
195e7a9df16SKonstantin Belousov {
196e7a9df16SKonstantin Belousov 
197e7a9df16SKonstantin Belousov 	return (0);
198e7a9df16SKonstantin Belousov }
199e7a9df16SKonstantin Belousov 
20096448820SKonstantin Belousov #define	PMAP_ENTER_QUICK_LOCKED	0x10000000
20196448820SKonstantin Belousov 
202041b7317SKonstantin Belousov #define	pmap_vm_page_alloc_check(m)
203041b7317SKonstantin Belousov 
20412fdcefcSSvatopluk Kraus #endif	/* _KERNEL */
2056fc729afSOlivier Houchard #endif	/* !_MACHINE_PMAP_H_ */
206