emulation: qemu-sbsa: Fill in correct ITS ID
authorPatrick Rudolph <patrick.rudolph@9elements.com>
Thu, 20 Mar 2025 12:51:58 +0000 (13:51 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 8 Apr 2025 22:23:27 +0000 (16:23 -0600)
The ACPI IORT and ACPI MADT needs to use the same IDs when referencing
GIC ITS. The GIC-v3 ITS driver uses dev_seq(dev) to generate a unique ID
for the MADT, but qemu sbsa-ref hardcodes it.
Currently it's not the same ID, breaking interrupt routing on the OS.

Don't assume it's 0 and fetch it from the device instead.

TEST: Fixes non working IRQs in QEMU sbsa-ref.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
board/emulation/qemu-sbsa/acpi.c

index ba85e08..2e518f2 100644 (file)
@@ -10,9 +10,9 @@
 #include <asm/acpi_table.h>
 #include <asm/armv8/sec_firmware.h>
 #include <configs/qemu-sbsa.h>
-#include <dm/uclass.h>
 #include <dm/device.h>
-#include "qemu-sbsa.h"
+#include <dm/read.h>
+#include <dm/uclass.h>
 
 #define SBSAQEMU_MADT_GIC_VBASE          0x2c020000
 #define SBSAQEMU_MADT_GIC_HBASE          0x2c010000
 int acpi_fill_iort(struct acpi_ctx *ctx)
 {
        u32 its_offset, smmu_offset;
-       u64 gic_its_base = 0;
-
-       smc_get_gic_its_base(&gic_its_base);
-       if (gic_its_base == 0)
-               return 0;
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_IRQ,
+                                         DM_DRIVER_GET(arm_gic_v3_its), &dev);
+       if (ret) {
+               pr_err("%s: failed to get %s irq device\n", __func__,
+                      DM_DRIVER_GET(arm_gic_v3_its)->name);
+               return ret;
+       }
 
-       u32 identifiers[] = { 0 };
+       u32 identifiers[] = { dev_seq(dev) };
 
        its_offset = acpi_iort_add_its_group(ctx, ARRAY_SIZE(identifiers),
                                             identifiers);