/******************************************************************************
 *
 * Name: aclocal.h - Internal data types used across the ACPI subsystem
 *
 *****************************************************************************/

/*
 * Copyright (C) 2000 - 2005, R. Byron Moore
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#ifndef __ACLOCAL_H__
#define __ACLOCAL_H__


#define ACPI_WAIT_FOREVER               0xFFFF  /* u16, as per ACPI spec */

typedef void *                                  acpi_mutex;
typedef u32                                     acpi_mutex_handle;


/* Total number of aml opcodes defined */

#define AML_NUM_OPCODES                 0x7F


/*****************************************************************************
 *
 * Mutex typedefs and structs
 *
 ****************************************************************************/


/*
 * Predefined handles for the mutex objects used within the subsystem
 * All mutex objects are automatically created by acpi_ut_mutex_initialize.
 *
 * The acquire/release ordering protocol is implied via this list.  Mutexes
 * with a lower value must be acquired before mutexes with a higher value.
 *
 * NOTE: any changes here must be reflected in the acpi_gbl_mutex_names table also!
 */

#define ACPI_MTX_EXECUTE                0
#define ACPI_MTX_INTERPRETER            1
#define ACPI_MTX_PARSER                 2
#define ACPI_MTX_DISPATCHER             3
#define ACPI_MTX_TABLES                 4
#define ACPI_MTX_OP_REGIONS             5
#define ACPI_MTX_NAMESPACE              6
#define ACPI_MTX_EVENTS                 7
#define ACPI_MTX_HARDWARE               8
#define ACPI_MTX_CACHES                 9
#define ACPI_MTX_MEMORY                 10
#define ACPI_MTX_DEBUG_CMD_COMPLETE     11
#define ACPI_MTX_DEBUG_CMD_READY        12

#define MAX_MUTEX                       12
#define NUM_MUTEX                       MAX_MUTEX+1


#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
#ifdef DEFINE_ACPI_GLOBALS

/* Names for the mutexes used in the subsystem */

static char                         *acpi_gbl_mutex_names[] =
{
	"ACPI_MTX_Execute",
	"ACPI_MTX_Interpreter",
	"ACPI_MTX_Parser",
	"ACPI_MTX_Dispatcher",
	"ACPI_MTX_Tables",
	"ACPI_MTX_op_regions",
	"ACPI_MTX_Namespace",
	"ACPI_MTX_Events",
	"ACPI_MTX_Hardware",
	"ACPI_MTX_Caches",
	"ACPI_MTX_Memory",
	"ACPI_MTX_debug_cmd_complete",
	"ACPI_MTX_debug_cmd_ready",
};

#endif
#endif


/* Table for the global mutexes */

struct acpi_mutex_info
{
	acpi_mutex                          mutex;
	u32                                 use_count;
	u32                                 owner_id;
};

/* This owner ID means that the mutex is not in use (unlocked) */

#define ACPI_MUTEX_NOT_ACQUIRED         (u32) (-1)


/* Lock flag parameter for various interfaces */

#define ACPI_MTX_DO_NOT_LOCK            0
#define ACPI_MTX_LOCK                   1


typedef u16                                     acpi_owner_id;
#define ACPI_OWNER_TYPE_TABLE           0x0
#define ACPI_OWNER_TYPE_METHOD          0x1
#define ACPI_FIRST_METHOD_ID            0x0001
#define ACPI_FIRST_TABLE_ID             0xF000


/* Field access granularities */

#define ACPI_FIELD_BYTE_GRANULARITY     1
#define ACPI_FIELD_WORD_GRANULARITY     2
#define ACPI_FIELD_DWORD_GRANULARITY    4
#define ACPI_FIELD_QWORD_GRANULARITY    8

/*****************************************************************************
 *
 * Namespace typedefs and structs
 *
 ****************************************************************************/


/* Operational modes of the AML interpreter/scanner */

typedef enum
{
	ACPI_IMODE_LOAD_PASS1               = 0x01,
	ACPI_IMODE_LOAD_PASS2               = 0x02,
	ACPI_IMODE_EXECUTE                  = 0x0E

} acpi_interpreter_mode;


/*
 * The Node describes a named object that appears in the AML
 * An acpi_node is used to store Nodes.
 *
 * data_type is used to differentiate between internal descriptors, and MUST
 * be the first byte in this structure.
 */

union acpi_name_union
{
	u32                                 integer;
	char                                ascii[4];
};

