lkml.org 
[lkml]   [2019]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/4] powerpc/32: define helpers to get L1 cache sizes.
    Date
    This patch defines C helpers to retrieve the size of
    cache blocks and uses them in the cacheflush functions.

    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
    ---
    arch/powerpc/include/asm/cache.h | 16 ++++++++++++++--
    arch/powerpc/include/asm/cacheflush.h | 24 +++++++++++++++---------
    2 files changed, 29 insertions(+), 11 deletions(-)

    diff --git a/arch/powerpc/include/asm/cache.h b/arch/powerpc/include/asm/cache.h
    index 40ea5b3781c6..0009a0a82e86 100644
    --- a/arch/powerpc/include/asm/cache.h
    +++ b/arch/powerpc/include/asm/cache.h
    @@ -33,7 +33,8 @@

    #define IFETCH_ALIGN_BYTES (1 << IFETCH_ALIGN_SHIFT)

    -#if defined(__powerpc64__) && !defined(__ASSEMBLY__)
    +#if !defined(__ASSEMBLY__)
    +#ifdef CONFIG_PPC64

    struct ppc_cache_info {
    u32 size;
    @@ -53,7 +54,18 @@ struct ppc64_caches {
    };

    extern struct ppc64_caches ppc64_caches;
    -#endif /* __powerpc64__ && ! __ASSEMBLY__ */
    +#else
    +static inline u32 l1_cache_shift(void)
    +{
    + return L1_CACHE_SHIFT;
    +}
    +
    +static inline u32 l1_cache_bytes(void)
    +{
    + return L1_CACHE_BYTES;
    +}
    +#endif
    +#endif /* ! __ASSEMBLY__ */

    #if defined(__ASSEMBLY__)
    /*
    diff --git a/arch/powerpc/include/asm/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h
    index e9a40b110f1d..d405f18441cd 100644
    --- a/arch/powerpc/include/asm/cacheflush.h
    +++ b/arch/powerpc/include/asm/cacheflush.h
    @@ -64,11 +64,13 @@ static inline void __flush_dcache_icache_phys(unsigned long physaddr)
    */
    static inline void flush_dcache_range(unsigned long start, unsigned long stop)
    {
    - void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
    - unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
    + unsigned long shift = l1_cache_shift();
    + unsigned long bytes = l1_cache_bytes();
    + void *addr = (void *)(start & ~(bytes - 1));
    + unsigned long size = stop - (unsigned long)addr + (bytes - 1);
    unsigned long i;

    - for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
    + for (i = 0; i < size >> shift; i++, addr += bytes)
    dcbf(addr);
    mb(); /* sync */
    }
    @@ -80,11 +82,13 @@ static inline void flush_dcache_range(unsigned long start, unsigned long stop)
    */
    static inline void clean_dcache_range(unsigned long start, unsigned long stop)
    {
    - void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
    - unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
    + unsigned long shift = l1_cache_shift();
    + unsigned long bytes = l1_cache_bytes();
    + void *addr = (void *)(start & ~(bytes - 1));
    + unsigned long size = stop - (unsigned long)addr + (bytes - 1);
    unsigned long i;

    - for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
    + for (i = 0; i < size >> shift; i++, addr += bytes)
    dcbst(addr);
    mb(); /* sync */
    }
    @@ -97,11 +101,13 @@ static inline void clean_dcache_range(unsigned long start, unsigned long stop)
    static inline void invalidate_dcache_range(unsigned long start,
    unsigned long stop)
    {
    - void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
    - unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
    + unsigned long shift = l1_cache_shift();
    + unsigned long bytes = l1_cache_bytes();
    + void *addr = (void *)(start & ~(bytes - 1));
    + unsigned long size = stop - (unsigned long)addr + (bytes - 1);
    unsigned long i;

    - for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
    + for (i = 0; i < size >> shift; i++, addr += bytes)
    dcbi(addr);
    mb(); /* sync */
    }
    --
    2.13.3
    \
     
     \ /
      Last update: 2019-05-14 11:05    [W:5.077 / U:1.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site