[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 03/21] multi-process: setup PCI host bridge for remote device
From: |
elena . ufimtseva |
Subject: |
[PATCH v7 03/21] multi-process: setup PCI host bridge for remote device |
Date: |
Sat, 27 Jun 2020 10:09:25 -0700 |
From: Jagannathan Raman <jag.raman@oracle.com>
PCI host bridge is setup for the remote device process. It is
implemented using remote-pcihost object. It is an extension of the PCI
host bridge setup by QEMU.
Remote-pcihost configures a PCI bus which could be used by the remote
PCI device to latch on to.
Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
---
MAINTAINERS | 8 +++++
hw/pci-host/Makefile.objs | 1 +
hw/pci-host/remote.c | 63 ++++++++++++++++++++++++++++++++++++
include/hw/pci-host/remote.h | 34 +++++++++++++++++++
4 files changed, 106 insertions(+)
create mode 100644 hw/pci-host/remote.c
create mode 100644 include/hw/pci-host/remote.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 1b40446c73..e46f1960bf 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2938,6 +2938,14 @@ S: Maintained
F: hw/semihosting/
F: include/hw/semihosting/
+Multi-process QEMU
+M: Jagannathan Raman <jag.raman@oracle.com>
+M: Elena Ufimtseva <elena.ufimtseva@oracle.com>
+M: John G Johnson <john.g.johnson@oracle.com>
+S: Maintained
+F: hw/pci-host/remote.c
+F: include/hw/pci-host/remote.h
+
Build and test automation
-------------------------
Build and test automation
diff --git a/hw/pci-host/Makefile.objs b/hw/pci-host/Makefile.objs
index e422e0aca0..daf900710d 100644
--- a/hw/pci-host/Makefile.objs
+++ b/hw/pci-host/Makefile.objs
@@ -18,6 +18,7 @@ common-obj-$(CONFIG_XEN_IGD_PASSTHROUGH) += xen_igd_pt.o
common-obj-$(CONFIG_PCI_EXPRESS_Q35) += q35.o
common-obj-$(CONFIG_PCI_EXPRESS_GENERIC_BRIDGE) += gpex.o
common-obj-$(CONFIG_PCI_EXPRESS_XILINX) += xilinx-pcie.o
+common-obj-$(CONFIG_MPQEMU) += remote.o
common-obj-$(CONFIG_PCI_EXPRESS_DESIGNWARE) += designware.o
obj-$(CONFIG_POWERNV) += pnv_phb4.o pnv_phb4_pec.o
diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c
new file mode 100644
index 0000000000..5ea9af4154
--- /dev/null
+++ b/hw/pci-host/remote.c
@@ -0,0 +1,63 @@
+/*
+ * Remote PCI host device
+ *
+ * Copyright © 2018, 2020 Oracle and/or its affiliates.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+
+#include "hw/pci/pci.h"
+#include "hw/pci/pci_host.h"
+#include "hw/pci/pcie_host.h"
+#include "hw/qdev-properties.h"
+#include "hw/pci-host/remote.h"
+#include "exec/memory.h"
+
+static const char *remote_pcihost_root_bus_path(PCIHostState *host_bridge,
+ PCIBus *rootbus)
+{
+ return "0000:00";
+}
+
+static void remote_pcihost_realize(DeviceState *dev, Error **errp)
+{
+ char *busname = g_strdup_printf("remote-pci-%ld", (unsigned long)getpid());
+ PCIHostState *pci = PCI_HOST_BRIDGE(dev);
+ RemotePCIHost *s = REMOTE_HOST_DEVICE(dev);
+
+ pci->bus = pci_root_bus_new(DEVICE(s), busname,
+ s->mr_pci_mem, s->mr_sys_io,
+ 0, TYPE_PCIE_BUS);
+}
+
+static void remote_pcihost_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+ PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(klass);
+
+ hc->root_bus_path = remote_pcihost_root_bus_path;
+ dc->realize = remote_pcihost_realize;
+
+ dc->user_creatable = false;
+ set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
+ dc->fw_name = "pci";
+}
+
+static const TypeInfo remote_pcihost_info = {
+ .name = TYPE_REMOTE_HOST_DEVICE,
+ .parent = TYPE_PCIE_HOST_BRIDGE,
+ .instance_size = sizeof(RemotePCIHost),
+ .class_init = remote_pcihost_class_init,
+};
+
+static void remote_pcihost_register(void)
+{
+ type_register_static(&remote_pcihost_info);
+}
+
+type_init(remote_pcihost_register)
diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h
new file mode 100644
index 0000000000..3df1b53c17
--- /dev/null
+++ b/include/hw/pci-host/remote.h
@@ -0,0 +1,34 @@
+/*
+ * PCI Host for remote device
+ *
+ * Copyright © 2018, 2020 Oracle and/or its affiliates.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef REMOTE_PCIHOST_H
+#define REMOTE_PCIHOST_H
+
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+
+#include "exec/memory.h"
+#include "hw/pci/pcie_host.h"
+
+#define TYPE_REMOTE_HOST_DEVICE "remote-pcihost"
+#define REMOTE_HOST_DEVICE(obj) \
+ OBJECT_CHECK(RemotePCIHost, (obj), TYPE_REMOTE_HOST_DEVICE)
+
+typedef struct RemotePCIHost {
+ /*< private >*/
+ PCIExpressHost parent_obj;
+ /*< public >*/
+
+ MemoryRegion *mr_pci_mem;
+ MemoryRegion *mr_sys_mem;
+ MemoryRegion *mr_sys_io;
+} RemotePCIHost;
+
+#endif
--
2.25.GIT
- [PATCH v7 12/21] multi-process: Connect Proxy Object with device in the remote process, (continued)
- [PATCH v7 12/21] multi-process: Connect Proxy Object with device in the remote process, elena . ufimtseva, 2020/06/27
- [PATCH v7 13/21] multi-process: Forward PCI config space acceses to the remote process, elena . ufimtseva, 2020/06/27
- [PATCH v7 16/21] multi-process: create IOHUB object to handle irq, elena . ufimtseva, 2020/06/27
- [PATCH v7 18/21] multi-process: heartbeat messages to remote, elena . ufimtseva, 2020/06/27
- [PATCH v7 19/21] multi-process: perform device reset in the remote process, elena . ufimtseva, 2020/06/27
- [PATCH v7 21/21] multi-process: add configure and usage information, elena . ufimtseva, 2020/06/27
- [PATCH v7 20/21] multi-process: add the concept description to docs/devel/qemu-multiprocess, elena . ufimtseva, 2020/06/27
- [PATCH v7 14/21] multi-process: PCI BAR read/write handling for proxy & remote endpoints, elena . ufimtseva, 2020/06/27
- [PATCH v7 02/21] multi-process: Add config option for multi-process QEMU, elena . ufimtseva, 2020/06/27
- [PATCH v7 03/21] multi-process: setup PCI host bridge for remote device,
elena . ufimtseva <=
- [PATCH v7 04/21] multi-process: setup a machine object for remote device process, elena . ufimtseva, 2020/06/27
- [PATCH v7 05/21] multi-process: add qio channel function to transmit, elena . ufimtseva, 2020/06/27
- [PATCH v7 08/21] multi-process: Initialize communication channel at the remote end, elena . ufimtseva, 2020/06/27
- [PATCH v7 09/21] multi-process: Initialize message handler in remote device, elena . ufimtseva, 2020/06/27
- [PATCH v7 17/21] multi-process: Retrieve PCI info from remote process, elena . ufimtseva, 2020/06/27
- [PATCH v7 15/21] multi-process: Synchronize remote memory, elena . ufimtseva, 2020/06/27