lkml.org 
[lkml]   [2008]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: ohci1394 problem (MMIO broken) (was 2.6.25-rc6-git6: Reported regressions from 2.6.24)


    On Sat, 22 Mar 2008, Linus Torvalds wrote:
    >
    > AND no, I don't think our x86-32 ioremap() actually works for this case,
    > because while the resource data may have the full 64 bits, when the
    > ioremap() happens it gets truncated to 32 bits.

    Does this patch make any difference?

    (ENTIRELY untested, I checked that it compiles on x86-64, but didn't even
    test a 32-bit build, I'm hoping whoever sees this issue can also fix up
    the inevitable small missed pieces)

    Linus

    ---
    arch/x86/mm/ioremap.c | 6 +++---
    include/asm-x86/io_32.h | 6 +++---
    include/asm-x86/io_64.h | 6 +++---
    lib/iomap.c | 2 +-
    4 files changed, 10 insertions(+), 10 deletions(-)

    diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
    index 8fe576b..4afaba0 100644
    --- a/arch/x86/mm/ioremap.c
    +++ b/arch/x86/mm/ioremap.c
    @@ -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
    * 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)
    {
    unsigned long pfn, offset, last_addr, vaddr;
    @@ -193,13 +193,13 @@ static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
    *
    * 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);
    }
    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);
    }
    diff --git a/include/asm-x86/io_32.h b/include/asm-x86/io_32.h
    index 58d2c45..d4d8fbd 100644
    --- a/include/asm-x86/io_32.h
    +++ b/include/asm-x86/io_32.h
    @@ -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
    * look at pci_iomap().
    */
    -extern void __iomem *ioremap_nocache(unsigned long offset, unsigned long size);
    -extern void __iomem *ioremap_cache(unsigned long offset, unsigned long size);
    +extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size);
    +extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);

    /*
    * 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);
    }
    diff --git a/include/asm-x86/io_64.h b/include/asm-x86/io_64.h
    index f64a59c..db0be20 100644
    --- a/include/asm-x86/io_64.h
    +++ b/include/asm-x86/io_64.h
    @@ -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
    * or read caching is not desirable:
    */
    -extern void __iomem *ioremap_nocache(unsigned long offset, unsigned long size);
    -extern void __iomem *ioremap_cache(unsigned long offset, unsigned long size);
    +extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size);
    +extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);

    /*
    * 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);
    }
    diff --git a/lib/iomap.c b/lib/iomap.c
    index db004a9..dd6ca48 100644
    --- a/lib/iomap.c
    +++ b/lib/iomap.c
    @@ -256,7 +256,7 @@ EXPORT_SYMBOL(ioport_unmap);
    * */
    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 flags = pci_resource_flags(dev, bar);


    \
     
     \ /
      Last update: 2008-03-23 00:05    [W:0.028 / U:61.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site