Skip to content

Commit 94a7734

Browse files
yong-xuanavpatel
authored andcommitted
RISC-V: Add Svade and Svadu Extensions Support
Svade and Svadu extensions represent two schemes for managing the PTE A/D bits. When the PTE A/D bits need to be set, Svade extension intdicates that a related page fault will be raised. In contrast, the Svadu extension supports hardware updating of PTE A/D bits. Since the Svade extension is mandatory and the Svadu extension is optional in RVA23 profile, by default the M-mode firmware will enable the Svadu extension in the menvcfg CSR when only Svadu is present in DT. This patch detects Svade and Svadu extensions from DT and adds arch_has_hw_pte_young() to enable optimization in MGLRU and __wp_page_copy_user() when we have the PTE A/D bits hardware updating support. Co-developed-by: Jinyu Tang <tjytimi@163.com> Signed-off-by: Jinyu Tang <tjytimi@163.com> Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com> Acked-by: Palmer Dabbelt <palmer@rivosinc.com> Link: https://lore.kernel.org/r/20240726084931.28924-2-yongxuan.wang@sifive.com Signed-off-by: Anup Patel <anup@brainfault.org>
1 parent 332fa4a commit 94a7734

File tree

5 files changed

+28
-1
lines changed

5 files changed

+28
-1
lines changed

arch/riscv/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ config RISCV
3232
select ARCH_HAS_FORTIFY_SOURCE
3333
select ARCH_HAS_GCOV_PROFILE_ALL
3434
select ARCH_HAS_GIGANTIC_PAGE
35+
select ARCH_HAS_HW_PTE_YOUNG
3536
select ARCH_HAS_KCOV
3637
select ARCH_HAS_KERNEL_FPU_SUPPORT if 64BIT && FPU
3738
select ARCH_HAS_MEMBARRIER_CALLBACKS

arch/riscv/include/asm/csr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@
195195
/* xENVCFG flags */
196196
#define ENVCFG_STCE (_AC(1, ULL) << 63)
197197
#define ENVCFG_PBMTE (_AC(1, ULL) << 62)
198+
#define ENVCFG_ADUE (_AC(1, ULL) << 61)
198199
#define ENVCFG_CBZE (_AC(1, UL) << 7)
199200
#define ENVCFG_CBCFE (_AC(1, UL) << 6)
200201
#define ENVCFG_CBIE_SHIFT 4

arch/riscv/include/asm/hwcap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@
9393
#define RISCV_ISA_EXT_ZCMOP 84
9494
#define RISCV_ISA_EXT_ZAWRS 85
9595
#define RISCV_ISA_EXT_SVVPTC 86
96+
#define RISCV_ISA_EXT_SVADE 87
97+
#define RISCV_ISA_EXT_SVADU 88
9698

9799
#define RISCV_ISA_EXT_XLINUXENVCFG 127
98100

arch/riscv/include/asm/pgtable.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
#include <asm/tlbflush.h>
114114
#include <linux/mm_types.h>
115115
#include <asm/compat.h>
116+
#include <asm/cpufeature.h>
116117

117118
#define __page_val_to_pfn(_val) (((_val) & _PAGE_PFN_MASK) >> _PAGE_PFN_SHIFT)
118119

@@ -284,7 +285,6 @@ static inline pte_t pud_pte(pud_t pud)
284285
}
285286

286287
#ifdef CONFIG_RISCV_ISA_SVNAPOT
287-
#include <asm/cpufeature.h>
288288

289289
static __always_inline bool has_svnapot(void)
290290
{
@@ -655,6 +655,17 @@ static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
655655
return __pgprot(prot);
656656
}
657657

658+
/*
659+
* Both Svade and Svadu control the hardware behavior when the PTE A/D bits need to be set. By
660+
* default the M-mode firmware enables the hardware updating scheme when only Svadu is present in
661+
* DT.
662+
*/
663+
#define arch_has_hw_pte_young arch_has_hw_pte_young
664+
static inline bool arch_has_hw_pte_young(void)
665+
{
666+
return riscv_has_extension_unlikely(RISCV_ISA_EXT_SVADU);
667+
}
668+
658669
/*
659670
* THP functions
660671
*/

arch/riscv/kernel/cpufeature.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,16 @@ static int riscv_ext_zcf_validate(const struct riscv_isa_ext_data *data,
132132
return -EPROBE_DEFER;
133133
}
134134

135+
static int riscv_ext_svadu_validate(const struct riscv_isa_ext_data *data,
136+
const unsigned long *isa_bitmap)
137+
{
138+
/* SVADE has already been detected, use SVADE only */
139+
if (__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_SVADE))
140+
return -EOPNOTSUPP;
141+
142+
return 0;
143+
}
144+
135145
static const unsigned int riscv_zk_bundled_exts[] = {
136146
RISCV_ISA_EXT_ZBKB,
137147
RISCV_ISA_EXT_ZBKC,
@@ -378,6 +388,8 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
378388
__RISCV_ISA_EXT_DATA(ssaia, RISCV_ISA_EXT_SSAIA),
379389
__RISCV_ISA_EXT_DATA(sscofpmf, RISCV_ISA_EXT_SSCOFPMF),
380390
__RISCV_ISA_EXT_DATA(sstc, RISCV_ISA_EXT_SSTC),
391+
__RISCV_ISA_EXT_DATA(svade, RISCV_ISA_EXT_SVADE),
392+
__RISCV_ISA_EXT_DATA_VALIDATE(svadu, RISCV_ISA_EXT_SVADU, riscv_ext_svadu_validate),
381393
__RISCV_ISA_EXT_DATA(svinval, RISCV_ISA_EXT_SVINVAL),
382394
__RISCV_ISA_EXT_DATA(svnapot, RISCV_ISA_EXT_SVNAPOT),
383395
__RISCV_ISA_EXT_DATA(svpbmt, RISCV_ISA_EXT_SVPBMT),

0 commit comments

Comments
 (0)