drm/linux: Port kfifo.h to DragonFly BSD
[dragonfly.git] / sys / dev / drm / include / linux / mm.h
1 /*-
2  * Copyright (c) 2010 Isilon Systems, Inc.
3  * Copyright (c) 2010 iX Systems, Inc.
4  * Copyright (c) 2010 Panasas, Inc.
5  * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
6  * Copyright (c) 2015 Matthew Dillon <dillon@backplane.com>
7  * Copyright (c) 2015-2019 François Tigeot <ftigeot@wolfpond.org>
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice unmodified, this list of conditions, and the following
15  *    disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 #ifndef _LINUX_MM_H_
32 #define _LINUX_MM_H_
33
34 #include <linux/errno.h>
35
36 #include <linux/mmdebug.h>
37 #include <linux/gfp.h>
38 #include <linux/bug.h>
39 #include <linux/list.h>
40 #include <linux/mmzone.h>
41 #include <linux/rbtree.h>
42 #include <linux/atomic.h>
43 #include <linux/mm_types.h>
44 #include <linux/err.h>
45 #include <linux/shrinker.h>
46
47 #include <asm/page.h>
48 #include <asm/pgtable.h>
49 #include <asm/processor.h>
50
51 struct vm_operations_struct;
52
53 static inline struct page *
54 nth_page(struct page *page, int n)
55 {
56         return page + n;
57 }
58
59 #define PAGE_ALIGN(addr) round_page(addr)
60
61 struct vm_fault {
62         uintptr_t       virtual_address;
63 };
64
65 #define VM_FAULT_NOPAGE         0x0001
66 #define VM_FAULT_SIGBUS         0x0002
67 #define VM_FAULT_OOM            0x0004
68
69 struct vm_area_struct {
70         vm_offset_t     vm_start;
71         vm_offset_t     vm_end;
72         vm_offset_t     vm_pgoff;
73         vm_paddr_t      vm_pfn;         /* PFN For mmap. */
74         vm_memattr_t    vm_page_prot;
75         void            *vm_private_data;
76         int             vm_flags;
77         const struct vm_operations_struct *vm_ops;
78 };
79
80 #define VM_DONTDUMP     0x0001
81 #define VM_DONTEXPAND   0x0002
82 #define VM_IO           0x0004
83 #define VM_MIXEDMAP     0x0008
84
85 struct vm_operations_struct {
86         int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
87         void (*open)(struct vm_area_struct *vma);
88         void (*close)(struct vm_area_struct *vma);
89 };
90
91 /*
92  * Compute log2 of the power of two rounded up count of pages
93  * needed for size bytes.
94  */
95 static inline int
96 get_order(unsigned long size)
97 {
98         int order;
99
100         size = (size - 1) >> PAGE_SHIFT;
101         order = 0;
102         while (size) {
103                 order++;
104                 size >>= 1;
105         }
106         return (order);
107 }
108
109 /*
110  * This only works via mmap ops.
111  */
112 static inline int
113 io_remap_pfn_range(struct vm_area_struct *vma,
114     unsigned long addr, unsigned long pfn, unsigned long size,
115     vm_memattr_t prot)
116 {
117         vma->vm_page_prot = prot;
118         vma->vm_pfn = pfn;
119
120         return (0);
121 }
122
123 static inline unsigned long
124 vma_pages(struct vm_area_struct *vma)
125 {
126         unsigned long size;
127
128         size = vma->vm_end - vma->vm_start;
129
130         return size >> PAGE_SHIFT;
131 }
132
133 #define offset_in_page(off)     ((off) & PAGE_MASK)
134
135 static inline void
136 set_page_dirty(struct page *page)
137 {
138         vm_page_dirty((struct vm_page *)page);
139 }
140
141 /*
142  * Allocate multiple contiguous pages.  The DragonFly code can only do
143  * multiple allocations via the free page reserve.  Linux does not appear
144  * to restrict the address space, so neither do we.
145  */
146 static inline struct vm_page *
147 alloc_pages(int flags, u_int order)
148 {
149         size_t bytes = PAGE_SIZE << order;
150         struct vm_page *pgs;
151
152         pgs = vm_page_alloc_contig(0LLU, ~0LLU, bytes, bytes, bytes,
153                                    VM_MEMATTR_DEFAULT);
154         kprintf("alloc_pages order %u vm_pages=%p\n", order, pgs);
155         return pgs;
156 }
157
158 /*
159  * Free multiple contiguous pages
160  */
161 static inline void
162 __free_pages(struct vm_page *pgs, u_int order)
163 {
164         size_t bytes = PAGE_SIZE << order;
165
166         vm_page_free_contig(pgs, bytes);
167 }
168
169 static inline void
170 get_page(struct vm_page *page)
171 {
172         vm_page_hold(page);
173 }
174
175 extern vm_paddr_t Realmem;
176
177 static inline unsigned long get_num_physpages(void)
178 {
179         return Realmem / PAGE_SIZE;
180 }
181
182 int is_vmalloc_addr(const void *x);
183
184 static inline void
185 unmap_mapping_range(struct address_space *mapping,
186         loff_t const holebegin, loff_t const holelen, int even_cows)
187 {
188 }
189
190 #define VM_SHARED       0x00000008
191
192 #define VM_PFNMAP       0x00000400
193
194 #endif  /* _LINUX_MM_H_ */