/*
 * 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)
