@@ -30,28 +30,6 @@ unsigned int kvm_riscv_aia_nr_hgei;
3030unsigned int kvm_riscv_aia_max_ids ;
3131DEFINE_STATIC_KEY_FALSE (kvm_riscv_aia_available );
3232
33- static int aia_find_hgei (struct kvm_vcpu * owner )
34- {
35- int i , hgei ;
36- unsigned long flags ;
37- struct aia_hgei_control * hgctrl = get_cpu_ptr (& aia_hgei );
38-
39- raw_spin_lock_irqsave (& hgctrl -> lock , flags );
40-
41- hgei = -1 ;
42- for (i = 1 ; i <= kvm_riscv_aia_nr_hgei ; i ++ ) {
43- if (hgctrl -> owners [i ] == owner ) {
44- hgei = i ;
45- break ;
46- }
47- }
48-
49- raw_spin_unlock_irqrestore (& hgctrl -> lock , flags );
50-
51- put_cpu_ptr (& aia_hgei );
52- return hgei ;
53- }
54-
5533static inline unsigned long aia_hvictl_value (bool ext_irq_pending )
5634{
5735 unsigned long hvictl ;
@@ -95,7 +73,6 @@ void kvm_riscv_vcpu_aia_sync_interrupts(struct kvm_vcpu *vcpu)
9573
9674bool kvm_riscv_vcpu_aia_has_interrupts (struct kvm_vcpu * vcpu , u64 mask )
9775{
98- int hgei ;
9976 unsigned long seip ;
10077
10178 if (!kvm_riscv_aia_available ())
@@ -114,11 +91,7 @@ bool kvm_riscv_vcpu_aia_has_interrupts(struct kvm_vcpu *vcpu, u64 mask)
11491 if (!kvm_riscv_aia_initialized (vcpu -> kvm ) || !seip )
11592 return false;
11693
117- hgei = aia_find_hgei (vcpu );
118- if (hgei > 0 )
119- return !!(ncsr_read (CSR_HGEIP ) & BIT (hgei ));
120-
121- return false;
94+ return kvm_riscv_vcpu_aia_imsic_has_interrupt (vcpu );
12295}
12396
12497void kvm_riscv_vcpu_aia_update_hvip (struct kvm_vcpu * vcpu )
@@ -164,6 +137,9 @@ void kvm_riscv_vcpu_aia_load(struct kvm_vcpu *vcpu, int cpu)
164137 csr_write (CSR_HVIPRIO2H , csr -> hviprio2h );
165138#endif
166139 }
140+
141+ if (kvm_riscv_aia_initialized (vcpu -> kvm ))
142+ kvm_riscv_vcpu_aia_imsic_load (vcpu , cpu );
167143}
168144
169145void kvm_riscv_vcpu_aia_put (struct kvm_vcpu * vcpu )
@@ -174,6 +150,9 @@ void kvm_riscv_vcpu_aia_put(struct kvm_vcpu *vcpu)
174150 if (!kvm_riscv_aia_available ())
175151 return ;
176152
153+ if (kvm_riscv_aia_initialized (vcpu -> kvm ))
154+ kvm_riscv_vcpu_aia_imsic_put (vcpu );
155+
177156 if (kvm_riscv_nacl_available ()) {
178157 nsh = nacl_shmem ();
179158 csr -> vsiselect = nacl_csr_read (nsh , CSR_VSISELECT );
@@ -472,22 +451,6 @@ void kvm_riscv_aia_free_hgei(int cpu, int hgei)
472451 raw_spin_unlock_irqrestore (& hgctrl -> lock , flags );
473452}
474453
475- void kvm_riscv_aia_wakeon_hgei (struct kvm_vcpu * owner , bool enable )
476- {
477- int hgei ;
478-
479- if (!kvm_riscv_aia_available ())
480- return ;
481-
482- hgei = aia_find_hgei (owner );
483- if (hgei > 0 ) {
484- if (enable )
485- csr_set (CSR_HGEIE , BIT (hgei ));
486- else
487- csr_clear (CSR_HGEIE , BIT (hgei ));
488- }
489- }
490-
491454static irqreturn_t hgei_interrupt (int irq , void * dev_id )
492455{
493456 int i ;
0 commit comments