Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.c

    r321 r429  
    137137 *  ARMv7におけるデータキャッシュの無効化
    138138 *
    139  *  レベル0のキャッシュのみを無効化する.
     139 *  バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ
     140 *  アルのサンプルコードを踏襲した.
    140141 */
    141142#if __TARGET_ARCH_ARM == 7
     
    144145armv7_invalidate_dcache(void)
    145146{
    146         uint32_t        reg;
     147        uint32_t        clidr, ccsidr;
     148        uint32_t        level, no_levels;
    147149        uint32_t        way, no_ways, shift_way;
    148150        uint32_t        set, no_sets, shift_set;
    149 
    150         CP15_WRITE_CSSELR(0U);
    151         CP15_READ_CCSIDR(reg);
    152         no_sets = ((reg >> 13) & 0x7fffU) + 1;
    153         shift_set = (reg & 0x07U) + 4;
    154         no_ways = ((reg >> 3) & 0x3ffU) + 1;
    155         shift_way = count_leading_zero(no_ways);
    156 
    157         for (way = 0; way < no_ways; way++){
    158                 for (set = 0; set < no_sets; set++) {
    159                         reg = (way << shift_way) | (set << shift_set);
    160                         CP15_WRITE_DCISW(reg);
     151        uint32_t        waylevel, setwaylevel;
     152
     153        CP15_READ_CLIDR(clidr);
     154        no_levels = (clidr >> 24) & 0x07U;
     155        for (level = 0; level < no_levels; level++) {
     156                if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) {
     157                        CP15_WRITE_CSSELR(level << 1);
     158                        inst_sync_barrier();
     159                        CP15_READ_CCSIDR(ccsidr);
     160                        no_sets = ((ccsidr >> 13) & 0x7fffU) + 1;
     161                        shift_set = (ccsidr & 0x07U) + 4;
     162                        no_ways = ((ccsidr >> 3) & 0x3ffU) + 1;
     163                        shift_way = count_leading_zero(no_ways - 1);
     164
     165                        for (way = 0; way < no_ways; way++) {
     166                                waylevel = (way << shift_way) | (level << 1);
     167                                for (set = 0; set < no_sets; set++) {
     168                                        setwaylevel = waylevel | (set << shift_set);
     169                                        CP15_WRITE_DCISW(setwaylevel);
     170                                }
     171                        }
    161172                }
    162173        }
     174        data_sync_barrier();
    163175}
    164176
     
    168180 *  ARMv7におけるデータキャッシュのクリーンと無効化
    169181 *
    170  *  レベル0のキャッシュのみをクリーンと無効化する.
     182 *  バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ
     183 *  アルのサンプルコードを踏襲した.
    171184 */
    172185#if __TARGET_ARCH_ARM == 7
     
    175188armv7_clean_and_invalidate_dcache(void)
    176189{
    177         uint32_t        reg;
     190        uint32_t        clidr, ccsidr;
     191        uint32_t        level, no_levels;
    178192        uint32_t        way, no_ways, shift_way;
    179193        uint32_t        set, no_sets, shift_set;
    180 
    181         CP15_WRITE_CSSELR(0U);
    182         CP15_READ_CCSIDR(reg);
    183         no_sets = ((reg >> 13) & 0x7fffU) + 1;
    184         shift_set = (reg & 0x07U) + 4;
    185         no_ways = ((reg >> 3) & 0x3ffU) + 1;
    186         shift_way = count_leading_zero(no_ways);
    187 
    188         for (way = 0; way < no_ways; way++){
    189                 for (set = 0; set < no_sets; set++) {
    190                         reg = (way << shift_way) | (set << shift_set);
    191                         CP15_WRITE_DCCISW(reg);
     194        uint32_t        waylevel, setwaylevel;
     195
     196        CP15_READ_CLIDR(clidr);
     197        no_levels = (clidr >> 24) & 0x07U;
     198        for (level = 0; level < no_levels; level++) {
     199                if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) {
     200                        CP15_WRITE_CSSELR(level << 1);
     201                        inst_sync_barrier();
     202                        CP15_READ_CCSIDR(ccsidr);
     203                        no_sets = ((ccsidr >> 13) & 0x7fffU) + 1;
     204                        shift_set = (ccsidr & 0x07U) + 4;
     205                        no_ways = ((ccsidr >> 3) & 0x3ffU) + 1;
     206                        shift_way = count_leading_zero(no_ways - 1);
     207
     208                        for (way = 0; way < no_ways; way++) {
     209                                waylevel = (way << shift_way) | (level << 1);
     210                                for (set = 0; set < no_sets; set++) {
     211                                        setwaylevel = waylevel | (set << shift_set);
     212                                        CP15_WRITE_DCCISW(setwaylevel);
     213                                }
     214                        }
    192215                }
    193216        }
     217        data_sync_barrier();
    194218}
    195219
Note: See TracChangeset for help on using the changeset viewer.