mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
acpi/gpex: Extract two APIs from acpi_dsdt_add_pci
Extract two APIs acpi_dsdt_add_pci_route_table and acpi_dsdt_add_pci_osc from acpi_dsdt_add_pci. The first API is used to specify the pci route table and the second API is used to declare the operation system capabilities. These two APIs would be used to specify the pxb-pcie in DSDT. Signed-off-by: Yubo Miao <miaoyubo@huawei.com> Signed-off-by: Jiahui Cen <cenjiahui@huawei.com> Message-Id: <20201119014841.7298-2-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
4aedda25e8
commit
a0e2905b41
1 changed files with 63 additions and 49 deletions
|
@ -2,21 +2,11 @@
|
|||
#include "hw/acpi/aml-build.h"
|
||||
#include "hw/pci-host/gpex.h"
|
||||
|
||||
void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
|
||||
static void acpi_dsdt_add_pci_route_table(Aml *dev, uint32_t irq)
|
||||
{
|
||||
int nr_pcie_buses = cfg->ecam.size / PCIE_MMCFG_SIZE_MIN;
|
||||
Aml *method, *crs, *ifctx, *UUID, *ifctx1, *elsectx, *buf;
|
||||
Aml *method, *crs;
|
||||
int i, slot_no;
|
||||
|
||||
Aml *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")));
|
||||
aml_append(dev, aml_name_decl("_SEG", aml_int(0)));
|
||||
aml_append(dev, aml_name_decl("_BBN", aml_int(0)));
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
|
||||
aml_append(dev, aml_name_decl("_STR", aml_unicode("PCIe 0 Device")));
|
||||
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
|
||||
|
||||
/* Declare the PCI Routing Table. */
|
||||
Aml *rt_pkg = aml_varpackage(PCI_SLOT_MAX * PCI_NUM_PINS);
|
||||
for (slot_no = 0; slot_no < PCI_SLOT_MAX; slot_no++) {
|
||||
|
@ -34,7 +24,7 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
|
|||
|
||||
/* Create GSI link device */
|
||||
for (i = 0; i < PCI_NUM_PINS; i++) {
|
||||
uint32_t irqs = cfg->irq + i;
|
||||
uint32_t irqs = irq + i;
|
||||
Aml *dev_gsi = aml_device("GSI%d", i);
|
||||
aml_append(dev_gsi, aml_name_decl("_HID", aml_string("PNP0C0F")));
|
||||
aml_append(dev_gsi, aml_name_decl("_UID", aml_int(i)));
|
||||
|
@ -52,43 +42,11 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
|
|||
aml_append(dev_gsi, method);
|
||||
aml_append(dev, dev_gsi);
|
||||
}
|
||||
}
|
||||
|
||||
method = aml_method("_CBA", 0, AML_NOTSERIALIZED);
|
||||
aml_append(method, aml_return(aml_int(cfg->ecam.base)));
|
||||
aml_append(dev, method);
|
||||
|
||||
Aml *rbuf = aml_resource_template();
|
||||
aml_append(rbuf,
|
||||
aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE,
|
||||
0x0000, 0x0000, nr_pcie_buses - 1, 0x0000,
|
||||
nr_pcie_buses));
|
||||
if (cfg->mmio32.size) {
|
||||
aml_append(rbuf,
|
||||
aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED,
|
||||
AML_NON_CACHEABLE, AML_READ_WRITE, 0x0000,
|
||||
cfg->mmio32.base,
|
||||
cfg->mmio32.base + cfg->mmio32.size - 1,
|
||||
0x0000,
|
||||
cfg->mmio32.size));
|
||||
}
|
||||
if (cfg->pio.size) {
|
||||
aml_append(rbuf,
|
||||
aml_dword_io(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE,
|
||||
AML_ENTIRE_RANGE, 0x0000, 0x0000,
|
||||
cfg->pio.size - 1,
|
||||
cfg->pio.base,
|
||||
cfg->pio.size));
|
||||
}
|
||||
if (cfg->mmio64.size) {
|
||||
aml_append(rbuf,
|
||||
aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED,
|
||||
AML_NON_CACHEABLE, AML_READ_WRITE, 0x0000,
|
||||
cfg->mmio64.base,
|
||||
cfg->mmio64.base + cfg->mmio64.size - 1,
|
||||
0x0000,
|
||||
cfg->mmio64.size));
|
||||
}
|
||||
aml_append(dev, aml_name_decl("_CRS", rbuf));
|
||||
static void acpi_dsdt_add_pci_osc(Aml *dev)
|
||||
{
|
||||
Aml *method, *UUID, *ifctx, *ifctx1, *elsectx, *buf;
|
||||
|
||||
/* Declare an _OSC (OS Control Handoff) method */
|
||||
aml_append(dev, aml_name_decl("SUPP", aml_int(0)));
|
||||
|
@ -160,6 +118,62 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
|
|||
buf = aml_buffer(1, byte_list);
|
||||
aml_append(method, aml_return(buf));
|
||||
aml_append(dev, method);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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")));
|
||||
aml_append(dev, aml_name_decl("_SEG", aml_int(0)));
|
||||
aml_append(dev, aml_name_decl("_BBN", aml_int(0)));
|
||||
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
|
||||
aml_append(dev, aml_name_decl("_STR", aml_unicode("PCIe 0 Device")));
|
||||
aml_append(dev, aml_name_decl("_CCA", aml_int(1)));
|
||||
|
||||
acpi_dsdt_add_pci_route_table(dev, cfg->irq);
|
||||
|
||||
method = aml_method("_CBA", 0, AML_NOTSERIALIZED);
|
||||
aml_append(method, aml_return(aml_int(cfg->ecam.base)));
|
||||
aml_append(dev, method);
|
||||
|
||||
rbuf = aml_resource_template();
|
||||
aml_append(rbuf,
|
||||
aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE,
|
||||
0x0000, 0x0000, nr_pcie_buses - 1, 0x0000,
|
||||
nr_pcie_buses));
|
||||
if (cfg->mmio32.size) {
|
||||
aml_append(rbuf,
|
||||
aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED,
|
||||
AML_NON_CACHEABLE, AML_READ_WRITE, 0x0000,
|
||||
cfg->mmio32.base,
|
||||
cfg->mmio32.base + cfg->mmio32.size - 1,
|
||||
0x0000,
|
||||
cfg->mmio32.size));
|
||||
}
|
||||
if (cfg->pio.size) {
|
||||
aml_append(rbuf,
|
||||
aml_dword_io(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE,
|
||||
AML_ENTIRE_RANGE, 0x0000, 0x0000,
|
||||
cfg->pio.size - 1,
|
||||
cfg->pio.base,
|
||||
cfg->pio.size));
|
||||
}
|
||||
if (cfg->mmio64.size) {
|
||||
aml_append(rbuf,
|
||||
aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED,
|
||||
AML_NON_CACHEABLE, AML_READ_WRITE, 0x0000,
|
||||
cfg->mmio64.base,
|
||||
cfg->mmio64.base + cfg->mmio64.size - 1,
|
||||
0x0000,
|
||||
cfg->mmio64.size));
|
||||
}
|
||||
aml_append(dev, aml_name_decl("_CRS", rbuf));
|
||||
|
||||
acpi_dsdt_add_pci_osc(dev);
|
||||
|
||||
Aml *dev_res0 = aml_device("%s", "RES0");
|
||||
aml_append(dev_res0, aml_name_decl("_HID", aml_string("PNP0C02")));
|
||||
|
|
Loading…
Reference in a new issue