ACPICA: MADT: Add RISC-V external interrupt controllers
authorSunil V L <sunilvl@ventanamicro.com>
Sat, 15 Apr 2023 13:49:16 +0000 (19:19 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 10 Jul 2023 16:49:16 +0000 (18:49 +0200)
ACPICA commit 8c048cee4ea7b9ded8db3e1b3b9c14e21e084a2c

This adds 3 different external interrupt controller
definitions in MADT for RISC-V.

 1) RISC-V PLIC is a platform interrupt controller for
    handling wired interrupt in a RISC-V systems.

 2) RISC-V IMSIC is MSI interrupt controller to
    support MSI interrupts.

 3) RISC-V APLIC has dual functionality. First it can
    act like PLIC and direct all wired interrupts to
    the CPU which doesn't have MSI controller. Second,
    when the CPU has MSI controller (IMSIC), it will
    act as a converter from wired interrupts to MSI.

Update the existing RINTC structure also to support
these external interrupt controllers.

This codefirst ECR is approved by UEFI forum and will
be part of next ACPI spec version.

Link: https://github.com/acpica/acpica/commit/8c048cee
Signed-off-by: Haibo, Xu <haibo1.xu@intel.com>
Co-developed-by: Haibo, Xu <haibo1.xu@intel.com>
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
include/acpi/actbl2.h

index 0029336..280ab4c 100644 (file)
@@ -893,7 +893,10 @@ enum acpi_madt_type {
        ACPI_MADT_TYPE_BIO_PIC = 22,
        ACPI_MADT_TYPE_LPC_PIC = 23,
        ACPI_MADT_TYPE_RINTC = 24,
-       ACPI_MADT_TYPE_RESERVED = 25,   /* 25 to 0x7F are reserved */
+       ACPI_MADT_TYPE_IMSIC = 25,
+       ACPI_MADT_TYPE_APLIC = 26,
+       ACPI_MADT_TYPE_PLIC = 27,
+       ACPI_MADT_TYPE_RESERVED = 28,   /* 28 to 0x7F are reserved */
        ACPI_MADT_TYPE_OEM_RESERVED = 0x80      /* 0x80 to 0xFF are reserved for OEM use */
 };
 
@@ -1261,6 +1264,9 @@ struct acpi_madt_rintc {
        u32 flags;
        u64 hart_id;
        u32 uid;                /* ACPI processor UID */
+       u32 ext_intc_id;        /* External INTC Id */
+       u64 imsic_addr;         /* IMSIC base address */
+       u32 imsic_size;         /* IMSIC size */
 };
 
 /* Values for RISC-V INTC Version field above */
@@ -1271,6 +1277,48 @@ enum acpi_madt_rintc_version {
        ACPI_MADT_RINTC_VERSION_RESERVED = 2    /* 2 and greater are reserved */
 };
 
+/* 25: RISC-V IMSIC */
+struct acpi_madt_imsic {
+       struct acpi_subtable_header header;
+       u8 version;
+       u8 reserved;
+       u32 flags;
+       u16 num_ids;
+       u16 num_guest_ids;
+       u8 guest_index_bits;
+       u8 hart_index_bits;
+       u8 group_index_bits;
+       u8 group_index_shift;
+};
+
+/* 26: RISC-V APLIC */
+struct acpi_madt_aplic {
+       struct acpi_subtable_header header;
+       u8 version;
+       u8 id;
+       u32 flags;
+       u8 hw_id[8];
+       u16 num_idcs;
+       u16 num_sources;
+       u32 gsi_base;
+       u64 base_addr;
+       u32 size;
+};
+
+/* 27: RISC-V PLIC */
+struct acpi_madt_plic {
+       struct acpi_subtable_header header;
+       u8 version;
+       u8 id;
+       u8 hw_id[8];
+       u16 num_irqs;
+       u16 max_prio;
+       u32 flags;
+       u32 size;
+       u64 base_addr;
+       u32 gsi_base;
+};
+
 /* 80: OEM data */
 
 struct acpi_madt_oem_data {