Skip to content

Commit 4ecbd3e

Browse files
committed
RISC-V: KVM: Factor-out MMU related declarations into separate headers
The MMU, TLB, and VMID management for KVM RISC-V already exists as seprate sources so create separate headers along these lines. This further simplifies asm/kvm_host.h header. Signed-off-by: Anup Patel <apatel@ventanamicro.com> Reviewed-by: Atish Patra <atishp@rivosinc.com> Tested-by: Atish Patra <atishp@rivosinc.com> Reviewed-by: Nutty Liu <liujingqi@lanxincomputing.com> Link: https://lore.kernel.org/r/20250618113532.471448-9-apatel@ventanamicro.com Signed-off-by: Anup Patel <anup@brainfault.org>
1 parent 77ba646 commit 4ecbd3e

12 files changed

Lines changed: 143 additions & 98 deletions

File tree

arch/riscv/include/asm/kvm_host.h

Lines changed: 2 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include <asm/hwcap.h>
1717
#include <asm/kvm_aia.h>
1818
#include <asm/ptrace.h>
19+
#include <asm/kvm_tlb.h>
20+
#include <asm/kvm_vmid.h>
1921
#include <asm/kvm_vcpu_fp.h>
2022
#include <asm/kvm_vcpu_insn.h>
2123
#include <asm/kvm_vcpu_sbi.h>
@@ -55,24 +57,6 @@
5557
BIT(IRQ_VS_TIMER) | \
5658
BIT(IRQ_VS_EXT))
5759

58-
enum kvm_riscv_hfence_type {
59-
KVM_RISCV_HFENCE_UNKNOWN = 0,
60-
KVM_RISCV_HFENCE_GVMA_VMID_GPA,
61-
KVM_RISCV_HFENCE_VVMA_ASID_GVA,
62-
KVM_RISCV_HFENCE_VVMA_ASID_ALL,
63-
KVM_RISCV_HFENCE_VVMA_GVA,
64-
};
65-
66-
struct kvm_riscv_hfence {
67-
enum kvm_riscv_hfence_type type;
68-
unsigned long asid;
69-
unsigned long order;
70-
gpa_t addr;
71-
gpa_t size;
72-
};
73-
74-
#define KVM_RISCV_VCPU_MAX_HFENCE 64
75-
7660
struct kvm_vm_stat {
7761
struct kvm_vm_stat_generic generic;
7862
};
@@ -98,15 +82,6 @@ struct kvm_vcpu_stat {
9882
struct kvm_arch_memory_slot {
9983
};
10084

101-
struct kvm_vmid {
102-
/*
103-
* Writes to vmid_version and vmid happen with vmid_lock held
104-
* whereas reads happen without any lock held.
105-
*/
106-
unsigned long vmid_version;
107-
unsigned long vmid;
108-
};
109-
11085
struct kvm_arch {
11186
/* G-stage vmid */
11287
struct kvm_vmid vmid;
@@ -310,77 +285,6 @@ static inline bool kvm_arch_pmi_in_guest(struct kvm_vcpu *vcpu)
310285
static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {}
311286
static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {}
312287

313-
#define KVM_RISCV_GSTAGE_TLB_MIN_ORDER 12
314-
315-
void kvm_riscv_local_hfence_gvma_vmid_gpa(unsigned long vmid,
316-
gpa_t gpa, gpa_t gpsz,
317-
unsigned long order);
318-
void kvm_riscv_local_hfence_gvma_vmid_all(unsigned long vmid);
319-
void kvm_riscv_local_hfence_gvma_gpa(gpa_t gpa, gpa_t gpsz,
320-
unsigned long order);
321-
void kvm_riscv_local_hfence_gvma_all(void);
322-
void kvm_riscv_local_hfence_vvma_asid_gva(unsigned long vmid,
323-
unsigned long asid,
324-
unsigned long gva,
325-
unsigned long gvsz,
326-
unsigned long order);
327-
void kvm_riscv_local_hfence_vvma_asid_all(unsigned long vmid,
328-
unsigned long asid);
329-
void kvm_riscv_local_hfence_vvma_gva(unsigned long vmid,
330-
unsigned long gva, unsigned long gvsz,
331-
unsigned long order);
332-
void kvm_riscv_local_hfence_vvma_all(unsigned long vmid);
333-
334-
void kvm_riscv_tlb_flush_process(struct kvm_vcpu *vcpu);
335-
336-
void kvm_riscv_fence_i_process(struct kvm_vcpu *vcpu);
337-
void kvm_riscv_hfence_vvma_all_process(struct kvm_vcpu *vcpu);
338-
void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu);
339-
340-
void kvm_riscv_fence_i(struct kvm *kvm,
341-
unsigned long hbase, unsigned long hmask);
342-
void kvm_riscv_hfence_gvma_vmid_gpa(struct kvm *kvm,
343-
unsigned long hbase, unsigned long hmask,
344-
gpa_t gpa, gpa_t gpsz,
345-
unsigned long order);
346-
void kvm_riscv_hfence_gvma_vmid_all(struct kvm *kvm,
347-
unsigned long hbase, unsigned long hmask);
348-
void kvm_riscv_hfence_vvma_asid_gva(struct kvm *kvm,
349-
unsigned long hbase, unsigned long hmask,
350-
unsigned long gva, unsigned long gvsz,
351-
unsigned long order, unsigned long asid);
352-
void kvm_riscv_hfence_vvma_asid_all(struct kvm *kvm,
353-
unsigned long hbase, unsigned long hmask,
354-
unsigned long asid);
355-
void kvm_riscv_hfence_vvma_gva(struct kvm *kvm,
356-
unsigned long hbase, unsigned long hmask,
357-
unsigned long gva, unsigned long gvsz,
358-
unsigned long order);
359-
void kvm_riscv_hfence_vvma_all(struct kvm *kvm,
360-
unsigned long hbase, unsigned long hmask);
361-
362-
int kvm_riscv_gstage_ioremap(struct kvm *kvm, gpa_t gpa,
363-
phys_addr_t hpa, unsigned long size,
364-
bool writable, bool in_atomic);
365-
void kvm_riscv_gstage_iounmap(struct kvm *kvm, gpa_t gpa,
366-
unsigned long size);
367-
int kvm_riscv_gstage_map(struct kvm_vcpu *vcpu,
368-
struct kvm_memory_slot *memslot,
369-
gpa_t gpa, unsigned long hva, bool is_write);
370-
int kvm_riscv_gstage_alloc_pgd(struct kvm *kvm);
371-
void kvm_riscv_gstage_free_pgd(struct kvm *kvm);
372-
void kvm_riscv_gstage_update_hgatp(struct kvm_vcpu *vcpu);
373-
void __init kvm_riscv_gstage_mode_detect(void);
374-
unsigned long __init kvm_riscv_gstage_mode(void);
375-
int kvm_riscv_gstage_gpa_bits(void);
376-
377-
void __init kvm_riscv_gstage_vmid_detect(void);
378-
unsigned long kvm_riscv_gstage_vmid_bits(void);
379-
int kvm_riscv_gstage_vmid_init(struct kvm *kvm);
380-
bool kvm_riscv_gstage_vmid_ver_changed(struct kvm_vmid *vmid);
381-
void kvm_riscv_gstage_vmid_update(struct kvm_vcpu *vcpu);
382-
void kvm_riscv_gstage_vmid_sanitize(struct kvm_vcpu *vcpu);
383-
384288
int kvm_riscv_setup_default_irq_routing(struct kvm *kvm, u32 lines);
385289

386290
void __kvm_riscv_unpriv_trap(void);

arch/riscv/include/asm/kvm_mmu.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (c) 2025 Ventana Micro Systems Inc.
4+
*/
5+
6+
#ifndef __RISCV_KVM_MMU_H_
7+
#define __RISCV_KVM_MMU_H_
8+
9+
#include <linux/kvm_types.h>
10+
11+
int kvm_riscv_gstage_ioremap(struct kvm *kvm, gpa_t gpa,
12+
phys_addr_t hpa, unsigned long size,
13+
bool writable, bool in_atomic);
14+
void kvm_riscv_gstage_iounmap(struct kvm *kvm, gpa_t gpa,
15+
unsigned long size);
16+
int kvm_riscv_gstage_map(struct kvm_vcpu *vcpu,
17+
struct kvm_memory_slot *memslot,
18+
gpa_t gpa, unsigned long hva, bool is_write);
19+
int kvm_riscv_gstage_alloc_pgd(struct kvm *kvm);
20+
void kvm_riscv_gstage_free_pgd(struct kvm *kvm);
21+
void kvm_riscv_gstage_update_hgatp(struct kvm_vcpu *vcpu);
22+
void kvm_riscv_gstage_mode_detect(void);
23+
unsigned long kvm_riscv_gstage_mode(void);
24+
int kvm_riscv_gstage_gpa_bits(void);
25+
26+
#endif

arch/riscv/include/asm/kvm_tlb.h

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (c) 2025 Ventana Micro Systems Inc.
4+
*/
5+
6+
#ifndef __RISCV_KVM_TLB_H_
7+
#define __RISCV_KVM_TLB_H_
8+
9+
#include <linux/kvm_types.h>
10+
11+
enum kvm_riscv_hfence_type {
12+
KVM_RISCV_HFENCE_UNKNOWN = 0,
13+
KVM_RISCV_HFENCE_GVMA_VMID_GPA,
14+
KVM_RISCV_HFENCE_VVMA_ASID_GVA,
15+
KVM_RISCV_HFENCE_VVMA_ASID_ALL,
16+
KVM_RISCV_HFENCE_VVMA_GVA,
17+
};
18+
19+
struct kvm_riscv_hfence {
20+
enum kvm_riscv_hfence_type type;
21+
unsigned long asid;
22+
unsigned long order;
23+
gpa_t addr;
24+
gpa_t size;
25+
};
26+
27+
#define KVM_RISCV_VCPU_MAX_HFENCE 64
28+
29+
#define KVM_RISCV_GSTAGE_TLB_MIN_ORDER 12
30+
31+
void kvm_riscv_local_hfence_gvma_vmid_gpa(unsigned long vmid,
32+
gpa_t gpa, gpa_t gpsz,
33+
unsigned long order);
34+
void kvm_riscv_local_hfence_gvma_vmid_all(unsigned long vmid);
35+
void kvm_riscv_local_hfence_gvma_gpa(gpa_t gpa, gpa_t gpsz,
36+
unsigned long order);
37+
void kvm_riscv_local_hfence_gvma_all(void);
38+
void kvm_riscv_local_hfence_vvma_asid_gva(unsigned long vmid,
39+
unsigned long asid,
40+
unsigned long gva,
41+
unsigned long gvsz,
42+
unsigned long order);
43+
void kvm_riscv_local_hfence_vvma_asid_all(unsigned long vmid,
44+
unsigned long asid);
45+
void kvm_riscv_local_hfence_vvma_gva(unsigned long vmid,
46+
unsigned long gva, unsigned long gvsz,
47+
unsigned long order);
48+
void kvm_riscv_local_hfence_vvma_all(unsigned long vmid);
49+
50+
void kvm_riscv_tlb_flush_process(struct kvm_vcpu *vcpu);
51+
52+
void kvm_riscv_fence_i_process(struct kvm_vcpu *vcpu);
53+
void kvm_riscv_hfence_vvma_all_process(struct kvm_vcpu *vcpu);
54+
void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu);
55+
56+
void kvm_riscv_fence_i(struct kvm *kvm,
57+
unsigned long hbase, unsigned long hmask);
58+
void kvm_riscv_hfence_gvma_vmid_gpa(struct kvm *kvm,
59+
unsigned long hbase, unsigned long hmask,
60+
gpa_t gpa, gpa_t gpsz,
61+
unsigned long order);
62+
void kvm_riscv_hfence_gvma_vmid_all(struct kvm *kvm,
63+
unsigned long hbase, unsigned long hmask);
64+
void kvm_riscv_hfence_vvma_asid_gva(struct kvm *kvm,
65+
unsigned long hbase, unsigned long hmask,
66+
unsigned long gva, unsigned long gvsz,
67+
unsigned long order, unsigned long asid);
68+
void kvm_riscv_hfence_vvma_asid_all(struct kvm *kvm,
69+
unsigned long hbase, unsigned long hmask,
70+
unsigned long asid);
71+
void kvm_riscv_hfence_vvma_gva(struct kvm *kvm,
72+
unsigned long hbase, unsigned long hmask,
73+
unsigned long gva, unsigned long gvsz,
74+
unsigned long order);
75+
void kvm_riscv_hfence_vvma_all(struct kvm *kvm,
76+
unsigned long hbase, unsigned long hmask);
77+
78+
#endif

arch/riscv/include/asm/kvm_vmid.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (c) 2025 Ventana Micro Systems Inc.
4+
*/
5+
6+
#ifndef __RISCV_KVM_VMID_H_
7+
#define __RISCV_KVM_VMID_H_
8+
9+
#include <linux/kvm_types.h>
10+
11+
struct kvm_vmid {
12+
/*
13+
* Writes to vmid_version and vmid happen with vmid_lock held
14+
* whereas reads happen without any lock held.
15+
*/
16+
unsigned long vmid_version;
17+
unsigned long vmid;
18+
};
19+
20+
void __init kvm_riscv_gstage_vmid_detect(void);
21+
unsigned long kvm_riscv_gstage_vmid_bits(void);
22+
int kvm_riscv_gstage_vmid_init(struct kvm *kvm);
23+
bool kvm_riscv_gstage_vmid_ver_changed(struct kvm_vmid *vmid);
24+
void kvm_riscv_gstage_vmid_update(struct kvm_vcpu *vcpu);
25+
void kvm_riscv_gstage_vmid_sanitize(struct kvm_vcpu *vcpu);
26+
27+
#endif

arch/riscv/kvm/aia_imsic.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/swab.h>
1717
#include <kvm/iodev.h>
1818
#include <asm/csr.h>
19+
#include <asm/kvm_mmu.h>
1920

2021
#define IMSIC_MAX_EIX (IMSIC_MAX_ID / BITS_PER_TYPE(u64))
2122

arch/riscv/kvm/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/module.h>
1212
#include <linux/kvm_host.h>
1313
#include <asm/cpufeature.h>
14+
#include <asm/kvm_mmu.h>
1415
#include <asm/kvm_nacl.h>
1516
#include <asm/sbi.h>
1617

arch/riscv/kvm/mmu.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/vmalloc.h>
1616
#include <linux/kvm_host.h>
1717
#include <linux/sched/signal.h>
18+
#include <asm/kvm_mmu.h>
1819
#include <asm/kvm_nacl.h>
1920
#include <asm/page.h>
2021
#include <asm/pgtable.h>

arch/riscv/kvm/tlb.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <asm/cpufeature.h>
1616
#include <asm/insn-def.h>
1717
#include <asm/kvm_nacl.h>
18+
#include <asm/kvm_tlb.h>
19+
#include <asm/kvm_vmid.h>
1820

1921
#define has_svinval() riscv_has_extension_unlikely(RISCV_ISA_EXT_SVINVAL)
2022

arch/riscv/kvm/vcpu.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <linux/fs.h>
1919
#include <linux/kvm_host.h>
2020
#include <asm/cacheflush.h>
21+
#include <asm/kvm_mmu.h>
2122
#include <asm/kvm_nacl.h>
2223
#include <asm/kvm_vcpu_vector.h>
2324

arch/riscv/kvm/vcpu_exit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <linux/kvm_host.h>
1010
#include <asm/csr.h>
1111
#include <asm/insn-def.h>
12+
#include <asm/kvm_mmu.h>
1213
#include <asm/kvm_nacl.h>
1314

1415
static int gstage_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run,

0 commit comments

Comments
 (0)