Message ID | 1432940350-1802-7-git-send-email-toshi.kani@hp.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
On Sat, May 30, 2015 at 12:59 AM, Toshi Kani <toshi.kani@hp.com> wrote: > --- a/include/asm-generic/io.h > +++ b/include/asm-generic/io.h > @@ -785,8 +785,17 @@ static inline void __iomem *ioremap_wc(phys_addr_t offset, size_t size) > } > #endif > > +#ifndef ioremap_wt > +#define ioremap_wt ioremap_wt > +static inline void __iomem *ioremap_wt(phys_addr_t offset, size_t size) > +{ > + return ioremap_nocache(offset, size); > +} > +#endif > + > #ifndef iounmap > #define iounmap iounmap > + > static inline void iounmap(void __iomem *addr) > { > } > diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h > index 1b41011..d8f8622 100644 > --- a/include/asm-generic/iomap.h > +++ b/include/asm-generic/iomap.h > @@ -66,6 +66,10 @@ extern void ioport_unmap(void __iomem *); > #define ioremap_wc ioremap_nocache > #endif > > +#ifndef ARCH_HAS_IOREMAP_WT > +#define ioremap_wt ioremap_nocache > +#endif Defining ioremap_wt in two different places in asm-generic looks fishy to me. If <asm/io.h> already provides it (either through asm-generic/io.h or arch/<arch>/include/asm/io.h), why does asm-generic/iomap.h need to define its own version? I see this pattern already exists for ioremap_wc... Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
On Sat, 2015-05-30 at 11:18 +0200, Geert Uytterhoeven wrote: > On Sat, May 30, 2015 at 12:59 AM, Toshi Kani <toshi.kani@hp.com> wrote: > > --- a/include/asm-generic/io.h > > +++ b/include/asm-generic/io.h > > @@ -785,8 +785,17 @@ static inline void __iomem *ioremap_wc(phys_addr_t offset, size_t size) > > } > > #endif > > > > +#ifndef ioremap_wt > > +#define ioremap_wt ioremap_wt > > +static inline void __iomem *ioremap_wt(phys_addr_t offset, size_t size) > > +{ > > + return ioremap_nocache(offset, size); > > +} > > +#endif > > + > > #ifndef iounmap > > #define iounmap iounmap > > + > > static inline void iounmap(void __iomem *addr) > > { > > } > > diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h > > index 1b41011..d8f8622 100644 > > --- a/include/asm-generic/iomap.h > > +++ b/include/asm-generic/iomap.h > > @@ -66,6 +66,10 @@ extern void ioport_unmap(void __iomem *); > > #define ioremap_wc ioremap_nocache > > #endif > > > > +#ifndef ARCH_HAS_IOREMAP_WT > > +#define ioremap_wt ioremap_nocache > > +#endif > > Defining ioremap_wt in two different places in asm-generic looks fishy to me. > > If <asm/io.h> already provides it (either through asm-generic/io.h or > arch/<arch>/include/asm/io.h), why does asm-generic/iomap.h need to define > its own version? > > I see this pattern already exists for ioremap_wc... Yes, this patchset follows the model of ioremap_wc. This duplication was introduced by 9216efafc52 "asm-generic/io.h: Reconcile I/O accessor overrides", while the original ioremap_wc support changed asm-generic/iomap.h (1526a756fba). As described in patch 07, some architectures define ioremap_xxx() locally as well. It is too risky to do everything in one short. I will look into the duplication issue as a separate item after this patchset is settled. Thanks, -Toshi
diff --git a/Documentation/x86/pat.txt b/Documentation/x86/pat.txt index 521bd8a..db0de6c 100644 --- a/Documentation/x86/pat.txt +++ b/Documentation/x86/pat.txt @@ -12,7 +12,7 @@ virtual addresses. PAT allows for different types of memory attributes. The most commonly used ones that will be supported at this time are Write-back, Uncached, -Write-combined and Uncached Minus. +Write-combined, Write-through and Uncached Minus. PAT APIs @@ -40,6 +40,8 @@ ioremap_nocache | -- | UC- | UC- | | | | | ioremap_wc | -- | -- | WC | | | | | +ioremap_wt | -- | -- | WT | + | | | | set_memory_uc | UC- | -- | -- | set_memory_wb | | | | | | | | diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index a2b9740..6c3a130 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h @@ -35,6 +35,7 @@ */ #define ARCH_HAS_IOREMAP_WC +#define ARCH_HAS_IOREMAP_WT #include <linux/string.h> #include <linux/compiler.h> @@ -321,6 +322,7 @@ extern void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr); extern int ioremap_change_attr(unsigned long vaddr, unsigned long size, enum page_cache_mode pcm); extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size); +extern void __iomem *ioremap_wt(resource_size_t offset, unsigned long size); extern bool is_early_ioremap_ptep(pte_t *ptep); diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 078c270..779b1a2 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -172,6 +172,10 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, prot = __pgprot(pgprot_val(prot) | cachemode2protval(_PAGE_CACHE_MODE_WC)); break; + case _PAGE_CACHE_MODE_WT: + prot = __pgprot(pgprot_val(prot) | + cachemode2protval(_PAGE_CACHE_MODE_WT)); + break; case _PAGE_CACHE_MODE_WB: break; } @@ -297,6 +301,23 @@ void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size) } EXPORT_SYMBOL(ioremap_wc); +/** + * ioremap_wt - map memory into CPU space write through + * @phys_addr: bus address of the memory + * @size: size of the resource to map + * + * This version of ioremap ensures that the memory is marked write through. + * Write through stores data into memory while keeping the cache up-to-date. + * + * Must be freed with iounmap. + */ +void __iomem *ioremap_wt(resource_size_t phys_addr, unsigned long size) +{ + return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WT, + __builtin_return_address(0)); +} +EXPORT_SYMBOL(ioremap_wt); + void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size) { return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB, diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 90ccba7..f56094c 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -785,8 +785,17 @@ static inline void __iomem *ioremap_wc(phys_addr_t offset, size_t size) } #endif +#ifndef ioremap_wt +#define ioremap_wt ioremap_wt +static inline void __iomem *ioremap_wt(phys_addr_t offset, size_t size) +{ + return ioremap_nocache(offset, size); +} +#endif + #ifndef iounmap #define iounmap iounmap + static inline void iounmap(void __iomem *addr) { } diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h index 1b41011..d8f8622 100644 --- a/include/asm-generic/iomap.h +++ b/include/asm-generic/iomap.h @@ -66,6 +66,10 @@ extern void ioport_unmap(void __iomem *); #define ioremap_wc ioremap_nocache #endif +#ifndef ARCH_HAS_IOREMAP_WT +#define ioremap_wt ioremap_nocache +#endif + #ifdef CONFIG_PCI /* Destroy a virtual mapping cookie for a PCI BAR (memory or IO) */ struct pci_dev;