xref: /freebsd/sys/vm/vm_phys.h (revision 0078df5f025854600595462e56fa95d34e732141)
111752d88SAlan Cox /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3fe267a55SPedro F. Giffuni  *
411752d88SAlan Cox  * Copyright (c) 2002-2006 Rice University
57bfda801SAlan Cox  * Copyright (c) 2007 Alan L. Cox <alc@cs.rice.edu>
611752d88SAlan Cox  * All rights reserved.
711752d88SAlan Cox  *
811752d88SAlan Cox  * This software was developed for the FreeBSD Project by Alan L. Cox,
911752d88SAlan Cox  * Olivier Crameri, Peter Druschel, Sitaram Iyer, and Juan Navarro.
1011752d88SAlan Cox  *
1111752d88SAlan Cox  * Redistribution and use in source and binary forms, with or without
1211752d88SAlan Cox  * modification, are permitted provided that the following conditions
1311752d88SAlan Cox  * are met:
1411752d88SAlan Cox  * 1. Redistributions of source code must retain the above copyright
1511752d88SAlan Cox  *    notice, this list of conditions and the following disclaimer.
1611752d88SAlan Cox  * 2. Redistributions in binary form must reproduce the above copyright
1711752d88SAlan Cox  *    notice, this list of conditions and the following disclaimer in the
1811752d88SAlan Cox  *    documentation and/or other materials provided with the distribution.
1911752d88SAlan Cox  *
2011752d88SAlan Cox  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2111752d88SAlan Cox  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2211752d88SAlan Cox  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2311752d88SAlan Cox  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
2411752d88SAlan Cox  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2511752d88SAlan Cox  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2611752d88SAlan Cox  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2711752d88SAlan Cox  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2811752d88SAlan Cox  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2911752d88SAlan Cox  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
3011752d88SAlan Cox  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3111752d88SAlan Cox  * POSSIBILITY OF SUCH DAMAGE.
3211752d88SAlan Cox  */
3311752d88SAlan Cox 
3411752d88SAlan Cox /*
3511752d88SAlan Cox  *	Physical memory system definitions
3611752d88SAlan Cox  */
3711752d88SAlan Cox 
3811752d88SAlan Cox #ifndef	_VM_PHYS_H_
3911752d88SAlan Cox #define	_VM_PHYS_H_
4011752d88SAlan Cox 
41e35395ceSAlan Cox #ifdef _KERNEL
42e35395ceSAlan Cox 
439e817428SDoug Moore #include <vm/_vm_phys.h>
449e817428SDoug Moore 
45431fb8abSMark Johnston extern vm_paddr_t phys_avail[];
4621943937SJeff Roberson 
47a3870a18SJohn Baldwin /* Domains must be dense (non-sparse) and zero-based. */
48a3870a18SJohn Baldwin struct mem_affinity {
49a3870a18SJohn Baldwin 	vm_paddr_t start;
50a3870a18SJohn Baldwin 	vm_paddr_t end;
51a3870a18SJohn Baldwin 	int domain;
52a3870a18SJohn Baldwin };
53b6715dabSJeff Roberson #ifdef NUMA
54b6715dabSJeff Roberson extern struct mem_affinity *mem_affinity;
55b6715dabSJeff Roberson extern int *mem_locality;
56b6715dabSJeff Roberson #endif
57a3870a18SJohn Baldwin 
58fbd80bd0SAlan Cox /*
59fbd80bd0SAlan Cox  * The following functions are only to be used by the virtual memory system.
60fbd80bd0SAlan Cox  */
61271f0f12SAlan Cox void vm_phys_add_seg(vm_paddr_t start, vm_paddr_t end);
62ef435ae7SJeff Roberson vm_page_t vm_phys_alloc_contig(int domain, u_long npages, vm_paddr_t low,
63ef435ae7SJeff Roberson     vm_paddr_t high, u_long alignment, vm_paddr_t boundary);
6489ea39a7SAlan Cox int vm_phys_alloc_npages(int domain, int pool, int npages, vm_page_t ma[]);
65ef435ae7SJeff Roberson vm_page_t vm_phys_alloc_pages(int domain, int pool, int order);
666f4acaf4SJeff Roberson int vm_phys_domain_match(int prefer, vm_paddr_t low, vm_paddr_t high);
67*0078df5fSDoug Moore void vm_phys_enqueue_contig(vm_page_t m, int pool, u_long npages);
68b6de32bdSKonstantin Belousov int vm_phys_fictitious_reg_range(vm_paddr_t start, vm_paddr_t end,
69b6de32bdSKonstantin Belousov     vm_memattr_t memattr);
70b6de32bdSKonstantin Belousov void vm_phys_fictitious_unreg_range(vm_paddr_t start, vm_paddr_t end);
71b6de32bdSKonstantin Belousov vm_page_t vm_phys_fictitious_to_vm_page(vm_paddr_t pa);
729e817428SDoug Moore int vm_phys_find_range(vm_page_t bounds[], int segind, int domain,
739e817428SDoug Moore     u_long npages, vm_paddr_t low, vm_paddr_t high);
74*0078df5fSDoug Moore void vm_phys_free_contig(vm_page_t m, int pool, u_long npages);
75*0078df5fSDoug Moore void vm_phys_free_pages(vm_page_t m, int pool, int order);
7611752d88SAlan Cox void vm_phys_init(void);
7743f48b65SKonstantin Belousov vm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa);
7869cbb187SMark Johnston vm_page_t vm_phys_seg_paddr_to_vm_page(struct vm_phys_seg *seg, vm_paddr_t pa);
79662e7fa8SMark Johnston void vm_phys_register_domains(int ndomains, struct mem_affinity *affinity,
80662e7fa8SMark Johnston     int *locality);
81b16b4c22SMark Johnston bool vm_phys_unfree_page(vm_paddr_t pa);
826520495aSAdrian Chadd int vm_phys_mem_affinity(int f, int t);
8381302f1dSMark Johnston void vm_phys_early_add_seg(vm_paddr_t start, vm_paddr_t end);
84b7565d44SJeff Roberson vm_paddr_t vm_phys_early_alloc(int domain, size_t alloc_size);
85b7565d44SJeff Roberson void vm_phys_early_startup(void);
86b7565d44SJeff Roberson int vm_phys_avail_largest(void);
87b7565d44SJeff Roberson vm_paddr_t vm_phys_avail_size(int i);
8831991a5aSMitchell Horne bool vm_phys_is_dumpable(vm_paddr_t pa);
89b7565d44SJeff Roberson 
90ef435ae7SJeff Roberson static inline int
91cb20a74cSStephen J. Kiernan vm_phys_domain(vm_paddr_t pa __numa_used)
92449c2e92SKonstantin Belousov {
93b6715dabSJeff Roberson #ifdef NUMA
94431fb8abSMark Johnston 	int i;
95449c2e92SKonstantin Belousov 
96431fb8abSMark Johnston 	if (vm_ndomains == 1)
97431fb8abSMark Johnston 		return (0);
98431fb8abSMark Johnston 	for (i = 0; mem_affinity[i].end != 0; i++)
99431fb8abSMark Johnston 		if (mem_affinity[i].start <= pa &&
100431fb8abSMark Johnston 		    mem_affinity[i].end >= pa)
101431fb8abSMark Johnston 			return (mem_affinity[i].domain);
102431fb8abSMark Johnston 	return (-1);
103b6715dabSJeff Roberson #else
104b6715dabSJeff Roberson 	return (0);
105b6715dabSJeff Roberson #endif
106449c2e92SKonstantin Belousov }
107449c2e92SKonstantin Belousov 
1089e817428SDoug Moore /*
1099e817428SDoug Moore  * Find the segind for the first segment at or after the given physical address.
1109e817428SDoug Moore  */
1119e817428SDoug Moore static inline int
1129e817428SDoug Moore vm_phys_lookup_segind(vm_paddr_t pa)
1139e817428SDoug Moore {
1149e817428SDoug Moore 	u_int hi, lo, mid;
1159e817428SDoug Moore 
1169e817428SDoug Moore 	lo = 0;
1179e817428SDoug Moore 	hi = vm_phys_nsegs;
1189e817428SDoug Moore 	while (lo != hi) {
1199e817428SDoug Moore 		/*
1209e817428SDoug Moore 		 * for i in [0, lo), segs[i].end <= pa
1219e817428SDoug Moore 		 * for i in [hi, nsegs), segs[i].end > pa
1229e817428SDoug Moore 		 */
1239e817428SDoug Moore 		mid = lo + (hi - lo) / 2;
1249e817428SDoug Moore 		if (vm_phys_segs[mid].end <= pa)
1259e817428SDoug Moore 			lo = mid + 1;
1269e817428SDoug Moore 		else
1279e817428SDoug Moore 			hi = mid;
1289e817428SDoug Moore 	}
1299e817428SDoug Moore 	return (lo);
1309e817428SDoug Moore }
1319e817428SDoug Moore 
1329e817428SDoug Moore /*
1339e817428SDoug Moore  * Find the segment corresponding to the given physical address.
1349e817428SDoug Moore  */
1359e817428SDoug Moore static inline struct vm_phys_seg *
1369e817428SDoug Moore vm_phys_paddr_to_seg(vm_paddr_t pa)
1379e817428SDoug Moore {
1389e817428SDoug Moore 	struct vm_phys_seg *seg;
1399e817428SDoug Moore 	int segind;
1409e817428SDoug Moore 
1419e817428SDoug Moore 	segind = vm_phys_lookup_segind(pa);
1429e817428SDoug Moore 	if (segind < vm_phys_nsegs) {
1439e817428SDoug Moore 		seg = &vm_phys_segs[segind];
1449e817428SDoug Moore 		if (pa >= seg->start)
1459e817428SDoug Moore 			return (seg);
1469e817428SDoug Moore 	}
1479e817428SDoug Moore 	return (NULL);
1489e817428SDoug Moore }
1499e817428SDoug Moore 
150e35395ceSAlan Cox #endif	/* _KERNEL */
15111752d88SAlan Cox #endif	/* !_VM_PHYS_H_ */
152