struct acpi_namespace_node
{
	u8                                  descriptor;     /* Used to differentiate object descriptor types */
	u8                                  type;           /* Type associated with this name */
	u16                                 owner_id;
	union acpi_name_union               name;           /* ACPI Name, always 4 chars per ACPI spec */
	union acpi_operand_object           *object;        /* Pointer to attached ACPI object (optional) */
	struct acpi_namespace_node          *child;         /* First child */
	struct acpi_namespace_node          *peer;          /* Next peer*/
	u16                                 reference_count; /* Current count of references and children */
	u8                                  flags;
};


#define ACPI_ENTRY_NOT_FOUND            NULL


/* Node flags */

#define ANOBJ_RESERVED                  0x01
#define ANOBJ_END_OF_PEER_LIST          0x02
#define ANOBJ_DATA_WIDTH_32             0x04     /* Parent table is 64-bits */
#define ANOBJ_METHOD_ARG                0x08
#define ANOBJ_METHOD_LOCAL              0x10
#define ANOBJ_METHOD_NO_RETVAL          0x20
#define ANOBJ_METHOD_SOME_NO_RETVAL     0x40
#define ANOBJ_IS_BIT_OFFSET             0x80

/*
 * ACPI Table Descriptor.  One per ACPI table
 */
struct acpi_table_desc
{
	struct acpi_table_desc          *prev;
	struct acpi_table_desc          *next;
	struct acpi_table_desc          *installed_desc;
	struct acpi_table_header        *pointer;
	u8                              *aml_start;
	u64                             physical_address;
	u32                             aml_length;
	acpi_size                       length;
	acpi_owner_id                   table_id;
	u8                              type;
	u8                              allocation;
	u8                              loaded_into_namespace;
};

struct acpi_table_list
{
	struct acpi_table_desc          *next;
	u32                             count;
};


struct acpi_find_context
{
	char                            *search_for;
	acpi_handle                     *list;
	u32                             *count;
};


struct acpi_ns_search_data
{
	struct acpi_namespace_node      *node;
};


/*
 * Predefined Namespace items
 */
struct acpi_predefined_names
{
	char                            *name;
	u8                              type;
	char                            *val;
};


/* Object types used during package copies */


#define ACPI_COPY_TYPE_SIMPLE           0
#define ACPI_COPY_TYPE_PACKAGE          1

/* Info structure used to convert external<->internal namestrings */

struct acpi_namestring_info
{
	char                            *external_name;
	char                            *next_external_char;
	char                            *internal_name;
	u32                             length;
	u32                             num_segments;
	u32                             num_carats;
	u8                              fully_qualified;
};


/* Field creation info */

struct acpi_create_field_info
{
	struct acpi_namespace_node      *region_node;
	struct acpi_namespace_node      *field_node;
	struct acpi_namespace_node      *register_node;
	struct acpi_namespace_node      *data_register_node;
	u32                             bank_value;
	u32                             field_bit_position;
	u32                             field_bit_length;
	u8                              field_flags;
	u8                              attribute;
	u8                              field_type;
};


/*****************************************************************************
 *
 * Event typedefs and structs
 *
 ****************************************************************************/

/* Dispatch info for each GPE -- either a method or handler, cannot be both */

struct acpi_handler_info
{
	acpi_event_handler                      address;        /* Address of handler, if any */
	void                                    *context;       /* Context to be passed to handler */
	struct acpi_namespace_node              *method_node;   /* Method node for this GPE level (saved) */
};

union acpi_gpe_dispatch_info
{
	struct acpi_namespace_node              *method_node;   /* Method node for this GPE level */
	struct acpi_handler_info                *handler;
};

/*
 * Information about a GPE, one per each GPE in an array.
 * NOTE: Important to keep this struct as small as possible.
 */
struct acpi_gpe_event_info
{
	union acpi_gpe_dispatch_info    dispatch;       /* Either Method or Handler */
	struct acpi_gpe_register_info           *register_info; /* Backpointer to register info */
	u8                                      flags;          /* Misc info about this GPE */
	u8                                      register_bit;   /* This GPE bit within the register */
};

/* Information about a GPE register pair, one per each status/enable pair in an array */

