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-08-24 13:40:31 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             : /* architectures can override this */
      72             : pgprot_t __init early_memremap_pgprot_adjust(resource_size_t phys_addr,
      73             :                                         unsigned long size, pgprot_t prot);
      74             : 
      75             : 
      76             : #ifdef CONFIG_PCI
      77             : /*
      78             :  * The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
      79             :  * Posting") mandate non-posted configuration transactions. This default
      80             :  * implementation attempts to use the ioremap_np() API to provide this
      81             :  * on arches that support it, and falls back to ioremap() on those that
      82             :  * don't. Overriding this function is deprecated; arches that properly
      83             :  * support non-posted accesses should implement ioremap_np() instead, which
      84             :  * this default implementation can then use to return mappings compliant with
      85             :  * the PCI specification.
      86             :  */
      87             : #ifndef pci_remap_cfgspace
      88             : #define pci_remap_cfgspace pci_remap_cfgspace
      89             : static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset,
      90             :                                                size_t size)
      91             : {
      92           0 :         return ioremap_np(offset, size) ?: ioremap(offset, size);
      93             : }
      94             : #endif
      95             : #endif
      96             : 
      97             : /*
      98             :  * Some systems do not have legacy ISA devices.
      99             :  * /dev/port is not a valid interface on these systems.
     100             :  * So for those archs, <asm/io.h> should define the following symbol.
     101             :  */
     102             : #ifndef arch_has_dev_port
     103             : #define arch_has_dev_port()     (1)
     104             : #endif
     105             : 
     106             : /*
     107             :  * Some systems (x86 without PAT) have a somewhat reliable way to mark a
     108             :  * physical address range such that uncached mappings will actually
     109             :  * end up write-combining.  This facility should be used in conjunction
     110             :  * with pgprot_writecombine, ioremap-wc, or set_memory_wc, since it has
     111             :  * no effect if the per-page mechanisms are functional.
     112             :  * (On x86 without PAT, these functions manipulate MTRRs.)
     113             :  *
     114             :  * arch_phys_del_wc(0) or arch_phys_del_wc(any error code) is guaranteed
     115             :  * to have no effect.
     116             :  */
     117             : #ifndef arch_phys_wc_add
     118             : static inline int __must_check arch_phys_wc_add(unsigned long base,
     119             :                                                 unsigned long size)
     120             : {
     121             :         return 0;  /* It worked (i.e. did nothing). */
     122             : }
     123             : 
     124             : static inline void arch_phys_wc_del(int handle)
     125             : {
     126             : }
     127             : 
     128             : #define arch_phys_wc_add arch_phys_wc_add
     129             : #ifndef arch_phys_wc_index
     130             : static inline int arch_phys_wc_index(int handle)
     131             : {
     132             :         return -1;
     133             : }
     134             : #define arch_phys_wc_index arch_phys_wc_index
     135             : #endif
     136             : #endif
     137             : 
     138             : int devm_arch_phys_wc_add(struct device *dev, unsigned long base, unsigned long size);
     139             : 
     140             : enum {
     141             :         /* See memremap() kernel-doc for usage description... */
     142             :         MEMREMAP_WB = 1 << 0,
     143             :         MEMREMAP_WT = 1 << 1,
     144             :         MEMREMAP_WC = 1 << 2,
     145             :         MEMREMAP_ENC = 1 << 3,
     146             :         MEMREMAP_DEC = 1 << 4,
     147             : };
     148             : 
     149             : void *memremap(resource_size_t offset, size_t size, unsigned long flags);
     150             : void memunmap(void *addr);
     151             : 
     152             : /*
     153             :  * On x86 PAT systems we have memory tracking that keeps track of
     154             :  * the allowed mappings on memory ranges. This tracking works for
     155             :  * all the in-kernel mapping APIs (ioremap*), but where the user
     156             :  * wishes to map a range from a physical device into user memory
     157             :  * the tracking won't be updated. This API is to be used by
     158             :  * drivers which remap physical device pages into userspace,
     159             :  * and wants to make sure they are mapped WC and not UC.
     160             :  */
     161             : #ifndef arch_io_reserve_memtype_wc
     162             : static inline int arch_io_reserve_memtype_wc(resource_size_t base,
     163             :                                              resource_size_t size)
     164             : {
     165             :         return 0;
     166             : }
     167             : 
     168             : static inline void arch_io_free_memtype_wc(resource_size_t base,
     169             :                                            resource_size_t size)
     170             : {
     171             : }
     172             : #endif
     173             : 
     174             : int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start,
     175             :                                     resource_size_t size);
     176             : 
     177             : #endif /* _LINUX_IO_H */

Generated by: LCOV version 1.14