diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2020-03-31 15:11:46 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2020-05-15 13:55:29 +0200 |
commit | 665dce17c04b574bb0ebcde4cac129c3dd9e681c (patch) | |
tree | 124e49e36bfec4bf080532ba193e42afa0a9753b | |
parent | ea03821b1dd0dc0227f55a2e4c8ae351c8de6a58 (diff) | |
download | seabios-665dce17c04b574bb0ebcde4cac129c3dd9e681c.tar.gz |
acpi: find and register virtio-mmio devices
Seach for virtio-mmio devices in the DSDT table,
register the devices found.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | src/fw/paravirt.c | 2 | ||||
-rw-r--r-- | src/hw/virtio-mmio.c | 20 | ||||
-rw-r--r-- | src/hw/virtio-mmio.h | 1 |
3 files changed, 23 insertions, 0 deletions
diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c index 62abf502..fba4e52d 100644 --- a/src/fw/paravirt.c +++ b/src/fw/paravirt.c @@ -16,6 +16,7 @@ #include "hw/pci_regs.h" // PCI_DEVICE_ID #include "hw/serialio.h" // PORT_SERIAL1 #include "hw/rtc.h" // CMOS_* +#include "hw/virtio-mmio.h" // virtio_mmio_acpi #include "malloc.h" // malloc_tmp #include "output.h" // dprintf #include "paravirt.h" // qemu_cfg_preinit @@ -239,6 +240,7 @@ qemu_platform_setup(void) if (RsdpAddr) { acpi_dsdt_parse(); + virtio_mmio_setup_acpi(); return; } /* If present, loader should have installed an RSDP. diff --git a/src/hw/virtio-mmio.c b/src/hw/virtio-mmio.c index dabef7b7..44344a49 100644 --- a/src/hw/virtio-mmio.c +++ b/src/hw/virtio-mmio.c @@ -3,12 +3,32 @@ #include "output.h" // dprintf #include "stacks.h" // run_thread #include "string.h" // memset +#include "util.h" // acpi_dsdt_* #include "virtio-pci.h" #include "virtio-blk.h" #include "virtio-scsi.h" #include "virtio-ring.h" #include "virtio-mmio.h" +void virtio_mmio_setup_acpi(void) +{ + static const char *virtio_hid = "LNRO0005"; + struct acpi_device *dev; + u64 mem, irq, unused; + + for (dev = acpi_dsdt_find_string(NULL, virtio_hid); + dev != NULL; + dev = acpi_dsdt_find_string(dev, virtio_hid)) { + if (acpi_dsdt_find_mem(dev, &mem, &unused) < 0) + continue; + if (acpi_dsdt_find_irq(dev, &irq) < 0) + continue; + dprintf(1, "ACPI: virtio-mmio device %s at 0x%llx, irq %lld\n", + acpi_dsdt_name(dev), mem, irq); + virtio_mmio_setup_one(mem); + } +} + void virtio_mmio_setup_one(u64 addr) { static const char *names[] = { diff --git a/src/hw/virtio-mmio.h b/src/hw/virtio-mmio.h index 9e0dae42..69fbd23c 100644 --- a/src/hw/virtio-mmio.h +++ b/src/hw/virtio-mmio.h @@ -70,6 +70,7 @@ typedef struct virtio_mmio_cfg { u32 config_generation; } virtio_mmio_cfg; +void virtio_mmio_setup_acpi(void); void virtio_mmio_setup_one(u64 mmio); void vp_init_mmio(struct vp_device *vp, void *mmio); |