| /* |
| * Remote PCI host device |
| * |
| * Unlike PCI host devices that model physical hardware, the purpose |
| * of this PCI host is to host multi-process QEMU devices. |
| * |
| * Multi-process QEMU extends the PCI host of a QEMU machine into a |
| * remote process. Any PCI device attached to the remote process is |
| * visible in the QEMU guest. This allows existing QEMU device models |
| * to be reused in the remote process. |
| * |
| * This PCI host is purely a container for PCI devices. It's fake in the |
| * sense that the guest never sees this PCI host and has no way of |
| * accessing it. Its job is just to provide the environment that QEMU |
| * PCI device models need when running in a remote process. |
| * |
| * Copyright © 2018, 2021 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 "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) |
| { |
| PCIHostState *pci = PCI_HOST_BRIDGE(dev); |
| RemotePCIHost *s = REMOTE_PCIHOST(dev); |
| |
| pci->bus = pci_root_bus_new(DEVICE(s), "remote-pci", |
| 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_PCIHOST, |
| .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) |