aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2020-03-31 15:11:46 +0200
committerGerd Hoffmann <kraxel@redhat.com>2020-05-15 13:55:29 +0200
commit665dce17c04b574bb0ebcde4cac129c3dd9e681c (patch)
tree124e49e36bfec4bf080532ba193e42afa0a9753b
parentea03821b1dd0dc0227f55a2e4c8ae351c8de6a58 (diff)
downloadseabios-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.c2
-rw-r--r--src/hw/virtio-mmio.c20
-rw-r--r--src/hw/virtio-mmio.h1
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);