fw_cfg: Refactor extra pci roots addition
Extract extra pci roots addition from pc machine, which could be used by other machines. In order to make uefi get the extra roots, it is necessary to write extra roots into fw_cfg. And only if the uefi knows there are extra roots, the config spaces of devices behind the root could be obtained. Signed-off-by: Jiahui Cen <cenjiahui@huawei.com> Signed-off-by: Yubo Miao <miaoyubo@huawei.com> Message-Id: <20201119014841.7298-3-cenjiahui@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
a0e2905b41
commit
0abd38885a
18
hw/i386/pc.c
18
hw/i386/pc.c
@ -777,27 +777,11 @@ void pc_machine_done(Notifier *notifier, void *data)
|
|||||||
PCMachineState *pcms = container_of(notifier,
|
PCMachineState *pcms = container_of(notifier,
|
||||||
PCMachineState, machine_done);
|
PCMachineState, machine_done);
|
||||||
X86MachineState *x86ms = X86_MACHINE(pcms);
|
X86MachineState *x86ms = X86_MACHINE(pcms);
|
||||||
PCIBus *bus = pcms->bus;
|
|
||||||
|
|
||||||
/* set the number of CPUs */
|
/* set the number of CPUs */
|
||||||
x86_rtc_set_cpus_count(x86ms->rtc, x86ms->boot_cpus);
|
x86_rtc_set_cpus_count(x86ms->rtc, x86ms->boot_cpus);
|
||||||
|
|
||||||
if (bus) {
|
fw_cfg_add_extra_pci_roots(pcms->bus, x86ms->fw_cfg);
|
||||||
int extra_hosts = 0;
|
|
||||||
|
|
||||||
QLIST_FOREACH(bus, &bus->child, sibling) {
|
|
||||||
/* look for expander root buses */
|
|
||||||
if (pci_bus_is_root(bus)) {
|
|
||||||
extra_hosts++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (extra_hosts && x86ms->fw_cfg) {
|
|
||||||
uint64_t *val = g_malloc(sizeof(*val));
|
|
||||||
*val = cpu_to_le64(extra_hosts);
|
|
||||||
fw_cfg_add_file(x86ms->fw_cfg,
|
|
||||||
"etc/extra-pci-roots", val, sizeof(*val));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
acpi_setup();
|
acpi_setup();
|
||||||
if (x86ms->fw_cfg) {
|
if (x86ms->fw_cfg) {
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "hw/acpi/aml-build.h"
|
#include "hw/acpi/aml-build.h"
|
||||||
|
#include "hw/pci/pci_bus.h"
|
||||||
|
|
||||||
#define FW_CFG_FILE_SLOTS_DFLT 0x20
|
#define FW_CFG_FILE_SLOTS_DFLT 0x20
|
||||||
|
|
||||||
@ -1061,6 +1062,28 @@ bool fw_cfg_add_from_generator(FWCfgState *s, const char *filename,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fw_cfg_add_extra_pci_roots(PCIBus *bus, FWCfgState *s)
|
||||||
|
{
|
||||||
|
int extra_hosts = 0;
|
||||||
|
|
||||||
|
if (!bus) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLIST_FOREACH(bus, &bus->child, sibling) {
|
||||||
|
/* look for expander root buses */
|
||||||
|
if (pci_bus_is_root(bus)) {
|
||||||
|
extra_hosts++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extra_hosts && s) {
|
||||||
|
uint64_t *val = g_malloc(sizeof(*val));
|
||||||
|
*val = cpu_to_le64(extra_hosts);
|
||||||
|
fw_cfg_add_file(s, "etc/extra-pci-roots", val, sizeof(*val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void fw_cfg_machine_reset(void *opaque)
|
static void fw_cfg_machine_reset(void *opaque)
|
||||||
{
|
{
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
||||||
|
@ -308,6 +308,15 @@ void *fw_cfg_modify_file(FWCfgState *s, const char *filename, void *data,
|
|||||||
bool fw_cfg_add_from_generator(FWCfgState *s, const char *filename,
|
bool fw_cfg_add_from_generator(FWCfgState *s, const char *filename,
|
||||||
const char *gen_id, Error **errp);
|
const char *gen_id, Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fw_cfg_add_extra_pci_roots:
|
||||||
|
* @bus: main pci root bus to be scanned from
|
||||||
|
* @s: fw_cfg device being modified
|
||||||
|
*
|
||||||
|
* Add a new fw_cfg item...
|
||||||
|
*/
|
||||||
|
void fw_cfg_add_extra_pci_roots(PCIBus *bus, FWCfgState *s);
|
||||||
|
|
||||||
FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, uint32_t dma_iobase,
|
FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, uint32_t dma_iobase,
|
||||||
AddressSpace *dma_as);
|
AddressSpace *dma_as);
|
||||||
FWCfgState *fw_cfg_init_io(uint32_t iobase);
|
FWCfgState *fw_cfg_init_io(uint32_t iobase);
|
||||||
|
Loading…
Reference in New Issue
Block a user