[syslinux:master] acpi: Adding ecdt

syslinux-bot for Erwan Velu erwan.velu at free.fr
Sun Feb 6 14:07:00 PST 2011


Commit-ID:  091a8c61d384cf56affee3d7d89bde0dcc0057fe
Gitweb:     http://syslinux.zytor.com/commit/091a8c61d384cf56affee3d7d89bde0dcc0057fe
Author:     Erwan Velu <erwan.velu at free.fr>
AuthorDate: Thu, 3 Dec 2009 11:10:38 +0100
Committer:  Erwan Velu <erwan.velu at free.fr>
CommitDate: Fri, 4 Dec 2009 10:19:02 +0100

acpi: Adding ecdt

Impact: Addding ecdt

Adding ecdt


---
 com32/gplinclude/acpi/acpi.h             |    5 +++--
 com32/gplinclude/acpi/{sbst.h => ecdt.h} |   18 +++++++++++++-----
 com32/gplinclude/acpi/madt.h             |    2 +-
 com32/gplinclude/acpi/structs.h          |   12 ++++++++++++
 com32/gpllib/acpi/{fadt.c => ecdt.c}     |   20 ++++++++++++--------
 com32/gpllib/acpi/xsdt.c                 |    8 +++++++-
 6 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/com32/gplinclude/acpi/acpi.h b/com32/gplinclude/acpi/acpi.h
index 5ded220..0ce43f5 100644
--- a/com32/gplinclude/acpi/acpi.h
+++ b/com32/gplinclude/acpi/acpi.h
@@ -23,13 +23,13 @@
 #include <acpi/dsdt.h>
 #include <acpi/ssdt.h>
 #include <acpi/sbst.h>
+#include <acpi/ecdt.h>
 
 enum { ACPI_FOUND, ENO_ACPI, MADT_FOUND, ENO_MADT };
 
 #define MAX_SSDT 128
 
 /* Some other description HEADERS : ACPI doc: 5.2.6*/
-#define ECDT "ECDT"
 #define FACS "FACS"
 #define OEMX "OEMx"
 #define SRAR "SRAT"
@@ -66,8 +66,9 @@ typedef struct {
     s_madt madt;
     s_dsdt dsdt;
     s_ssdt *ssdt[MAX_SSDT];
-    s_sbst sbst;
     uint8_t ssdt_count;
+    s_sbst sbst;
+    s_ecdt ecdt;
 } s_acpi;
 
 int parse_acpi(s_acpi * acpi);
diff --git a/com32/gplinclude/acpi/sbst.h b/com32/gplinclude/acpi/ecdt.h
similarity index 76%
copy from com32/gplinclude/acpi/sbst.h
copy to com32/gplinclude/acpi/ecdt.h
index 6e3aa10..0f8f3ca 100644
--- a/com32/gplinclude/acpi/sbst.h
+++ b/com32/gplinclude/acpi/ecdt.h
@@ -10,12 +10,15 @@
  *
  * ----------------------------------------------------------------------- */
 
-#ifndef SBST_H
-#define SBST_H
+#ifndef ECDT_H
+#define ECDT_H
 #include <inttypes.h>
 #include <stdbool.h>
 
-#define SBST "SBST"
+#define ECDT "ECDT"
+
+/* Offset of the EC_ID in the structure */
+#define EC_ID_OFFSET 65
 
 typedef struct {
     uint64_t address;
@@ -24,7 +27,12 @@ typedef struct {
     uint32_t warning_energy_level;
     uint32_t low_energy_level;
     uint32_t critical_energy_level;
-} s_sbst;
+    s_gas ec_control;
+    s_gas ec_data;
+    uint32_t uid;
+    uint8_t gpe_bit;
+    char *ec_id;
+} s_ecdt;
 
-void parse_sbst(s_sbst * sbst);
+void parse_ecdt(s_ecdt * ecdt);
 #endif
diff --git a/com32/gplinclude/acpi/madt.h b/com32/gplinclude/acpi/madt.h
index c79d99b..8627edd 100644
--- a/com32/gplinclude/acpi/madt.h
+++ b/com32/gplinclude/acpi/madt.h
@@ -37,7 +37,7 @@ typedef struct {
     uint8_t acpi_id;
     uint8_t apic_id;
     uint32_t flags;
-} s_processor_local_apic;
+} __attribute__ ((packed)) s_processor_local_apic;
 
 typedef struct {
     uint64_t address;
diff --git a/com32/gplinclude/acpi/structs.h b/com32/gplinclude/acpi/structs.h
index b5e1772..9838170 100644
--- a/com32/gplinclude/acpi/structs.h
+++ b/com32/gplinclude/acpi/structs.h
@@ -20,6 +20,18 @@
  * */
 #define ACPI_HEADER_SIZE 36
 
+enum { GAS_SYSTEM_MEMORY=0, GAS_SYSTEM_IO=1 };
+
+/* Generic Address Structure (GAS) Format */
+typedef struct {
+    /* address_space_id could be {GAS_SYSTEM_MEMORY | GAS_SYSTEM_IO} */
+    uint8_t address_space_id;
+    uint8_t register_bit_width;
+    uint8_t register_bit_offset;
+    uint8_t reserved;
+    uint64_t address;
+} __attribute__ ((packed)) s_gas;
+
 typedef struct {
     uint8_t signature[4 + 1];
     uint32_t length;
diff --git a/com32/gpllib/acpi/fadt.c b/com32/gpllib/acpi/ecdt.c
similarity index 77%
copy from com32/gpllib/acpi/fadt.c
copy to com32/gpllib/acpi/ecdt.c
index a37149c..5cbdd60 100644
--- a/com32/gpllib/acpi/fadt.c
+++ b/com32/gpllib/acpi/ecdt.c
@@ -32,16 +32,20 @@
 #include <dprintf.h>
 #include "acpi/acpi.h"
 
-void parse_fadt(s_fadt * f)
+void parse_ecdt(s_ecdt * e)
 {
-    /* Let's seach for FADT table */
     uint8_t *q;
+    q = (uint64_t *) (e->address + ACPI_HEADER_SIZE);
 
-    /* Fixing table name */
-    memcpy(f->header.signature,FADT,sizeof(FADT));
-    
     /* Copying remaining structs */
-    q = (uint64_t *) (f->address+ACPI_HEADER_SIZE);
-    cp_struct(&f->firmware_ctrl);
-    cp_struct(&f->dsdt_address);
+    cp_struct(&e->ec_control);
+    cp_struct(&e->ec_data);
+    cp_struct(&e->uid);
+    cp_struct(&e->gpe_bit);
+
+    /* Searching ec_id size we must copy */
+    uint32_t ec_id_size = e->header.length - EC_ID_OFFSET;
+    if ((e->ec_id = malloc(ec_id_size)) != NULL) {
+	memcpy(e->ec_id, (uint64_t *) (e->address + EC_ID_OFFSET), ec_id_size);
+    }
 }
diff --git a/com32/gpllib/acpi/xsdt.c b/com32/gpllib/acpi/xsdt.c
index 916695b..d9e1b8c 100644
--- a/com32/gpllib/acpi/xsdt.c
+++ b/com32/gpllib/acpi/xsdt.c
@@ -112,8 +112,14 @@ int parse_xsdt(s_acpi * acpi)
 		    s->address=*p;
 		    memcpy(&s->header,&adh,sizeof(adh));
 		    parse_sbst(s);
+	    } else if (memcmp(adh.signature, ECDT, sizeof(ECDT)-1) == 0) {
+		    s_ecdt *e = &acpi->ecdt;
+		    /* This structure is valid, let's fill it */
+		    e->valid=true;
+		    e->address=*p;
+		    memcpy(&e->header,&adh,sizeof(adh));
+		    parse_ecdt(e);
 	    }
-
 	    x->entry_count++;
 	}
 	return XSDT_TABLE_FOUND;



More information about the Syslinux-commits mailing list