acpi: Adding ecdt
authorErwan Velu <erwan.velu@free.fr>
Thu, 3 Dec 2009 10:10:38 +0000 (11:10 +0100)
committerErwan Velu <erwan.velu@free.fr>
Fri, 4 Dec 2009 09:19:02 +0000 (10:19 +0100)
Impact: Addding ecdt

Adding ecdt

com32/gplinclude/acpi/acpi.h
com32/gplinclude/acpi/ecdt.h [new file with mode: 0644]
com32/gplinclude/acpi/madt.h
com32/gplinclude/acpi/structs.h
com32/gpllib/acpi/ecdt.c [new file with mode: 0644]
com32/gpllib/acpi/xsdt.c

index 5ded220..0ce43f5 100644 (file)
 #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/ecdt.h b/com32/gplinclude/acpi/ecdt.h
new file mode 100644 (file)
index 0000000..0f8f3ca
--- /dev/null
@@ -0,0 +1,38 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2009 Erwan Velu - All Rights Reserved
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
+ *   Boston MA 02111-1307, USA; either version 2 of the License, or
+ *   (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef ECDT_H
+#define ECDT_H
+#include <inttypes.h>
+#include <stdbool.h>
+
+#define ECDT "ECDT"
+
+/* Offset of the EC_ID in the structure */
+#define EC_ID_OFFSET 65
+
+typedef struct {
+    uint64_t address;
+    s_acpi_description_header header;
+    bool valid;
+    uint32_t warning_energy_level;
+    uint32_t low_energy_level;
+    uint32_t critical_energy_level;
+    s_gas ec_control;
+    s_gas ec_data;
+    uint32_t uid;
+    uint8_t gpe_bit;
+    char *ec_id;
+} s_ecdt;
+
+void parse_ecdt(s_ecdt * ecdt);
+#endif
index c79d99b..8627edd 100644 (file)
@@ -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;
index b5e1772..9838170 100644 (file)
  * */
 #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/ecdt.c b/com32/gpllib/acpi/ecdt.c
new file mode 100644 (file)
index 0000000..5cbdd60
--- /dev/null
@@ -0,0 +1,51 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2009 Erwan Velu - All Rights Reserved
+ *
+ *   Permission is hereby granted, free of charge, to any person
+ *   obtaining a copy of this software and associated documentation
+ *   files (the "Software"), to deal in the Software without
+ *   restriction, including without limitation the rights to use,
+ *   copy, modify, merge, publish, distribute, sublicense, and/or
+ *   sell copies of the Software, and to permit persons to whom
+ *   the Software is furnished to do so, subject to the following
+ *   conditions:
+ *
+ *   The above copyright notice and this permission notice shall
+ *   be included in all copies or substantial portions of the Software.
+ *
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *   OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * -----------------------------------------------------------------------
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#include <dprintf.h>
+#include "acpi/acpi.h"
+
+void parse_ecdt(s_ecdt * e)
+{
+    uint8_t *q;
+    q = (uint64_t *) (e->address + ACPI_HEADER_SIZE);
+
+    /* Copying remaining structs */
+    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);
+    }
+}
index 916695b..d9e1b8c 100644 (file)
@@ -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;