[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2 of 2] Add configuration options to selectively disable S3 and S4 ACPI power states
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |