Commit 62c7aea9 authored by Andy Grover's avatar Andy Grover Committed by Linus Torvalds

[PATCH] ACPI patch 1/9

This is the first of 9 patches. We did a complete rewrite of the
Linux-specific code, so we wait for things to stabilize before submitting.
There will be more updates, but *much* smaller.

#1 - this updates the header file.
parent 1ae90c54
/*
* acpi.h - ACPI driver interface
* acpi.h - ACPI Interface
*
* Copyright (C) 1999 Andrew Henroid
* Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 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
......@@ -16,165 +18,373 @@
* 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 _LINUX_ACPI_H
#define _LINUX_ACPI_H
#include <linux/types.h>
#include <linux/ioctl.h>
#ifdef __KERNEL__
#include <linux/sched.h>
#include <linux/wait.h>
#endif /* __KERNEL__ */
#ifndef _LINUX
#define _LINUX
#endif
#include "../../drivers/acpi/include/acpi.h"
#include <asm/acpi.h>
/* --------------------------------------------------------------------------
Boot-Time Table Parsing
-------------------------------------------------------------------------- */
#ifdef CONFIG_ACPI_BOOT
/* Root System Description Pointer (RSDP) */
struct acpi_table_rsdp {
char signature[8];
u8 checksum;
char oem_id[6];
u8 revision;
u32 rsdt_address;
} __attribute__ ((packed));
struct acpi20_table_rsdp {
char signature[8];
u8 checksum;
char oem_id[6];
u8 revision;
u32 rsdt_address;
u32 length;
u64 xsdt_address;
u8 ext_checksum;
u8 reserved[3];
} __attribute__ ((packed));
/* Common table header */
struct acpi_table_header {
char signature[4];
u32 length;
u8 revision;
u8 checksum;
char oem_id[6];
char oem_table_id[8];
u32 oem_revision;
char asl_compiler_id[4];
u32 asl_compiler_revision;
} __attribute__ ((packed));
typedef struct {
u8 type;
u8 length;
} acpi_table_entry_header __attribute__ ((packed));
/* Root System Description Table (RSDT) */
struct acpi_table_rsdt {
struct acpi_table_header header;
u32 entry[1];
} __attribute__ ((packed));
/* Extended System Description Table (XSDT) */
struct acpi_table_xsdt {
struct acpi_table_header header;
u64 entry[1];
} __attribute__ ((packed));
/* Multiple APIC Description Table (MADT) */
struct acpi_table_madt {
struct acpi_table_header header;
u32 lapic_address;
struct {
u32 pcat_compat:1;
u32 reserved:31;
} flags;
} __attribute__ ((packed));
enum acpi_madt_entry_id {
ACPI_MADT_LAPIC = 0,
ACPI_MADT_IOAPIC,
ACPI_MADT_INT_SRC_OVR,
ACPI_MADT_NMI_SRC,
ACPI_MADT_LAPIC_NMI,
ACPI_MADT_LAPIC_ADDR_OVR,
ACPI_MADT_IOSAPIC,
ACPI_MADT_LSAPIC,
ACPI_MADT_PLAT_INT_SRC,
ACPI_MADT_ENTRY_COUNT
};
typedef struct {
u16 polarity:2;
u16 trigger:2;
u16 reserved:12;
} acpi_interrupt_flags __attribute__ ((packed));
struct acpi_table_lapic {
acpi_table_entry_header header;
u8 acpi_id;
u8 id;
struct {
u32 enabled:1;
u32 reserved:31;
} flags;
} __attribute__ ((packed));
struct acpi_table_ioapic {
acpi_table_entry_header header;
u8 id;
u8 reserved;
u32 address;
u32 global_irq_base;
} __attribute__ ((packed));
struct acpi_table_int_src_ovr {
acpi_table_entry_header header;
u8 bus;
u8 bus_irq;
u32 global_irq;
acpi_interrupt_flags flags;
} __attribute__ ((packed));
struct acpi_table_nmi_src {
acpi_table_entry_header header;
acpi_interrupt_flags flags;
u32 global_irq;
} __attribute__ ((packed));
struct acpi_table_lapic_nmi {
acpi_table_entry_header header;
u8 acpi_id;
acpi_interrupt_flags flags;
u8 lint;
} __attribute__ ((packed));
struct acpi_table_lapic_addr_ovr {
acpi_table_entry_header header;
u8 reserved[2];
u64 address;
} __attribute__ ((packed));
struct acpi_table_iosapic {
acpi_table_entry_header header;
u8 id;
u8 reserved;
u32 global_irq_base;
u64 address;
} __attribute__ ((packed));
struct acpi_table_lsapic {
acpi_table_entry_header header;
u8 acpi_id;
u8 id;
u8 eid;
u8 reserved[3];
struct {
u32 enabled:1;
u32 reserved:31;
} flags;
} __attribute__ ((packed));
struct acpi_table_plat_int_src {
acpi_table_entry_header header;
acpi_interrupt_flags flags;
u8 type; /* See acpi_interrupt_type */
u8 id;
u8 eid;
u8 iosapic_vector;
u32 global_irq;
u32 reserved;
} __attribute__ ((packed));
enum acpi_interrupt_id {
ACPI_INTERRUPT_PMI = 1,
ACPI_INTERRUPT_INIT,
ACPI_INTERRUPT_CPEI,
ACPI_INTERRUPT_COUNT
};
/*
* Device states
* System Resource Affinity Table (SRAT)
* see http://www.microsoft.com/hwdev/design/srat.htm
*/
typedef enum {
ACPI_D0, /* fully-on */
ACPI_D1, /* partial-on */
ACPI_D2, /* partial-on */
ACPI_D3, /* fully-off */
} acpi_dstate_t;
typedef enum {
ACPI_S0, /* working state */
ACPI_S1, /* power-on suspend */
ACPI_S2, /* suspend to ram, with devices */
ACPI_S3, /* suspend to ram */
ACPI_S4, /* suspend to disk */
ACPI_S5, /* soft-off */
} acpi_sstate_t;
/* RSDP location */
#define ACPI_BIOS_ROM_BASE (0x0e0000)
#define ACPI_BIOS_ROM_END (0x100000)
/* Table signatures */
#define ACPI_RSDP1_SIG 0x20445352 /* 'RSD ' */
#define ACPI_RSDP2_SIG 0x20525450 /* 'PTR ' */
#define ACPI_RSDT_SIG 0x54445352 /* 'RSDT' */
#define ACPI_FADT_SIG 0x50434146 /* 'FACP' */
#define ACPI_DSDT_SIG 0x54445344 /* 'DSDT' */
#define ACPI_FACS_SIG 0x53434146 /* 'FACS' */
#define ACPI_SIG_LEN 4
#define ACPI_FADT_SIGNATURE "FACP"
/* PM1_STS/EN flags */
#define ACPI_TMR 0x0001
#define ACPI_BM 0x0010
#define ACPI_GBL 0x0020
#define ACPI_PWRBTN 0x0100
#define ACPI_SLPBTN 0x0200
#define ACPI_RTC 0x0400
#define ACPI_WAK 0x8000
/* PM1_CNT flags */
#define ACPI_SCI_EN 0x0001
#define ACPI_BM_RLD 0x0002
#define ACPI_GBL_RLS 0x0004
#define ACPI_SLP_TYP0 0x0400
#define ACPI_SLP_TYP1 0x0800
#define ACPI_SLP_TYP2 0x1000
#define ACPI_SLP_EN 0x2000
#define ACPI_SLP_TYP_MASK 0x1c00
#define ACPI_SLP_TYP_SHIFT 10
/* PM_TMR masks */
#define ACPI_TMR_VAL_EXT 0x00000100
#define ACPI_TMR_MASK 0x00ffffff
#define ACPI_TMR_HZ 3579545 /* 3.58 MHz */
#define ACPI_TMR_KHZ (ACPI_TMR_HZ / 1000)
#define ACPI_MICROSEC_TO_TMR_TICKS(val) \
(((val) * (ACPI_TMR_KHZ)) / 1000)
/* PM2_CNT flags */
#define ACPI_ARB_DIS 0x01
/* FADT flags */
#define ACPI_WBINVD 0x00000001
#define ACPI_WBINVD_FLUSH 0x00000002
#define ACPI_PROC_C1 0x00000004
#define ACPI_P_LVL2_UP 0x00000008
#define ACPI_PWR_BUTTON 0x00000010
#define ACPI_SLP_BUTTON 0x00000020
#define ACPI_FIX_RTC 0x00000040
#define ACPI_RTC_64 0x00000080
#define ACPI_TMR_VAL_EXT 0x00000100
#define ACPI_DCK_CAP 0x00000200
/* FADT BOOT_ARCH flags */
#define FADT_BOOT_ARCH_LEGACY_DEVICES 0x0001
#define FADT_BOOT_ARCH_KBD_CONTROLLER 0x0002
/* FACS flags */
#define ACPI_S4BIOS 0x00000001
/* processor block offsets */
#define ACPI_P_CNT 0x00000000
#define ACPI_P_LVL2 0x00000004
#define ACPI_P_LVL3 0x00000005
/* C-state latencies (microseconds) */
#define ACPI_MAX_P_LVL2_LAT 100
#define ACPI_MAX_P_LVL3_LAT 1000
#define ACPI_INFINITE_LAT (~0UL)
struct acpi_table_srat {
struct acpi_table_header header;
u32 table_revision;
u64 reserved;
} __attribute__ ((packed));
enum acpi_srat_entry_id {
ACPI_SRAT_PROCESSOR_AFFINITY = 0,
ACPI_SRAT_MEMORY_AFFINITY,
ACPI_SRAT_ENTRY_COUNT
};
struct acpi_table_processor_affinity {
acpi_table_entry_header header;
u8 proximity_domain;
u8 apic_id;
struct {
u32 enabled:1;
u32 reserved:31;
} flags;
u8 lsapic_eid;
u8 reserved[7];
} __attribute__ ((packed));
struct acpi_table_memory_affinity {
acpi_table_entry_header header;
u8 proximity_domain;
u8 reserved1[5];
u32 base_addr_lo;
u32 base_addr_hi;
u32 length_lo;
u32 length_hi;
u32 memory_type; /* See acpi_address_range_id */
struct {
u32 enabled:1;
u32 hot_pluggable:1;
u32 reserved:30;
} flags;
u64 reserved2;
} __attribute__ ((packed));
enum acpi_address_range_id {
ACPI_ADDRESS_RANGE_MEMORY = 1,
ACPI_ADDRESS_RANGE_RESERVED = 2,
ACPI_ADDRESS_RANGE_ACPI = 3,
ACPI_ADDRESS_RANGE_NVS = 4,
ACPI_ADDRESS_RANGE_COUNT
};
/*
* Sysctl declarations
* System Locality Information Table (SLIT)
* see http://devresource.hp.com/devresource/docs/techpapers/ia64/slit.pdf
*/
enum
{
CTL_ACPI = 10
struct acpi_table_slit {
struct acpi_table_header header;
u64 localities;
u8 entry[1]; /* real size = localities^2 */
};
enum
{
ACPI_FADT = 1,
/* Smart Battery Description Table (SBST) */
struct acpi_table_sbst {
struct acpi_table_header header;
u32 warning; /* Warn user */
u32 low; /* Critical sleep */
u32 critical; /* Critical shutdown */
} __attribute__ ((packed));
/* Embedded Controller Boot Resources Table (ECDT) */
/* TBD: acpi_generic_address
struct acpi_table_ecdt {
struct acpi_table_header header;
acpi_generic_address ec_control;
acpi_generic_address ec_data;
u32 uid;
u8 gpe_bit;
char *ec_id;
} __attribute__ ((packed));
*/
/* Table Handlers */
enum acpi_table_id {
ACPI_TABLE_UNKNOWN = 0,
ACPI_APIC,
ACPI_BOOT,
ACPI_DBGP,
ACPI_DSDT,
ACPI_PM1_ENABLE,
ACPI_GPE_ENABLE,
ACPI_GPE_LEVEL,
ACPI_EVENT,
ACPI_P_BLK,
ACPI_ENTER_LVL2_LAT,
ACPI_ENTER_LVL3_LAT,
ACPI_P_LVL2_LAT,
ACPI_P_LVL3_LAT,
ACPI_C1_TIME,
ACPI_C2_TIME,
ACPI_C3_TIME,
ACPI_C1_COUNT,
ACPI_C2_COUNT,
ACPI_C3_COUNT,
ACPI_S0_SLP_TYP,
ACPI_S1_SLP_TYP,
ACPI_S5_SLP_TYP,
ACPI_SLEEP,
ACPI_ECDT,
ACPI_ETDT,
ACPI_FACP,
ACPI_FACS,
ACPI_XSDT,
ACPI_PMTIMER,
ACPI_BATT,
ACPI_OEMX,
ACPI_PSDT,
ACPI_SBST,
ACPI_SLIT,
ACPI_SPCR,
ACPI_SRAT,
ACPI_SSDT,
ACPI_SPMI,
ACPI_TABLE_COUNT
};
#define ACPI_SLP_TYP_DISABLED (~0UL)
typedef int (*acpi_table_handler) (unsigned long phys_addr, unsigned long size);
extern acpi_table_handler acpi_table_ops[ACPI_TABLE_COUNT];
typedef int (*acpi_madt_entry_handler) (acpi_table_entry_header *header);
struct acpi_boot_flags {
u8 madt:1;
u8 reserved:7;
};
#ifdef __KERNEL__
int acpi_table_init (char *cmdline);
int acpi_table_parse (enum acpi_table_id, acpi_table_handler);
int acpi_table_parse_madt (enum acpi_table_id, acpi_madt_entry_handler);
void acpi_table_print (struct acpi_table_header *, unsigned long);
void acpi_table_print_madt_entry (acpi_table_entry_header *);
/* routines for saving/restoring kernel state */
FASTCALL(extern unsigned long acpi_save_state_mem(unsigned long return_point));
FASTCALL(extern int acpi_save_state_disk(unsigned long return_point));
extern void acpi_restore_state(void);
#endif /*CONFIG_ACPI_BOOT*/
extern unsigned long acpi_wakeup_address;
#endif /* __KERNEL__ */
/* --------------------------------------------------------------------------
PCI Interrupt Routing (PRT)
-------------------------------------------------------------------------- */
#ifdef CONFIG_ACPI_PCI
#define ACPI_PCI_ROUTING_PIC 0
#define ACPI_PCI_ROUTING_IOAPIC 1
#define ACPI_PCI_ROUTING_IOSAPIC 2
struct acpi_prt_entry {
struct list_head node;
struct {
u8 seg;
u8 bus;
u8 dev;
u8 pin;
} id;
struct {
acpi_handle handle;
u32 index;
} source;
};
struct acpi_prt_list {
int count;
struct list_head entries;
};
extern struct acpi_prt_list acpi_prts;
struct pci_dev;
int acpi_prt_get_irq (struct pci_dev *dev, u8 pin, int *irq);
int acpi_prt_set_irq (struct pci_dev *dev, u8 pin, int irq);
#endif /*CONFIG_ACPI_PCI*/
/* --------------------------------------------------------------------------
ACPI Interpreter (Core)
-------------------------------------------------------------------------- */
#ifdef CONFIG_ACPI_INTERPRETER
int acpi_init(void);
#endif /* _LINUX_ACPI_H */
#endif /*CONFIG_ACPI_INTERPRETER*/
#endif /*_LINUX_ACPI_H*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment