x86-32: Pass the full resource data to ioremap()

It appears that 64-bit PCI resources cannot possibly ever have worked on
x86-32 even when the RESOURCES_64BIT config option was set, because any
driver that tried to [pci_]ioremap() the resource would have been unable
to do so because the high 32 bits would have been silently dropped on
the floor by the ioremap() routines that only used "unsigned long".

Change them to use "resource_size_t" instead, which properly encodes the
whole 64-bit resource data if RESOURCES_64BIT is enabled.

Acked-by: H. Peter Anvin <hpa@kernel.org>
Acked-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+10 -10
+3 -3
arch/x86/mm/ioremap.c
··· 106 106 * have to convert them into an offset in a page-aligned mapping, but the 107 107 * caller shouldn't need to know that small detail. 108 108 */ 109 - static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, 109 + static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size, 110 110 enum ioremap_mode mode) 111 111 { 112 112 unsigned long pfn, offset, last_addr, vaddr; ··· 193 193 * 194 194 * Must be freed with iounmap. 195 195 */ 196 - void __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size) 196 + void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size) 197 197 { 198 198 return __ioremap(phys_addr, size, IOR_MODE_UNCACHED); 199 199 } 200 200 EXPORT_SYMBOL(ioremap_nocache); 201 201 202 - void __iomem *ioremap_cache(unsigned long phys_addr, unsigned long size) 202 + void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size) 203 203 { 204 204 return __ioremap(phys_addr, size, IOR_MODE_CACHED); 205 205 }
+3 -3
include/asm-x86/io_32.h
··· 114 114 * If the area you are trying to map is a PCI BAR you should have a 115 115 * look at pci_iomap(). 116 116 */ 117 - extern void __iomem *ioremap_nocache(unsigned long offset, unsigned long size); 118 - extern void __iomem *ioremap_cache(unsigned long offset, unsigned long size); 117 + extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); 118 + extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); 119 119 120 120 /* 121 121 * The default ioremap() behavior is non-cached: 122 122 */ 123 - static inline void __iomem *ioremap(unsigned long offset, unsigned long size) 123 + static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) 124 124 { 125 125 return ioremap_nocache(offset, size); 126 126 }
+3 -3
include/asm-x86/io_64.h
··· 158 158 * it's useful if some control registers are in such an area and write combining 159 159 * or read caching is not desirable: 160 160 */ 161 - extern void __iomem *ioremap_nocache(unsigned long offset, unsigned long size); 162 - extern void __iomem *ioremap_cache(unsigned long offset, unsigned long size); 161 + extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); 162 + extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); 163 163 164 164 /* 165 165 * The default ioremap() behavior is non-cached: 166 166 */ 167 - static inline void __iomem *ioremap(unsigned long offset, unsigned long size) 167 + static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) 168 168 { 169 169 return ioremap_nocache(offset, size); 170 170 }
+1 -1
lib/iomap.c
··· 256 256 * */ 257 257 void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) 258 258 { 259 - unsigned long start = pci_resource_start(dev, bar); 259 + resource_size_t start = pci_resource_start(dev, bar); 260 260 unsigned long len = pci_resource_len(dev, bar); 261 261 unsigned long flags = pci_resource_flags(dev, bar); 262 262