# HG changeset patch
# User Paul Durrant <paul.durrant@xxxxxxxxxx>
# Date 1321612462 0
# Node ID 3e977aa71278d30aad3d9eb3e5b6413cbcfc0f4e
# Parent 8a29891d6a98002b299d73253935c161ecf393a1
Add configuration options to selectively disable S3 and S4 ACPI power states.
Introduce acpi_s3 and acpi_s4 configuration options (default=1). The S3 and S4
packages are moved into separate SSDTs and their inclusion is controlled by the
new configuration options.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/Makefile
--- a/tools/firmware/hvmloader/acpi/Makefile Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/acpi/Makefile Fri Nov 18 10:34:22 2011 +0000
@@ -26,7 +26,7 @@ CFLAGS += $(CFLAGS_xeninclude)
vpath iasl $(PATH)
all: acpi.a
-ssdt_pm.h ssdt_tpm.h: %.h: %.asl iasl
+ssdt_s3.h ssdt_s4.h ssdt_pm.h ssdt_tpm.h: %.h: %.asl iasl
iasl -vs -p $* -tc $<
sed -e 's/AmlCode/$*/g' $*.hex >$@
rm -f $*.hex $*.aml
@@ -57,7 +57,7 @@ iasl:
@echo
@exit 1
-build.o: ssdt_pm.h ssdt_tpm.h
+build.o: ssdt_s3.h ssdt_s4.h ssdt_pm.h ssdt_tpm.h
acpi.a: $(OBJS)
$(AR) rc $@ $(OBJS)
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/acpi2_0.h
--- a/tools/firmware/hvmloader/acpi/acpi2_0.h Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/acpi/acpi2_0.h Fri Nov 18 10:34:22 2011 +0000
@@ -396,6 +396,8 @@ struct acpi_config {
int dsdt_anycpu_len;
unsigned char *dsdt_15cpu;
int dsdt_15cpu_len;
+ int ssdt_s3_enabled;
+ int ssdt_s4_enabled;
};
void acpi_build_tables(struct acpi_config *config, unsigned int physical);
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/acpi/build.c Fri Nov 18 10:34:22 2011 +0000
@@ -17,6 +17,8 @@
*/
#include "acpi2_0.h"
+#include "ssdt_s3.h"
+#include "ssdt_s4.h"
#include "ssdt_tpm.h"
#include "ssdt_pm.h"
#include "../config.h"
@@ -196,7 +198,8 @@ static struct acpi_20_waet *construct_wa
}
static int construct_secondary_tables(unsigned long *table_ptrs,
- struct acpi_info *info)
+ struct acpi_info *info,
+ struct acpi_config *config)
{
int nr_tables = 0;
struct acpi_20_madt *madt;
@@ -235,6 +238,22 @@ static int construct_secondary_tables(un
table_ptrs[nr_tables++] = (unsigned long)ssdt;
}
+ if ( config->ssdt_s3_enabled )
+ {
+ ssdt = mem_alloc(sizeof(ssdt_s3), 16);
+ if (!ssdt) return -1;
+ memcpy(ssdt, ssdt_s3, sizeof(ssdt_s3));
+ table_ptrs[nr_tables++] = (unsigned long)ssdt;
+ }
+
+ if ( config->ssdt_s4_enabled )
+ {
+ ssdt = mem_alloc(sizeof(ssdt_s4), 16);
+ if (!ssdt) return -1;
+ memcpy(ssdt, ssdt_s4, sizeof(ssdt_s4));
+ table_ptrs[nr_tables++] = (unsigned long)ssdt;
+ }
+
/* TPM TCPA and SSDT. */
tis_hdr = (uint16_t *)0xFED40F00;
if ( (tis_hdr[0] == tis_signature[0]) &&
@@ -353,7 +372,8 @@ void acpi_build_tables(struct acpi_confi
offsetof(struct acpi_header, checksum),
sizeof(struct acpi_20_fadt));
- nr_secondaries = construct_secondary_tables(secondary_tables, acpi_info);
+ nr_secondaries = construct_secondary_tables(secondary_tables, acpi_info,
+ config);
if ( nr_secondaries < 0 )
goto oom;
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/dsdt.asl
--- a/tools/firmware/hvmloader/acpi/dsdt.asl Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/acpi/dsdt.asl Fri Nov 18 10:34:22 2011 +0000
@@ -27,24 +27,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
Name (\APCL, 0x00010000)
Name (\PUID, 0x00)
- /*
- * S3 (suspend-to-ram), S4 (suspend-to-disc) and S5 (power-off) type codes:
- * must match piix4 emulation.
- */
- Name (\_S3, Package (0x04)
- {
- 0x01, /* PM1a_CNT.SLP_TYP */
- 0x01, /* PM1b_CNT.SLP_TYP */
- 0x0, /* reserved */
- 0x0 /* reserved */
- })
- Name (\_S4, Package (0x04)
- {
- 0x00, /* PM1a_CNT.SLP_TYP */
- 0x00, /* PM1b_CNT.SLP_TYP */
- 0x00, /* reserved */
- 0x00 /* reserved */
- })
+ /* _S3 and _S4 are in separate SSDTs */
Name (\_S5, Package (0x04)
{
0x00, /* PM1a_CNT.SLP_TYP */
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/ssdt_s3.asl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/acpi/ssdt_s3.asl Fri Nov 18 10:34:22 2011 +0000
@@ -0,0 +1,32 @@
+/*
+ * ssdt_s3.asl
+ *
+ * Copyright (c) 2011 Citrix Systems, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+DefinitionBlock ("SSDT_S3.aml", "SSDT", 2, "Xen", "HVM", 0)
+{
+ /* Must match piix emulation */
+ Name (\_S3, Package (0x04)
+ {
+ 0x01, /* PM1a_CNT.SLP_TYP */
+ 0x01, /* PM1b_CNT.SLP_TYP */
+ 0x0, /* reserved */
+ 0x0 /* reserved */
+ })
+}
+
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/ssdt_s4.asl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/acpi/ssdt_s4.asl Fri Nov 18 10:34:22 2011 +0000
@@ -0,0 +1,32 @@
+/*
+ * ssdt_s4.asl
+ *
+ * Copyright (c) 2011 Citrix Systems, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+DefinitionBlock ("SSDT_S4.aml", "SSDT", 2, "Xen", "HVM", 0)
+{
+ /* Must match piix emulation */
+ Name (\_S4, Package (0x04)
+ {
+ 0x00, /* PM1a_CNT.SLP_TYP */
+ 0x00, /* PM1b_CNT.SLP_TYP */
+ 0x00, /* reserved */
+ 0x00 /* reserved */
+ })
+}
+
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/config.h
--- a/tools/firmware/hvmloader/config.h Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/config.h Fri Nov 18 10:34:22 2011 +0000
@@ -27,7 +27,7 @@ struct bios_config {
void (*e820_setup)(void);
- void (*acpi_build_tables)(void);
+ void (*acpi_build_tables)(int, int);
void (*create_mp_tables)(void);
void (*create_smbios_tables)(void);
void (*create_pir_tables)(void);
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/hvmloader.c Fri Nov 18 10:34:22 2011 +0000
@@ -516,11 +516,17 @@ int main(void)
.index = HVM_PARAM_ACPI_IOPORTS_LOCATION,
.value = 1,
};
+ int s3_enabled, s4_enabled;
+
+ s3_enabled = !strncmp(xenstore_read("platform/acpi_s3", "1"), "1", 1);
+ s4_enabled = !strncmp(xenstore_read("platform/acpi_s4", "1"), "1", 1);
if ( bios->acpi_build_tables )
{
- printf("Loading ACPI ...\n");
- bios->acpi_build_tables();
+ printf("Loading ACPI (S3=%s S4=%s) ...\n",
+ (s3_enabled) ? "ON" : "OFF",
+ (s4_enabled) ? "ON" : "OFF");
+ bios->acpi_build_tables(s3_enabled, s4_enabled);
}
acpi_enable_sci();
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/rombios.c
--- a/tools/firmware/hvmloader/rombios.c Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/rombios.c Fri Nov 18 10:34:22 2011 +0000
@@ -112,13 +112,15 @@ static void reset_bios_checksum(void)
*((uint8_t *)(ROMBIOS_BEGIN + ROMBIOS_MAXOFFSET)) = -checksum;
}
-static void rombios_acpi_build_tables(void)
+static void rombios_acpi_build_tables(int s3_enabled, int s4_enabled)
{
struct acpi_config config = {
.dsdt_anycpu = dsdt_anycpu,
.dsdt_anycpu_len = dsdt_anycpu_len,
.dsdt_15cpu = dsdt_15cpu,
.dsdt_15cpu_len = dsdt_15cpu_len,
+ .ssdt_s3_enabled = s3_enabled,
+ .ssdt_s4_enabled = s4_enabled,
};
acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/seabios.c
--- a/tools/firmware/hvmloader/seabios.c Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/firmware/hvmloader/seabios.c Fri Nov 18 10:34:22 2011 +0000
@@ -91,7 +91,7 @@ static void add_table(uint32_t t)
info->tables_nr++;
}
-static void seabios_acpi_build_tables(void)
+static void seabios_acpi_build_tables(int s3_enabled, int s4_enabled)
{
uint32_t rsdp = (uint32_t)scratch_alloc(sizeof(struct acpi_20_rsdp), 0);
struct acpi_config config = {
@@ -99,6 +99,8 @@ static void seabios_acpi_build_tables(vo
.dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len,
.dsdt_15cpu = NULL,
.dsdt_15cpu_len = 0,
+ .ssdt_s3_enabled = s3_enabled,
+ .ssdt_s4_enabled = s4_enabled,
};
acpi_build_tables(&config, rsdp);
diff -r 8a29891d6a98 -r 3e977aa71278 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/libxl/libxl_create.c Fri Nov 18 10:34:22 2011 +0000
@@ -93,6 +93,8 @@ int libxl_init_build_info(libxl_ctx *ctx
b_info->u.hvm.pae = 1;
b_info->u.hvm.apic = 1;
b_info->u.hvm.acpi = 1;
+ b_info->u.hvm.acpi_s3 = 1;
+ b_info->u.hvm.acpi_s4 = 1;
b_info->u.hvm.nx = 1;
b_info->u.hvm.viridian = 0;
b_info->u.hvm.hpet = 1;
@@ -189,9 +191,13 @@ int libxl__domain_build(libxl__gc *gc,
vments[4] = "start_time";
vments[5] = libxl__sprintf(gc, "%lu.%02d",
start_time.tv_sec,(int)start_time.tv_usec/10000);
- localents = libxl__calloc(gc, 3, sizeof(char *));
+ localents = libxl__calloc(gc, 7, sizeof(char *));
localents[0] = "platform/acpi";
localents[1] = (info->u.hvm.acpi) ? "1" : "0";
+ localents[2] = "platform/acpi_s3";
+ localents[3] = (info->u.hvm.acpi_s3) ? "1" : "0";
+ localents[4] = "platform/acpi_s4";
+ localents[5] = (info->u.hvm.acpi_s4) ? "1" : "0";
break;
case LIBXL_DOMAIN_TYPE_PV:
diff -r 8a29891d6a98 -r 3e977aa71278 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/libxl/libxl_types.idl Fri Nov 18 10:34:22 2011 +0000
@@ -167,6 +167,8 @@ libxl_domain_build_info = Struct("domain
("pae", bool),
("apic", bool),
("acpi", bool),
+ ("acpi_s3", bool),
+ ("acpi_s4", bool),
("nx", bool),
("viridian", bool),
("timeoffset", string),
diff -r 8a29891d6a98 -r 3e977aa71278 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Fri Nov 18 10:33:33 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c Fri Nov 18 10:34:22 2011 +0000
@@ -683,6 +683,10 @@ static void parse_config_data(const char
b_info->u.hvm.apic = l;
if (!xlu_cfg_get_long (config, "acpi", &l))
b_info->u.hvm.acpi = l;
+ if (!xlu_cfg_get_long (config, "acpi_s3", &l))
+ b_info->u.hvm.acpi_s3 = l;
+ if (!xlu_cfg_get_long (config, "acpi_s4", &l))
+ b_info->u.hvm.acpi_s4 = l;
if (!xlu_cfg_get_long (config, "nx", &l))
b_info->u.hvm.nx = l;
if (!xlu_cfg_get_long (config, "viridian", &l))
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|