Release 4.12 include/linux/io-mapping.h
/*
* Copyright © 2008 Keith Packard <keithp@keithp.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _LINUX_IO_MAPPING_H
#define _LINUX_IO_MAPPING_H
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/bug.h>
#include <linux/io.h>
#include <asm/page.h>
/*
* The io_mapping mechanism provides an abstraction for mapping
* individual pages from an io device to the CPU in an efficient fashion.
*
* See Documentation/io-mapping.txt
*/
struct io_mapping {
resource_size_t base;
unsigned long size;
pgprot_t prot;
void __iomem *iomem;
};
#ifdef CONFIG_HAVE_ATOMIC_IOMAP
#include <asm/iomap.h>
/*
* For small address space machines, mapping large objects
* into the kernel virtual space isn't practical. Where
* available, use fixmap support to dynamically map pages
* of the object at run time.
*/
static inline struct io_mapping *
io_mapping_init_wc(struct io_mapping *iomap,
resource_size_t base,
unsigned long size)
{
pgprot_t prot;
if (iomap_create_wc(base, size, &prot))
return NULL;
iomap->base = base;
iomap->size = size;
iomap->prot = prot;
return iomap;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Venkatesh Pallipadi | 36 | 60.00% | 2 | 50.00% |
Keith Packard | 15 | 25.00% | 1 | 25.00% |
Chris Wilson | 9 | 15.00% | 1 | 25.00% |
Total | 60 | 100.00% | 4 | 100.00% |
static inline void
io_mapping_fini(struct io_mapping *mapping)
{
iomap_free(mapping->base, mapping->size);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Venkatesh Pallipadi | 13 | 56.52% | 2 | 50.00% |
Keith Packard | 9 | 39.13% | 1 | 25.00% |
Chris Wilson | 1 | 4.35% | 1 | 25.00% |
Total | 23 | 100.00% | 4 | 100.00% |
/* Atomic map/unmap */
static inline void __iomem *
io_mapping_map_atomic_wc(struct io_mapping *mapping,
unsigned long offset)
{
resource_size_t phys_addr;
unsigned long pfn;
BUG_ON(offset >= mapping->size);
phys_addr = mapping->base + offset;
pfn = (unsigned long) (phys_addr >> PAGE_SHIFT);
return iomap_atomic_prot_pfn(pfn, mapping->prot);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Venkatesh Pallipadi | 36 | 56.25% | 1 | 25.00% |
Keith Packard | 27 | 42.19% | 2 | 50.00% |
Francisco Jerez | 1 | 1.56% | 1 | 25.00% |
Total | 64 | 100.00% | 4 | 100.00% |
static inline void
io_mapping_unmap_atomic(void __iomem *vaddr)
{
iounmap_atomic(vaddr);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 16 | 94.12% | 2 | 66.67% |
Francisco Jerez | 1 | 5.88% | 1 | 33.33% |
Total | 17 | 100.00% | 3 | 100.00% |
static inline void __iomem *
io_mapping_map_wc(struct io_mapping *mapping,
unsigned long offset,
unsigned long size)
{
resource_size_t phys_addr;
BUG_ON(offset >= mapping->size);
phys_addr = mapping->base + offset;
return ioremap_wc(phys_addr, size);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 26 | 52.00% | 2 | 33.33% |
Venkatesh Pallipadi | 18 | 36.00% | 2 | 33.33% |
Chris Wilson | 5 | 10.00% | 1 | 16.67% |
Francisco Jerez | 1 | 2.00% | 1 | 16.67% |
Total | 50 | 100.00% | 6 | 100.00% |
static inline void
io_mapping_unmap(void __iomem *vaddr)
{
iounmap(vaddr);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 16 | 94.12% | 2 | 66.67% |
Francisco Jerez | 1 | 5.88% | 1 | 33.33% |
Total | 17 | 100.00% | 3 | 100.00% |
#else
#include <linux/uaccess.h>
#include <asm/pgtable.h>
/* Create the io_mapping object*/
static inline struct io_mapping *
io_mapping_init_wc(struct io_mapping *iomap,
resource_size_t base,
unsigned long size)
{
iomap->base = base;
iomap->size = size;
iomap->iomem = ioremap_wc(base, size);
#if defined(pgprot_noncached_wc) /* archs can't agree on a name ... */
iomap->prot = pgprot_noncached_wc(PAGE_KERNEL);
#elif defined(pgprot_writecombine)
iomap->prot = pgprot_writecombine(PAGE_KERNEL);
#else
iomap->prot = pgprot_noncached(PAGE_KERNEL);
#endif
return iomap;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Daniel Vetter | 35 | 38.46% | 1 | 16.67% |
Chris Wilson | 34 | 37.36% | 2 | 33.33% |
Keith Packard | 21 | 23.08% | 2 | 33.33% |
Venkatesh Pallipadi | 1 | 1.10% | 1 | 16.67% |
Total | 91 | 100.00% | 6 | 100.00% |
static inline void
io_mapping_fini(struct io_mapping *mapping)
{
iounmap(mapping->iomem);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 16 | 84.21% | 2 | 66.67% |
Chris Wilson | 3 | 15.79% | 1 | 33.33% |
Total | 19 | 100.00% | 3 | 100.00% |
/* Non-atomic map/unmap */
static inline void __iomem *
io_mapping_map_wc(struct io_mapping *mapping,
unsigned long offset,
unsigned long size)
{
return mapping->iomem + offset;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 21 | 72.41% | 2 | 50.00% |
Chris Wilson | 7 | 24.14% | 1 | 25.00% |
Francisco Jerez | 1 | 3.45% | 1 | 25.00% |
Total | 29 | 100.00% | 4 | 100.00% |
static inline void
io_mapping_unmap(void __iomem *vaddr)
{
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 8 | 72.73% | 1 | 33.33% |
Chris Wilson | 2 | 18.18% | 1 | 33.33% |
Francisco Jerez | 1 | 9.09% | 1 | 33.33% |
Total | 11 | 100.00% | 3 | 100.00% |
/* Atomic map/unmap */
static inline void __iomem *
io_mapping_map_atomic_wc(struct io_mapping *mapping,
unsigned long offset)
{
preempt_disable();
pagefault_disable();
return io_mapping_map_wc(mapping, offset, PAGE_SIZE);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 20 | 58.82% | 2 | 50.00% |
Chris Wilson | 13 | 38.24% | 1 | 25.00% |
Francisco Jerez | 1 | 2.94% | 1 | 25.00% |
Total | 34 | 100.00% | 4 | 100.00% |
static inline void
io_mapping_unmap_atomic(void __iomem *vaddr)
{
io_mapping_unmap(vaddr);
pagefault_enable();
preempt_enable();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Chris Wilson | 14 | 60.87% | 1 | 33.33% |
Keith Packard | 8 | 34.78% | 1 | 33.33% |
Francisco Jerez | 1 | 4.35% | 1 | 33.33% |
Total | 23 | 100.00% | 3 | 100.00% |
#endif /* HAVE_ATOMIC_IOMAP */
static inline struct io_mapping *
io_mapping_create_wc(resource_size_t base,
unsigned long size)
{
struct io_mapping *iomap;
iomap = kmalloc(sizeof(*iomap), GFP_KERNEL);
if (!iomap)
return NULL;
if (!io_mapping_init_wc(iomap, base, size)) {
kfree(iomap);
return NULL;
}
return iomap;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Chris Wilson | 67 | 100.00% | 1 | 100.00% |
Total | 67 | 100.00% | 1 | 100.00% |
static inline void
io_mapping_free(struct io_mapping *iomap)
{
io_mapping_fini(iomap);
kfree(iomap);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Chris Wilson | 22 | 100.00% | 1 | 100.00% |
Total | 22 | 100.00% | 1 | 100.00% |
#endif /* _LINUX_IO_MAPPING_H */
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Keith Packard | 229 | 38.49% | 2 | 13.33% |
Chris Wilson | 193 | 32.44% | 3 | 20.00% |
Venkatesh Pallipadi | 119 | 20.00% | 3 | 20.00% |
Daniel Vetter | 38 | 6.39% | 2 | 13.33% |
Francisco Jerez | 8 | 1.34% | 1 | 6.67% |
Tejun Heo | 3 | 0.50% | 1 | 6.67% |
Paul Gortmaker | 3 | 0.50% | 1 | 6.67% |
Dan J Williams | 1 | 0.17% | 1 | 6.67% |
Paul Bolle | 1 | 0.17% | 1 | 6.67% |
Total | 595 | 100.00% | 15 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.