diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-02-17 21:38:51 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-02-17 21:38:51 +0000 |
commit | d58671c4bfc0376e288cb0f2936bd43d8cfbb48e (patch) | |
tree | 458b0d59ed56e9b48af594e841bf9e0ebb8e81a2 | |
parent | 142cad1503c9b218dd71fc1e0293aa1bd51d11c6 (diff) |
Add QWord support to acpigen.
Add TOM2 to the K8 DSDT.
Thanks to Rudolf Marek for testing and fixing this patch.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Signed-off-by: Rudolf Marek <r.marek@assembler.cz>
Acked-by: Peter Stuge <peter@stuge.se>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3953 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r-- | src/arch/i386/boot/acpigen.c | 22 | ||||
-rw-r--r-- | src/arch/i386/include/arch/acpigen.h | 2 | ||||
-rw-r--r-- | src/northbridge/amd/amdk8/amdk8_acpi.c | 2 |
3 files changed, 26 insertions, 0 deletions
diff --git a/src/arch/i386/boot/acpigen.c b/src/arch/i386/boot/acpigen.c index 6342a69572..53bf6d0841 100644 --- a/src/arch/i386/boot/acpigen.c +++ b/src/arch/i386/boot/acpigen.c @@ -97,6 +97,21 @@ int acpigen_write_dword(unsigned int data) return 5; } +int acpigen_write_qword(uint64_t data) +{ + /* qword op */ + acpigen_emit_byte(0xe); + acpigen_emit_byte(data & 0xff); + acpigen_emit_byte((data >> 8) & 0xff); + acpigen_emit_byte((data >> 16) & 0xff); + acpigen_emit_byte((data >> 24) & 0xff); + acpigen_emit_byte((data >> 32) & 0xff); + acpigen_emit_byte((data >> 40) & 0xff); + acpigen_emit_byte((data >> 48) & 0xff); + acpigen_emit_byte((data >> 56) & 0xff); + return 9; +} + int acpigen_write_name_byte(char *name, uint8_t val) { int len; len = acpigen_write_name(name); @@ -111,6 +126,13 @@ int acpigen_write_name_dword(char *name, uint32_t val) { return len; } +int acpigen_write_name_qword(char *name, uint64_t val) { + int len; + len = acpigen_write_name(name); + len += acpigen_write_qword(val); + return len; +} + int acpigen_emit_stream(char *data, int size) { int i; for (i = 0; i < size; i++) { diff --git a/src/arch/i386/include/arch/acpigen.h b/src/arch/i386/include/arch/acpigen.h index e024f67d64..074f6415bb 100644 --- a/src/arch/i386/include/arch/acpigen.h +++ b/src/arch/i386/include/arch/acpigen.h @@ -30,8 +30,10 @@ int acpigen_write_byte(unsigned int data); int acpigen_emit_byte(unsigned char data); int acpigen_emit_stream(char *data, int size); int acpigen_write_dword(unsigned int data); +int acpigen_write_qword(uint64_t data); int acpigen_write_name(char *name); int acpigen_write_name_dword(char *name, uint32_t val); +int acpigen_write_name_qword(char *name, uint64_t val); int acpigen_write_name_byte(char *name, uint8_t val); int acpigen_write_scope(char *name); int acpigen_write_PPC(u8 nr); diff --git a/src/northbridge/amd/amdk8/amdk8_acpi.c b/src/northbridge/amd/amdk8/amdk8_acpi.c index 2d56a4f605..ca71c379d7 100644 --- a/src/northbridge/amd/amdk8/amdk8_acpi.c +++ b/src/northbridge/amd/amdk8/amdk8_acpi.c @@ -302,6 +302,8 @@ int k8acpi_write_vars(void) lens += acpigen_write_name_dword("SBDN", sysconf.sbdn); msr = rdmsr(TOP_MEM); lens += acpigen_write_name_dword("TOM1", msr.lo); + msr = rdmsr(TOP_MEM2); + lens += acpigen_write_name_qword("TOM2", (((uint64_t) msr.hi) << 32) | msr.lo); lens += k8acpi_write_HT(); //minus opcode |