Ignore:
Timestamp:
2015-10-03T08:37:37Z (9 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
afe5e09
Parents:
8ca6f08
Message:

Cleanup some of the cache maintenance mess on ARM

  • Do not define ARMv7 cache maintenance registers for ARMv6-.
  • Define missing ARMv6- registers using analoguos naming convention.
  • In smc_coherence() and pt_coherence_m(), do not blindly use ARMv7 DCCVMAU but decide the proper type of cache maintenance operation in dcache_clean_mva_pou().
  • Also, do not use ARMv7 ICIALLU directly, but call icache_invalidate() instead, which does the right thing.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/include/arch/barrier.h

    r8ca6f08 rd5610b9  
    3838
    3939#ifdef KERNEL
     40#include <arch/cache.h>
    4041#include <arch/cp15.h>
    4142#else
     
    7172 * CP15 implementation is mandatory only for armv6+.
    7273 */
     74#if defined(PROCESSOR_ARCH_armv6) || defined(PROCESSOR_ARCH_armv7_a)
    7375#define memory_barrier()  CP15DMB_write(0)
    74 #define read_barrier()    CP15DSB_write(0)
     76#else
     77#define memory_barrier()  CP15DSB_write(0)
     78#endif
     79#define read_barrier()    CP15DSB_write(0)
    7580#define write_barrier()   read_barrier()
     81#if defined(PROCESSOR_ARCH_armv6) || defined(PROCESSOR_ARCH_armv7_a)
    7682#define inst_barrier()    CP15ISB_write(0)
     83#else
     84#define inst_barrier()
     85#endif
    7786#else
    7887/* Older manuals mention syscalls as a way to implement cache coherency and
     
    103112
    104113#if defined PROCESSOR_ARCH_armv7_a | defined PROCESSOR_ARCH_armv6 | defined KERNEL
    105 /* Available on all supported arms,
    106  * invalidates entire ICache so the written value does not matter. */
    107114//TODO might be PL1 only on armv5-
    108115#define smc_coherence(a) \
    109116do { \
    110         DCCMVAU_write((uint32_t)(a));  /* Flush changed memory */\
     117        dcache_clean_mva_pou((uintptr_t) a);\
    111118        write_barrier();               /* Wait for completion */\
    112         ICIALLU_write(0);              /* Flush ICache */\
     119        icache_invalidate();\
    113120        inst_barrier();                /* Wait for Inst refetch */\
    114121} while (0)
Note: See TracChangeset for help on using the changeset viewer.