struct acpi_gpe_register_info
{
	struct acpi_generic_address             status_address; /* Address of status reg */
	struct acpi_generic_address             enable_address; /* Address of enable reg */
	u8                                      enable_for_wake; /* GPEs to keep enabled when sleeping */
	u8                                      enable_for_run; /* GPEs to keep enabled when running */
	u8                                      base_gpe_number; /* Base GPE number for this register */
};

/*
 * Information about a GPE register block, one per each installed block --
 * GPE0, GPE1, and one per each installed GPE Block Device.
 */
struct acpi_gpe_block_info
{
	struct acpi_namespace_node              *node;
	struct acpi_gpe_block_info              *previous;
	struct acpi_gpe_block_info              *next;
	struct acpi_gpe_xrupt_info              *xrupt_block;   /* Backpointer to interrupt block */
	struct acpi_gpe_register_info           *register_info; /* One per GPE register pair */
	struct acpi_gpe_event_info              *event_info;    /* One for each GPE */
	struct acpi_generic_address             block_address;  /* Base address of the block */
	u32                                     register_count; /* Number of register pairs in block */
	u8                                      block_base_number;/* Base GPE number for this block */
};

/* Information about GPE interrupt handlers, one per each interrupt level used for GPEs */

struct acpi_gpe_xrupt_info
{
	struct acpi_gpe_xrupt_info              *previous;
	struct acpi_gpe_xrupt_info              *next;
	struct acpi_gpe_block_info              *gpe_block_list_head; /* List of GPE blocks for this xrupt */
	u32                                     interrupt_level;    /* System interrupt level */
};


struct acpi_gpe_walk_info
{
	struct acpi_namespace_node              *gpe_device;
	struct acpi_gpe_block_info              *gpe_block;
};


typedef acpi_status (*ACPI_GPE_CALLBACK) (
	struct acpi_gpe_xrupt_info      *gpe_xrupt_info,
	struct acpi_gpe_block_info      *gpe_block);


/* Information about each particular fixed event */

struct acpi_fixed_event_handler
{
	acpi_event_handler              handler;        /* Address of handler. */
	void                            *context;       /* Context to be passed to handler */
};

struct acpi_fixed_event_info
{
	u8                              status_register_id;
	u8                              enable_register_id;
	u16                             status_bit_mask;
	u16                             enable_bit_mask;
};

/* Information used during field processing */

struct acpi_field_info
{
	u8                              skip_field;
	u8                              field_flag;
	u32                             pkg_length;
};


/*****************************************************************************
 *
 * Generic "state" object for stacks
 *
 ****************************************************************************/


#define ACPI_CONTROL_NORMAL                  0xC0
#define ACPI_CONTROL_CONDITIONAL_EXECUTING   0xC1
#define ACPI_CONTROL_PREDICATE_EXECUTING     0xC2
#define ACPI_CONTROL_PREDICATE_FALSE         0xC3
#define ACPI_CONTROL_PREDICATE_TRUE          0xC4


/* Forward declarations */
struct acpi_walk_state        ;
struct acpi_obj_mutex;
union acpi_parse_object        ;


#define ACPI_STATE_COMMON                  /* Two 32-bit fields and a pointer */\
	u8                                  data_type;          /* To differentiate various internal objs */\
	u8                                  flags;      \
	u16                                 value;      \
	u16                                 state;      \
	u16                                 reserved;   \
	void                                *next;      \

struct acpi_common_state
{
	ACPI_STATE_COMMON
};


/*
 * Update state - used to traverse complex objects such as packages
 */
struct acpi_update_state
{
	ACPI_STATE_COMMON
	union acpi_operand_object           *object;
};


/*
 * Pkg state - used to traverse nested package structures
 */
struct acpi_pkg_state
{
	ACPI_STATE_COMMON
	union acpi_operand_object           *source_object;
	union acpi_operand_object           *dest_object;
	struct acpi_walk_state              *walk_state;
	void                                *this_target_obj;
	u32                                 num_packages;
	u16                                 index;
};


/*
 * Control state - one per if/else and while constructs.
 * Allows nesting of these constructs
 */
struct acpi_control_state
{
	ACPI_STATE_COMMON
	union acpi_parse_object             *predicate_op;
	u8                                  *aml_predicate_start;   /* Start of if/while predicate */
	u8                                  *package_end;           /* End of if/while block */
	u16                                 opcode;
};


/*
 * Scope state - current scope during namespace lookups
 */
struct acpi_scope_state
{
	ACPI_STATE_COMMON
	struct acpi_namespace_node          *node;
};


