~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/io-mapping.h

Version: ~ [ linux-6.0-rc6 ] ~ [ linux-5.19.10 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.69 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.144 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.214 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.259 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.294 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.329 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.302 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright © 2008 Keith Packard <keithp@keithp.com>
  3  *
  4  * This file is free software; you can redistribute it and/or modify
  5  * it under the terms of version 2 of the GNU General Public License
  6  * as published by the Free Software Foundation.
  7  *
  8  * This program is distributed in the hope that it will be useful,
  9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 11  * GNU General Public License for more details.
 12  *
 13  * You should have received a copy of the GNU General Public License
 14  * along with this program; if not, write to the Free Software Foundation,
 15  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 16  */
 17 
 18 #ifndef _LINUX_IO_MAPPING_H
 19 #define _LINUX_IO_MAPPING_H
 20 
 21 #include <linux/types.h>
 22 #include <linux/slab.h>
 23 #include <linux/bug.h>
 24 #include <linux/io.h>
 25 #include <asm/page.h>
 26 
 27 /*
 28  * The io_mapping mechanism provides an abstraction for mapping
 29  * individual pages from an io device to the CPU in an efficient fashion.
 30  *
 31  * See Documentation/io-mapping.txt
 32  */
 33 
 34 struct io_mapping {
 35         resource_size_t base;
 36         unsigned long size;
 37         pgprot_t prot;
 38         void __iomem *iomem;
 39 };
 40 
 41 #ifdef CONFIG_HAVE_ATOMIC_IOMAP
 42 
 43 #include <asm/iomap.h>
 44 /*
 45  * For small address space machines, mapping large objects
 46  * into the kernel virtual space isn't practical. Where
 47  * available, use fixmap support to dynamically map pages
 48  * of the object at run time.
 49  */
 50 
 51 static inline struct io_mapping *
 52 io_mapping_init_wc(struct io_mapping *iomap,
 53                    resource_size_t base,
 54                    unsigned long size)
 55 {
 56         pgprot_t prot;
 57 
 58         if (iomap_create_wc(base, size, &prot))
 59                 return NULL;
 60 
 61         iomap->base = base;
 62         iomap->size = size;
 63         iomap->prot = prot;
 64         return iomap;
 65 }
 66 
 67 static inline void
 68 io_mapping_fini(struct io_mapping *mapping)
 69 {
 70         iomap_free(mapping->base, mapping->size);
 71 }
 72 
 73 /* Atomic map/unmap */
 74 static inline void __iomem *
 75 io_mapping_map_atomic_wc(struct io_mapping *mapping,
 76                          unsigned long offset)
 77 {
 78         resource_size_t phys_addr;
 79         unsigned long pfn;
 80 
 81         BUG_ON(offset >= mapping->size);
 82         phys_addr = mapping->base + offset;
 83         pfn = (unsigned long) (phys_addr >> PAGE_SHIFT);
 84         return iomap_atomic_prot_pfn(pfn, mapping->prot);
 85 }
 86 
 87 static inline void
 88 io_mapping_unmap_atomic(void __iomem *vaddr)
 89 {
 90         iounmap_atomic(vaddr);
 91 }
 92 
 93 static inline void __iomem *
 94 io_mapping_map_wc(struct io_mapping *mapping,
 95                   unsigned long offset,
 96                   unsigned long size)
 97 {
 98         resource_size_t phys_addr;
 99 
100         BUG_ON(offset >= mapping->size);
101         phys_addr = mapping->base + offset;
102 
103         return ioremap_wc(phys_addr, size);
104 }
105 
106 static inline void
107 io_mapping_unmap(void __iomem *vaddr)
108 {
109         iounmap(vaddr);
110 }
111 
112 #else
113 
114 #include <linux/uaccess.h>
115 #include <asm/pgtable.h>
116 
117 /* Create the io_mapping object*/
118 static inline struct io_mapping *
119 io_mapping_init_wc(struct io_mapping *iomap,
120                    resource_size_t base,
121                    unsigned long size)
122 {
123         iomap->base = base;
124         iomap->size = size;
125         iomap->iomem = ioremap_wc(base, size);
126 #if defined(pgprot_noncached_wc) /* archs can't agree on a name ... */
127         iomap->prot = pgprot_noncached_wc(PAGE_KERNEL);
128 #elif defined(pgprot_writecombine)
129         iomap->prot = pgprot_writecombine(PAGE_KERNEL);
130 #else
131         iomap->prot = pgprot_noncached(PAGE_KERNEL);
132 #endif
133 
134         return iomap;
135 }
136 
137 static inline void
138 io_mapping_fini(struct io_mapping *mapping)
139 {
140         iounmap(mapping->iomem);
141 }
142 
143 /* Non-atomic map/unmap */
144 static inline void __iomem *
145 io_mapping_map_wc(struct io_mapping *mapping,
146                   unsigned long offset,
147                   unsigned long size)
148 {
149         return mapping->iomem + offset;
150 }
151 
152 static inline void
153 io_mapping_unmap(void __iomem *vaddr)
154 {
155 }
156 
157 /* Atomic map/unmap */
158 static inline void __iomem *
159 io_mapping_map_atomic_wc(struct io_mapping *mapping,
160                          unsigned long offset)
161 {
162         preempt_disable();
163         pagefault_disable();
164         return io_mapping_map_wc(mapping, offset, PAGE_SIZE);
165 }
166 
167 static inline void
168 io_mapping_unmap_atomic(void __iomem *vaddr)
169 {
170         io_mapping_unmap(vaddr);
171         pagefault_enable();
172         preempt_enable();
173 }
174 
175 #endif /* HAVE_ATOMIC_IOMAP */
176 
177 static inline struct io_mapping *
178 io_mapping_create_wc(resource_size_t base,
179                      unsigned long size)
180 {
181         struct io_mapping *iomap;
182 
183         iomap = kmalloc(sizeof(*iomap), GFP_KERNEL);
184         if (!iomap)
185                 return NULL;
186 
187         if (!io_mapping_init_wc(iomap, base, size)) {
188                 kfree(iomap);
189                 return NULL;
190         }
191 
192         return iomap;
193 }
194 
195 static inline void
196 io_mapping_free(struct io_mapping *iomap)
197 {
198         io_mapping_fini(iomap);
199         kfree(iomap);
200 }
201 
202 #endif /* _LINUX_IO_MAPPING_H */
203 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp