@@ -20,6 +20,33 @@ struct kvm_aia {
2020
2121 /* In-kernel irqchip initialized */
2222 bool initialized ;
23+
24+ /* Virtualization mode (Emulation, HW Accelerated, or Auto) */
25+ u32 mode ;
26+
27+ /* Number of MSIs */
28+ u32 nr_ids ;
29+
30+ /* Number of wired IRQs */
31+ u32 nr_sources ;
32+
33+ /* Number of group bits in IMSIC address */
34+ u32 nr_group_bits ;
35+
36+ /* Position of group bits in IMSIC address */
37+ u32 nr_group_shift ;
38+
39+ /* Number of hart bits in IMSIC address */
40+ u32 nr_hart_bits ;
41+
42+ /* Number of guest bits in IMSIC address */
43+ u32 nr_guest_bits ;
44+
45+ /* Guest physical address of APLIC */
46+ gpa_t aplic_addr ;
47+
48+ /* Internal state of APLIC */
49+ void * aplic_state ;
2350};
2451
2552struct kvm_vcpu_aia_csr {
@@ -38,25 +65,53 @@ struct kvm_vcpu_aia {
3865
3966 /* CPU AIA CSR context upon Guest VCPU reset */
4067 struct kvm_vcpu_aia_csr guest_reset_csr ;
68+
69+ /* Guest physical address of IMSIC for this VCPU */
70+ gpa_t imsic_addr ;
71+
72+ /* HART index of IMSIC extacted from guest physical address */
73+ u32 hart_index ;
74+
75+ /* Internal state of IMSIC for this VCPU */
76+ void * imsic_state ;
4177};
4278
79+ #define KVM_RISCV_AIA_UNDEF_ADDR (-1)
80+
4381#define kvm_riscv_aia_initialized (k ) ((k)->arch.aia.initialized)
4482
4583#define irqchip_in_kernel (k ) ((k)->arch.aia.in_kernel)
4684
85+ extern unsigned int kvm_riscv_aia_nr_hgei ;
86+ extern unsigned int kvm_riscv_aia_max_ids ;
4787DECLARE_STATIC_KEY_FALSE (kvm_riscv_aia_available );
4888#define kvm_riscv_aia_available () \
4989 static_branch_unlikely(&kvm_riscv_aia_available)
5090
91+ extern struct kvm_device_ops kvm_riscv_aia_device_ops ;
92+
93+ void kvm_riscv_vcpu_aia_imsic_release (struct kvm_vcpu * vcpu );
94+ int kvm_riscv_vcpu_aia_imsic_update (struct kvm_vcpu * vcpu );
95+
5196#define KVM_RISCV_AIA_IMSIC_TOPEI (ISELECT_MASK + 1)
52- static inline int kvm_riscv_vcpu_aia_imsic_rmw (struct kvm_vcpu * vcpu ,
53- unsigned long isel ,
54- unsigned long * val ,
55- unsigned long new_val ,
56- unsigned long wr_mask )
57- {
58- return 0 ;
59- }
97+ int kvm_riscv_vcpu_aia_imsic_rmw (struct kvm_vcpu * vcpu , unsigned long isel ,
98+ unsigned long * val , unsigned long new_val ,
99+ unsigned long wr_mask );
100+ int kvm_riscv_aia_imsic_rw_attr (struct kvm * kvm , unsigned long type ,
101+ bool write , unsigned long * val );
102+ int kvm_riscv_aia_imsic_has_attr (struct kvm * kvm , unsigned long type );
103+ void kvm_riscv_vcpu_aia_imsic_reset (struct kvm_vcpu * vcpu );
104+ int kvm_riscv_vcpu_aia_imsic_inject (struct kvm_vcpu * vcpu ,
105+ u32 guest_index , u32 offset , u32 iid );
106+ int kvm_riscv_vcpu_aia_imsic_init (struct kvm_vcpu * vcpu );
107+ void kvm_riscv_vcpu_aia_imsic_cleanup (struct kvm_vcpu * vcpu );
108+
109+ int kvm_riscv_aia_aplic_set_attr (struct kvm * kvm , unsigned long type , u32 v );
110+ int kvm_riscv_aia_aplic_get_attr (struct kvm * kvm , unsigned long type , u32 * v );
111+ int kvm_riscv_aia_aplic_has_attr (struct kvm * kvm , unsigned long type );
112+ int kvm_riscv_aia_aplic_inject (struct kvm * kvm , u32 source , bool level );
113+ int kvm_riscv_aia_aplic_init (struct kvm * kvm );
114+ void kvm_riscv_aia_aplic_cleanup (struct kvm * kvm );
60115
61116#ifdef CONFIG_32BIT
62117void kvm_riscv_vcpu_aia_flush_interrupts (struct kvm_vcpu * vcpu );
@@ -93,31 +148,23 @@ int kvm_riscv_vcpu_aia_rmw_ireg(struct kvm_vcpu *vcpu, unsigned int csr_num,
93148{ .base = CSR_SIREG, .count = 1, .func = kvm_riscv_vcpu_aia_rmw_ireg }, \
94149{ .base = CSR_STOPEI, .count = 1, .func = kvm_riscv_vcpu_aia_rmw_topei },
95150
96- static inline int kvm_riscv_vcpu_aia_update (struct kvm_vcpu * vcpu )
97- {
98- return 1 ;
99- }
100-
101- static inline void kvm_riscv_vcpu_aia_reset (struct kvm_vcpu * vcpu )
102- {
103- }
104-
105- static inline int kvm_riscv_vcpu_aia_init (struct kvm_vcpu * vcpu )
106- {
107- return 0 ;
108- }
151+ int kvm_riscv_vcpu_aia_update (struct kvm_vcpu * vcpu );
152+ void kvm_riscv_vcpu_aia_reset (struct kvm_vcpu * vcpu );
153+ int kvm_riscv_vcpu_aia_init (struct kvm_vcpu * vcpu );
154+ void kvm_riscv_vcpu_aia_deinit (struct kvm_vcpu * vcpu );
109155
110- static inline void kvm_riscv_vcpu_aia_deinit (struct kvm_vcpu * vcpu )
111- {
112- }
156+ int kvm_riscv_aia_inject_msi_by_id (struct kvm * kvm , u32 hart_index ,
157+ u32 guest_index , u32 iid );
158+ int kvm_riscv_aia_inject_msi (struct kvm * kvm , struct kvm_msi * msi );
159+ int kvm_riscv_aia_inject_irq (struct kvm * kvm , unsigned int irq , bool level );
113160
114- static inline void kvm_riscv_aia_init_vm (struct kvm * kvm )
115- {
116- }
161+ void kvm_riscv_aia_init_vm (struct kvm * kvm );
162+ void kvm_riscv_aia_destroy_vm (struct kvm * kvm );
117163
118- static inline void kvm_riscv_aia_destroy_vm (struct kvm * kvm )
119- {
120- }
164+ int kvm_riscv_aia_alloc_hgei (int cpu , struct kvm_vcpu * owner ,
165+ void __iomem * * hgei_va , phys_addr_t * hgei_pa );
166+ void kvm_riscv_aia_free_hgei (int cpu , int hgei );
167+ void kvm_riscv_aia_wakeon_hgei (struct kvm_vcpu * owner , bool enable );
121168
122169void kvm_riscv_aia_enable (void );
123170void kvm_riscv_aia_disable (void );
0 commit comments