[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