[SeaBIOS] [PATCH 2/6] acpi: move s3/s4/s5 to build_ssdt
Paolo Bonzini
pbonzini at redhat.com
Wed Aug 1 13:05:03 CEST 2012
Il 01/08/2012 10:05, Igor Mammedov ha scritto:
> On 07/31/2012 11:52 AM, Paolo Bonzini wrote:
>> Move the _S3/_S4/_S5 packages out of ssdt-pcihp.dsl and into a separate
>> file. Correspondingly, move the patching from build_pcihp to build_ssdt.
>> Place this part at the beginning of the SSDT. Offset computation is a
>> bit simpler, and anyway the packages do not need to be inside Scope(_SB).
>>
>> Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
>> ---
>> Makefile | 2 +-
>> src/acpi.c | 41 ++++++++++++++++++++++++-----------------
>> src/ssdt-pcihp.dsl | 36 ------------------------------------
>> src/ssdt-susp.dsl | 41 +++++++++++++++++++++++++++++++++++++++++
>> 4 files changed, 66 insertions(+), 54 deletions(-)
>> create mode 100644 src/ssdt-susp.dsl
>>
>> diff --git a/Makefile b/Makefile
>> index fe974f7..2ccf05b 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -228,7 +228,7 @@ $(OUT)%.hex: src/%.dsl
>> ./tools/acpi_extract_preprocess.py ./tools/acpi_extract.p
>> $(Q)$(PYTHON) ./tools/acpi_extract.py $(OUT)$*.lst > $(OUT)$*.off
>> $(Q)cat $(OUT)$*.off > $@
>>
>> -$(OUT)ccode32flat.o: $(OUT)acpi-dsdt.hex $(OUT)ssdt-proc.hex
>> $(OUT)ssdt-pcihp.hex
>> +$(OUT)ccode32flat.o: $(OUT)acpi-dsdt.hex $(OUT)ssdt-proc.hex
>> $(OUT)ssdt-pcihp.hex $(OUT)ssdt-susp.hex
>>
>> ################ Kconfig rules
>>
>> diff --git a/src/acpi.c b/src/acpi.c
>> index 55e4607..e6a7ef5 100644
>> --- a/src/acpi.c
>> +++ b/src/acpi.c
>> @@ -407,26 +407,46 @@ encodeLen(u8 *ssdt_ptr, int length, int bytes)
>>
>> #define SSDT_SIGNATURE 0x54445353 // SSDT
>>
>> +#define SSDT_HEADER_LENGTH 36
>> +
>> +#include "ssdt-susp.hex"
>> +
>> static void*
>> build_ssdt(void)
>> {
>> int acpi_cpus = MaxCountCPUs > 0xff ? 0xff : MaxCountCPUs;
>> // length = ScopeOp + procs + NTYF method + CPON package
> perhaps comment should reflect changes
It's already out of date, but you're right. It can be fixed on top, or
I can respin.
>> - int length = ((1+3+4)
>> + int length = (sizeof(ssdp_susp_aml)
>> + + (1+3+4)
> it would be nice to have a self documenting define here instead of numbers
>
>> + (acpi_cpus * SD_SIZEOF)
>> + (1+2+5+(12*acpi_cpus))
>> + (6+2+1+(1*acpi_cpus))
>> + 17);
>> - u8 *ssdt = malloc_high(sizeof(struct acpi_table_header) + length);
>> + u8 *ssdt = malloc_high(length);
> does sizeof(ssdp_susp_aml) includes sizeof(struct acpi_table_header)?
Yes:
static unsigned char ssdp_susp_aml[] = {
0x53, // 'S'
0x53, // 'S'
0x44, // 'D'
0x54, // 'T'
0x4e, // length
0x0, // rev
0x0,
0x0,
0x1,
0x45, // checksum
0x42, // 'B'
0x58, // 'X'
etc.
>> if (! ssdt) {
>> warn_noalloc();
>> return NULL;
>> }
>> - u8 *ssdt_ptr = ssdt + sizeof(struct acpi_table_header);
>> + u8 *ssdt_ptr = ssdt;
>> +
>> + // Copy header and encode fwcfg values in the S3_ / S4_ / S5_
>> packages
>> + int sys_state_size;
>> + char *sys_states = romfile_loadfile("etc/system-states",
>> &sys_state_size);
>> + if (!sys_states || sys_state_size != 6)
>> + sys_states = (char[]){128, 0, 0, 129, 128, 128};
>> +
>> + memcpy(ssdt_ptr, ssdp_susp_aml, sizeof(ssdp_susp_aml));
>> + if (!(sys_states[3] & 128))
>> + ssdt_ptr[acpi_s3_name[0]] = 'X';
>> + if (!(sys_states[4] & 128))
>> + ssdt_ptr[acpi_s4_name[0]] = 'X';
>> + else
>> + ssdt_ptr[acpi_s4_pkg[0] + 1] = ssdt[acpi_s4_pkg[0] + 3] =
>> sys_states[4] & 127;
>> + ssdt_ptr += sizeof(ssdp_susp_aml);
>>
>> // build Scope(_SB_) header
>> *(ssdt_ptr++) = 0x10; // ScopeOp
>> - ssdt_ptr = encodeLen(ssdt_ptr, length-1, 3);
>> + ssdt_ptr = encodeLen(ssdt_ptr, length - (ssdt_ptr - ssdt), 3);
>> *(ssdt_ptr++) = '_';
>> *(ssdt_ptr++) = 'S';
>> *(ssdt_ptr++) = 'B';
>> @@ -518,8 +538,6 @@ extern void link_time_assertion(void);
>>
>> static void* build_pcihp(void)
>> {
>> - char *sys_states;
>> - int sys_state_size;
>> u32 rmvc_pcrm;
>> int i;
>>
>> @@ -551,19 +569,8 @@ static void* build_pcihp(void)
>> }
>> }
>>
>> - sys_states = romfile_loadfile("etc/system-states", &sys_state_size);
>> - if (!sys_states || sys_state_size != 6)
>> - sys_states = (char[]){128, 0, 0, 129, 128, 128};
>> -
>> - if (!(sys_states[3] & 128))
>> - ssdt[acpi_s3_name[0]] = 'X';
>> - if (!(sys_states[4] & 128))
>> - ssdt[acpi_s4_name[0]] = 'X';
>> - else
>> - ssdt[acpi_s4_pkg[0] + 1] = ssdt[acpi_s4_pkg[0] + 3] =
>> sys_states[4] & 127;
>> ((struct acpi_table_header*)ssdt)->checksum = 0;
>> ((struct acpi_table_header*)ssdt)->checksum -= checksum(ssdt,
>> sizeof(ssdp_pcihp_aml));
>> -
>> return ssdt;
>> }
>>
>> diff --git a/src/ssdt-pcihp.dsl b/src/ssdt-pcihp.dsl
>> index 81c57b3..fd9c0bb 100644
>> --- a/src/ssdt-pcihp.dsl
>> +++ b/src/ssdt-pcihp.dsl
>> @@ -58,40 +58,4 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01,
>> "BXPC", "BXSSDTPCIHP", 0x1)
>> hotplug_slot(1e)
>> hotplug_slot(1f)
>> }
>> -
>> - Scope(\) {
>> -/****************************************************************
>> - * Suspend
>> - ****************************************************************/
>> -
>> - /*
>> - * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off)
>> type codes:
>> - * must match piix4 emulation.
>> - */
>> -
>> - ACPI_EXTRACT_NAME_STRING acpi_s3_name
>> - Name (_S3, Package (0x04)
>> - {
>> - One, /* PM1a_CNT.SLP_TYP */
>> - One, /* PM1b_CNT.SLP_TYP */
>> - Zero, /* reserved */
>> - Zero /* reserved */
>> - })
>> - ACPI_EXTRACT_NAME_STRING acpi_s4_name
>> - ACPI_EXTRACT_PKG_START acpi_s4_pkg
>> - Name (_S4, Package (0x04)
>> - {
>> - 0x2, /* PM1a_CNT.SLP_TYP */
>> - 0x2, /* PM1b_CNT.SLP_TYP */
>> - Zero, /* reserved */
>> - Zero /* reserved */
>> - })
>> - Name (_S5, Package (0x04)
>> - {
>> - Zero, /* PM1a_CNT.SLP_TYP */
>> - Zero, /* PM1b_CNT.SLP_TYP */
>> - Zero, /* reserved */
>> - Zero /* reserved */
>> - })
>> - }
>> }
>> diff --git a/src/ssdt-susp.dsl b/src/ssdt-susp.dsl
>> new file mode 100644
>> index 0000000..0b3fa08
>> --- /dev/null
>> +++ b/src/ssdt-susp.dsl
>> @@ -0,0 +1,41 @@
>> +ACPI_EXTRACT_ALL_CODE ssdp_susp_aml
>> +
>> +DefinitionBlock ("ssdt-susp.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP",
>> 0x1)
>> +{
>> +
>> +/****************************************************************
>> + * Suspend
>> + ****************************************************************/
>> +
>> + Scope(\) {
>> + /*
>> + * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off)
>> type codes:
>> + * must match piix4 emulation.
>> + */
>> +
>> + ACPI_EXTRACT_NAME_STRING acpi_s3_name
>> + Name (_S3, Package (0x04)
>> + {
>> + One, /* PM1a_CNT.SLP_TYP */
>> + One, /* PM1b_CNT.SLP_TYP */
>> + Zero, /* reserved */
>> + Zero /* reserved */
>> + })
>> + ACPI_EXTRACT_NAME_STRING acpi_s4_name
>> + ACPI_EXTRACT_PKG_START acpi_s4_pkg
>> + Name (_S4, Package (0x04)
>> + {
>> + 0x2, /* PM1a_CNT.SLP_TYP */
>> + 0x2, /* PM1b_CNT.SLP_TYP */
>> + Zero, /* reserved */
>> + Zero /* reserved */
>> + })
>> + Name (_S5, Package (0x04)
>> + {
>> + Zero, /* PM1a_CNT.SLP_TYP */
>> + Zero, /* PM1b_CNT.SLP_TYP */
>> + Zero, /* reserved */
>> + Zero /* reserved */
>> + })
>> + }
>> +}
>>
More information about the SeaBIOS
mailing list