Commit b9e76a00 authored by Linus Torvalds's avatar Linus Torvalds

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: default avatarH. Peter Anvin <hpa@kernel.org>
Acked-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 92896bd9
...@@ -106,7 +106,7 @@ static int ioremap_change_attr(unsigned long vaddr, unsigned long size, ...@@ -106,7 +106,7 @@ static int ioremap_change_attr(unsigned long vaddr, unsigned long size,
* have to convert them into an offset in a page-aligned mapping, but the * have to convert them into an offset in a page-aligned mapping, but the
* caller shouldn't need to know that small detail. * caller shouldn't need to know that small detail.
*/ */
static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size,
enum ioremap_mode mode) enum ioremap_mode mode)
{ {
unsigned long pfn, offset, last_addr, vaddr; unsigned long pfn, offset, last_addr, vaddr;
...@@ -193,13 +193,13 @@ static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, ...@@ -193,13 +193,13 @@ static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
* *
* Must be freed with iounmap. * Must be freed with iounmap.
*/ */
void __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size) void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size)
{ {
return __ioremap(phys_addr, size, IOR_MODE_UNCACHED); return __ioremap(phys_addr, size, IOR_MODE_UNCACHED);
} }
EXPORT_SYMBOL(ioremap_nocache); EXPORT_SYMBOL(ioremap_nocache);
void __iomem *ioremap_cache(unsigned long phys_addr, unsigned long size) void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size)
{ {
return __ioremap(phys_addr, size, IOR_MODE_CACHED); return __ioremap(phys_addr, size, IOR_MODE_CACHED);
} }
......
...@@ -114,13 +114,13 @@ static inline void * phys_to_virt(unsigned long address) ...@@ -114,13 +114,13 @@ static inline void * phys_to_virt(unsigned long address)
* If the area you are trying to map is a PCI BAR you should have a * If the area you are trying to map is a PCI BAR you should have a
* look at pci_iomap(). * look at pci_iomap().
*/ */
extern void __iomem *ioremap_nocache(unsigned long offset, unsigned long size); extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size);
extern void __iomem *ioremap_cache(unsigned long offset, unsigned long size); extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);
/* /*
* The default ioremap() behavior is non-cached: * The default ioremap() behavior is non-cached:
*/ */
static inline void __iomem *ioremap(unsigned long offset, unsigned long size) static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)
{ {
return ioremap_nocache(offset, size); return ioremap_nocache(offset, size);
} }
......
...@@ -158,13 +158,13 @@ extern void early_iounmap(void *addr, unsigned long size); ...@@ -158,13 +158,13 @@ extern void early_iounmap(void *addr, unsigned long size);
* it's useful if some control registers are in such an area and write combining * it's useful if some control registers are in such an area and write combining
* or read caching is not desirable: * or read caching is not desirable:
*/ */
extern void __iomem *ioremap_nocache(unsigned long offset, unsigned long size); extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size);
extern void __iomem *ioremap_cache(unsigned long offset, unsigned long size); extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);
/* /*
* The default ioremap() behavior is non-cached: * The default ioremap() behavior is non-cached:
*/ */
static inline void __iomem *ioremap(unsigned long offset, unsigned long size) static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)
{ {
return ioremap_nocache(offset, size); return ioremap_nocache(offset, size);
} }
......
...@@ -256,7 +256,7 @@ EXPORT_SYMBOL(ioport_unmap); ...@@ -256,7 +256,7 @@ EXPORT_SYMBOL(ioport_unmap);
* */ * */
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
{ {
unsigned long start = pci_resource_start(dev, bar); resource_size_t start = pci_resource_start(dev, bar);
unsigned long len = pci_resource_len(dev, bar); unsigned long len = pci_resource_len(dev, bar);
unsigned long flags = pci_resource_flags(dev, bar); unsigned long flags = pci_resource_flags(dev, bar);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment