LCOV - code coverage report
Current view: top level - include/linux - io.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 0 -

          Line data    Source code
       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             : 
      16             : struct device;
      17             : struct resource;
      18             : 
      19             : __visible void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
      20             : void __ioread32_copy(void *to, const void __iomem *from, size_t count);
      21             : void __iowrite64_copy(void __iomem *to, const void *from, size_t count);
      22             : 
      23             : #ifdef CONFIG_MMU
      24             : int ioremap_page_range(unsigned long addr, unsigned long end,
      25             :                        phys_addr_t phys_addr, pgprot_t prot);
      26             : #else
      27             : static 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
      38             : void __iomem * devm_ioport_map(struct device *dev, unsigned long port,
      39             :                                unsigned int nr);
      40             : void devm_ioport_unmap(struct device *dev, void __iomem *addr);
      41             : #else
      42             : static inline void __iomem *devm_ioport_map(struct device *dev,
      43             :                                              unsigned long port,
      44             :                                              unsigned int nr)
      45             : {
      46             :         return NULL;
      47             : }
      48             : 
      49             : static 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             : 
      56             : void __iomem *devm_ioremap(struct device *dev, resource_size_t offset,
      57             :                            resource_size_t size);
      58             : void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset,
      59             :                                    resource_size_t size);
      60             : void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset,
      61             :                                    resource_size_t size);
      62             : void devm_iounmap(struct device *dev, void __iomem *addr);
      63             : int check_signature(const volatile void __iomem *io_addr,
      64             :                         const unsigned char *signature, int length);
      65             : void devm_ioremap_release(struct device *dev, void *res);
      66             : 
      67             : void *devm_memremap(struct device *dev, resource_size_t offset,
      68             :                 size_t size, unsigned long flags);
      69             : void devm_memunmap(struct device *dev, void *addr);
      70             : 
      71             : #ifdef CONFIG_PCI
      72             : /*
      73             :  * The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
      74             :  * Posting") mandate non-posted configuration transactions. This default
      75             :  * implementation attempts to use the ioremap_np() API to provide this
      76             :  * on arches that support it, and falls back to ioremap() on those that
      77             :  * don't. Overriding this function is deprecated; arches that properly
      78             :  * support non-posted accesses should implement ioremap_np() instead, which
      79             :  * this default implementation can then use to return mappings compliant with
      80             :  * the PCI specification.
      81             :  */
      82             : #ifndef pci_remap_cfgspace
      83             : #define pci_remap_cfgspace pci_remap_cfgspace
      84             : static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset,
      85             :                                                size_t size)
      86             : {
      87           0 :         return ioremap_np(offset, size) ?: ioremap(offset, size);
      88             : }
      89             : #endif
      90             : #endif
      91             : 
      92             : /*
      93             :  * Some systems do not have legacy ISA devices.
      94             :  * /dev/port is not a valid interface on these systems.
      95             :  * So for those archs, <asm/io.h> should define the following symbol.
      96             :  */
      97             : #ifndef arch_has_dev_port
      98             : #define arch_has_dev_port()     (1)
      99             : #endif
     100             : 
     101             : /*
     102             :  * Some systems (x86 without PAT) have a somewhat reliable way to mark a
     103             :  * physical address range such that uncached mappings will actually
     104             :  * end up write-combining.  This facility should be used in conjunction
     105             :  * with pgprot_writecombine, ioremap-wc, or set_memory_wc, since it has
     106             :  * no effect if the per-page mechanisms are functional.
     107             :  * (On x86 without PAT, these functions manipulate MTRRs.)
     108             :  *
     109             :  * arch_phys_del_wc(0) or arch_phys_del_wc(any error code) is guaranteed
     110             :  * to have no effect.
     111             :  */
     112             : #ifndef arch_phys_wc_add
     113             : static inline int __must_check arch_phys_wc_add(unsigned long base,
     114             :                                                 unsigned long size)
     115             : {
     116             :         return 0;  /* It worked (i.e. did nothing). */
     117             : }
     118             : 
     119             : static inline void arch_phys_wc_del(int handle)
     120             : {
     121             : }
     122             : 
     123             : #define arch_phys_wc_add arch_phys_wc_add
     124             : #ifndef arch_phys_wc_index
     125             : static inline int arch_phys_wc_index(int handle)
     126             : {
     127             :         return -1;
     128             : }
     129             : #define arch_phys_wc_index arch_phys_wc_index
     130             : #endif
     131             : #endif
     132             : 
     133             : int devm_arch_phys_wc_add(struct device *dev, unsigned long base, unsigned long size);
     134             : 
     135             : enum {
     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             : 
     144             : void *memremap(resource_size_t offset, size_t size, unsigned long flags);
     145             : void 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
     157             : static inline int arch_io_reserve_memtype_wc(resource_size_t base,
     158             :                                              resource_size_t size)
     159             : {
     160             :         return 0;
     161             : }
     162             : 
     163             : static inline void arch_io_free_memtype_wc(resource_size_t base,
     164             :                                            resource_size_t size)
     165             : {
     166             : }
     167             : #endif
     168             : 
     169             : int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start,
     170             :                                     resource_size_t size);
     171             : 
     172             : #endif /* _LINUX_IO_H */

Generated by: LCOV version 1.14