/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2023 Ventana Micro Systems Inc. */ #include <linux/linkage.h> #include <asm/asm.h> #include <asm/alternative-macros.h> #include <asm-generic/export.h> #include <asm/hwcap.h> #include <asm/insn-def.h> #include <asm/page.h> #define CBOZ_ALT(order, old, new) \ ALTERNATIVE(old, new, 0, \ ((order) << 16) | RISCV_ISA_EXT_ZICBOZ, \ CONFIG_RISCV_ISA_ZICBOZ) /* void clear_page(void *page) */ SYM_FUNC_START(clear_page) li a2, PAGE_SIZE /* * If Zicboz isn't present, or somehow has a block * size larger than 4K, then fallback to memset. */ CBOZ_ALT(12, "j .Lno_zicboz", "nop") lw a1, riscv_cboz_block_size add a2, a0, a2 .Lzero_loop: CBO_zero(a0) add a0, a0, a1 CBOZ_ALT(11, "bltu a0, a2, .Lzero_loop; ret", "nop; nop") CBO_zero(a0) add a0, a0, a1 CBOZ_ALT(10, "bltu a0, a2, .Lzero_loop; ret", "nop; nop") CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBOZ_ALT(9, "bltu a0, a2, .Lzero_loop; ret", "nop; nop") CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBOZ_ALT(8, "bltu a0, a2, .Lzero_loop; ret", "nop; nop") CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 CBO_zero(a0) add a0, a0, a1 bltu a0, a2, .Lzero_loop ret .Lno_zicboz: li a1, 0 tail __memset SYM_FUNC_END(clear_page) EXPORT_SYMBOL(clear_page)