From 091a8c61d384cf56affee3d7d89bde0dcc0057fe Mon Sep 17 00:00:00 2001 From: Erwan Velu Date: Thu, 3 Dec 2009 11:10:38 +0100 Subject: [PATCH] acpi: Adding ecdt Impact: Addding ecdt Adding ecdt --- com32/gplinclude/acpi/acpi.h | 5 ++-- com32/gplinclude/acpi/ecdt.h | 38 ++++++++++++++++++++++++++++++ com32/gplinclude/acpi/madt.h | 2 +- com32/gplinclude/acpi/structs.h | 12 ++++++++++ com32/gpllib/acpi/ecdt.c | 51 +++++++++++++++++++++++++++++++++++++++++ com32/gpllib/acpi/xsdt.c | 8 ++++++- 6 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 com32/gplinclude/acpi/ecdt.h create mode 100644 com32/gpllib/acpi/ecdt.c 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 #include #include +#include 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 index 0000000..0f8f3ca --- /dev/null +++ b/com32/gplinclude/acpi/ecdt.h @@ -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 +#include + +#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 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/ecdt.c b/com32/gpllib/acpi/ecdt.c new file mode 100644 index 0000000..5cbdd60 --- /dev/null +++ b/com32/gpllib/acpi/ecdt.c @@ -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 +#include +#include +#include +#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); + } +} 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; -- 2.7.4