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,
|
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);
|
int ecam_id = VIRT_ECAM_ID(highmem_ecam);
|
||||||
struct GPEXConfig cfg = {
|
struct GPEXConfig cfg = {
|
||||||
@ -161,6 +162,7 @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
|
|||||||
.pio = memmap[VIRT_PCIE_PIO],
|
.pio = memmap[VIRT_PCIE_PIO],
|
||||||
.ecam = memmap[ecam_id],
|
.ecam = memmap[ecam_id],
|
||||||
.irq = irq,
|
.irq = irq,
|
||||||
|
.bus = vms->bus,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (use_highmem) {
|
if (use_highmem) {
|
||||||
@ -609,7 +611,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
|||||||
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
|
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
|
||||||
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
|
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
|
||||||
acpi_dsdt_add_pci(scope, memmap, (irqmap[VIRT_PCIE] + ARM_SPI_BASE),
|
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) {
|
if (vms->acpi_dev) {
|
||||||
build_ged_aml(scope, "\\_SB."GED_DEVICE,
|
build_ged_aml(scope, "\\_SB."GED_DEVICE,
|
||||||
HOTPLUG_HANDLER(vms->acpi_dev),
|
HOTPLUG_HANDLER(vms->acpi_dev),
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "hw/acpi/aml-build.h"
|
#include "hw/acpi/aml-build.h"
|
||||||
#include "hw/pci-host/gpex.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)
|
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;
|
int nr_pcie_buses = cfg->ecam.size / PCIE_MMCFG_SIZE_MIN;
|
||||||
Aml *method, *crs, *dev, *rbuf;
|
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");
|
dev = aml_device("%s", "PCI0");
|
||||||
aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A08")));
|
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("_CID", aml_string("PNP0A03")));
|
||||||
|
@ -59,6 +59,7 @@ struct GPEXConfig {
|
|||||||
MemMapEntry mmio64;
|
MemMapEntry mmio64;
|
||||||
MemMapEntry pio;
|
MemMapEntry pio;
|
||||||
int irq;
|
int irq;
|
||||||
|
PCIBus *bus;
|
||||||
};
|
};
|
||||||
|
|
||||||
int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
|
int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user