acpi/gpex: Build tables for pxb
The resources of pxbs are obtained by crs_build and the resources used by pxbs would be moved from the resources defined for host-bridge. The resources for pxb are composed of following two parts: 1. The bar space of the pci-bridge/pcie-root-port behined it 2. The config space of devices behind it. Signed-off-by: Yubo Miao <miaoyubo@huawei.com> Signed-off-by: Jiahui Cen <cenjiahui@huawei.com> Message-Id: <20201119014841.7298-6-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
37d5c0a8ff
commit
6f9765fbad
@ -153,7 +153,8 @@ static void acpi_dsdt_add_virtio(Aml *scope,
|
||||
}
|
||||
|
||||
static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
|
||||
uint32_t irq, bool use_highmem, bool highmem_ecam)
|
||||
uint32_t irq, bool use_highmem, bool highmem_ecam,
|
||||
VirtMachineState *vms)
|
||||
{
|
||||
int ecam_id = VIRT_ECAM_ID(highmem_ecam);
|
||||
struct GPEXConfig cfg = {
|
||||
@ -161,6 +162,7 @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
|
||||
.pio = memmap[VIRT_PCIE_PIO],
|
||||
.ecam = memmap[ecam_id],
|
||||
.irq = irq,
|
||||
.bus = vms->bus,
|
||||
};
|
||||
|
||||
if (use_highmem) {
|
||||
@ -609,7 +611,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
|
||||
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
|
||||
acpi_dsdt_add_pci(scope, memmap, (irqmap[VIRT_PCIE] + ARM_SPI_BASE),
|
||||
vms->highmem, vms->highmem_ecam);
|
||||
vms->highmem, vms->highmem_ecam, vms);
|
||||
if (vms->acpi_dev) {
|
||||
build_ged_aml(scope, "\\_SB."GED_DEVICE,
|
||||
HOTPLUG_HANDLER(vms->acpi_dev),
|
||||
|
@ -1,6 +1,10 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/pci-host/gpex.h"
|
||||
#include "hw/arm/virt.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci/pcie_host.h"
|
||||
|
||||
static void acpi_dsdt_add_pci_route_table(Aml *dev, uint32_t irq)
|
||||
{
|
||||
@ -124,7 +128,57 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
|
||||
{
|
||||
int nr_pcie_buses = cfg->ecam.size / PCIE_MMCFG_SIZE_MIN;
|
||||
Aml *method, *crs, *dev, *rbuf;
|
||||
PCIBus *bus = cfg->bus;
|
||||
CrsRangeSet crs_range_set;
|
||||
|
||||
/* start to construct the tables for pxb */
|
||||
crs_range_set_init(&crs_range_set);
|
||||
if (bus) {
|
||||
QLIST_FOREACH(bus, &bus->child, sibling) {
|
||||
uint8_t bus_num = pci_bus_num(bus);
|
||||
uint8_t numa_node = pci_bus_numa_node(bus);
|
||||
|
||||
if (!pci_bus_is_root(bus)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* 0 - (nr_pcie_buses - 1) is the bus range for the main
|
||||
* host-bridge and it equals the MIN of the
|
||||
* busNr defined for pxb-pcie.
|
||||
*/
|
||||
if (bus_num < nr_pcie_buses) {
|
||||
nr_pcie_buses = bus_num;
|
||||
}
|
||||
|
||||
dev = aml_device("PC%.02X", bus_num);
|
||||
aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A08")));
|
||||
aml_append(dev, aml_name_decl("_CID", aml_string("PNP0A03")));
|
||||
aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num)));
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(bus_num)));
|
||||
aml_append(dev, aml_name_decl("_STR", aml_unicode("pxb Device")));
|
||||
if (numa_node != NUMA_NODE_UNASSIGNED) {
|
||||
aml_append(dev, aml_name_decl("_PXM", aml_int(numa_node)));
|
||||
}
|
||||
|
||||
acpi_dsdt_add_pci_route_table(dev, cfg->irq);
|
||||
|
||||
/*
|
||||
* Resources defined for PXBs are composed by the folling parts:
|
||||
* 1. The resources the pci-brige/pcie-root-port need.
|
||||
* 2. The resources the devices behind pxb need.
|
||||
*/
|
||||
crs = build_crs(PCI_HOST_BRIDGE(BUS(bus)->parent), &crs_range_set);
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
|
||||
acpi_dsdt_add_pci_osc(dev);
|
||||
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
}
|
||||
crs_range_set_free(&crs_range_set);
|
||||
|
||||
/* tables for the main */
|
||||
dev = aml_device("%s", "PCI0");
|
||||
aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A08")));
|
||||
aml_append(dev, aml_name_decl("_CID", aml_string("PNP0A03")));
|
||||
|
@ -59,6 +59,7 @@ struct GPEXConfig {
|
||||
MemMapEntry mmio64;
|
||||
MemMapEntry pio;
|
||||
int irq;
|
||||
PCIBus *bus;
|
||||
};
|
||||
|
||||
int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
|
||||
|
Loading…
Reference in New Issue
Block a user