Commit 8b80c0f1 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpica'

* acpica:
  ACPICA: Update version to 20140724.
  ACPICA: ACPI 5.1: Update for PCCT table changes.
  ACPICA/ARM: ACPI 5.1: Update for GTDT table changes.
  ACPICA/ARM: ACPI 5.1: Update for MADT changes.
  ACPICA/ARM: ACPI 5.1: Update for FADT changes.
  ACPICA: ACPI 5.1: Support for the _CCA predifined name.
  ACPICA: ACPI 5.1: New notify value for System Affinity Update.
  ACPICA: ACPI 5.1: Support for the _DSD predefined name.
  ACPICA: Debug object: Add current value of Timer() to debug line prefix.
  ACPICA: acpihelp: Add UUID support, restructure some existing files.
  ACPICA: Utilities: Fix local printf issue.
  ACPICA: Tables: Update for DMAR table changes.
  ACPICA: Remove some extraneous printf arguments.
  ACPICA: Update for comments/formatting. No functional changes.
  ACPICA: Disassembler: Add support for the ToUUID opererator (macro).
  ACPICA: Remove a redundant cast to acpi_size for ACPI_OFFSET() macro.
  ACPICA: Work around an ancient GCC bug.
parents 49c68fd4 796ca778
...@@ -157,6 +157,7 @@ acpi-y += \ ...@@ -157,6 +157,7 @@ acpi-y += \
uterror.o \ uterror.o \
uteval.o \ uteval.o \
utglobal.o \ utglobal.o \
uthex.o \
utids.o \ utids.o \
utinit.o \ utinit.o \
utlock.o \ utlock.o \
...@@ -175,5 +176,10 @@ acpi-y += \ ...@@ -175,5 +176,10 @@ acpi-y += \
utxferror.o \ utxferror.o \
utxfmutex.o utxfmutex.o
acpi-$(ACPI_FUTURE_USAGE) += utfileio.o utprint.o uttrack.o utcache.o acpi-$(ACPI_FUTURE_USAGE) += \
utcache.o \
utfileio.o \
utprint.o \
uttrack.o \
utuuid.o
...@@ -730,12 +730,13 @@ union acpi_parse_value { ...@@ -730,12 +730,13 @@ union acpi_parse_value {
#define ACPI_DASM_STRING 0x02 /* Buffer is a ASCII string */ #define ACPI_DASM_STRING 0x02 /* Buffer is a ASCII string */
#define ACPI_DASM_UNICODE 0x03 /* Buffer is a Unicode string */ #define ACPI_DASM_UNICODE 0x03 /* Buffer is a Unicode string */
#define ACPI_DASM_PLD_METHOD 0x04 /* Buffer is a _PLD method bit-packed buffer */ #define ACPI_DASM_PLD_METHOD 0x04 /* Buffer is a _PLD method bit-packed buffer */
#define ACPI_DASM_EISAID 0x05 /* Integer is an EISAID */ #define ACPI_DASM_UUID 0x05 /* Buffer is a UUID/GUID */
#define ACPI_DASM_MATCHOP 0x06 /* Parent opcode is a Match() operator */ #define ACPI_DASM_EISAID 0x06 /* Integer is an EISAID */
#define ACPI_DASM_LNOT_PREFIX 0x07 /* Start of a Lnot_equal (etc.) pair of opcodes */ #define ACPI_DASM_MATCHOP 0x07 /* Parent opcode is a Match() operator */
#define ACPI_DASM_LNOT_SUFFIX 0x08 /* End of a Lnot_equal (etc.) pair of opcodes */ #define ACPI_DASM_LNOT_PREFIX 0x08 /* Start of a Lnot_equal (etc.) pair of opcodes */
#define ACPI_DASM_HID_STRING 0x09 /* String is a _HID or _CID */ #define ACPI_DASM_LNOT_SUFFIX 0x09 /* End of a Lnot_equal (etc.) pair of opcodes */
#define ACPI_DASM_IGNORE 0x0A /* Not used at this time */ #define ACPI_DASM_HID_STRING 0x0A /* String is a _HID or _CID */
#define ACPI_DASM_IGNORE 0x0B /* Not used at this time */
/* /*
* Generic operation (for example: If, While, Store) * Generic operation (for example: If, While, Store)
...@@ -1154,4 +1155,9 @@ struct ah_device_id { ...@@ -1154,4 +1155,9 @@ struct ah_device_id {
char *description; char *description;
}; };
struct ah_uuid {
char *description;
char *string;
};
#endif /* __ACLOCAL_H__ */ #endif /* __ACLOCAL_H__ */
...@@ -105,6 +105,11 @@ ...@@ -105,6 +105,11 @@
* count = 0 (optional) * count = 0 (optional)
* (Used for _DLM) * (Used for _DLM)
* *
* ACPI_PTYPE2_UUID_PAIR: Each subpackage is preceded by a UUID Buffer. The UUID
* defines the format of the package. Zero-length parent package is
* allowed.
* (Used for _DSD)
*
*****************************************************************************/ *****************************************************************************/
enum acpi_return_package_types { enum acpi_return_package_types {
...@@ -117,7 +122,8 @@ enum acpi_return_package_types { ...@@ -117,7 +122,8 @@ enum acpi_return_package_types {
ACPI_PTYPE2_FIXED = 7, ACPI_PTYPE2_FIXED = 7,
ACPI_PTYPE2_MIN = 8, ACPI_PTYPE2_MIN = 8,
ACPI_PTYPE2_REV_FIXED = 9, ACPI_PTYPE2_REV_FIXED = 9,
ACPI_PTYPE2_FIX_VAR = 10 ACPI_PTYPE2_FIX_VAR = 10,
ACPI_PTYPE2_UUID_PAIR = 11
}; };
/* Support macros for users of the predefined info table */ /* Support macros for users of the predefined info table */
...@@ -364,6 +370,9 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = { ...@@ -364,6 +370,9 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
{{"_CBA", METHOD_0ARGS, {{"_CBA", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}}, /* See PCI firmware spec 3.0 */ METHOD_RETURNS(ACPI_RTYPE_INTEGER)}}, /* See PCI firmware spec 3.0 */
{{"_CCA", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}}, /* ACPI 5.1 */
{{"_CDM", METHOD_0ARGS, {{"_CDM", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}}, METHOD_RETURNS(ACPI_RTYPE_INTEGER)}},
...@@ -436,6 +445,11 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = { ...@@ -436,6 +445,11 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
{{"_DOS", METHOD_1ARGS(ACPI_TYPE_INTEGER), {{"_DOS", METHOD_1ARGS(ACPI_TYPE_INTEGER),
METHOD_NO_RETURN_VALUE}}, METHOD_NO_RETURN_VALUE}},
{{"_DSD", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}}, /* Variable-length (Pkgs) each: 1 Buf, 1 Pkg */
PACKAGE_INFO(ACPI_PTYPE2_UUID_PAIR, ACPI_RTYPE_BUFFER, 1,
ACPI_RTYPE_PACKAGE, 1, 0),
{{"_DSM", {{"_DSM",
METHOD_4ARGS(ACPI_TYPE_BUFFER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, METHOD_4ARGS(ACPI_TYPE_BUFFER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER,
ACPI_TYPE_PACKAGE), ACPI_TYPE_PACKAGE),
......
...@@ -194,6 +194,8 @@ char *acpi_ut_get_event_name(u32 event_id); ...@@ -194,6 +194,8 @@ char *acpi_ut_get_event_name(u32 event_id);
char acpi_ut_hex_to_ascii_char(u64 integer, u32 position); char acpi_ut_hex_to_ascii_char(u64 integer, u32 position);
u8 acpi_ut_ascii_char_to_hex(int hex_char);
u8 acpi_ut_valid_object_type(acpi_object_type type); u8 acpi_ut_valid_object_type(acpi_object_type type);
/* /*
...@@ -759,6 +761,8 @@ const struct ah_predefined_name *acpi_ah_match_predefined_name(char *nameseg); ...@@ -759,6 +761,8 @@ const struct ah_predefined_name *acpi_ah_match_predefined_name(char *nameseg);
const struct ah_device_id *acpi_ah_match_hardware_id(char *hid); const struct ah_device_id *acpi_ah_match_hardware_id(char *hid);
const char *acpi_ah_match_uuid(u8 *data);
/* /*
* utprint - printf/vprintf output functions * utprint - printf/vprintf output functions
*/ */
...@@ -778,4 +782,9 @@ int acpi_ut_file_vprintf(ACPI_FILE file, const char *format, va_list args); ...@@ -778,4 +782,9 @@ int acpi_ut_file_vprintf(ACPI_FILE file, const char *format, va_list args);
int acpi_ut_file_printf(ACPI_FILE file, const char *format, ...); int acpi_ut_file_printf(ACPI_FILE file, const char *format, ...);
#endif #endif
/*
* utuuid -- UUID support functions
*/
void acpi_ut_convert_string_to_uuid(char *in_string, u8 *uuid_buffer);
#endif /* _ACUTILS_H */ #endif /* _ACUTILS_H */
...@@ -75,6 +75,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, ...@@ -75,6 +75,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
u32 level, u32 index) u32 level, u32 index)
{ {
u32 i; u32 i;
u32 timer;
ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc); ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc);
...@@ -85,12 +86,20 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, ...@@ -85,12 +86,20 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
return_VOID; return_VOID;
} }
/*
* We will emit the current timer value (in microseconds) with each
* debug output. Only need the lower 26 bits. This allows for 67
* million microseconds or 67 seconds before rollover.
*/
timer = ((u32)acpi_os_get_timer() / 10); /* (100 nanoseconds to microseconds) */
timer &= 0x03FFFFFF;
/* /*
* Print line header as long as we are not in the middle of an * Print line header as long as we are not in the middle of an
* object display * object display
*/ */
if (!((level > 0) && index == 0)) { if (!((level > 0) && index == 0)) {
acpi_os_printf("[ACPI Debug] %*s", level, " "); acpi_os_printf("[ACPI Debug %.8u] %*s", timer, level, " ");
} }
/* Display the index for package output only */ /* Display the index for package output only */
......
...@@ -494,7 +494,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc, ...@@ -494,7 +494,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
} }
} }
acpi_os_printf("\n", next); acpi_os_printf("\n");
break; break;
case ACPI_EXD_HDLR_LIST: case ACPI_EXD_HDLR_LIST:
...@@ -528,7 +528,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc, ...@@ -528,7 +528,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
} }
} }
acpi_os_printf("\n", next); acpi_os_printf("\n");
break; break;
case ACPI_EXD_RGN_LIST: case ACPI_EXD_RGN_LIST:
...@@ -562,7 +562,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc, ...@@ -562,7 +562,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
} }
} }
acpi_os_printf("\n", next); acpi_os_printf("\n");
break; break;
case ACPI_EXD_NODE: case ACPI_EXD_NODE:
......
...@@ -186,12 +186,11 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state, ...@@ -186,12 +186,11 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
access_length); access_length);
/* /*
* Add additional 2 bytes for modeled generic_serial_bus data buffer: * Add additional 2 bytes for the generic_serial_bus data buffer:
* typedef struct { *
* BYTEStatus; // Byte 0 of the data buffer * Status; (Byte 0 of the data buffer)
* BYTELength; // Byte 1 of the data buffer * Length; (Byte 1 of the data buffer)
* BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer, * Data[x-1]; (Bytes 2-x of the arbitrary length data buffer)
* }
*/ */
length += 2; length += 2;
function = ACPI_READ | (accessor_type << 16); function = ACPI_READ | (accessor_type << 16);
...@@ -368,12 +367,11 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, ...@@ -368,12 +367,11 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
access_length); access_length);
/* /*
* Add additional 2 bytes for modeled generic_serial_bus data buffer: * Add additional 2 bytes for the generic_serial_bus data buffer:
* typedef struct { *
* BYTEStatus; // Byte 0 of the data buffer * Status; (Byte 0 of the data buffer)
* BYTELength; // Byte 1 of the data buffer * Length; (Byte 1 of the data buffer)
* BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer, * Data[x-1]; (Bytes 2-x of the arbitrary length data buffer)
* }
*/ */
length += 2; length += 2;
function = ACPI_WRITE | (accessor_type << 16); function = ACPI_WRITE | (accessor_type << 16);
......
...@@ -86,33 +86,6 @@ const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES] = { ...@@ -86,33 +86,6 @@ const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES] = {
ACPI_NS_NORMAL /* 30 Invalid */ ACPI_NS_NORMAL /* 30 Invalid */
}; };
/*******************************************************************************
*
* FUNCTION: acpi_ut_hex_to_ascii_char
*
* PARAMETERS: integer - Contains the hex digit
* position - bit position of the digit within the
* integer (multiple of 4)
*
* RETURN: The converted Ascii character
*
* DESCRIPTION: Convert a hex digit to an Ascii character
*
******************************************************************************/
/* Hex to ASCII conversion table */
static const char acpi_gbl_hex_to_ascii[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
{
return (acpi_gbl_hex_to_ascii[(integer >> position) & 0xF]);
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_get_region_name * FUNCTION: acpi_ut_get_region_name
...@@ -475,7 +448,8 @@ static const char *acpi_gbl_generic_notify[ACPI_NOTIFY_MAX + 1] = { ...@@ -475,7 +448,8 @@ static const char *acpi_gbl_generic_notify[ACPI_NOTIFY_MAX + 1] = {
/* 09 */ "Device PLD Check", /* 09 */ "Device PLD Check",
/* 0A */ "Reserved", /* 0A */ "Reserved",
/* 0B */ "System Locality Update", /* 0B */ "System Locality Update",
/* 0C */ "Shutdown Request" /* 0C */ "Shutdown Request",
/* 0D */ "System Resource Affinity Update"
}; };
static const char *acpi_gbl_device_notify[4] = { static const char *acpi_gbl_device_notify[4] = {
...@@ -502,7 +476,7 @@ static const char *acpi_gbl_thermal_notify[4] = { ...@@ -502,7 +476,7 @@ static const char *acpi_gbl_thermal_notify[4] = {
const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type) const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type)
{ {
/* 00 - 0C are common to all object types */ /* 00 - 0D are common to all object types */
if (notify_value <= ACPI_NOTIFY_MAX) { if (notify_value <= ACPI_NOTIFY_MAX) {
return (acpi_gbl_generic_notify[notify_value]); return (acpi_gbl_generic_notify[notify_value]);
......
...@@ -201,8 +201,7 @@ acpi_ut_read_table(FILE * fp, ...@@ -201,8 +201,7 @@ acpi_ut_read_table(FILE * fp,
status = fl_check_for_ascii(fp, NULL, FALSE); status = fl_check_for_ascii(fp, NULL, FALSE);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
acpi_os_printf acpi_os_printf
("File appears to be ASCII only, must be binary\n", ("File appears to be ASCII only, must be binary\n");
table_header.length, file_size);
} }
#endif #endif
return (AE_BAD_HEADER); return (AE_BAD_HEADER);
......
/******************************************************************************
*
* Module Name: uthex -- Hex/ASCII support functions
*
*****************************************************************************/
/*
* Copyright (C) 2000 - 2014, Intel Corp.
* 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.
*/
#include <acpi/acpi.h>
#include "accommon.h"
#define _COMPONENT ACPI_COMPILER
ACPI_MODULE_NAME("uthex")
/* Hex to ASCII conversion table */
static char acpi_gbl_hex_to_ascii[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'E', 'F'
};
/*******************************************************************************
*
* FUNCTION: acpi_ut_hex_to_ascii_char
*
* PARAMETERS: integer - Contains the hex digit
* position - bit position of the digit within the
* integer (multiple of 4)
*
* RETURN: The converted Ascii character
*
* DESCRIPTION: Convert a hex digit to an Ascii character
*
******************************************************************************/
char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
{
return (acpi_gbl_hex_to_ascii[(integer >> position) & 0xF]);
}
/*******************************************************************************
*
* FUNCTION: acpi_ut_hex_char_to_value
*
* PARAMETERS: ascii_char - Hex character in Ascii
*
* RETURN: The binary value of the ascii/hex character
*
* DESCRIPTION: Perform ascii-to-hex translation
*
******************************************************************************/
u8 acpi_ut_ascii_char_to_hex(int hex_char)
{
if (hex_char <= 0x39) {
return ((u8)(hex_char - 0x30));
}
if (hex_char <= 0x46) {
return ((u8)(hex_char - 0x37));
}
return ((u8)(hex_char - 0x57));
}
...@@ -242,6 +242,7 @@ static char *acpi_ut_format_number(char *string, ...@@ -242,6 +242,7 @@ static char *acpi_ut_format_number(char *string,
u64 number, u64 number,
u8 base, s32 width, s32 precision, u8 type) u8 base, s32 width, s32 precision, u8 type)
{ {
char *pos;
char sign; char sign;
char zero; char zero;
u8 need_prefix; u8 need_prefix;
...@@ -289,9 +290,8 @@ static char *acpi_ut_format_number(char *string, ...@@ -289,9 +290,8 @@ static char *acpi_ut_format_number(char *string,
/* Generate full string in reverse order */ /* Generate full string in reverse order */
i = ACPI_PTR_DIFF(acpi_ut_put_number pos = acpi_ut_put_number(reversed_string, number, base, upper);
(reversed_string, number, base, upper), i = ACPI_PTR_DIFF(pos, reversed_string);
reversed_string);
/* Printing 100 using %2d gives "100", not "00" */ /* Printing 100 using %2d gives "100", not "00" */
...@@ -401,6 +401,7 @@ acpi_ut_vsnprintf(char *string, ...@@ -401,6 +401,7 @@ acpi_ut_vsnprintf(char *string,
/* Process width */ /* Process width */
width = -1;
if (ACPI_IS_DIGIT(*format)) { if (ACPI_IS_DIGIT(*format)) {
format = acpi_ut_scan_number(format, &number); format = acpi_ut_scan_number(format, &number);
width = (s32) number; width = (s32) number;
...@@ -415,6 +416,7 @@ acpi_ut_vsnprintf(char *string, ...@@ -415,6 +416,7 @@ acpi_ut_vsnprintf(char *string,
/* Process precision */ /* Process precision */
precision = -1;
if (*format == '.') { if (*format == '.') {
++format; ++format;
if (ACPI_IS_DIGIT(*format)) { if (ACPI_IS_DIGIT(*format)) {
...@@ -431,6 +433,7 @@ acpi_ut_vsnprintf(char *string, ...@@ -431,6 +433,7 @@ acpi_ut_vsnprintf(char *string,
/* Process qualifier */ /* Process qualifier */
qualifier = -1;
if (*format == 'h' || *format == 'l' || *format == 'L') { if (*format == 'h' || *format == 'l' || *format == 'L') {
qualifier = *format; qualifier = *format;
++format; ++format;
......
/******************************************************************************
*
* Module Name: utuuid -- UUID support functions
*
*****************************************************************************/
/*
* Copyright (C) 2000 - 2014, Intel Corp.
* 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.
*/
#include <acpi/acpi.h>
#include "accommon.h"
#define _COMPONENT ACPI_COMPILER
ACPI_MODULE_NAME("utuuid")
/*
* UUID support functions.
*
* This table is used to convert an input UUID ascii string to a 16 byte
* buffer and the reverse. The table maps a UUID buffer index 0-15 to
* the index within the 36-byte UUID string where the associated 2-byte
* hex value can be found.
*
* 36-byte UUID strings are of the form:
* aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
* Where aa-pp are one byte hex numbers, made up of two hex digits
*
* Note: This table is basically the inverse of the string-to-offset table
* found in the ACPI spec in the description of the to_UUID macro.
*/
const u8 acpi_gbl_map_to_uuid_offset[UUID_BUFFER_LENGTH] = {
6, 4, 2, 0, 11, 9, 16, 14, 19, 21, 24, 26, 28, 30, 32, 34
};
/*******************************************************************************
*
* FUNCTION: acpi_ut_convert_string_to_uuid
*
* PARAMETERS: in_string - 36-byte formatted UUID string
* uuid_buffer - Where the 16-byte UUID buffer is returned
*
* RETURN: None. Output data is returned in the uuid_buffer
*
* DESCRIPTION: Convert a 36-byte formatted UUID string to 16-byte UUID buffer
*
******************************************************************************/
void acpi_ut_convert_string_to_uuid(char *in_string, u8 *uuid_buffer)
{
u32 i;
for (i = 0; i < UUID_BUFFER_LENGTH; i++) {
uuid_buffer[i] =
(acpi_ut_ascii_char_to_hex
(in_string[acpi_gbl_map_to_uuid_offset[i]]) << 4);
uuid_buffer[i] |=
acpi_ut_ascii_char_to_hex(in_string
[acpi_gbl_map_to_uuid_offset[i] +
1]);
}
}
...@@ -84,7 +84,7 @@ void *dmar_alloc_dev_scope(void *start, void *end, int *cnt) ...@@ -84,7 +84,7 @@ void *dmar_alloc_dev_scope(void *start, void *end, int *cnt)
*cnt = 0; *cnt = 0;
while (start < end) { while (start < end) {
scope = start; scope = start;
if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ACPI || if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_NAMESPACE ||
scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT || scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE) scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE)
(*cnt)++; (*cnt)++;
...@@ -380,7 +380,7 @@ static int __init dmar_parse_one_andd(struct acpi_dmar_header *header) ...@@ -380,7 +380,7 @@ static int __init dmar_parse_one_andd(struct acpi_dmar_header *header)
struct acpi_dmar_andd *andd = (void *)header; struct acpi_dmar_andd *andd = (void *)header;
/* Check for NUL termination within the designated length */ /* Check for NUL termination within the designated length */
if (strnlen(andd->object_name, header->length - 8) == header->length - 8) { if (strnlen(andd->device_name, header->length - 8) == header->length - 8) {
WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND, WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
"Your BIOS is broken; ANDD object name is not NUL-terminated\n" "Your BIOS is broken; ANDD object name is not NUL-terminated\n"
"BIOS vendor: %s; Ver: %s; Product Version: %s\n", "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
...@@ -390,7 +390,7 @@ static int __init dmar_parse_one_andd(struct acpi_dmar_header *header) ...@@ -390,7 +390,7 @@ static int __init dmar_parse_one_andd(struct acpi_dmar_header *header)
return -EINVAL; return -EINVAL;
} }
pr_info("ANDD device: %x name: %s\n", andd->device_number, pr_info("ANDD device: %x name: %s\n", andd->device_number,
andd->object_name); andd->device_name);
return 0; return 0;
} }
...@@ -448,17 +448,17 @@ dmar_table_print_dmar_entry(struct acpi_dmar_header *header) ...@@ -448,17 +448,17 @@ dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
(unsigned long long)rmrr->base_address, (unsigned long long)rmrr->base_address,
(unsigned long long)rmrr->end_address); (unsigned long long)rmrr->end_address);
break; break;
case ACPI_DMAR_TYPE_ATSR: case ACPI_DMAR_TYPE_ROOT_ATS:
atsr = container_of(header, struct acpi_dmar_atsr, header); atsr = container_of(header, struct acpi_dmar_atsr, header);
pr_info("ATSR flags: %#x\n", atsr->flags); pr_info("ATSR flags: %#x\n", atsr->flags);
break; break;
case ACPI_DMAR_HARDWARE_AFFINITY: case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
rhsa = container_of(header, struct acpi_dmar_rhsa, header); rhsa = container_of(header, struct acpi_dmar_rhsa, header);
pr_info("RHSA base: %#016Lx proximity domain: %#x\n", pr_info("RHSA base: %#016Lx proximity domain: %#x\n",
(unsigned long long)rhsa->base_address, (unsigned long long)rhsa->base_address,
rhsa->proximity_domain); rhsa->proximity_domain);
break; break;
case ACPI_DMAR_TYPE_ANDD: case ACPI_DMAR_TYPE_NAMESPACE:
/* We don't print this here because we need to sanity-check /* We don't print this here because we need to sanity-check
it first. So print it in dmar_parse_one_andd() instead. */ it first. So print it in dmar_parse_one_andd() instead. */
break; break;
...@@ -539,15 +539,15 @@ parse_dmar_table(void) ...@@ -539,15 +539,15 @@ parse_dmar_table(void)
case ACPI_DMAR_TYPE_RESERVED_MEMORY: case ACPI_DMAR_TYPE_RESERVED_MEMORY:
ret = dmar_parse_one_rmrr(entry_header); ret = dmar_parse_one_rmrr(entry_header);
break; break;
case ACPI_DMAR_TYPE_ATSR: case ACPI_DMAR_TYPE_ROOT_ATS:
ret = dmar_parse_one_atsr(entry_header); ret = dmar_parse_one_atsr(entry_header);
break; break;
case ACPI_DMAR_HARDWARE_AFFINITY: case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
ret = dmar_parse_one_rhsa(entry_header); ret = dmar_parse_one_rhsa(entry_header);
#endif #endif
break; break;
case ACPI_DMAR_TYPE_ANDD: case ACPI_DMAR_TYPE_NAMESPACE:
ret = dmar_parse_one_andd(entry_header); ret = dmar_parse_one_andd(entry_header);
break; break;
default: default:
...@@ -631,7 +631,7 @@ static void __init dmar_acpi_insert_dev_scope(u8 device_number, ...@@ -631,7 +631,7 @@ static void __init dmar_acpi_insert_dev_scope(u8 device_number,
for (scope = (void *)(drhd + 1); for (scope = (void *)(drhd + 1);
(unsigned long)scope < ((unsigned long)drhd) + drhd->header.length; (unsigned long)scope < ((unsigned long)drhd) + drhd->header.length;
scope = ((void *)scope) + scope->length) { scope = ((void *)scope) + scope->length) {
if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_ACPI) if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_NAMESPACE)
continue; continue;
if (scope->enumeration_id != device_number) if (scope->enumeration_id != device_number)
continue; continue;
...@@ -666,21 +666,21 @@ static int __init dmar_acpi_dev_scope_init(void) ...@@ -666,21 +666,21 @@ static int __init dmar_acpi_dev_scope_init(void)
for (andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar); for (andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
((unsigned long)andd) < ((unsigned long)dmar_tbl) + dmar_tbl->length; ((unsigned long)andd) < ((unsigned long)dmar_tbl) + dmar_tbl->length;
andd = ((void *)andd) + andd->header.length) { andd = ((void *)andd) + andd->header.length) {
if (andd->header.type == ACPI_DMAR_TYPE_ANDD) { if (andd->header.type == ACPI_DMAR_TYPE_NAMESPACE) {
acpi_handle h; acpi_handle h;
struct acpi_device *adev; struct acpi_device *adev;
if (!ACPI_SUCCESS(acpi_get_handle(ACPI_ROOT_OBJECT, if (!ACPI_SUCCESS(acpi_get_handle(ACPI_ROOT_OBJECT,
andd->object_name, andd->device_name,
&h))) { &h))) {
pr_err("Failed to find handle for ACPI object %s\n", pr_err("Failed to find handle for ACPI object %s\n",
andd->object_name); andd->device_name);
continue; continue;
} }
acpi_bus_get_device(h, &adev); acpi_bus_get_device(h, &adev);
if (!adev) { if (!adev) {
pr_err("Failed to get device for ACPI object %s\n", pr_err("Failed to get device for ACPI object %s\n",
andd->object_name); andd->device_name);
continue; continue;
} }
dmar_acpi_insert_dev_scope(andd->device_number, adev); dmar_acpi_insert_dev_scope(andd->device_number, adev);
......
...@@ -217,6 +217,24 @@ ...@@ -217,6 +217,24 @@
#define ACPI_NUM_sx_d_METHODS 4 #define ACPI_NUM_sx_d_METHODS 4
#define ACPI_NUM_sx_w_METHODS 5 #define ACPI_NUM_sx_w_METHODS 5
/******************************************************************************
*
* Miscellaneous constants
*
*****************************************************************************/
/* UUID constants */
#define UUID_BUFFER_LENGTH 16 /* Length of UUID in memory */
#define UUID_STRING_LENGTH 36 /* Total length of a UUID string */
/* Positions for required hyphens (dashes) in UUID strings */
#define UUID_HYPHEN1_OFFSET 8
#define UUID_HYPHEN2_OFFSET 13
#define UUID_HYPHEN3_OFFSET 18
#define UUID_HYPHEN4_OFFSET 23
/****************************************************************************** /******************************************************************************
* *
* ACPI AML Debugger * ACPI AML Debugger
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#define METHOD_NAME__HID "_HID" #define METHOD_NAME__HID "_HID"
#define METHOD_NAME__INI "_INI" #define METHOD_NAME__INI "_INI"
#define METHOD_NAME__PLD "_PLD" #define METHOD_NAME__PLD "_PLD"
#define METHOD_NAME__DSD "_DSD"
#define METHOD_NAME__PRS "_PRS" #define METHOD_NAME__PRS "_PRS"
#define METHOD_NAME__PRT "_PRT" #define METHOD_NAME__PRT "_PRT"
#define METHOD_NAME__PRW "_PRW" #define METHOD_NAME__PRW "_PRW"
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20140627 #define ACPI_CA_VERSION 0x20140724
#include <acpi/acconfig.h> #include <acpi/acconfig.h>
#include <acpi/actypes.h> #include <acpi/actypes.h>
......
...@@ -270,7 +270,8 @@ struct acpi_table_fadt { ...@@ -270,7 +270,8 @@ struct acpi_table_fadt {
u32 flags; /* Miscellaneous flag bits (see below for individual flags) */ u32 flags; /* Miscellaneous flag bits (see below for individual flags) */
struct acpi_generic_address reset_register; /* 64-bit address of the Reset register */ struct acpi_generic_address reset_register; /* 64-bit address of the Reset register */
u8 reset_value; /* Value to write to the reset_register port to reset the system */ u8 reset_value; /* Value to write to the reset_register port to reset the system */
u8 reserved4[3]; /* Reserved, must be zero */ u16 arm_boot_flags; /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */
u8 minor_revision; /* FADT Minor Revision (ACPI 5.1) */
u64 Xfacs; /* 64-bit physical address of FACS */ u64 Xfacs; /* 64-bit physical address of FACS */
u64 Xdsdt; /* 64-bit physical address of DSDT */ u64 Xdsdt; /* 64-bit physical address of DSDT */
struct acpi_generic_address xpm1a_event_block; /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ struct acpi_generic_address xpm1a_event_block; /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
...@@ -285,7 +286,7 @@ struct acpi_table_fadt { ...@@ -285,7 +286,7 @@ struct acpi_table_fadt {
struct acpi_generic_address sleep_status; /* 64-bit Sleep Status register (ACPI 5.0) */ struct acpi_generic_address sleep_status; /* 64-bit Sleep Status register (ACPI 5.0) */
}; };
/* Masks for FADT Boot Architecture Flags (boot_flags) [Vx]=Introduced in this FADT revision */ /* Masks for FADT IA-PC Boot Architecture Flags (boot_flags) [Vx]=Introduced in this FADT revision */
#define ACPI_FADT_LEGACY_DEVICES (1) /* 00: [V2] System has LPC or ISA bus devices */ #define ACPI_FADT_LEGACY_DEVICES (1) /* 00: [V2] System has LPC or ISA bus devices */
#define ACPI_FADT_8042 (1<<1) /* 01: [V3] System has an 8042 controller on port 60/64 */ #define ACPI_FADT_8042 (1<<1) /* 01: [V3] System has an 8042 controller on port 60/64 */
...@@ -296,6 +297,11 @@ struct acpi_table_fadt { ...@@ -296,6 +297,11 @@ struct acpi_table_fadt {
#define FADT2_REVISION_ID 3 #define FADT2_REVISION_ID 3
/* Masks for FADT ARM Boot Architecture Flags (arm_boot_flags) ACPI 5.1 */
#define ACPI_FADT_PSCI_COMPLIANT (1) /* 00: [V5+] PSCI 0.2+ is implemented */
#define ACPI_FADT_PSCI_USE_HVC (1<<1) /* 01: [V5+] HVC must be used instead of SMC as the PSCI conduit */
/* Masks for FADT flags */ /* Masks for FADT flags */
#define ACPI_FADT_WBINVD (1) /* 00: [V1] The WBINVD instruction works properly */ #define ACPI_FADT_WBINVD (1) /* 00: [V1] The WBINVD instruction works properly */
...@@ -399,7 +405,7 @@ struct acpi_table_desc { ...@@ -399,7 +405,7 @@ struct acpi_table_desc {
* FADT V5 size: 0x10C * FADT V5 size: 0x10C
*/ */
#define ACPI_FADT_V1_SIZE (u32) (ACPI_FADT_OFFSET (flags) + 4) #define ACPI_FADT_V1_SIZE (u32) (ACPI_FADT_OFFSET (flags) + 4)
#define ACPI_FADT_V2_SIZE (u32) (ACPI_FADT_OFFSET (reserved4[0]) + 3) #define ACPI_FADT_V2_SIZE (u32) (ACPI_FADT_OFFSET (minor_revision) + 1)
#define ACPI_FADT_V3_SIZE (u32) (ACPI_FADT_OFFSET (sleep_control)) #define ACPI_FADT_V3_SIZE (u32) (ACPI_FADT_OFFSET (sleep_control))
#define ACPI_FADT_V5_SIZE (u32) (sizeof (struct acpi_table_fadt)) #define ACPI_FADT_V5_SIZE (u32) (sizeof (struct acpi_table_fadt))
......
...@@ -671,7 +671,9 @@ enum acpi_madt_type { ...@@ -671,7 +671,9 @@ enum acpi_madt_type {
ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10,
ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11,
ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12,
ACPI_MADT_TYPE_RESERVED = 13 /* 13 and greater are reserved */ ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13,
ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14,
ACPI_MADT_TYPE_RESERVED = 15 /* 15 and greater are reserved */
}; };
/* /*
...@@ -797,15 +799,26 @@ struct acpi_madt_local_x2apic_nmi { ...@@ -797,15 +799,26 @@ struct acpi_madt_local_x2apic_nmi {
struct acpi_madt_generic_interrupt { struct acpi_madt_generic_interrupt {
struct acpi_subtable_header header; struct acpi_subtable_header header;
u16 reserved; /* reserved - must be zero */ u16 reserved; /* reserved - must be zero */
u32 gic_id; u32 cpu_interface_number;
u32 uid; u32 uid;
u32 flags; u32 flags;
u32 parking_version; u32 parking_version;
u32 performance_interrupt; u32 performance_interrupt;
u64 parked_address; u64 parked_address;
u64 base_address; u64 base_address;
u64 gicv_base_address;
u64 gich_base_address;
u32 vgic_interrupt;
u64 gicr_base_address;
u64 arm_mpidr;
}; };
/* Masks for Flags field above */
/* ACPI_MADT_ENABLED (1) Processor is usable if set */
#define ACPI_MADT_PERFORMANCE_IRQ_MODE (1<<1) /* 01: Performance Interrupt Mode */
#define ACPI_MADT_VGIC_IRQ_MODE (1<<2) /* 02: VGIC Maintenance Interrupt mode */
/* 12: Generic Distributor (ACPI 5.0) */ /* 12: Generic Distributor (ACPI 5.0) */
struct acpi_madt_generic_distributor { struct acpi_madt_generic_distributor {
...@@ -817,11 +830,36 @@ struct acpi_madt_generic_distributor { ...@@ -817,11 +830,36 @@ struct acpi_madt_generic_distributor {
u32 reserved2; /* reserved - must be zero */ u32 reserved2; /* reserved - must be zero */
}; };
/* 13: Generic MSI Frame (ACPI 5.1) */
struct acpi_madt_generic_msi_frame {
struct acpi_subtable_header header;
u16 reserved; /* reserved - must be zero */
u32 msi_frame_id;
u64 base_address;
u32 flags;
u16 spi_count;
u16 spi_base;
};
/* Masks for Flags field above */
#define ACPI_MADT_OVERRIDE_SPI_VALUES (1)
/* 14: Generic Redistributor (ACPI 5.1) */
struct acpi_madt_generic_redistributor {
struct acpi_subtable_header header;
u16 reserved; /* reserved - must be zero */
u64 base_address;
u32 length;
};
/* /*
* Common flags fields for MADT subtables * Common flags fields for MADT subtables
*/ */
/* MADT Local APIC flags (lapic_flags) and GIC flags */ /* MADT Local APIC flags */
#define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */ #define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */
......
...@@ -396,7 +396,7 @@ struct acpi_table_dbgp { ...@@ -396,7 +396,7 @@ struct acpi_table_dbgp {
* Version 1 * Version 1
* *
* Conforms to "Intel Virtualization Technology for Directed I/O", * Conforms to "Intel Virtualization Technology for Directed I/O",
* Version 1.2, Sept. 2008 * Version 2.2, Sept. 2013
* *
******************************************************************************/ ******************************************************************************/
...@@ -423,9 +423,9 @@ struct acpi_dmar_header { ...@@ -423,9 +423,9 @@ struct acpi_dmar_header {
enum acpi_dmar_type { enum acpi_dmar_type {
ACPI_DMAR_TYPE_HARDWARE_UNIT = 0, ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,
ACPI_DMAR_TYPE_RESERVED_MEMORY = 1, ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,
ACPI_DMAR_TYPE_ATSR = 2, ACPI_DMAR_TYPE_ROOT_ATS = 2,
ACPI_DMAR_HARDWARE_AFFINITY = 3, ACPI_DMAR_TYPE_HARDWARE_AFFINITY = 3,
ACPI_DMAR_TYPE_ANDD = 4, ACPI_DMAR_TYPE_NAMESPACE = 4,
ACPI_DMAR_TYPE_RESERVED = 5 /* 5 and greater are reserved */ ACPI_DMAR_TYPE_RESERVED = 5 /* 5 and greater are reserved */
}; };
...@@ -439,7 +439,7 @@ struct acpi_dmar_device_scope { ...@@ -439,7 +439,7 @@ struct acpi_dmar_device_scope {
u8 bus; u8 bus;
}; };
/* Values for entry_type in struct acpi_dmar_device_scope */ /* Values for entry_type in struct acpi_dmar_device_scope - device types */
enum acpi_dmar_scope_type { enum acpi_dmar_scope_type {
ACPI_DMAR_SCOPE_TYPE_NOT_USED = 0, ACPI_DMAR_SCOPE_TYPE_NOT_USED = 0,
...@@ -447,7 +447,7 @@ enum acpi_dmar_scope_type { ...@@ -447,7 +447,7 @@ enum acpi_dmar_scope_type {
ACPI_DMAR_SCOPE_TYPE_BRIDGE = 2, ACPI_DMAR_SCOPE_TYPE_BRIDGE = 2,
ACPI_DMAR_SCOPE_TYPE_IOAPIC = 3, ACPI_DMAR_SCOPE_TYPE_IOAPIC = 3,
ACPI_DMAR_SCOPE_TYPE_HPET = 4, ACPI_DMAR_SCOPE_TYPE_HPET = 4,
ACPI_DMAR_SCOPE_TYPE_ACPI = 5, ACPI_DMAR_SCOPE_TYPE_NAMESPACE = 5,
ACPI_DMAR_SCOPE_TYPE_RESERVED = 6 /* 6 and greater are reserved */ ACPI_DMAR_SCOPE_TYPE_RESERVED = 6 /* 6 and greater are reserved */
}; };
...@@ -516,7 +516,7 @@ struct acpi_dmar_andd { ...@@ -516,7 +516,7 @@ struct acpi_dmar_andd {
struct acpi_dmar_header header; struct acpi_dmar_header header;
u8 reserved[3]; u8 reserved[3];
u8 device_number; u8 device_number;
char object_name[1]; char device_name[1];
}; };
/******************************************************************************* /*******************************************************************************
......
...@@ -241,33 +241,96 @@ struct acpi_s3pt_suspend { ...@@ -241,33 +241,96 @@ struct acpi_s3pt_suspend {
/******************************************************************************* /*******************************************************************************
* *
* GTDT - Generic Timer Description Table (ACPI 5.0) * GTDT - Generic Timer Description Table (ACPI 5.1)
* Version 1 * Version 2
* *
******************************************************************************/ ******************************************************************************/
struct acpi_table_gtdt { struct acpi_table_gtdt {
struct acpi_table_header header; /* Common ACPI table header */ struct acpi_table_header header; /* Common ACPI table header */
u64 address; u64 counter_block_addresss;
u32 flags; u32 reserved;
u32 secure_pl1_interrupt; u32 secure_el1_interrupt;
u32 secure_pl1_flags; u32 secure_el1_flags;
u32 non_secure_pl1_interrupt; u32 non_secure_el1_interrupt;
u32 non_secure_pl1_flags; u32 non_secure_el1_flags;
u32 virtual_timer_interrupt; u32 virtual_timer_interrupt;
u32 virtual_timer_flags; u32 virtual_timer_flags;
u32 non_secure_pl2_interrupt; u32 non_secure_el2_interrupt;
u32 non_secure_pl2_flags; u32 non_secure_el2_flags;
u64 counter_read_block_address;
u32 platform_timer_count;
u32 platform_timer_offset;
}; };
/* Values for Flags field above */ /* Flag Definitions: Timer Block Physical Timers and Virtual timers */
#define ACPI_GTDT_INTERRUPT_MODE (1)
#define ACPI_GTDT_INTERRUPT_POLARITY (1<<1)
#define ACPI_GTDT_ALWAYS_ON (1<<2)
/* Common GTDT subtable header */
struct acpi_gtdt_header {
u8 type;
u16 length;
};
#define ACPI_GTDT_MAPPED_BLOCK_PRESENT 1 /* Values for GTDT subtable type above */
/* Values for all "TimerFlags" fields above */ enum acpi_gtdt_type {
ACPI_GTDT_TYPE_TIMER_BLOCK = 0,
ACPI_GTDT_TYPE_WATCHDOG = 1,
ACPI_GTDT_TYPE_RESERVED = 2 /* 2 and greater are reserved */
};
/* GTDT Subtables, correspond to Type in struct acpi_gtdt_header */
/* 0: Generic Timer Block */
struct acpi_gtdt_timer_block {
struct acpi_gtdt_header header;
u8 reserved;
u64 block_address;
u32 timer_count;
u32 timer_offset;
};
/* Timer Sub-Structure, one per timer */
struct acpi_gtdt_timer_entry {
u8 frame_number;
u8 reserved[3];
u64 base_address;
u64 el0_base_address;
u32 timer_interrupt;
u32 timer_flags;
u32 virtual_timer_interrupt;
u32 virtual_timer_flags;
u32 common_flags;
};
#define ACPI_GTDT_INTERRUPT_MODE 1 /* Flag Definitions: common_flags above */
#define ACPI_GTDT_INTERRUPT_POLARITY 2
#define ACPI_GTDT_GT_IS_SECURE_TIMER (1)
#define ACPI_GTDT_GT_ALWAYS_ON (1<<1)
/* 1: SBSA Generic Watchdog Structure */
struct acpi_gtdt_watchdog {
struct acpi_gtdt_header header;
u8 reserved;
u64 refresh_frame_address;
u64 control_frame_address;
u32 timer_interrupt;
u32 timer_flags;
};
/* Flag Definitions: timer_flags above */
#define ACPI_GTDT_WATCHDOG_IRQ_MODE (1)
#define ACPI_GTDT_WATCHDOG_IRQ_POLARITY (1<<1)
#define ACPI_GTDT_WATCHDOG_SECURE (1<<2)
/******************************************************************************* /*******************************************************************************
* *
...@@ -385,7 +448,8 @@ struct acpi_table_pcct { ...@@ -385,7 +448,8 @@ struct acpi_table_pcct {
enum acpi_pcct_type { enum acpi_pcct_type {
ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0,
ACPI_PCCT_TYPE_RESERVED = 1 /* 1 and greater are reserved */ ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1,
ACPI_PCCT_TYPE_RESERVED = 2 /* 2 and greater are reserved */
}; };
/* /*
...@@ -407,6 +471,28 @@ struct acpi_pcct_subspace { ...@@ -407,6 +471,28 @@ struct acpi_pcct_subspace {
u16 min_turnaround_time; u16 min_turnaround_time;
}; };
/* 1: HW-reduced Communications Subspace (ACPI 5.1) */
struct acpi_pcct_hw_reduced {
struct acpi_subtable_header header;
u32 doorbell_interrupt;
u8 flags;
u8 reserved;
u64 base_address;
u64 length;
struct acpi_generic_address doorbell_register;
u64 preserve_mask;
u64 write_mask;
u32 latency;
u32 max_access_rate;
u16 min_turnaround_time;
};
/* Values for doorbell flags above */
#define ACPI_PCCT_INTERRUPT_POLARITY (1)
#define ACPI_PCCT_INTERRUPT_MODE (1<<1)
/* /*
* PCC memory structures (not part of the ACPI table) * PCC memory structures (not part of the ACPI table)
*/ */
......
...@@ -517,7 +517,7 @@ typedef u64 acpi_integer; ...@@ -517,7 +517,7 @@ typedef u64 acpi_integer;
#define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void, (void *) NULL,(acpi_size) i) #define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void, (void *) NULL,(acpi_size) i)
#define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) NULL) #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) NULL)
#define ACPI_OFFSET(d, f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f), (void *) NULL) #define ACPI_OFFSET(d, f) ACPI_PTR_DIFF (&(((d *) 0)->f), (void *) NULL)
#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) #define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i)
#define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i)
...@@ -612,8 +612,9 @@ typedef u64 acpi_integer; ...@@ -612,8 +612,9 @@ typedef u64 acpi_integer;
#define ACPI_NOTIFY_RESERVED (u8) 0x0A #define ACPI_NOTIFY_RESERVED (u8) 0x0A
#define ACPI_NOTIFY_LOCALITY_UPDATE (u8) 0x0B #define ACPI_NOTIFY_LOCALITY_UPDATE (u8) 0x0B
#define ACPI_NOTIFY_SHUTDOWN_REQUEST (u8) 0x0C #define ACPI_NOTIFY_SHUTDOWN_REQUEST (u8) 0x0C
#define ACPI_NOTIFY_AFFINITY_UPDATE (u8) 0x0D
#define ACPI_NOTIFY_MAX 0x0C #define ACPI_NOTIFY_MAX 0x0D
/* /*
* Types associated with ACPI names and objects. The first group of * Types associated with ACPI names and objects. The first group of
......
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