struct acpi_pscope_state
{
	ACPI_STATE_COMMON
	union acpi_parse_object             *op;                    /* Current op being parsed */
	u8                                  *arg_end;               /* Current argument end */
	u8                                  *pkg_end;               /* Current package end */
	u32                                 arg_list;               /* Next argument to parse */
	u32                                 arg_count;              /* Number of fixed arguments */
};


/*
 * Thread state - one per thread across multiple walk states.  Multiple walk
 * states are created when there are nested control methods executing.
 */
struct acpi_thread_state
{
	ACPI_STATE_COMMON
	struct acpi_walk_state              *walk_state_list;       /* Head of list of walk_states for this thread */
	union acpi_operand_object           *acquired_mutex_list;   /* List of all currently acquired mutexes */
	u32                                 thread_id;              /* Running thread ID */
	u8                                  current_sync_level;     /* Mutex Sync (nested acquire) level */
};


/*
 * Result values - used to accumulate the results of nested
 * AML arguments
 */
struct acpi_result_values
{
	ACPI_STATE_COMMON
	union acpi_operand_object           *obj_desc [ACPI_OBJ_NUM_OPERANDS];
	u8                                  num_results;
	u8                                  last_insert;
};


typedef
acpi_status (*acpi_parse_downwards) (
	struct acpi_walk_state              *walk_state,
	union acpi_parse_object             **out_op);

typedef
acpi_status (*acpi_parse_upwards) (
	struct acpi_walk_state              *walk_state);


/*
 * Notify info - used to pass info to the deferred notify
 * handler/dispatcher.
 */
struct acpi_notify_info
{
	ACPI_STATE_COMMON
	struct acpi_namespace_node          *node;
	union acpi_operand_object           *handler_obj;
};


/* Generic state is union of structs above */

union acpi_generic_state
{
	struct acpi_common_state            common;
	struct acpi_control_state           control;
	struct acpi_update_state            update;
	struct acpi_scope_state             scope;
	struct acpi_pscope_state            parse_scope;
	struct acpi_pkg_state               pkg;
	struct acpi_thread_state            thread;
	struct acpi_result_values           results;
	struct acpi_notify_info             notify;
};


/*****************************************************************************
 *
 * Interpreter typedefs and structs
 *
 ****************************************************************************/

typedef
acpi_status (*ACPI_EXECUTE_OP) (
	struct acpi_walk_state              *walk_state);


/*****************************************************************************
 *
 * Parser typedefs and structs
 *
 ****************************************************************************/

/*
 * AML opcode, name, and argument layout
 */
struct acpi_opcode_info
{
#if defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUG_OUTPUT)
	char                                *name;          /* Opcode name (disassembler/debug only) */
#endif
	u32                                 parse_args;     /* Grammar/Parse time arguments */
	u32                                 runtime_args;   /* Interpret time arguments */
	u32                                 flags;          /* Misc flags */
	u8                                  object_type;    /* Corresponding internal object type */
	u8                                  class;          /* Opcode class */
	u8                                  type;           /* Opcode type */
};


union acpi_parse_value
{
	acpi_integer                        integer;        /* Integer constant (Up to 64 bits) */
	struct uint64_struct                integer64;      /* Structure overlay for 2 32-bit Dwords */
	u32                                 size;           /* bytelist or field size */
	char                                *string;        /* NULL terminated string */
	u8                                  *buffer;        /* buffer or string */
	char                                *name;          /* NULL terminated string */
	union acpi_parse_object             *arg;           /* arguments and contained ops */
};


#define ACPI_PARSE_COMMON \
	u8                                  data_type;      /* To differentiate various internal objs */\
	u8                                  flags;          /* Type of Op */\
	u16                                 aml_opcode;     /* AML opcode */\
	u32                                 aml_offset;     /* Offset of declaration in AML */\
	union acpi_parse_object             *parent;        /* Parent op */\
	union acpi_parse_object             *next;          /* Next op */\
	ACPI_DISASM_ONLY_MEMBERS (\
	u8                                  disasm_flags;   /* Used during AML disassembly */\
	u8                                  disasm_opcode;  /* Subtype used for disassembly */\
	char                                aml_op_name[16]) /* Op name (debug only) */\
			   /* NON-DEBUG members below: */\
	struct acpi_namespace_node          *node;          /* For use by interpreter */\
	union acpi_parse_value              value;          /* Value or args associated with the opcode */\


#define ACPI_DASM_BUFFER        0x00
#define ACPI_DASM_RESOURCE      0x01
#define ACPI_DASM_STRING        0x02
#define ACPI_DASM_UNICODE       0x03
#define ACPI_DASM_EISAID        0x04
#define ACPI_DASM_MATCHOP       0x05

/*
 * generic operation (for example:  If, While, Store)
 */
struct acpi_parse_obj_common
{
	ACPI_PARSE_COMMON
};


/*
 * Extended Op for named ops (Scope, Method, etc.), deferred ops (Methods and op_regions),
 * and bytelists.
 */
struct acpi_parse_obj_named
{
	ACPI_PARSE_COMMON
	u8                                  *path;
	u8                                  *data;          /* AML body or bytelist data */
	u32                                 length;         /* AML length */
	u32                                 name;           /* 4-byte name or zero if no name */
};


/* The parse node is the fundamental element of the parse tree */

struct acpi_parse_obj_asl
{
	ACPI_PARSE_COMMON
	union acpi_parse_object             *child;
	union acpi_parse_object             *parent_method;
	char                                *filename;
	char                                *external_name;
	char                                *namepath;
	char                                name_seg[4];
	u32                                 extra_value;
	u32                                 column;
	u32                                 line_number;
	u32                                 logical_line_number;
	u32                                 logical_byte_offset;
	u32                                 end_line;
	u32                                 end_logical_line;
	u32                                 acpi_btype;
	u32                                 aml_length;
	u32                                 aml_subtree_length;
	u32                                 final_aml_length;
	u32                                 final_aml_offset;
	u32                                 compile_flags;
	u16                                 parse_opcode;
	u8                                  aml_opcode_length;
	u8                                  aml_pkg_len_bytes;
	u8                                  extra;
	char                                parse_op_name[12];
};


union acpi_parse_object
{
	struct acpi_parse_obj_common        common;
	struct acpi_parse_obj_named         named;
	struct acpi_parse_obj_asl           asl;
};


/*
 * Parse state - one state per parser invocation and each control
 * method.
 */
struct acpi_parse_state
{
	u32                                 aml_size;
	u8                                  *aml_start;     /* First AML byte */
	u8                                  *aml;           /* Next AML byte */
	u8                                  *aml_end;       /* (last + 1) AML byte */
	u8                                  *pkg_start;     /* Current package begin */
	u8                                  *pkg_end;       /* Current package end */
	union acpi_parse_object             *start_op;      /* Root of parse tree */
	struct acpi_namespace_node          *start_node;
	union acpi_generic_state            *scope;         /* Current scope */
	union acpi_parse_object             *start_scope;
};


/* Parse object flags */

#define ACPI_PARSEOP_GENERIC                    0x01
#define ACPI_PARSEOP_NAMED                      0x02
#define ACPI_PARSEOP_DEFERRED                   0x04
#define ACPI_PARSEOP_BYTELIST                   0x08
#define ACPI_PARSEOP_IN_CACHE                   0x80

/* Parse object disasm_flags */

#define ACPI_PARSEOP_IGNORE                     0x01
#define ACPI_PARSEOP_PARAMLIST                  0x02
#define ACPI_PARSEOP_EMPTY_TERMLIST             0x04
#define ACPI_PARSEOP_SPECIAL                    0x10


/*****************************************************************************
 *
 * Hardware (ACPI registers) and PNP
 *
 ****************************************************************************/

#define PCI_ROOT_HID_STRING         "PNP0A03"

struct acpi_bit_register_info
{
	u8                                  parent_register;
	u8                                  bit_position;
	u16                                 access_bit_mask;
};


/*
 * Register IDs
 * These are the full ACPI registers
 */
#define ACPI_REGISTER_PM1_STATUS                0x01
#define ACPI_REGISTER_PM1_ENABLE                0x02
#define ACPI_REGISTER_PM1_CONTROL               0x03
#define ACPI_REGISTER_PM1A_CONTROL              0x04
#define ACPI_REGISTER_PM1B_CONTROL              0x05
#define ACPI_REGISTER_PM2_CONTROL               0x06
#define ACPI_REGISTER_PM_TIMER                  0x07
#define ACPI_REGISTER_PROCESSOR_BLOCK           0x08
#define ACPI_REGISTER_SMI_COMMAND_BLOCK         0x09


/* Masks used to access the bit_registers */

