Re: [PATCH 1/4] lib: move pci_iomap.c to drivers/pci/

Philipp Stanner
2023-11-21T10:44:46Z

On Tue, 2023-11-21 at 12:20 +0800, kernel test robot wrote:
> Hi Philipp,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on pci/next]
> [also build test ERROR on pci/for-linus linus/master v6.7-rc2 next-
> 20231120]
> [If your patch is applied to the wrong git tree, kindly drop us a
> note.
> And when submitting patch, we suggest to use '--base' as documented
> in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url:
> https://github.com/intel-lab-lkp/linux/commits/Philipp-Stanner/lib-move-pci_iomap-c-to-drivers-pci/20231121-060258
> base:
> https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next
> patch link:
> https://lore.kernel.org/r/20231120215945.52027-3-pstanner%40redhat.com
> patch subject: [PATCH 1/4] lib: move pci_iomap.c to drivers/pci/
> config: openrisc-allnoconfig
> (https://download.01.org/0day-ci/archive/20231121/202311211216.KqPYvO
> CI-lkp@intel.com/config)
> compiler: or1k-linux-gcc (GCC) 13.2.0
> reproduce (this is a W=1 build):
> (https://download.01.org/0day-ci/archive/20231121/202311211216.KqPYvO
> CI-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new
> version of
> the same patch/commit), kindly add following tags
> > Reported-by: kernel test robot <lkp@intel.com>
> > Closes:
> > https://lore.kernel.org/oe-kbuild-all/202311211216.KqPYvOCI-lkp@intel.com/
>
> All error/warnings (new ones prefixed by >>):
>
> > > drivers/pci/iomap.c:27:15: error: redefinition of
> > > 'pci_iomap_range'
>       27 | void __iomem *pci_iomap_range(struct pci_dev *dev,
>          |               ^~~~~~~~~~~~~~~
>    In file included from include/asm-generic/io.h:20,
>                     from arch/openrisc/include/asm/io.h:37,
>                     from include/linux/io.h:13,
>                     from include/linux/irq.h:20,
>                     from include/asm-generic/hardirq.h:17,
>                     from
> ./arch/openrisc/include/generated/asm/hardirq.h:1,
>                     from include/linux/hardirq.h:11,
>                     from include/linux/interrupt.h:11,
>                     from include/linux/pci.h:38,
>                     from drivers/pci/iomap.c:7:
>    include/asm-generic/pci_iomap.h:44:29: note: previous definition
> of 'pci_iomap_range' with type 'void *(struct pci_dev *, int,  long
> unsigned int,  long unsigned int)'
>       44 | static inline void __iomem *pci_iomap_range(struct pci_dev
> *dev, int bar,
>          |                             ^~~~~~~~~~~~~~~
>    drivers/pci/iomap.c: In function 'pci_iomap_range':
> > > drivers/pci/iomap.c:43:24: error: implicit declaration of
> > > function '__pci_ioport_map'; did you mean 'devm_ioport_map'? [-
> > > Werror=implicit-function-declaration]
>       43 |                 return __pci_ioport_map(dev, start, len);
>          |                        ^~~~~~~~~~~~~~~~
>          |                        devm_ioport_map
> > > drivers/pci/iomap.c:43:24: warning: returning 'int' from a
> > > function with return type 'void *' makes pointer from integer
> > > without a cast [-Wint-conversion]
>       43 |                 return __pci_ioport_map(dev, start, len);
>          |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    drivers/pci/iomap.c: At top level:
> > > drivers/pci/iomap.c:67:15: error: redefinition of
> > > 'pci_iomap_wc_range'
>       67 | void __iomem *pci_iomap_wc_range(struct pci_dev *dev,
>          |               ^~~~~~~~~~~~~~~~~~
>    include/asm-generic/pci_iomap.h:50:29: note: previous definition
> of 'pci_iomap_wc_range' with type 'void *(struct pci_dev *, int,
> long unsigned int,  long unsigned int)'
>       50 | static inline void __iomem *pci_iomap_wc_range(struct
> pci_dev *dev, int bar,
>          |                             ^~~~~~~~~~~~~~~~~~
> > > drivers/pci/iomap.c:110:15: error: redefinition of 'pci_iomap'
>      110 | void __iomem *pci_iomap(struct pci_dev *dev, int bar,
> unsigned long maxlen)
>          |               ^~~~~~~~~
>    include/asm-generic/pci_iomap.h:35:29: note: previous definition
> of 'pci_iomap' with type 'void *(struct pci_dev *, int,  long
> unsigned int)'
>       35 | static inline void __iomem *pci_iomap(struct pci_dev *dev,
> int bar, unsigned long max)
>          |                             ^~~~~~~~~
> > > drivers/pci/iomap.c:131:15: error: redefinition of 'pci_iomap_wc'
>      131 | void __iomem *pci_iomap_wc(struct pci_dev *dev, int bar,
> unsigned long maxlen)
>          |               ^~~~~~~~~~~~
>    include/asm-generic/pci_iomap.h:40:29: note: previous definition
> of 'pci_iomap_wc' with type 'void *(struct pci_dev *, int,  long
> unsigned int)'
>       40 | static inline void __iomem *pci_iomap_wc(struct pci_dev
> *dev, int bar, unsigned long max)
>          |                             ^~~~~~~~~~~~
> > > drivers/pci/iomap.c:164:6: error: redefinition of 'pci_iounmap'
>      164 | void pci_iounmap(struct pci_dev *dev, void __iomem *p)
>          |      ^~~~~~~~~~~
>    include/asm-generic/pci_iomap.h:56:20: note: previous definition
> of 'pci_iounmap' with type 'void(struct pci_dev *, void *)'
>       56 | static inline void pci_iounmap(struct pci_dev *dev, void
> __iomem *addr)
>          |                    ^~~~~~~~~~~
>    cc1: some warnings being treated as errors
>
> Kconfig warnings: (for reference only)
>    WARNING: unmet direct dependencies detected for GENERIC_PCI_IOMAP
>    Depends on [n]: PCI [=n]
>    Selected by [y]:
>    - OPENRISC [=y]

OK, so the issue here seems to be that you can not have
GENERIC_PCI_IOMAP depend on PCI.

Previously, #ifdef CONFIG_PCI made the (in this case) redundant
function definitions disappear, which is not the case anymore for
configs that want GENERIC_PCI_IOMAP but not PCI.

My bad.
I'll address that in the next version.

P.

>
>
> vim +/pci_iomap_range +27 drivers/pci/iomap.c
>
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   11
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   12
> /**
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   13   *
> pci_iomap_range - create a virtual mapping cookie for a PCI BAR
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   14   *
> @dev: PCI device that owns the BAR
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   15   *
> @bar: BAR number
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   16   *
> @offset: map memory at the given offset in BAR
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   17   *
> @maxlen: max length of the memory to map
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   18   *
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   19   *
> Using this function you will get a __iomem address to your device
> BAR.
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   20   *
> You can access it using ioread*() and iowrite*(). These functions
> hide
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   21   *
> the details if this is a MMIO or PIO address space and will just do
> what
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   22   *
> you expect from them in the correct way.
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   23   *
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   24   *
> @maxlen specifies the maximum length to map. If you want to get
> access to
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   25   *
> the complete BAR from offset to the end, pass %0 here.
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   26   *
> */
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  @27
> void __iomem *pci_iomap_range(struct pci_dev *dev,
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 28                             int bar,
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 29                             unsigned long offset,
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 30                             unsigned long maxlen)
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   31  {
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 32       resource_size_t start = pci_resource_start(dev, bar);
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 33       resource_size_t len = pci_resource_len(dev, bar);
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 34       unsigned long flags = pci_resource_flags(dev, bar);
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   35
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 36       if (len <= offset || !start)
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 37               return NULL;
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 38       len -= offset;
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 39       start += offset;
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 40       if (maxlen && len > maxlen)
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 41               len = maxlen;
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 42       if (flags & IORESOURCE_IO)
> b923650b84068b lib/pci_iomap.c Michael S. Tsirkin 2012-01-30
> @43               return __pci_ioport_map(dev, start, len);
> 92b19ff50e8f24 lib/pci_iomap.c Dan Williams       2015-08-10
> 44       if (flags & IORESOURCE_MEM)
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 45               return ioremap(start, len);
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 46       /* What? */
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24
> 47       return NULL;
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   48  }
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   49
> EXPORT_SYMBOL(pci_iomap_range);
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24   50
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   51
> /**
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   52   *
> pci_iomap_wc_range - create a virtual WC mapping cookie for a PCI BAR
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   53   *
> @dev: PCI device that owns the BAR
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   54   *
> @bar: BAR number
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   55   *
> @offset: map memory at the given offset in BAR
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   56   *
> @maxlen: max length of the memory to map
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   57   *
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   58   *
> Using this function you will get a __iomem address to your device
> BAR.
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   59   *
> You can access it using ioread*() and iowrite*(). These functions
> hide
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   60   *
> the details if this is a MMIO or PIO address space and will just do
> what
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   61   *
> you expect from them in the correct way. When possible write
> combining
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   62   *
> is used.
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   63   *
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   64   *
> @maxlen specifies the maximum length to map. If you want to get
> access to
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   65   *
> the complete BAR from offset to the end, pass %0 here.
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   66   *
> */
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  @67
> void __iomem *pci_iomap_wc_range(struct pci_dev *dev,
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 68                                int bar,
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 69                                unsigned long offset,
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 70                                unsigned long maxlen)
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   71  {
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 72       resource_size_t start = pci_resource_start(dev, bar);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 73       resource_size_t len = pci_resource_len(dev, bar);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 74       unsigned long flags = pci_resource_flags(dev, bar);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   75
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   76
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 77       if (flags & IORESOURCE_IO)
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 78               return NULL;
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   79
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 80       if (len <= offset || !start)
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 81               return NULL;
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   82
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 83       len -= offset;
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 84       start += offset;
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 85       if (maxlen && len > maxlen)
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 86               len = maxlen;
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   87
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 88       if (flags & IORESOURCE_MEM)
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 89               return ioremap_wc(start, len);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   90
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 91       /* What? */
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 92       return NULL;
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   93  }
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   94
> EXPORT_SYMBOL_GPL(pci_iomap_wc_range);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24   95
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   96
> /**
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   97   *
> pci_iomap - create a virtual mapping cookie for a PCI BAR
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   98   *
> @dev: PCI device that owns the BAR
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29   99   *
> @bar: BAR number
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  100   *
> @maxlen: length of the memory to map
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  101   *
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  102   *
> Using this function you will get a __iomem address to your device
> BAR.
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  103   *
> You can access it using ioread*() and iowrite*(). These functions
> hide
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  104   *
> the details if this is a MMIO or PIO address space and will just do
> what
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  105   *
> you expect from them in the correct way.
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  106   *
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  107   *
> @maxlen specifies the maximum length to map. If you want to get
> access to
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  108   *
> the complete BAR without checking for its length first, pass %0 here.
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  109   *
> */
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29 @110
> void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long
> maxlen)
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  111  {
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29
> 112       return pci_iomap_range(dev, bar, 0, maxlen);
> eb29d8d2aad706 lib/pci_iomap.c Michael S. Tsirkin 2013-05-29  113  }
> 66eab4df288aae lib/pci_iomap.c Michael S. Tsirkin 2011-11-24  114
> EXPORT_SYMBOL(pci_iomap);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  115
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  116
> /**
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  117   *
> pci_iomap_wc - create a virtual WC mapping cookie for a PCI BAR
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  118   *
> @dev: PCI device that owns the BAR
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  119   *
> @bar: BAR number
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  120   *
> @maxlen: length of the memory to map
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  121   *
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  122   *
> Using this function you will get a __iomem address to your device
> BAR.
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  123   *
> You can access it using ioread*() and iowrite*(). These functions
> hide
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  124   *
> the details if this is a MMIO or PIO address space and will just do
> what
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  125   *
> you expect from them in the correct way. When possible write
> combining
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  126   *
> is used.
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  127   *
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  128   *
> @maxlen specifies the maximum length to map. If you want to get
> access to
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  129   *
> the complete BAR without checking for its length first, pass %0 here.
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  130   *
> */
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24 @131
> void __iomem *pci_iomap_wc(struct pci_dev *dev, int bar, unsigned
> long maxlen)
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  132  {
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24
> 133       return pci_iomap_wc_range(dev, bar, 0, maxlen);
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  134  }
> 1b3d4200c1e00a lib/pci_iomap.c Luis R. Rodriguez  2015-08-24  135
> EXPORT_SYMBOL_GPL(pci_iomap_wc);
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  136
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  137  /*
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  138   *
> pci_iounmap() somewhat illogically comes from lib/iomap.c for the
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  139   *
> CONFIG_GENERIC_IOMAP case, because that's the code that knows about
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  140   *
> the different IOMAP ranges.
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  141   *
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  142   *
> But if the architecture does not use the generic iomap code, and if
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  143   *
> it has _not_ defined it's own private pci_iounmap function, we define
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  144   *
> it here.
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  145   *
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  146   *
> NOTE! This default implementation assumes that if the architecture
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  147   *
> support ioport mapping (HAS_IOPORT_MAP), the ioport mapping will
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  148   *
> be fixed to the range [ PCI_IOBASE, PCI_IOBASE+IO_SPACE_LIMIT [,
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  149   *
> and does not need unmapping with 'ioport_unmap()'.
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  150   *
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  151   *
> If you have different rules for your architecture, you need to
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  152   *
> implement your own pci_iounmap() that knows the rules for where
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  153   *
> and how IO vs MEM get mapped.
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  154   *
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  155   *
> This code is odd, and the ARCH_HAS/ARCH_WANTS #define logic comes
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  156   *
> from legacy <asm-generic/io.h> header file behavior. In particular,
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  157   *
> it would seem to make sense to do the iounmap(p) for the non-IO-space
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  158   *
> case here regardless, but that's not what the old header file code
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  159   *
> did. Probably incorrectly, but this is meant to be bug-for-bug
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  160   *
> compatible.
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  161
> */
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  162
> #if defined(ARCH_WANTS_GENERIC_PCI_IOUNMAP)
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  163
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19 @164
> void pci_iounmap(struct pci_dev *dev, void __iomem *p)
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  165  {
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  166
> #ifdef ARCH_HAS_GENERIC_IOPORT_MAP
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19
> 167       uintptr_t start = (uintptr_t) PCI_IOBASE;
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19
> 168       uintptr_t addr = (uintptr_t) p;
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  169
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19
> 170       if (addr >= start && addr < start + IO_SPACE_LIMIT)
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19
> 171               return;
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19
> 172       iounmap(p);
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  173
> #endif
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  174  }
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  175
> EXPORT_SYMBOL(pci_iounmap);
> 316e8d79a0959c lib/pci_iomap.c Linus Torvalds     2021-09-19  176
>