Notice: We have migrated to GitLab launching 2024-05-01 see here: https://gitlab.rtems.org/

Ticket #3007: cache_invalidate.diff

File cache_invalidate.diff, 3.7 KB (added by munster, on 05/08/17 at 09:58:29)
  • c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h

    diff --git a/c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h b/c/src/lib/libbsp/arm/shared/arm-l2c-310/cache_.h
    index f7017b7688..06960692c5 100644
    a b l2c_310_invalidate_1_line( const void *d_addr ) 
    945945static inline void
    946946l2c_310_invalidate_range( const void* d_addr, const size_t n_bytes )
    947947{
    948   /* Back starting address up to start of a line and invalidate until ADDR_LAST */
    949   uint32_t       adx               = (uint32_t)d_addr
    950     & ~L2C_310_DATA_LINE_MASK;
    951   const uint32_t ADDR_LAST         =
    952     (uint32_t)( (size_t)d_addr + n_bytes - 1 );
    953   uint32_t       block_end         =
    954     L2C_310_MIN( ADDR_LAST, adx + L2C_310_MAX_LOCKING_BYTES );
     948  uint32_t       adx               = (uint32_t)d_addr;
     949  uint32_t       end               =
     950    (uint32_t)( (size_t)d_addr + n_bytes );
    955951  volatile L2CC *l2cc = (volatile L2CC *) BSP_ARM_L2C_310_BASE;
    956952
    957953  if ( n_bytes == 0 ) {
    958954    return;
    959955  }
    960956
    961   for (;
    962        adx      <= ADDR_LAST;
    963        adx       = block_end + 1,
    964        block_end = L2C_310_MIN( ADDR_LAST, adx + L2C_310_MAX_LOCKING_BYTES )) {
     957  if ( adx & L2C_310_DATA_LINE_MASK ) {
     958    /* flush start line in case of misalignment */
     959    adx &= ~L2C_310_DATA_LINE_MASK;
     960    l2c_310_flush_1_line( l2cc, adx );
     961    adx += CPU_DATA_CACHE_ALIGNMENT;
     962  }
     963
     964  if ( end & L2C_310_DATA_LINE_MASK ) {
     965    /* flush end line in case of misalignment */
     966    end &= ~L2C_310_DATA_LINE_MASK;
     967    l2c_310_flush_1_line( l2cc, end );
     968  }
     969
     970  while (adx < end) {
     971    uint32_t block_end = L2C_310_MIN( end, adx + L2C_310_MAX_LOCKING_BYTES );
    965972    rtems_interrupt_lock_context lock_context;
    966973
    967974    rtems_interrupt_lock_acquire( &l2c_310_lock, &lock_context );
    968975
    969     for (; adx <= block_end; adx += CPU_DATA_CACHE_ALIGNMENT ) {
     976    for (; adx < block_end; adx += CPU_DATA_CACHE_ALIGNMENT ) {
    970977      /* Invalidate L2 cache line */
    971978      l2cc->inv_pa = adx;
    972979    }
  • c/src/lib/libbsp/arm/shared/include/arm-cache-l1.h

    diff --git a/c/src/lib/libbsp/arm/shared/include/arm-cache-l1.h b/c/src/lib/libbsp/arm/shared/include/arm-cache-l1.h
    index 9caa2685bc..f2927a2766 100644
    a b static inline void arm_cache_l1_invalidate_data_range( 
    268268)
    269269{
    270270  if ( n_bytes != 0 ) {
    271     uint32_t       adx = (uint32_t) d_addr
    272                          & ~ARM_CACHE_L1_DATA_LINE_MASK;
    273     const uint32_t end =
    274       (uint32_t)( (size_t)d_addr + n_bytes -1);
     271    uint32_t       adx = (uint32_t) d_addr;
     272    uint32_t       end =
     273      (uint32_t)( (size_t)d_addr + n_bytes );
    275274
    276275    arm_cache_l1_errata_764369_handler();
    277276   
    278     /* Back starting address up to start of a line and invalidate until end */
    279     for (;
    280          adx <= end;
    281          adx += ARM_CACHE_L1_CPU_DATA_ALIGNMENT ) {
    282         /* Invalidate the Instruction cache line */
    283         arm_cp15_data_cache_invalidate_line( (void*)adx );
     277    if (adx & ARM_CACHE_L1_DATA_LINE_MASK) {
     278      /* flush start line in case of misalignment */
     279      adx &= ~ARM_CACHE_L1_DATA_LINE_MASK;
     280      arm_cp15_data_cache_clean_and_invalidate_line( (void*)adx );
     281      adx += ARM_CACHE_L1_CPU_DATA_ALIGNMENT;
    284282    }
     283
     284    if (end & ARM_CACHE_L1_DATA_LINE_MASK) {
     285      /* flush end line in case of misalignment */
     286      end &= ~ARM_CACHE_L1_DATA_LINE_MASK;
     287      arm_cp15_data_cache_clean_and_invalidate_line( (void*)end );
     288    }
     289
     290    while (adx < end) {
     291      /* Invalidate the Data cache line */
     292      arm_cp15_data_cache_invalidate_line( (void*)adx );
     293      adx += ARM_CACHE_L1_CPU_DATA_ALIGNMENT;
     294    }
     295
    285296    /* Wait for L1 invalidate to complete */
    286297    _ARM_Data_synchronization_barrier();
    287298  }