aia_init() is going to contain all the stuff related to AIA initialization. At the moment, it is just Check if SSAIA extension is available and if yes set is_aia_available to true.
Signed-off-by: Oleksii Kurochko <[email protected]> --- xen/arch/riscv/Makefile | 1 + xen/arch/riscv/aia.c | 25 +++++++++++++++++++++++++ xen/arch/riscv/include/asm/aia.h | 10 ++++++++++ xen/arch/riscv/intc.c | 3 +++ 4 files changed, 39 insertions(+) create mode 100644 xen/arch/riscv/aia.c create mode 100644 xen/arch/riscv/include/asm/aia.h diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile index fb04cc5a56b2..d772b42386c0 100644 --- a/xen/arch/riscv/Makefile +++ b/xen/arch/riscv/Makefile @@ -1,3 +1,4 @@ +obj-y += aia.o obj-y += aplic.o obj-y += cpufeature.o obj-y += dom0less-build.o diff --git a/xen/arch/riscv/aia.c b/xen/arch/riscv/aia.c new file mode 100644 index 000000000000..5e3f190e8e2c --- /dev/null +++ b/xen/arch/riscv/aia.c @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <xen/errno.h> +#include <xen/init.h> +#include <xen/sections.h> +#include <xen/types.h> + +#include <asm/cpufeature.h> + +static bool __ro_after_init is_aia_available; + +bool aia_available(void) +{ + return is_aia_available; +} + +int __init aia_init(void) +{ + if ( !riscv_isa_extension_available(NULL, RISCV_ISA_EXT_ssaia) ) + return -ENODEV; + + is_aia_available = true; + + return 0; +} diff --git a/xen/arch/riscv/include/asm/aia.h b/xen/arch/riscv/include/asm/aia.h new file mode 100644 index 000000000000..039607faf685 --- /dev/null +++ b/xen/arch/riscv/include/asm/aia.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef ASM__RISCV__AIA_H +#define ASM__RISCV__AIA_H + +bool aia_available(void); + +int aia_init(void); + +#endif /* ASM__RISCV__ACPI_H */ diff --git a/xen/arch/riscv/intc.c b/xen/arch/riscv/intc.c index a6f8c30f4771..c9f12651fda1 100644 --- a/xen/arch/riscv/intc.c +++ b/xen/arch/riscv/intc.c @@ -8,6 +8,7 @@ #include <xen/lib.h> #include <xen/spinlock.h> +#include <asm/aia.h> #include <asm/intc.h> static const struct intc_hw_operations *__ro_after_init intc_hw_ops; @@ -27,6 +28,8 @@ void __init intc_preinit(void) void __init intc_init(void) { + aia_init(); + if ( intc_hw_ops->init() ) panic("Failed to initialize the interrupt controller drivers\n"); } -- 2.53.0
