18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * include/asm-xtensa/cacheasm.h 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 58c2ecf20Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 68c2ecf20Sopenharmony_ci * for more details. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Copyright (C) 2006 Tensilica Inc. 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/cache.h> 128c2ecf20Sopenharmony_ci#include <asm/asmmacro.h> 138c2ecf20Sopenharmony_ci#include <linux/stringify.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* 168c2ecf20Sopenharmony_ci * Define cache functions as macros here so that they can be used 178c2ecf20Sopenharmony_ci * by the kernel and boot loader. We should consider moving them to a 188c2ecf20Sopenharmony_ci * library that can be linked by both. 198c2ecf20Sopenharmony_ci * 208c2ecf20Sopenharmony_ci * Locking 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci * ___unlock_dcache_all 238c2ecf20Sopenharmony_ci * ___unlock_icache_all 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * Flush and invaldating 268c2ecf20Sopenharmony_ci * 278c2ecf20Sopenharmony_ci * ___flush_invalidate_dcache_{all|range|page} 288c2ecf20Sopenharmony_ci * ___flush_dcache_{all|range|page} 298c2ecf20Sopenharmony_ci * ___invalidate_dcache_{all|range|page} 308c2ecf20Sopenharmony_ci * ___invalidate_icache_{all|range|page} 318c2ecf20Sopenharmony_ci * 328c2ecf20Sopenharmony_ci */ 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci .macro __loop_cache_unroll ar at insn size line_width max_immed 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci .if (1 << (\line_width)) > (\max_immed) 388c2ecf20Sopenharmony_ci .set _reps, 1 398c2ecf20Sopenharmony_ci .elseif (2 << (\line_width)) > (\max_immed) 408c2ecf20Sopenharmony_ci .set _reps, 2 418c2ecf20Sopenharmony_ci .else 428c2ecf20Sopenharmony_ci .set _reps, 4 438c2ecf20Sopenharmony_ci .endif 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci __loopi \ar, \at, \size, (_reps << (\line_width)) 468c2ecf20Sopenharmony_ci .set _index, 0 478c2ecf20Sopenharmony_ci .rep _reps 488c2ecf20Sopenharmony_ci \insn \ar, _index << (\line_width) 498c2ecf20Sopenharmony_ci .set _index, _index + 1 508c2ecf20Sopenharmony_ci .endr 518c2ecf20Sopenharmony_ci __endla \ar, \at, _reps << (\line_width) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci .endm 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci .macro __loop_cache_all ar at insn size line_width max_immed 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci movi \ar, 0 598c2ecf20Sopenharmony_ci __loop_cache_unroll \ar, \at, \insn, \size, \line_width, \max_immed 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci .endm 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci .macro __loop_cache_range ar as at insn line_width 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci extui \at, \ar, 0, \line_width 678c2ecf20Sopenharmony_ci add \as, \as, \at 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci __loops \ar, \as, \at, \line_width 708c2ecf20Sopenharmony_ci \insn \ar, 0 718c2ecf20Sopenharmony_ci __endla \ar, \at, (1 << (\line_width)) 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci .endm 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci .macro __loop_cache_page ar at insn line_width max_immed 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci __loop_cache_unroll \ar, \at, \insn, PAGE_SIZE, \line_width, \max_immed 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci .endm 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci .macro ___unlock_dcache_all ar at 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_LINE_LOCKABLE && XCHAL_DCACHE_SIZE 868c2ecf20Sopenharmony_ci __loop_cache_all \ar \at diu XCHAL_DCACHE_SIZE \ 878c2ecf20Sopenharmony_ci XCHAL_DCACHE_LINEWIDTH 240 888c2ecf20Sopenharmony_ci#endif 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci .endm 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci .macro ___unlock_icache_all ar at 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#if XCHAL_ICACHE_LINE_LOCKABLE && XCHAL_ICACHE_SIZE 968c2ecf20Sopenharmony_ci __loop_cache_all \ar \at iiu XCHAL_ICACHE_SIZE \ 978c2ecf20Sopenharmony_ci XCHAL_ICACHE_LINEWIDTH 240 988c2ecf20Sopenharmony_ci#endif 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci .endm 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci .macro ___flush_invalidate_dcache_all ar at 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1068c2ecf20Sopenharmony_ci __loop_cache_all \ar \at diwbi XCHAL_DCACHE_SIZE \ 1078c2ecf20Sopenharmony_ci XCHAL_DCACHE_LINEWIDTH 240 1088c2ecf20Sopenharmony_ci#endif 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci .endm 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci .macro ___flush_dcache_all ar at 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1168c2ecf20Sopenharmony_ci __loop_cache_all \ar \at diwb XCHAL_DCACHE_SIZE \ 1178c2ecf20Sopenharmony_ci XCHAL_DCACHE_LINEWIDTH 240 1188c2ecf20Sopenharmony_ci#endif 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci .endm 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci .macro ___invalidate_dcache_all ar at 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1268c2ecf20Sopenharmony_ci __loop_cache_all \ar \at dii XCHAL_DCACHE_SIZE \ 1278c2ecf20Sopenharmony_ci XCHAL_DCACHE_LINEWIDTH 1020 1288c2ecf20Sopenharmony_ci#endif 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci .endm 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci .macro ___invalidate_icache_all ar at 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#if XCHAL_ICACHE_SIZE 1368c2ecf20Sopenharmony_ci __loop_cache_all \ar \at iii XCHAL_ICACHE_SIZE \ 1378c2ecf20Sopenharmony_ci XCHAL_ICACHE_LINEWIDTH 1020 1388c2ecf20Sopenharmony_ci#endif 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci .endm 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci .macro ___flush_invalidate_dcache_range ar as at 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1478c2ecf20Sopenharmony_ci __loop_cache_range \ar \as \at dhwbi XCHAL_DCACHE_LINEWIDTH 1488c2ecf20Sopenharmony_ci#endif 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci .endm 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci .macro ___flush_dcache_range ar as at 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1568c2ecf20Sopenharmony_ci __loop_cache_range \ar \as \at dhwb XCHAL_DCACHE_LINEWIDTH 1578c2ecf20Sopenharmony_ci#endif 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci .endm 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci .macro ___invalidate_dcache_range ar as at 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1658c2ecf20Sopenharmony_ci __loop_cache_range \ar \as \at dhi XCHAL_DCACHE_LINEWIDTH 1668c2ecf20Sopenharmony_ci#endif 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci .endm 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci .macro ___invalidate_icache_range ar as at 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci#if XCHAL_ICACHE_SIZE 1748c2ecf20Sopenharmony_ci __loop_cache_range \ar \as \at ihi XCHAL_ICACHE_LINEWIDTH 1758c2ecf20Sopenharmony_ci#endif 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci .endm 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci .macro ___flush_invalidate_dcache_page ar as 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1848c2ecf20Sopenharmony_ci __loop_cache_page \ar \as dhwbi XCHAL_DCACHE_LINEWIDTH 1020 1858c2ecf20Sopenharmony_ci#endif 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci .endm 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci .macro ___flush_dcache_page ar as 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 1938c2ecf20Sopenharmony_ci __loop_cache_page \ar \as dhwb XCHAL_DCACHE_LINEWIDTH 1020 1948c2ecf20Sopenharmony_ci#endif 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci .endm 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci .macro ___invalidate_dcache_page ar as 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci#if XCHAL_DCACHE_SIZE 2028c2ecf20Sopenharmony_ci __loop_cache_page \ar \as dhi XCHAL_DCACHE_LINEWIDTH 1020 2038c2ecf20Sopenharmony_ci#endif 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci .endm 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci .macro ___invalidate_icache_page ar as 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci#if XCHAL_ICACHE_SIZE 2118c2ecf20Sopenharmony_ci __loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH 1020 2128c2ecf20Sopenharmony_ci#endif 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci .endm 215