diff options
Diffstat (limited to 'arch/riscv/kvm/main.c')
| -rw-r--r-- | arch/riscv/kvm/main.c | 24 | 
1 files changed, 22 insertions, 2 deletions
| diff --git a/arch/riscv/kvm/main.c b/arch/riscv/kvm/main.c index 41ad7639a17b..a7112d583637 100644 --- a/arch/riscv/kvm/main.c +++ b/arch/riscv/kvm/main.c @@ -44,11 +44,15 @@ int kvm_arch_hardware_enable(void)  	csr_write(CSR_HVIP, 0); +	kvm_riscv_aia_enable(); +  	return 0;  }  void kvm_arch_hardware_disable(void)  { +	kvm_riscv_aia_disable(); +  	/*  	 * After clearing the hideleg CSR, the host kernel will receive  	 * spurious interrupts if hvip CSR has pending interrupts and the @@ -63,6 +67,7 @@ void kvm_arch_hardware_disable(void)  static int __init riscv_kvm_init(void)  { +	int rc;  	const char *str;  	if (!riscv_isa_extension_available(NULL, h)) { @@ -75,7 +80,7 @@ static int __init riscv_kvm_init(void)  		return -ENODEV;  	} -	if (sbi_probe_extension(SBI_EXT_RFENCE) <= 0) { +	if (!sbi_probe_extension(SBI_EXT_RFENCE)) {  		kvm_info("require SBI RFENCE extension\n");  		return -ENODEV;  	} @@ -84,6 +89,10 @@ static int __init riscv_kvm_init(void)  	kvm_riscv_gstage_vmid_detect(); +	rc = kvm_riscv_aia_init(); +	if (rc && rc != -ENODEV) +		return rc; +  	kvm_info("hypervisor extension available\n");  	switch (kvm_riscv_gstage_mode()) { @@ -106,12 +115,23 @@ static int __init riscv_kvm_init(void)  	kvm_info("VMID %ld bits available\n", kvm_riscv_gstage_vmid_bits()); -	return kvm_init(sizeof(struct kvm_vcpu), 0, THIS_MODULE); +	if (kvm_riscv_aia_available()) +		kvm_info("AIA available\n"); + +	rc = kvm_init(sizeof(struct kvm_vcpu), 0, THIS_MODULE); +	if (rc) { +		kvm_riscv_aia_exit(); +		return rc; +	} + +	return 0;  }  module_init(riscv_kvm_init);  static void __exit riscv_kvm_exit(void)  { +	kvm_riscv_aia_exit(); +  	kvm_exit();  }  module_exit(riscv_kvm_exit); | 
