提交 8ac6f7a6 编写于 作者: I Igor Mammedov 提交者: Michael S. Tsirkin

pc: acpi-build: drop template patching and create Device(SMC) dynamically

patch moves SMC device into SSDT and creates it only
when device is present, which makes ACPI tables smaller
in default case when device is not present.

Also it fixes wrong IO range in CRS if "iobase"
property is set to a non default value.

PS:
Testing with XP shows that current default "iobase"
used SMC device conflicts with floppy controller IO,
but it's topic for another patch and I'd leave it
to SMC device author for resolving conflict.
Signed-off-by: NIgor Mammedov <imammedo@redhat.com>
CC: agraf@suse.de
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
上级 1142e45f
...@@ -116,6 +116,7 @@ typedef struct AcpiMiscInfo { ...@@ -116,6 +116,7 @@ typedef struct AcpiMiscInfo {
const unsigned char *dsdt_code; const unsigned char *dsdt_code;
unsigned dsdt_size; unsigned dsdt_size;
uint16_t pvpanic_port; uint16_t pvpanic_port;
uint16_t applesmc_io_base;
} AcpiMiscInfo; } AcpiMiscInfo;
typedef struct AcpiBuildPciBusHotplugState { typedef struct AcpiBuildPciBusHotplugState {
...@@ -127,7 +128,6 @@ typedef struct AcpiBuildPciBusHotplugState { ...@@ -127,7 +128,6 @@ typedef struct AcpiBuildPciBusHotplugState {
static void acpi_get_dsdt(AcpiMiscInfo *info) static void acpi_get_dsdt(AcpiMiscInfo *info)
{ {
uint16_t *applesmc_sta;
Object *piix = piix4_pm_find(); Object *piix = piix4_pm_find();
Object *lpc = ich9_lpc_find(); Object *lpc = ich9_lpc_find();
assert(!!piix != !!lpc); assert(!!piix != !!lpc);
...@@ -135,17 +135,11 @@ static void acpi_get_dsdt(AcpiMiscInfo *info) ...@@ -135,17 +135,11 @@ static void acpi_get_dsdt(AcpiMiscInfo *info)
if (piix) { if (piix) {
info->dsdt_code = AcpiDsdtAmlCode; info->dsdt_code = AcpiDsdtAmlCode;
info->dsdt_size = sizeof AcpiDsdtAmlCode; info->dsdt_size = sizeof AcpiDsdtAmlCode;
applesmc_sta = piix_dsdt_applesmc_sta;
} }
if (lpc) { if (lpc) {
info->dsdt_code = Q35AcpiDsdtAmlCode; info->dsdt_code = Q35AcpiDsdtAmlCode;
info->dsdt_size = sizeof Q35AcpiDsdtAmlCode; info->dsdt_size = sizeof Q35AcpiDsdtAmlCode;
applesmc_sta = q35_dsdt_applesmc_sta;
} }
/* Patch in appropriate value for AppleSMC _STA */
*(uint8_t *)(info->dsdt_code + *applesmc_sta) =
applesmc_port() ? 0x0b : 0x00;
} }
static static
...@@ -248,6 +242,7 @@ static void acpi_get_misc_info(AcpiMiscInfo *info) ...@@ -248,6 +242,7 @@ static void acpi_get_misc_info(AcpiMiscInfo *info)
info->has_hpet = hpet_find(); info->has_hpet = hpet_find();
info->has_tpm = tpm_find(); info->has_tpm = tpm_find();
info->pvpanic_port = pvpanic_port(); info->pvpanic_port = pvpanic_port();
info->applesmc_io_base = applesmc_port();
} }
static void acpi_get_pci_info(PcPciInfo *info) static void acpi_get_pci_info(PcPciInfo *info)
...@@ -955,6 +950,26 @@ build_ssdt(GArray *table_data, GArray *linker, ...@@ -955,6 +950,26 @@ build_ssdt(GArray *table_data, GArray *linker,
aml_append(scope, aml_name_decl("_S5", pkg)); aml_append(scope, aml_name_decl("_S5", pkg));
aml_append(ssdt, scope); aml_append(ssdt, scope);
if (misc->applesmc_io_base) {
scope = aml_scope("\\_SB.PCI0.ISA");
dev = aml_device("SMC");
aml_append(dev, aml_name_decl("_HID", aml_eisaid("APP0001")));
/* device present, functioning, decoding, not shown in UI */
aml_append(dev, aml_name_decl("_STA", aml_int(0xB)));
crs = aml_resource_template();
aml_append(crs,
aml_io(aml_decode16, misc->applesmc_io_base, misc->applesmc_io_base,
0x01, APPLESMC_MAX_DATA_LENGTH)
);
aml_append(crs, aml_irq_no_flags(6));
aml_append(dev, aml_name_decl("_CRS", crs));
aml_append(scope, dev);
aml_append(ssdt, scope);
}
if (misc->pvpanic_port) { if (misc->pvpanic_port) {
scope = aml_scope("\\_SB.PCI0.ISA"); scope = aml_scope("\\_SB.PCI0.ISA");
......
...@@ -16,17 +16,6 @@ ...@@ -16,17 +16,6 @@
/* Common legacy ISA style devices. */ /* Common legacy ISA style devices. */
Scope(\_SB.PCI0.ISA) { Scope(\_SB.PCI0.ISA) {
Device (SMC) {
Name(_HID, EisaId("APP0001"))
/* _STA will be patched to 0x0B if AppleSMC is present */
ACPI_EXTRACT_NAME_BYTE_CONST DSDT_APPLESMC_STA
Name(_STA, 0xF0)
Name(_CRS, ResourceTemplate () {
IO (Decode16, 0x0300, 0x0300, 0x01, 0x20)
IRQNoFlags() { 6 }
})
}
Device(RTC) { Device(RTC) {
Name(_HID, EisaId("PNP0B00")) Name(_HID, EisaId("PNP0B00"))
Name(_CRS, ResourceTemplate() { Name(_CRS, ResourceTemplate() {
......
...@@ -85,7 +85,6 @@ DefinitionBlock ( ...@@ -85,7 +85,6 @@ DefinitionBlock (
} }
} }
#define DSDT_APPLESMC_STA piix_dsdt_applesmc_sta
#include "acpi-dsdt-isa.dsl" #include "acpi-dsdt-isa.dsl"
......
...@@ -150,7 +150,6 @@ DefinitionBlock ( ...@@ -150,7 +150,6 @@ DefinitionBlock (
} }
} }
#define DSDT_APPLESMC_STA q35_dsdt_applesmc_sta
#include "acpi-dsdt-isa.dsl" #include "acpi-dsdt-isa.dsl"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册