#define ACPI_BITMASK_TIMER_STATUS               0x0001
#define ACPI_BITMASK_BUS_MASTER_STATUS          0x0010
#define ACPI_BITMASK_GLOBAL_LOCK_STATUS         0x0020
#define ACPI_BITMASK_POWER_BUTTON_STATUS        0x0100
#define ACPI_BITMASK_SLEEP_BUTTON_STATUS        0x0200
#define ACPI_BITMASK_RT_CLOCK_STATUS            0x0400
#define ACPI_BITMASK_PCIEXP_WAKE_STATUS         0x4000    /* ACPI 3.0 */
#define ACPI_BITMASK_WAKE_STATUS                0x8000

#define ACPI_BITMASK_ALL_FIXED_STATUS           (ACPI_BITMASK_TIMER_STATUS          | \
			 ACPI_BITMASK_BUS_MASTER_STATUS     | \
			 ACPI_BITMASK_GLOBAL_LOCK_STATUS    | \
			 ACPI_BITMASK_POWER_BUTTON_STATUS   | \
			 ACPI_BITMASK_SLEEP_BUTTON_STATUS   | \
			 ACPI_BITMASK_RT_CLOCK_STATUS       | \
			 ACPI_BITMASK_WAKE_STATUS)

#define ACPI_BITMASK_TIMER_ENABLE               0x0001
#define ACPI_BITMASK_GLOBAL_LOCK_ENABLE         0x0020
#define ACPI_BITMASK_POWER_BUTTON_ENABLE        0x0100
#define ACPI_BITMASK_SLEEP_BUTTON_ENABLE        0x0200
#define ACPI_BITMASK_RT_CLOCK_ENABLE            0x0400
#define ACPI_BITMASK_PCIEXP_WAKE_DISABLE        0x4000    /* ACPI 3.0 */

#define ACPI_BITMASK_SCI_ENABLE                 0x0001
#define ACPI_BITMASK_BUS_MASTER_RLD             0x0002
#define ACPI_BITMASK_GLOBAL_LOCK_RELEASE        0x0004
#define ACPI_BITMASK_SLEEP_TYPE_X               0x1C00
#define ACPI_BITMASK_SLEEP_ENABLE               0x2000

#define ACPI_BITMASK_ARB_DISABLE                0x0001


/* Raw bit position of each bit_register */

#define ACPI_BITPOSITION_TIMER_STATUS           0x00
#define ACPI_BITPOSITION_BUS_MASTER_STATUS      0x04
#define ACPI_BITPOSITION_GLOBAL_LOCK_STATUS     0x05
#define ACPI_BITPOSITION_POWER_BUTTON_STATUS    0x08
#define ACPI_BITPOSITION_SLEEP_BUTTON_STATUS    0x09
#define ACPI_BITPOSITION_RT_CLOCK_STATUS        0x0A
#define ACPI_BITPOSITION_PCIEXP_WAKE_STATUS     0x0E    /* ACPI 3.0 */
#define ACPI_BITPOSITION_WAKE_STATUS            0x0F

#define ACPI_BITPOSITION_TIMER_ENABLE           0x00
#define ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE     0x05
#define ACPI_BITPOSITION_POWER_BUTTON_ENABLE    0x08
#define ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE    0x09
#define ACPI_BITPOSITION_RT_CLOCK_ENABLE        0x0A
#define ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE    0x0E    /* ACPI 3.0 */

#define ACPI_BITPOSITION_SCI_ENABLE             0x00
#define ACPI_BITPOSITION_BUS_MASTER_RLD         0x01
#define ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE    0x02
#define ACPI_BITPOSITION_SLEEP_TYPE_X           0x0A
#define ACPI_BITPOSITION_SLEEP_ENABLE           0x0D

#define ACPI_BITPOSITION_ARB_DISABLE            0x00


/*****************************************************************************
 *
 * Resource descriptors
 *
 ****************************************************************************/


/* resource_type values */

#define ACPI_RESOURCE_TYPE_MEMORY_RANGE         0
#define ACPI_RESOURCE_TYPE_IO_RANGE             1
#define ACPI_RESOURCE_TYPE_BUS_NUMBER_RANGE     2

/* Resource descriptor types and masks */

#define ACPI_RDESC_TYPE_LARGE                   0x80
#define ACPI_RDESC_TYPE_SMALL                   0x00

