mirror of
https://github.com/qemu/qemu.git
synced 2025-08-17 16:03:30 +00:00
hw/pci: Have PCI_BUS implement TYPE_FW_CFG_DATA_GENERATOR_INTERFACE
The FW_CFG_DATA_GENERATOR interface allows any object to produce a blob of data consumable by the fw_cfg device. Implement that for PCI bus objects. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Message-Id: <20241213133352.10915-5-philmd@linaro.org>
This commit is contained in:
parent
4016adc74a
commit
59c5eea5c7
37
hw/pci/pci.c
37
hw/pci/pci.c
@ -46,6 +46,7 @@
|
|||||||
#include "hw/pci/msix.h"
|
#include "hw/pci/msix.h"
|
||||||
#include "hw/hotplug.h"
|
#include "hw/hotplug.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
|
#include "hw/nvram/fw_cfg.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
#include "pci-internal.h"
|
#include "pci-internal.h"
|
||||||
@ -216,11 +217,41 @@ static uint16_t pcibus_numa_node(PCIBus *bus)
|
|||||||
return NUMA_NODE_UNASSIGNED;
|
return NUMA_NODE_UNASSIGNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GByteArray *pci_bus_fw_cfg_gen_data(Object *obj, Error **errp)
|
||||||
|
{
|
||||||
|
PCIBus *bus = PCI_BUS(obj);
|
||||||
|
GByteArray *byte_array;
|
||||||
|
uint64_t extra_hosts = 0;
|
||||||
|
|
||||||
|
if (!bus) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLIST_FOREACH(bus, &bus->child, sibling) {
|
||||||
|
/* look for expander root buses */
|
||||||
|
if (pci_bus_is_root(bus)) {
|
||||||
|
extra_hosts++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!extra_hosts) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
extra_hosts = cpu_to_le64(extra_hosts);
|
||||||
|
|
||||||
|
byte_array = g_byte_array_new();
|
||||||
|
g_byte_array_append(byte_array,
|
||||||
|
(const void *)&extra_hosts, sizeof(extra_hosts));
|
||||||
|
|
||||||
|
return byte_array;
|
||||||
|
}
|
||||||
|
|
||||||
static void pci_bus_class_init(ObjectClass *klass, void *data)
|
static void pci_bus_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
BusClass *k = BUS_CLASS(klass);
|
BusClass *k = BUS_CLASS(klass);
|
||||||
PCIBusClass *pbc = PCI_BUS_CLASS(klass);
|
PCIBusClass *pbc = PCI_BUS_CLASS(klass);
|
||||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||||
|
FWCfgDataGeneratorClass *fwgc = FW_CFG_DATA_GENERATOR_CLASS(klass);
|
||||||
|
|
||||||
k->print_dev = pcibus_dev_print;
|
k->print_dev = pcibus_dev_print;
|
||||||
k->get_dev_path = pcibus_get_dev_path;
|
k->get_dev_path = pcibus_get_dev_path;
|
||||||
@ -232,6 +263,8 @@ static void pci_bus_class_init(ObjectClass *klass, void *data)
|
|||||||
|
|
||||||
pbc->bus_num = pcibus_num;
|
pbc->bus_num = pcibus_num;
|
||||||
pbc->numa_node = pcibus_numa_node;
|
pbc->numa_node = pcibus_numa_node;
|
||||||
|
|
||||||
|
fwgc->get_data = pci_bus_fw_cfg_gen_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo pci_bus_info = {
|
static const TypeInfo pci_bus_info = {
|
||||||
@ -240,6 +273,10 @@ static const TypeInfo pci_bus_info = {
|
|||||||
.instance_size = sizeof(PCIBus),
|
.instance_size = sizeof(PCIBus),
|
||||||
.class_size = sizeof(PCIBusClass),
|
.class_size = sizeof(PCIBusClass),
|
||||||
.class_init = pci_bus_class_init,
|
.class_init = pci_bus_class_init,
|
||||||
|
.interfaces = (InterfaceInfo[]) {
|
||||||
|
{ TYPE_FW_CFG_DATA_GENERATOR_INTERFACE },
|
||||||
|
{ }
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TypeInfo cxl_interface_info = {
|
static const TypeInfo cxl_interface_info = {
|
||||||
|
Loading…
Reference in New Issue
Block a user