linux/include/linux/io.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright 2006 PathScale, Inc.  All Rights Reserved.
   4 */
   5
   6#ifndef _LINUX_IO_H
   7#define _LINUX_IO_H
   8
   9#include <linux/types.h>
  10#include <linux/init.h>
  11#include <linux/bug.h>
  12#include <linux/err.h>
  13#include <asm/io.h>
  14#include <asm/page.h>
  15
  16struct device;
  17struct resource;
  18
  19__visible void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
  20void __ioread32_copy(void *to, const void __iomem *from, size_t count);
  21void __iowrite64_copy(void __iomem *to, const void *from, size_t count);
  22
  23#ifdef CONFIG_MMU
  24int ioremap_page_range(unsigned long addr, unsigned long end,
  25                       phys_addr_t phys_addr, pgprot_t prot);
  26#else
  27static inline int ioremap_page_range(unsigned long addr, unsigned long end,
  28                                     phys_addr_t phys_addr, pgprot_t prot)
  29{
  30        return 0;
  31}
  32#endif
  33
  34/*
  35 * Managed iomap interface
  36 */
  37#ifdef CONFIG_HAS_IOPORT_MAP
  38void __iomem * devm_ioport_map(struct device *dev, unsigned long port,
  39                               unsigned int nr);
  40void devm_ioport_unmap(struct device *dev, void __iomem *addr);
  41#else
  42static inline void __iomem *devm_ioport_map(struct device *dev,
  43                                             unsigned long port,
  44                                             unsigned int nr)
  45{
  46        return NULL;
  47}
  48
  49static inline void devm_ioport_unmap(struct device *dev, void __iomem *addr)
  50{
  51}
  52#endif
  53
  54#define IOMEM_ERR_PTR(err) (__force void __iomem *)ERR_PTR(err)
  55
  56void __iomem *devm_ioremap(struct device *dev, resource_size_t offset,
  57                           resource_size_t size);
  58void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset,
  59                                   resource_size_t size);
  60void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset,
  61                                   resource_size_t size);
  62void __iomem *devm_ioremap_np(struct device *dev, resource_size_t offset,
  63                                   resource_size_t size);
  64void devm_iounmap(struct device *dev, void __iomem *addr);
  65int check_signature(const volatile void __iomem *io_addr,
  66                        const unsigned char *signature, int length);
  67void devm_ioremap_release(struct device *dev, void *res);
  68
  69void *devm_memremap(struct device *dev, resource_size_t offset,
  70                size_t size, unsigned long flags);
  71void devm_memunmap(struct device *dev, void *addr);
  72
  73#ifdef CONFIG_PCI
  74/*
  75 * The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
  76 * Posting") mandate non-posted configuration transactions. This default
  77 * implementation attempts to use the ioremap_np() API to provide this
  78 * on arches that support it, and falls back to ioremap() on those that
  79 * don't. Overriding this function is deprecated; arches that properly
  80 * support non-posted accesses should implement ioremap_np() instead, which
  81 * this default implementation can then use to return mappings compliant with
  82 * the PCI specification.
  83 */
  84#ifndef pci_remap_cfgspace
  85#define pci_remap_cfgspace pci_remap_cfgspace
  86static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset,
  87                                               size_t size)
  88{
  89        return ioremap_np(offset, size) ?: ioremap(offset, size);
  90}
  91#endif
  92#endif
  93
  94/*
  95 * Some systems do not have legacy ISA devices.
  96 * /dev/port is not a valid interface on these systems.
  97 * So for those archs, <asm/io.h> should define the following symbol.
  98 */
  99#ifndef arch_has_dev_port
 100#define arch_has_dev_port()     (1)
 101#endif
 102
 103/*
 104 * Some systems (x86 without PAT) have a somewhat reliable way to mark a
 105 * physical address range such that uncached mappings will actually
 106 * end up write-combining.  This facility should be used in conjunction
 107 * with pgprot_writecombine, ioremap-wc, or set_memory_wc, since it has
 108 * no effect if the per-page mechanisms are functional.
 109 * (On x86 without PAT, these functions manipulate MTRRs.)
 110 *
 111 * arch_phys_del_wc(0) or arch_phys_del_wc(any error code) is guaranteed
 112 * to have no effect.
 113 */
 114#ifndef arch_phys_wc_add
 115static inline int __must_check arch_phys_wc_add(unsigned long base,
 116                                                unsigned long size)
 117{
 118        return 0;  /* It worked (i.e. did nothing). */
 119}
 120
 121static inline void arch_phys_wc_del(int handle)
 122{
 123}
 124
 125#define arch_phys_wc_add arch_phys_wc_add
 126#ifndef arch_phys_wc_index
 127static inline int arch_phys_wc_index(int handle)
 128{
 129        return -1;
 130}
 131#define arch_phys_wc_index arch_phys_wc_index
 132#endif
 133#endif
 134
 135enum {
 136        /* See memremap() kernel-doc for usage description... */
 137        MEMREMAP_WB = 1 << 0,
 138        MEMREMAP_WT = 1 << 1,
 139        MEMREMAP_WC = 1 << 2,
 140        MEMREMAP_ENC = 1 << 3,
 141        MEMREMAP_DEC = 1 << 4,
 142};
 143
 144void *memremap(resource_size_t offset, size_t size, unsigned long flags);
 145void memunmap(void *addr);
 146
 147/*
 148 * On x86 PAT systems we have memory tracking that keeps track of
 149 * the allowed mappings on memory ranges. This tracking works for
 150 * all the in-kernel mapping APIs (ioremap*), but where the user
 151 * wishes to map a range from a physical device into user memory
 152 * the tracking won't be updated. This API is to be used by
 153 * drivers which remap physical device pages into userspace,
 154 * and wants to make sure they are mapped WC and not UC.
 155 */
 156#ifndef arch_io_reserve_memtype_wc
 157static inline int arch_io_reserve_memtype_wc(resource_size_t base,
 158                                             resource_size_t size)
 159{
 160        return 0;
 161}
 162
 163static inline void arch_io_free_memtype_wc(resource_size_t base,
 164                                           resource_size_t size)
 165{
 166}
 167#endif
 168
 169#endif /* _LINUX_IO_H */
 170