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@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 */
})
- }
+}