
/******************************************************************************
 *
 * Name: actables.h - Table data structures defined in ACPI specification
 *
 *****************************************************************************/

/*
 *  Copyright (C) 2000 R. Byron Moore
 *
 *  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; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __ACTABLES_H__
#define __ACTABLES_H__


/*
 *  Values for description table header signatures
 */

#define RSDP_SIG            "RSD PTR "              /* RSDT Pointer signature */
#define APIC_SIG            "APIC"                  /* Multiple APIC Description Table */
#define DSDT_SIG            "DSDT"                  /* Differentiated System Description Table */
#define FACP_SIG            "FACP"                  /* Fixed ACPI Description Table */
#define FACS_SIG            "FACS"                  /* Firmware ACPI Control Structure */
#define PSDT_SIG            "PSDT"                  /* Persistent System Description Table */
#define RSDT_SIG            "RSDT"                  /* Root System Description Table */
#define SSDT_SIG            "SSDT"                  /* Secondary System Description Table */
#define SBST_SIG            "SBST"                  /* Smart Battery Specification Table */
#define BOOT_SIG            "BOOT"                  /* Boot table */


#define GL_OWNED            0x02                    /* Ownership of global lock is bit 1 */

/* values of Mapic.Model */

#define DUAL_PIC            0
#define MULTIPLE_APIC       1

/* values of Type in APIC_HEADER */

#define APIC_PROC           0
#define APIC_IO             1


/*
 * Architecture-independent tables
 * The architecture dependent tables are in separate files
 */

typedef struct  /* Root System Descriptor Pointer */
{
	char                    signature [8];          /* contains "RSD PTR " */
	u8                      checksum;               /* to make sum of struct == 0 */
	char                    oem_id [6];             /* OEM identification */
	u8                      reserved;               /* reserved - must be zero */
	u32                     rsdt_physical_address;  /* physical address of RSDT */

} ROOT_SYSTEM_DESCRIPTOR_POINTER;


typedef struct  /* ACPI common table header */
{
	char                    signature [4];          /* identifies type of table */
	u32                     length;                 /* length of table, in bytes,
			  * including header */
	u8                      revision;               /* specification minor version # */
	u8                      checksum;               /* to make sum of entire table == 0 */
	char                    oem_id [6];             /* OEM identification */
	char                    oem_table_id [8];       /* OEM table identification */
	u32                     oem_revision;           /* OEM revision number */
	char                    asl_compiler_id [4];    /* ASL compiler vendor ID */
	u32                     asl_compiler_revision;  /* ASL compiler revision number */

} ACPI_TABLE_HEADER;


typedef struct  /* APIC Table */
{
	ACPI_TABLE_HEADER       header;                 /* table header */
	u32                     local_apic_address;     /* Physical address for accessing local APICs */
	u32                     PCATcompat      : 1;    /* a one indicates system also has dual 8259s */
	u32                     reserved1       : 31;

} APIC_TABLE;


typedef struct  /* APIC Header */
{
	u8                      type;                   /* APIC type.  Either APIC_PROC or APIC_IO */
	u8                      length;                 /* Length of APIC structure */

} APIC_HEADER;


typedef struct  /* Processor APIC */
{
	APIC_HEADER             header;
	u8                      processor_apic_id;      /* ACPI processor id */
	u8                      local_apic_id;          /* processor's local APIC id */
	u32                     processor_enabled: 1;   /* Processor is usable if set */
	u32                     reserved1       : 32;

} PROCESSOR_APIC;


typedef struct  /* IO APIC */
{
	APIC_HEADER             header;
	u8                      io_apic_id;             /* I/O APIC ID */
	u8                      reserved;               /* reserved - must be zero */
	u32                     io_apic_address;        /* APIC's physical address */
	u32                     vector;                 /* interrupt vector index where INTI
			  * lines start */
} IO_APIC;


/*
**  IA64 TODO:  Add SAPIC Tables
*/

/*
**  IA64 TODO:  Modify Smart Battery Description to comply with ACPI IA64
**              extensions.
*/
typedef struct  /* Smart Battery Description Table */
{
	ACPI_TABLE_HEADER       header;
	u32                     warning_level;
	u32                     low_level;
	u32                     critical_level;

} SMART_BATTERY_DESCRIPTION_TABLE;


/*
 * ACPI Table information.  We save the table address, length,
 * and type of memory allocation (mapped or allocated) for each
 * table for 1) when we exit, and 2) if a new table is installed
 */

#define ACPI_MEM_NOT_ALLOCATED  0
#define ACPI_MEM_ALLOCATED      1
#define ACPI_MEM_MAPPED         2

#define ACPI_TABLE_SINGLE       0
#define ACPI_TABLE_MULTIPLE     1


/* Data about each known table type */

typedef struct _acpi_table_support
{
	char                    *name;
	char                    *signature;
	u8                      sig_length;
	u8                      flags;
	u16                     status;
	void                    **global_ptr;

} ACPI_TABLE_SUPPORT;


/*
 * Get the architecture-specific tables
 */

#ifdef IA64
#include "actbl64.h"
#else
#include "actbl32.h"
#endif


#endif /* __ACTABLES_H__ */