#define ACPI_RDESC_TYPE_MASK                    0x80
#define ACPI_RDESC_SMALL_MASK                   0x78 /* Only bits 6:3 contain the type */


/*
 * Small resource descriptor types
 * Note: The 3 length bits (2:0) must be zero
 */
#define ACPI_RDESC_TYPE_IRQ_FORMAT              0x20
#define ACPI_RDESC_TYPE_DMA_FORMAT              0x28
#define ACPI_RDESC_TYPE_START_DEPENDENT         0x30
#define ACPI_RDESC_TYPE_END_DEPENDENT           0x38
#define ACPI_RDESC_TYPE_IO_PORT                 0x40
#define ACPI_RDESC_TYPE_FIXED_IO_PORT           0x48
#define ACPI_RDESC_TYPE_SMALL_VENDOR            0x70
#define ACPI_RDESC_TYPE_END_TAG                 0x78

/*
 * Large resource descriptor types
 */
#define ACPI_RDESC_TYPE_MEMORY_24               0x81
#define ACPI_RDESC_TYPE_GENERAL_REGISTER        0x82
#define ACPI_RDESC_TYPE_LARGE_VENDOR            0x84
#define ACPI_RDESC_TYPE_MEMORY_32               0x85
#define ACPI_RDESC_TYPE_FIXED_MEMORY_32         0x86
#define ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE     0x87
#define ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE      0x88
#define ACPI_RDESC_TYPE_EXTENDED_XRUPT          0x89
#define ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE     0x8A
#define ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE  0x8B


/*****************************************************************************
 *
 * Miscellaneous
 *
 ****************************************************************************/

#define ACPI_ASCII_ZERO                      0x30


/*****************************************************************************
 *
 * Debugger
 *
 ****************************************************************************/

struct acpi_db_method_info
{
	acpi_handle                     thread_gate;
	char                            *name;
	char                            **args;
	u32                             flags;
	u32                             num_loops;
	char                            pathname[128];
};

struct acpi_integrity_info
{
	u32                         nodes;
	u32                         objects;
};


#define ACPI_DB_REDIRECTABLE_OUTPUT  0x01
#define ACPI_DB_CONSOLE_OUTPUT       0x02
#define ACPI_DB_DUPLICATE_OUTPUT     0x03


/*****************************************************************************
 *
 * Debug
 *
 ****************************************************************************/

struct acpi_debug_print_info
{
	u32                             component_id;
	char                            *proc_name;
	char                            *module_name;
};


/* Entry for a memory allocation (debug only) */

#define ACPI_MEM_MALLOC                      0
#define ACPI_MEM_CALLOC                      1
#define ACPI_MAX_MODULE_NAME                 16

#define ACPI_COMMON_DEBUG_MEM_HEADER \
	struct acpi_debug_mem_block         *previous; \
	struct acpi_debug_mem_block         *next; \
	u32                                 size; \
	u32                                 component; \
	u32                                 line; \
	char                                module[ACPI_MAX_MODULE_NAME]; \
	u8                                  alloc_type;

struct acpi_debug_mem_header
{
	ACPI_COMMON_DEBUG_MEM_HEADER
};

struct acpi_debug_mem_block
{
	ACPI_COMMON_DEBUG_MEM_HEADER
	u64                                 user_space;
};


#define ACPI_MEM_LIST_GLOBAL            0
#define ACPI_MEM_LIST_NSNODE            1

#define ACPI_MEM_LIST_FIRST_CACHE_LIST  2
#define ACPI_MEM_LIST_STATE             2
#define ACPI_MEM_LIST_PSNODE            3
#define ACPI_MEM_LIST_PSNODE_EXT        4
#define ACPI_MEM_LIST_OPERAND           5
#define ACPI_MEM_LIST_WALK              6
#define ACPI_MEM_LIST_MAX               6
#define ACPI_NUM_MEM_LISTS              7


struct acpi_memory_list
{
	void                                *list_head;
	u16                                 link_offset;
	u16                                 max_cache_depth;
	u16                                 cache_depth;
	u16                                 object_size;

#ifdef ACPI_DBG_TRACK_ALLOCATIONS

	/* Statistics for debug memory tracking only */

	u32                                 total_allocated;
	u32                                 total_freed;
	u32                                 current_total_size;
	u32                                 cache_requests;
	u32                                 cache_hits;
	char                                *list_name;
#endif
};


#endif /* __ACLOCAL_H__ */
