xref: /freebsd/sys/compat/linuxkpi/common/include/linux/mm.h (revision 05d4f501dca39533643c9e889a38703869c7c492)
18d59ecb2SHans Petter Selasky /*-
28d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Isilon Systems, Inc.
38d59ecb2SHans Petter Selasky  * Copyright (c) 2010 iX Systems, Inc.
48d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Panasas, Inc.
58d59ecb2SHans Petter Selasky  * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
68d59ecb2SHans Petter Selasky  * Copyright (c) 2015 François Tigeot
78d59ecb2SHans Petter Selasky  * Copyright (c) 2015 Matthew Dillon <dillon@backplane.com>
88d59ecb2SHans Petter Selasky  * All rights reserved.
98d59ecb2SHans Petter Selasky  *
108d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
118d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
128d59ecb2SHans Petter Selasky  * are met:
138d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
148d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
158d59ecb2SHans Petter Selasky  *    disclaimer.
168d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
178d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
188d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
198d59ecb2SHans Petter Selasky  *
208d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
218d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
228d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
238d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
248d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
258d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
268d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
278d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
288d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
298d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
308d59ecb2SHans Petter Selasky  *
318d59ecb2SHans Petter Selasky  * $FreeBSD$
328d59ecb2SHans Petter Selasky  */
338d59ecb2SHans Petter Selasky #ifndef	_LINUX_MM_H_
348d59ecb2SHans Petter Selasky #define	_LINUX_MM_H_
358d59ecb2SHans Petter Selasky 
368d59ecb2SHans Petter Selasky #include <linux/spinlock.h>
378d59ecb2SHans Petter Selasky #include <linux/gfp.h>
388d59ecb2SHans Petter Selasky #include <linux/kernel.h>
39*05d4f501SHans Petter Selasky #include <linux/mm_types.h>
408d59ecb2SHans Petter Selasky 
418d59ecb2SHans Petter Selasky #define	PAGE_ALIGN(x)	ALIGN(x, PAGE_SIZE)
428d59ecb2SHans Petter Selasky 
438d59ecb2SHans Petter Selasky struct vm_area_struct {
448d59ecb2SHans Petter Selasky 	vm_offset_t	vm_start;
458d59ecb2SHans Petter Selasky 	vm_offset_t	vm_end;
468d59ecb2SHans Petter Selasky 	vm_offset_t	vm_pgoff;
478d59ecb2SHans Petter Selasky 	vm_paddr_t	vm_pfn;		/* PFN For mmap. */
488d59ecb2SHans Petter Selasky 	vm_size_t	vm_len;		/* length for mmap. */
498d59ecb2SHans Petter Selasky 	vm_memattr_t	vm_page_prot;
508d59ecb2SHans Petter Selasky };
518d59ecb2SHans Petter Selasky 
528d59ecb2SHans Petter Selasky /*
538d59ecb2SHans Petter Selasky  * Compute log2 of the power of two rounded up count of pages
548d59ecb2SHans Petter Selasky  * needed for size bytes.
558d59ecb2SHans Petter Selasky  */
568d59ecb2SHans Petter Selasky static inline int
578d59ecb2SHans Petter Selasky get_order(unsigned long size)
588d59ecb2SHans Petter Selasky {
598d59ecb2SHans Petter Selasky 	int order;
608d59ecb2SHans Petter Selasky 
618d59ecb2SHans Petter Selasky 	size = (size - 1) >> PAGE_SHIFT;
628d59ecb2SHans Petter Selasky 	order = 0;
638d59ecb2SHans Petter Selasky 	while (size) {
648d59ecb2SHans Petter Selasky 		order++;
658d59ecb2SHans Petter Selasky 		size >>= 1;
668d59ecb2SHans Petter Selasky 	}
678d59ecb2SHans Petter Selasky 	return (order);
688d59ecb2SHans Petter Selasky }
698d59ecb2SHans Petter Selasky 
708d59ecb2SHans Petter Selasky static inline void *
718d59ecb2SHans Petter Selasky lowmem_page_address(struct page *page)
728d59ecb2SHans Petter Selasky {
738d59ecb2SHans Petter Selasky 
748d59ecb2SHans Petter Selasky 	return page_address(page);
758d59ecb2SHans Petter Selasky }
768d59ecb2SHans Petter Selasky 
778d59ecb2SHans Petter Selasky /*
788d59ecb2SHans Petter Selasky  * This only works via mmap ops.
798d59ecb2SHans Petter Selasky  */
808d59ecb2SHans Petter Selasky static inline int
818d59ecb2SHans Petter Selasky io_remap_pfn_range(struct vm_area_struct *vma,
828d59ecb2SHans Petter Selasky     unsigned long addr, unsigned long pfn, unsigned long size,
838d59ecb2SHans Petter Selasky     vm_memattr_t prot)
848d59ecb2SHans Petter Selasky {
858d59ecb2SHans Petter Selasky 	vma->vm_page_prot = prot;
868d59ecb2SHans Petter Selasky 	vma->vm_pfn = pfn;
878d59ecb2SHans Petter Selasky 	vma->vm_len = size;
888d59ecb2SHans Petter Selasky 
898d59ecb2SHans Petter Selasky 	return (0);
908d59ecb2SHans Petter Selasky }
918d59ecb2SHans Petter Selasky 
928d59ecb2SHans Petter Selasky static inline unsigned long
938d59ecb2SHans Petter Selasky vma_pages(struct vm_area_struct *vma)
948d59ecb2SHans Petter Selasky {
958d59ecb2SHans Petter Selasky 	return ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT);
968d59ecb2SHans Petter Selasky }
978d59ecb2SHans Petter Selasky 
988d59ecb2SHans Petter Selasky #define	offset_in_page(off)	((off) & (PAGE_SIZE - 1))
998d59ecb2SHans Petter Selasky 
1008d59ecb2SHans Petter Selasky static inline void
1018d59ecb2SHans Petter Selasky set_page_dirty(struct vm_page *page)
1028d59ecb2SHans Petter Selasky {
1038d59ecb2SHans Petter Selasky 	vm_page_dirty(page);
1048d59ecb2SHans Petter Selasky }
1058d59ecb2SHans Petter Selasky 
1068d59ecb2SHans Petter Selasky static inline void
1078d59ecb2SHans Petter Selasky get_page(struct vm_page *page)
1088d59ecb2SHans Petter Selasky {
1098d59ecb2SHans Petter Selasky 	vm_page_hold(page);
1108d59ecb2SHans Petter Selasky }
1118d59ecb2SHans Petter Selasky 
1128d59ecb2SHans Petter Selasky #endif	/* _LINUX_MM_H_ */
113