mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Merge branch 'for-4.16/nfit' into libnvdimm-for-next
This commit is contained in:
commit
ee95f4059a
475 changed files with 6107 additions and 1912 deletions
|
|
@ -427,6 +427,142 @@ out:
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct lpss_device_links {
|
||||
const char *supplier_hid;
|
||||
const char *supplier_uid;
|
||||
const char *consumer_hid;
|
||||
const char *consumer_uid;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/*
|
||||
* The _DEP method is used to identify dependencies but instead of creating
|
||||
* device links for every handle in _DEP, only links in the following list are
|
||||
* created. That is necessary because, in the general case, _DEP can refer to
|
||||
* devices that might not have drivers, or that are on different buses, or where
|
||||
* the supplier is not enumerated until after the consumer is probed.
|
||||
*/
|
||||
static const struct lpss_device_links lpss_device_links[] = {
|
||||
{"808622C1", "7", "80860F14", "3", DL_FLAG_PM_RUNTIME},
|
||||
};
|
||||
|
||||
static bool hid_uid_match(const char *hid1, const char *uid1,
|
||||
const char *hid2, const char *uid2)
|
||||
{
|
||||
return !strcmp(hid1, hid2) && uid1 && uid2 && !strcmp(uid1, uid2);
|
||||
}
|
||||
|
||||
static bool acpi_lpss_is_supplier(struct acpi_device *adev,
|
||||
const struct lpss_device_links *link)
|
||||
{
|
||||
return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
|
||||
link->supplier_hid, link->supplier_uid);
|
||||
}
|
||||
|
||||
static bool acpi_lpss_is_consumer(struct acpi_device *adev,
|
||||
const struct lpss_device_links *link)
|
||||
{
|
||||
return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
|
||||
link->consumer_hid, link->consumer_uid);
|
||||
}
|
||||
|
||||
struct hid_uid {
|
||||
const char *hid;
|
||||
const char *uid;
|
||||
};
|
||||
|
||||
static int match_hid_uid(struct device *dev, void *data)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
struct hid_uid *id = data;
|
||||
|
||||
if (!adev)
|
||||
return 0;
|
||||
|
||||
return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
|
||||
id->hid, id->uid);
|
||||
}
|
||||
|
||||
static struct device *acpi_lpss_find_device(const char *hid, const char *uid)
|
||||
{
|
||||
struct hid_uid data = {
|
||||
.hid = hid,
|
||||
.uid = uid,
|
||||
};
|
||||
|
||||
return bus_find_device(&platform_bus_type, NULL, &data, match_hid_uid);
|
||||
}
|
||||
|
||||
static bool acpi_lpss_dep(struct acpi_device *adev, acpi_handle handle)
|
||||
{
|
||||
struct acpi_handle_list dep_devices;
|
||||
acpi_status status;
|
||||
int i;
|
||||
|
||||
if (!acpi_has_method(adev->handle, "_DEP"))
|
||||
return false;
|
||||
|
||||
status = acpi_evaluate_reference(adev->handle, "_DEP", NULL,
|
||||
&dep_devices);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dev_dbg(&adev->dev, "Failed to evaluate _DEP.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (i = 0; i < dep_devices.count; i++) {
|
||||
if (dep_devices.handles[i] == handle)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void acpi_lpss_link_consumer(struct device *dev1,
|
||||
const struct lpss_device_links *link)
|
||||
{
|
||||
struct device *dev2;
|
||||
|
||||
dev2 = acpi_lpss_find_device(link->consumer_hid, link->consumer_uid);
|
||||
if (!dev2)
|
||||
return;
|
||||
|
||||
if (acpi_lpss_dep(ACPI_COMPANION(dev2), ACPI_HANDLE(dev1)))
|
||||
device_link_add(dev2, dev1, link->flags);
|
||||
|
||||
put_device(dev2);
|
||||
}
|
||||
|
||||
static void acpi_lpss_link_supplier(struct device *dev1,
|
||||
const struct lpss_device_links *link)
|
||||
{
|
||||
struct device *dev2;
|
||||
|
||||
dev2 = acpi_lpss_find_device(link->supplier_hid, link->supplier_uid);
|
||||
if (!dev2)
|
||||
return;
|
||||
|
||||
if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
|
||||
device_link_add(dev1, dev2, link->flags);
|
||||
|
||||
put_device(dev2);
|
||||
}
|
||||
|
||||
static void acpi_lpss_create_device_links(struct acpi_device *adev,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(lpss_device_links); i++) {
|
||||
const struct lpss_device_links *link = &lpss_device_links[i];
|
||||
|
||||
if (acpi_lpss_is_supplier(adev, link))
|
||||
acpi_lpss_link_consumer(&pdev->dev, link);
|
||||
|
||||
if (acpi_lpss_is_consumer(adev, link))
|
||||
acpi_lpss_link_supplier(&pdev->dev, link);
|
||||
}
|
||||
}
|
||||
|
||||
static int acpi_lpss_create_device(struct acpi_device *adev,
|
||||
const struct acpi_device_id *id)
|
||||
{
|
||||
|
|
@ -465,6 +601,8 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
acpi_dev_free_resource_list(&resource_list);
|
||||
|
||||
if (!pdata->mmio_base) {
|
||||
/* Avoid acpi_bus_attach() instantiating a pdev for this dev. */
|
||||
adev->pnp.type.platform_id = 0;
|
||||
/* Skip the device, but continue the namespace scan. */
|
||||
ret = 0;
|
||||
goto err_out;
|
||||
|
|
@ -500,6 +638,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
adev->driver_data = pdata;
|
||||
pdev = acpi_create_platform_device(adev, dev_desc->properties);
|
||||
if (!IS_ERR_OR_NULL(pdev)) {
|
||||
acpi_lpss_create_device_links(adev, pdev);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -80,8 +80,8 @@ MODULE_PARM_DESC(report_key_events,
|
|||
static bool device_id_scheme = false;
|
||||
module_param(device_id_scheme, bool, 0444);
|
||||
|
||||
static bool only_lcd = false;
|
||||
module_param(only_lcd, bool, 0444);
|
||||
static int only_lcd = -1;
|
||||
module_param(only_lcd, int, 0444);
|
||||
|
||||
static int register_count;
|
||||
static DEFINE_MUTEX(register_count_mutex);
|
||||
|
|
@ -2136,6 +2136,16 @@ int acpi_video_register(void)
|
|||
goto leave;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're seeing a lot of bogus backlight interfaces on newer machines
|
||||
* without a LCD such as desktops, servers and HDMI sticks. Checking
|
||||
* the lcd flag fixes this, so enable this on any machines which are
|
||||
* win8 ready (where we also prefer the native backlight driver, so
|
||||
* normally the acpi_video code should not register there anyways).
|
||||
*/
|
||||
if (only_lcd == -1)
|
||||
only_lcd = acpi_osi_is_win8();
|
||||
|
||||
dmi_check_system(video_dmi_table);
|
||||
|
||||
ret = acpi_bus_register_driver(&acpi_video_bus);
|
||||
|
|
|
|||
|
|
@ -80,6 +80,9 @@
|
|||
prefix, ACPICA_COPYRIGHT, \
|
||||
prefix
|
||||
|
||||
#define ACPI_COMMON_BUILD_TIME \
|
||||
"Build date/time: %s %s\n", __DATE__, __TIME__
|
||||
|
||||
/* Macros for usage messages */
|
||||
|
||||
#define ACPI_USAGE_HEADER(usage) \
|
||||
|
|
|
|||
|
|
@ -222,6 +222,10 @@ ACPI_DBR_DEPENDENT_RETURN_VOID(void
|
|||
void
|
||||
acpi_db_execute(char *name, char **args, acpi_object_type *types, u32 flags);
|
||||
|
||||
void
|
||||
acpi_db_create_execution_thread(char *method_name_arg,
|
||||
char **arguments, acpi_object_type *types);
|
||||
|
||||
void
|
||||
acpi_db_create_execution_threads(char *num_threads_arg,
|
||||
char *num_loops_arg, char *method_name_arg);
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Globals related to the ACPI tables
|
||||
* Globals related to the incoming ACPI tables
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
@ -87,7 +87,7 @@ ACPI_GLOBAL(u8, acpi_gbl_integer_nybble_width);
|
|||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Mutual exclusion within ACPICA subsystem
|
||||
* Mutual exclusion within the ACPICA subsystem
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
@ -167,7 +167,7 @@ ACPI_GLOBAL(u8, acpi_gbl_next_owner_id_offset);
|
|||
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_namespace_initialized, FALSE);
|
||||
|
||||
/* Misc */
|
||||
/* Miscellaneous */
|
||||
|
||||
ACPI_GLOBAL(u32, acpi_gbl_original_mode);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_ns_lookup_count);
|
||||
|
|
@ -191,10 +191,9 @@ extern const char acpi_gbl_lower_hex_digits[];
|
|||
extern const char acpi_gbl_upper_hex_digits[];
|
||||
extern const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES];
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
|
||||
/* Lists for tracking memory allocations (debug only) */
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
ACPI_GLOBAL(struct acpi_memory_list *, acpi_gbl_global_list);
|
||||
ACPI_GLOBAL(struct acpi_memory_list *, acpi_gbl_ns_node_list);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_display_final_mem_stats);
|
||||
|
|
@ -203,7 +202,7 @@ ACPI_GLOBAL(u8, acpi_gbl_disable_mem_tracking);
|
|||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Namespace globals
|
||||
* ACPI Namespace
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
@ -234,15 +233,20 @@ ACPI_INIT_GLOBAL(u32, acpi_gbl_nesting_level, 0);
|
|||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Interpreter globals
|
||||
* Interpreter/Parser globals
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
ACPI_GLOBAL(struct acpi_thread_state *, acpi_gbl_current_walk_list);
|
||||
|
||||
/* Control method single step flag */
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_cm_single_step);
|
||||
ACPI_GLOBAL(struct acpi_thread_state *, acpi_gbl_current_walk_list);
|
||||
ACPI_INIT_GLOBAL(union acpi_parse_object, *acpi_gbl_current_scope, NULL);
|
||||
|
||||
/* ASL/ASL+ converter */
|
||||
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_capture_comments, FALSE);
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_last_list_head, NULL);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
|
|
@ -252,7 +256,6 @@ ACPI_GLOBAL(u8, acpi_gbl_cm_single_step);
|
|||
|
||||
extern struct acpi_bit_register_info
|
||||
acpi_gbl_bit_register_info[ACPI_NUM_BITREG];
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b);
|
||||
|
||||
|
|
@ -263,7 +266,6 @@ ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b);
|
|||
****************************************************************************/
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_all_gpes_initialized);
|
||||
ACPI_GLOBAL(struct acpi_gpe_xrupt_info *, acpi_gbl_gpe_xrupt_list_head);
|
||||
ACPI_GLOBAL(struct acpi_gpe_block_info *,
|
||||
|
|
@ -272,10 +274,8 @@ ACPI_GLOBAL(acpi_gbl_event_handler, acpi_gbl_global_event_handler);
|
|||
ACPI_GLOBAL(void *, acpi_gbl_global_event_handler_context);
|
||||
ACPI_GLOBAL(struct acpi_fixed_event_handler,
|
||||
acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS]);
|
||||
|
||||
extern struct acpi_fixed_event_info
|
||||
acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS];
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
@ -291,14 +291,14 @@ ACPI_GLOBAL(u32, acpi_gpe_count);
|
|||
ACPI_GLOBAL(u32, acpi_sci_count);
|
||||
ACPI_GLOBAL(u32, acpi_fixed_event_count[ACPI_NUM_FIXED_EVENTS]);
|
||||
|
||||
/* Support for dynamic control method tracing mechanism */
|
||||
/* Dynamic control method tracing mechanism */
|
||||
|
||||
ACPI_GLOBAL(u32, acpi_gbl_original_dbg_level);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_original_dbg_layer);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Debugger and Disassembler globals
|
||||
* Debugger and Disassembler
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
@ -326,7 +326,6 @@ ACPI_GLOBAL(struct acpi_external_file *, acpi_gbl_external_file_list);
|
|||
#endif
|
||||
|
||||
#ifdef ACPI_DEBUGGER
|
||||
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_abort_method, FALSE);
|
||||
ACPI_INIT_GLOBAL(acpi_thread_id, acpi_gbl_db_thread_id, ACPI_INVALID_THREAD_ID);
|
||||
|
||||
|
|
@ -340,7 +339,6 @@ ACPI_GLOBAL(u32, acpi_gbl_db_console_debug_level);
|
|||
ACPI_GLOBAL(struct acpi_namespace_node *, acpi_gbl_db_scope_node);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_db_terminate_loop);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_db_threads_terminated);
|
||||
|
||||
ACPI_GLOBAL(char *, acpi_gbl_db_args[ACPI_DEBUGGER_MAX_ARGS]);
|
||||
ACPI_GLOBAL(acpi_object_type, acpi_gbl_db_arg_types[ACPI_DEBUGGER_MAX_ARGS]);
|
||||
|
||||
|
|
@ -350,32 +348,33 @@ ACPI_GLOBAL(char, acpi_gbl_db_parsed_buf[ACPI_DB_LINE_BUFFER_SIZE]);
|
|||
ACPI_GLOBAL(char, acpi_gbl_db_scope_buf[ACPI_DB_LINE_BUFFER_SIZE]);
|
||||
ACPI_GLOBAL(char, acpi_gbl_db_debug_filename[ACPI_DB_LINE_BUFFER_SIZE]);
|
||||
|
||||
/*
|
||||
* Statistic globals
|
||||
*/
|
||||
/* Statistics globals */
|
||||
|
||||
ACPI_GLOBAL(u16, acpi_gbl_obj_type_count[ACPI_TOTAL_TYPES]);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_node_type_count[ACPI_TOTAL_TYPES]);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_obj_type_count_misc);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_node_type_count_misc);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_num_nodes);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_num_objects);
|
||||
|
||||
#endif /* ACPI_DEBUGGER */
|
||||
|
||||
#if defined (ACPI_DISASSEMBLER) || defined (ACPI_ASL_COMPILER)
|
||||
|
||||
ACPI_GLOBAL(const char, *acpi_gbl_pld_panel_list[]);
|
||||
ACPI_GLOBAL(const char, *acpi_gbl_pld_vertical_position_list[]);
|
||||
ACPI_GLOBAL(const char, *acpi_gbl_pld_horizontal_position_list[]);
|
||||
ACPI_GLOBAL(const char, *acpi_gbl_pld_shape_list[]);
|
||||
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_disasm_flag, FALSE);
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Meant for the -ca option.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
*
|
||||
* ACPICA application-specific globals
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* ASL-to-ASL+ conversion utility (implemented within the iASL compiler) */
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
ACPI_INIT_GLOBAL(char *, acpi_gbl_current_inline_comment, NULL);
|
||||
ACPI_INIT_GLOBAL(char *, acpi_gbl_current_end_node_comment, NULL);
|
||||
ACPI_INIT_GLOBAL(char *, acpi_gbl_current_open_brace_comment, NULL);
|
||||
|
|
@ -386,23 +385,18 @@ ACPI_INIT_GLOBAL(char *, acpi_gbl_current_filename, NULL);
|
|||
ACPI_INIT_GLOBAL(char *, acpi_gbl_current_parent_filename, NULL);
|
||||
ACPI_INIT_GLOBAL(char *, acpi_gbl_current_include_filename, NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_last_list_head, NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_def_blk_comment_list_head,
|
||||
NULL);
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_def_blk_comment_list_tail,
|
||||
NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_reg_comment_list_head,
|
||||
NULL);
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_reg_comment_list_tail,
|
||||
NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_inc_comment_list_head,
|
||||
NULL);
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_inc_comment_list_tail,
|
||||
NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_end_blk_comment_list_head,
|
||||
NULL);
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_end_blk_comment_list_tail,
|
||||
|
|
@ -410,30 +404,18 @@ ACPI_INIT_GLOBAL(struct acpi_comment_node, *acpi_gbl_end_blk_comment_list_tail,
|
|||
|
||||
ACPI_INIT_GLOBAL(struct acpi_comment_addr_node,
|
||||
*acpi_gbl_comment_addr_list_head, NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(union acpi_parse_object, *acpi_gbl_current_scope, NULL);
|
||||
|
||||
ACPI_INIT_GLOBAL(struct acpi_file_node, *acpi_gbl_file_tree_root, NULL);
|
||||
|
||||
ACPI_GLOBAL(acpi_cache_t *, acpi_gbl_reg_comment_cache);
|
||||
ACPI_GLOBAL(acpi_cache_t *, acpi_gbl_comment_addr_cache);
|
||||
ACPI_GLOBAL(acpi_cache_t *, acpi_gbl_file_cache);
|
||||
|
||||
ACPI_INIT_GLOBAL(u8, gbl_capture_comments, FALSE);
|
||||
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_debug_asl_conversion, FALSE);
|
||||
ACPI_INIT_GLOBAL(ACPI_FILE, acpi_gbl_conv_debug_file, NULL);
|
||||
|
||||
ACPI_GLOBAL(char, acpi_gbl_table_sig[4]);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Application globals
|
||||
*
|
||||
****************************************************************************/
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_APPLICATION
|
||||
|
||||
ACPI_INIT_GLOBAL(ACPI_FILE, acpi_gbl_debug_file, NULL);
|
||||
ACPI_INIT_GLOBAL(ACPI_FILE, acpi_gbl_output_file, NULL);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_debug_timeout, FALSE);
|
||||
|
|
@ -442,16 +424,6 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_debug_timeout, FALSE);
|
|||
|
||||
ACPI_GLOBAL(acpi_spinlock, acpi_gbl_print_lock); /* For print buffer */
|
||||
ACPI_GLOBAL(char, acpi_gbl_print_buffer[1024]);
|
||||
|
||||
#endif /* ACPI_APPLICATION */
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Info/help support
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
extern const struct ah_predefined_name asl_predefined_info[];
|
||||
extern const struct ah_device_id asl_device_ids[];
|
||||
|
||||
#endif /* __ACGLOBAL_H__ */
|
||||
|
|
|
|||
|
|
@ -622,7 +622,7 @@ struct acpi_control_state {
|
|||
union acpi_parse_object *predicate_op;
|
||||
u8 *aml_predicate_start; /* Start of if/while predicate */
|
||||
u8 *package_end; /* End of if/while block */
|
||||
u32 loop_count; /* While() loop counter */
|
||||
u64 loop_timeout; /* While() loop timeout */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -1218,16 +1218,17 @@ struct acpi_db_method_info {
|
|||
acpi_object_type *types;
|
||||
|
||||
/*
|
||||
* Arguments to be passed to method for the command
|
||||
* Threads -
|
||||
* the Number of threads, ID of current thread and
|
||||
* Index of current thread inside all them created.
|
||||
* Arguments to be passed to method for the commands Threads and
|
||||
* Background. Note, ACPI specifies a maximum of 7 arguments (0 - 6).
|
||||
*
|
||||
* For the Threads command, the Number of threads, ID of current
|
||||
* thread and Index of current thread inside all them created.
|
||||
*/
|
||||
char init_args;
|
||||
#ifdef ACPI_DEBUGGER
|
||||
acpi_object_type arg_types[4];
|
||||
acpi_object_type arg_types[ACPI_METHOD_NUM_ARGS];
|
||||
#endif
|
||||
char *arguments[4];
|
||||
char *arguments[ACPI_METHOD_NUM_ARGS];
|
||||
char num_threads_str[11];
|
||||
char id_of_thread_str[11];
|
||||
char index_of_thread_str[11];
|
||||
|
|
|
|||
|
|
@ -455,7 +455,7 @@
|
|||
* the plist contains a set of parens to allow variable-length lists.
|
||||
* These macros are used for both the debug and non-debug versions of the code.
|
||||
*/
|
||||
#define ACPI_ERROR_NAMESPACE(s, e) acpi_ut_namespace_error (AE_INFO, s, e);
|
||||
#define ACPI_ERROR_NAMESPACE(s, p, e) acpi_ut_prefixed_namespace_error (AE_INFO, s, p, e);
|
||||
#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e);
|
||||
#define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist
|
||||
#define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist
|
||||
|
|
|
|||
|
|
@ -289,6 +289,9 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
|
|||
char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
|
||||
u8 no_trailing);
|
||||
|
||||
char *acpi_ns_build_prefixed_pathname(union acpi_generic_state *prefix_scope,
|
||||
const char *internal_path);
|
||||
|
||||
char *acpi_ns_name_of_current_scope(struct acpi_walk_state *walk_state);
|
||||
|
||||
acpi_status
|
||||
|
|
|
|||
|
|
@ -118,9 +118,6 @@ extern const char *acpi_gbl_ptyp_decode[];
|
|||
#ifndef ACPI_MSG_ERROR
|
||||
#define ACPI_MSG_ERROR "ACPI Error: "
|
||||
#endif
|
||||
#ifndef ACPI_MSG_EXCEPTION
|
||||
#define ACPI_MSG_EXCEPTION "ACPI Exception: "
|
||||
#endif
|
||||
#ifndef ACPI_MSG_WARNING
|
||||
#define ACPI_MSG_WARNING "ACPI Warning: "
|
||||
#endif
|
||||
|
|
@ -129,10 +126,10 @@ extern const char *acpi_gbl_ptyp_decode[];
|
|||
#endif
|
||||
|
||||
#ifndef ACPI_MSG_BIOS_ERROR
|
||||
#define ACPI_MSG_BIOS_ERROR "ACPI BIOS Error (bug): "
|
||||
#define ACPI_MSG_BIOS_ERROR "Firmware Error (ACPI): "
|
||||
#endif
|
||||
#ifndef ACPI_MSG_BIOS_WARNING
|
||||
#define ACPI_MSG_BIOS_WARNING "ACPI BIOS Warning (bug): "
|
||||
#define ACPI_MSG_BIOS_WARNING "Firmware Warning (ACPI): "
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -233,10 +230,10 @@ u64 acpi_ut_implicit_strtoul64(char *string);
|
|||
*/
|
||||
acpi_status acpi_ut_init_globals(void);
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
|
||||
const char *acpi_ut_get_mutex_name(u32 mutex_id);
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
|
||||
const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type);
|
||||
#endif
|
||||
|
||||
|
|
@ -641,9 +638,11 @@ void ut_convert_backslashes(char *pathname);
|
|||
|
||||
void acpi_ut_repair_name(char *name);
|
||||
|
||||
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
|
||||
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT)
|
||||
u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source);
|
||||
|
||||
void acpi_ut_safe_strncpy(char *dest, char *source, acpi_size dest_size);
|
||||
|
||||
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source);
|
||||
|
||||
u8
|
||||
|
|
@ -737,9 +736,11 @@ acpi_ut_predefined_bios_error(const char *module_name,
|
|||
u8 node_flags, const char *format, ...);
|
||||
|
||||
void
|
||||
acpi_ut_namespace_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *internal_name, acpi_status lookup_status);
|
||||
acpi_ut_prefixed_namespace_error(const char *module_name,
|
||||
u32 line_number,
|
||||
union acpi_generic_state *prefix_scope,
|
||||
const char *internal_name,
|
||||
acpi_status lookup_status);
|
||||
|
||||
void
|
||||
acpi_ut_method_error(const char *module_name,
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ static acpi_status
|
|||
acpi_db_execution_walk(acpi_handle obj_handle,
|
||||
u32 nesting_level, void *context, void **return_value);
|
||||
|
||||
static void ACPI_SYSTEM_XFACE acpi_db_single_execution_thread(void *context);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_db_delete_objects
|
||||
|
|
@ -229,7 +231,7 @@ static acpi_status acpi_db_execute_setup(struct acpi_db_method_info *info)
|
|||
|
||||
ACPI_FUNCTION_NAME(db_execute_setup);
|
||||
|
||||
/* Catenate the current scope to the supplied name */
|
||||
/* Concatenate the current scope to the supplied name */
|
||||
|
||||
info->pathname[0] = 0;
|
||||
if ((info->name[0] != '\\') && (info->name[0] != '/')) {
|
||||
|
|
@ -609,6 +611,112 @@ static void ACPI_SYSTEM_XFACE acpi_db_method_thread(void *context)
|
|||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_db_single_execution_thread
|
||||
*
|
||||
* PARAMETERS: context - Method info struct
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Create one thread and execute a method
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void ACPI_SYSTEM_XFACE acpi_db_single_execution_thread(void *context)
|
||||
{
|
||||
struct acpi_db_method_info *info = context;
|
||||
acpi_status status;
|
||||
struct acpi_buffer return_obj;
|
||||
|
||||
acpi_os_printf("\n");
|
||||
|
||||
status = acpi_db_execute_method(info, &return_obj);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_os_printf("%s During evaluation of %s\n",
|
||||
acpi_format_exception(status), info->pathname);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Display a return object, if any */
|
||||
|
||||
if (return_obj.length) {
|
||||
acpi_os_printf("Evaluation of %s returned object %p, "
|
||||
"external buffer length %X\n",
|
||||
acpi_gbl_db_method_info.pathname,
|
||||
return_obj.pointer, (u32)return_obj.length);
|
||||
|
||||
acpi_db_dump_external_object(return_obj.pointer, 1);
|
||||
}
|
||||
|
||||
acpi_os_printf("\nBackground thread completed\n%c ",
|
||||
ACPI_DEBUGGER_COMMAND_PROMPT);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_db_create_execution_thread
|
||||
*
|
||||
* PARAMETERS: method_name_arg - Control method to execute
|
||||
* arguments - Array of arguments to the method
|
||||
* types - Corresponding array of object types
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Create a single thread to evaluate a namespace object. Handles
|
||||
* arguments passed on command line for control methods.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_db_create_execution_thread(char *method_name_arg,
|
||||
char **arguments, acpi_object_type *types)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
memset(&acpi_gbl_db_method_info, 0, sizeof(struct acpi_db_method_info));
|
||||
acpi_gbl_db_method_info.name = method_name_arg;
|
||||
acpi_gbl_db_method_info.init_args = 1;
|
||||
acpi_gbl_db_method_info.args = acpi_gbl_db_method_info.arguments;
|
||||
acpi_gbl_db_method_info.types = acpi_gbl_db_method_info.arg_types;
|
||||
|
||||
/* Setup method arguments, up to 7 (0-6) */
|
||||
|
||||
for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && *arguments; i++) {
|
||||
acpi_gbl_db_method_info.arguments[i] = *arguments;
|
||||
arguments++;
|
||||
|
||||
acpi_gbl_db_method_info.arg_types[i] = *types;
|
||||
types++;
|
||||
}
|
||||
|
||||
status = acpi_db_execute_setup(&acpi_gbl_db_method_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the NS node, determines existence also */
|
||||
|
||||
status = acpi_get_handle(NULL, acpi_gbl_db_method_info.pathname,
|
||||
&acpi_gbl_db_method_info.method);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_os_printf("%s Could not get handle for %s\n",
|
||||
acpi_format_exception(status),
|
||||
acpi_gbl_db_method_info.pathname);
|
||||
return;
|
||||
}
|
||||
|
||||
status = acpi_os_execute(OSL_DEBUGGER_EXEC_THREAD,
|
||||
acpi_db_single_execution_thread,
|
||||
&acpi_gbl_db_method_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf("\nBackground thread started\n");
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_db_create_execution_threads
|
||||
|
|
|
|||
|
|
@ -99,8 +99,8 @@ void acpi_db_open_debug_file(char *name)
|
|||
}
|
||||
|
||||
acpi_os_printf("Debug output file %s opened\n", name);
|
||||
strncpy(acpi_gbl_db_debug_filename, name,
|
||||
sizeof(acpi_gbl_db_debug_filename));
|
||||
acpi_ut_safe_strncpy(acpi_gbl_db_debug_filename, name,
|
||||
sizeof(acpi_gbl_db_debug_filename));
|
||||
acpi_gbl_db_output_to_file = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -136,6 +136,7 @@ enum acpi_ex_debugger_commands {
|
|||
CMD_UNLOAD,
|
||||
|
||||
CMD_TERMINATE,
|
||||
CMD_BACKGROUND,
|
||||
CMD_THREADS,
|
||||
|
||||
CMD_TEST,
|
||||
|
|
@ -212,6 +213,7 @@ static const struct acpi_db_command_info acpi_gbl_db_commands[] = {
|
|||
{"UNLOAD", 1},
|
||||
|
||||
{"TERMINATE", 0},
|
||||
{"BACKGROUND", 1},
|
||||
{"THREADS", 3},
|
||||
|
||||
{"TEST", 1},
|
||||
|
|
@ -222,36 +224,12 @@ static const struct acpi_db_command_info acpi_gbl_db_commands[] = {
|
|||
/*
|
||||
* Help for all debugger commands. First argument is the number of lines
|
||||
* of help to output for the command.
|
||||
*
|
||||
* Note: Some commands are not supported by the kernel-level version of
|
||||
* the debugger.
|
||||
*/
|
||||
static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
|
||||
{0, "\nGeneral-Purpose Commands:", "\n"},
|
||||
{1, " Allocations", "Display list of current memory allocations\n"},
|
||||
{2, " Dump <Address>|<Namepath>", "\n"},
|
||||
{0, " [Byte|Word|Dword|Qword]",
|
||||
"Display ACPI objects or memory\n"},
|
||||
{1, " Handlers", "Info about global handlers\n"},
|
||||
{1, " Help [Command]", "This help screen or individual command\n"},
|
||||
{1, " History", "Display command history buffer\n"},
|
||||
{1, " Level <DebugLevel>] [console]",
|
||||
"Get/Set debug level for file or console\n"},
|
||||
{1, " Locks", "Current status of internal mutexes\n"},
|
||||
{1, " Osi [Install|Remove <name>]",
|
||||
"Display or modify global _OSI list\n"},
|
||||
{1, " Quit or Exit", "Exit this command\n"},
|
||||
{8, " Stats <SubCommand>",
|
||||
"Display namespace and memory statistics\n"},
|
||||
{1, " Allocations", "Display list of current memory allocations\n"},
|
||||
{1, " Memory", "Dump internal memory lists\n"},
|
||||
{1, " Misc", "Namespace search and mutex stats\n"},
|
||||
{1, " Objects", "Summary of namespace objects\n"},
|
||||
{1, " Sizes", "Sizes for each of the internal objects\n"},
|
||||
{1, " Stack", "Display CPU stack usage\n"},
|
||||
{1, " Tables", "Info about current ACPI table(s)\n"},
|
||||
{1, " Tables", "Display info about loaded ACPI tables\n"},
|
||||
{1, " ! <CommandNumber>", "Execute command from history buffer\n"},
|
||||
{1, " !!", "Execute last command again\n"},
|
||||
|
||||
{0, "\nNamespace Access Commands:", "\n"},
|
||||
{0, "\nNamespace Access:", "\n"},
|
||||
{1, " Businfo", "Display system bus info\n"},
|
||||
{1, " Disassemble <Method>", "Disassemble a control method\n"},
|
||||
{1, " Find <AcpiName> (? is wildcard)",
|
||||
|
|
@ -275,19 +253,74 @@ static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
|
|||
{1, " Template <Object>", "Format/dump a Buffer/ResourceTemplate\n"},
|
||||
{1, " Type <Object>", "Display object type\n"},
|
||||
|
||||
{0, "\nControl Method Execution Commands:", "\n"},
|
||||
{0, "\nControl Method Execution:", "\n"},
|
||||
{1, " Evaluate <Namepath> [Arguments]",
|
||||
"Evaluate object or control method\n"},
|
||||
{1, " Execute <Namepath> [Arguments]", "Synonym for Evaluate\n"},
|
||||
#ifdef ACPI_APPLICATION
|
||||
{1, " Background <Namepath> [Arguments]",
|
||||
"Evaluate object/method in a separate thread\n"},
|
||||
{1, " Thread <Threads><Loops><NamePath>",
|
||||
"Spawn threads to execute method(s)\n"},
|
||||
#endif
|
||||
{1, " Debug <Namepath> [Arguments]", "Single-Step a control method\n"},
|
||||
{7, " [Arguments] formats:", "Control method argument formats\n"},
|
||||
{1, " Hex Integer", "Integer\n"},
|
||||
{1, " \"Ascii String\"", "String\n"},
|
||||
{1, " (Hex Byte List)", "Buffer\n"},
|
||||
{1, " (01 42 7A BF)", "Buffer example (4 bytes)\n"},
|
||||
{1, " [Package Element List]", "Package\n"},
|
||||
{1, " [0x01 0x1234 \"string\"]",
|
||||
"Package example (3 elements)\n"},
|
||||
|
||||
{0, "\nMiscellaneous:", "\n"},
|
||||
{1, " Allocations", "Display list of current memory allocations\n"},
|
||||
{2, " Dump <Address>|<Namepath>", "\n"},
|
||||
{0, " [Byte|Word|Dword|Qword]",
|
||||
"Display ACPI objects or memory\n"},
|
||||
{1, " Handlers", "Info about global handlers\n"},
|
||||
{1, " Help [Command]", "This help screen or individual command\n"},
|
||||
{1, " History", "Display command history buffer\n"},
|
||||
{1, " Level <DebugLevel>] [console]",
|
||||
"Get/Set debug level for file or console\n"},
|
||||
{1, " Locks", "Current status of internal mutexes\n"},
|
||||
{1, " Osi [Install|Remove <name>]",
|
||||
"Display or modify global _OSI list\n"},
|
||||
{1, " Quit or Exit", "Exit this command\n"},
|
||||
{8, " Stats <SubCommand>",
|
||||
"Display namespace and memory statistics\n"},
|
||||
{1, " Allocations", "Display list of current memory allocations\n"},
|
||||
{1, " Memory", "Dump internal memory lists\n"},
|
||||
{1, " Misc", "Namespace search and mutex stats\n"},
|
||||
{1, " Objects", "Summary of namespace objects\n"},
|
||||
{1, " Sizes", "Sizes for each of the internal objects\n"},
|
||||
{1, " Stack", "Display CPU stack usage\n"},
|
||||
{1, " Tables", "Info about current ACPI table(s)\n"},
|
||||
{1, " Tables", "Display info about loaded ACPI tables\n"},
|
||||
#ifdef ACPI_APPLICATION
|
||||
{1, " Terminate", "Delete namespace and all internal objects\n"},
|
||||
#endif
|
||||
{1, " ! <CommandNumber>", "Execute command from history buffer\n"},
|
||||
{1, " !!", "Execute last command again\n"},
|
||||
|
||||
{0, "\nMethod and Namespace Debugging:", "\n"},
|
||||
{5, " Trace <State> [<Namepath>] [Once]",
|
||||
"Trace control method execution\n"},
|
||||
{1, " Enable", "Enable all messages\n"},
|
||||
{1, " Disable", "Disable tracing\n"},
|
||||
{1, " Method", "Enable method execution messages\n"},
|
||||
{1, " Opcode", "Enable opcode execution messages\n"},
|
||||
{3, " Test <TestName>", "Invoke a debug test\n"},
|
||||
{1, " Objects", "Read/write/compare all namespace data objects\n"},
|
||||
{1, " Predefined",
|
||||
"Validate all ACPI predefined names (_STA, etc.)\n"},
|
||||
{1, " Execute predefined",
|
||||
"Execute all predefined (public) methods\n"},
|
||||
|
||||
{0, "\nControl Method Single-Step Execution:", "\n"},
|
||||
{1, " Arguments (or Args)", "Display method arguments\n"},
|
||||
{1, " Breakpoint <AmlOffset>", "Set an AML execution breakpoint\n"},
|
||||
{1, " Call", "Run to next control method invocation\n"},
|
||||
{1, " Debug <Namepath> [Arguments]", "Single Step a control method\n"},
|
||||
{6, " Evaluate", "Synonym for Execute\n"},
|
||||
{5, " Execute <Namepath> [Arguments]", "Execute control method\n"},
|
||||
{1, " Hex Integer", "Integer method argument\n"},
|
||||
{1, " \"Ascii String\"", "String method argument\n"},
|
||||
{1, " (Hex Byte List)", "Buffer method argument\n"},
|
||||
{1, " [Package Element List]", "Package method argument\n"},
|
||||
{5, " Execute predefined",
|
||||
"Execute all predefined (public) methods\n"},
|
||||
{1, " Go", "Allow method to run to completion\n"},
|
||||
{1, " Information", "Display info about the current method\n"},
|
||||
{1, " Into", "Step into (not over) a method call\n"},
|
||||
|
|
@ -296,41 +329,24 @@ static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
|
|||
{1, " Results", "Display method result stack\n"},
|
||||
{1, " Set <A|L> <#> <Value>", "Set method data (Arguments/Locals)\n"},
|
||||
{1, " Stop", "Terminate control method\n"},
|
||||
{5, " Trace <State> [<Namepath>] [Once]",
|
||||
"Trace control method execution\n"},
|
||||
{1, " Enable", "Enable all messages\n"},
|
||||
{1, " Disable", "Disable tracing\n"},
|
||||
{1, " Method", "Enable method execution messages\n"},
|
||||
{1, " Opcode", "Enable opcode execution messages\n"},
|
||||
{1, " Tree", "Display control method calling tree\n"},
|
||||
{1, " <Enter>", "Single step next AML opcode (over calls)\n"},
|
||||
|
||||
#ifdef ACPI_APPLICATION
|
||||
{0, "\nHardware Simulation Commands:", "\n"},
|
||||
{1, " EnableAcpi", "Enable ACPI (hardware) mode\n"},
|
||||
{1, " Event <F|G> <Value>", "Generate AcpiEvent (Fixed/GPE)\n"},
|
||||
{1, " Gpe <GpeNum> [GpeBlockDevice]", "Simulate a GPE\n"},
|
||||
{1, " Gpes", "Display info on all GPE devices\n"},
|
||||
{1, " Sci", "Generate an SCI\n"},
|
||||
{1, " Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},
|
||||
|
||||
{0, "\nFile I/O Commands:", "\n"},
|
||||
{0, "\nFile Operations:", "\n"},
|
||||
{1, " Close", "Close debug output file\n"},
|
||||
{1, " Load <Input Filename>", "Load ACPI table from a file\n"},
|
||||
{1, " Open <Output Filename>", "Open a file for debug output\n"},
|
||||
{1, " Unload <Namepath>",
|
||||
"Unload an ACPI table via namespace object\n"},
|
||||
|
||||
{0, "\nUser Space Commands:", "\n"},
|
||||
{1, " Terminate", "Delete namespace and all internal objects\n"},
|
||||
{1, " Thread <Threads><Loops><NamePath>",
|
||||
"Spawn threads to execute method(s)\n"},
|
||||
|
||||
{0, "\nDebug Test Commands:", "\n"},
|
||||
{3, " Test <TestName>", "Invoke a debug test\n"},
|
||||
{1, " Objects", "Read/write/compare all namespace data objects\n"},
|
||||
{1, " Predefined",
|
||||
"Execute all ACPI predefined names (_STA, etc.)\n"},
|
||||
{0, "\nHardware Simulation:", "\n"},
|
||||
{1, " EnableAcpi", "Enable ACPI (hardware) mode\n"},
|
||||
{1, " Event <F|G> <Value>", "Generate AcpiEvent (Fixed/GPE)\n"},
|
||||
{1, " Gpe <GpeNum> [GpeBlockDevice]", "Simulate a GPE\n"},
|
||||
{1, " Gpes", "Display info on all GPE devices\n"},
|
||||
{1, " Sci", "Generate an SCI\n"},
|
||||
{1, " Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},
|
||||
#endif
|
||||
{0, NULL, NULL}
|
||||
};
|
||||
|
|
@ -442,11 +458,15 @@ static void acpi_db_display_help(char *command)
|
|||
|
||||
/* No argument to help, display help for all commands */
|
||||
|
||||
acpi_os_printf("\nSummary of AML Debugger Commands\n\n");
|
||||
|
||||
while (next->invocation) {
|
||||
acpi_os_printf("%-38s%s", next->invocation,
|
||||
next->description);
|
||||
next++;
|
||||
}
|
||||
acpi_os_printf("\n");
|
||||
|
||||
} else {
|
||||
/* Display help for all commands that match the subtring */
|
||||
|
||||
|
|
@ -1087,6 +1107,13 @@ acpi_db_command_dispatch(char *input_buffer,
|
|||
/* acpi_initialize (NULL); */
|
||||
break;
|
||||
|
||||
case CMD_BACKGROUND:
|
||||
|
||||
acpi_db_create_execution_thread(acpi_gbl_db_args[1],
|
||||
&acpi_gbl_db_args[2],
|
||||
&acpi_gbl_db_arg_types[2]);
|
||||
break;
|
||||
|
||||
case CMD_THREADS:
|
||||
|
||||
acpi_db_create_execution_threads(acpi_gbl_db_args[1],
|
||||
|
|
|
|||
|
|
@ -118,6 +118,8 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
|
|||
control_state->control.package_end =
|
||||
walk_state->parser_state.pkg_end;
|
||||
control_state->control.opcode = op->common.aml_opcode;
|
||||
control_state->control.loop_timeout = acpi_os_get_timer() +
|
||||
(u64)(acpi_gbl_max_loop_iterations * ACPI_100NSEC_PER_SEC);
|
||||
|
||||
/* Push the control state on this walk's control stack */
|
||||
|
||||
|
|
@ -206,15 +208,15 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state *walk_state,
|
|||
/* Predicate was true, the body of the loop was just executed */
|
||||
|
||||
/*
|
||||
* This loop counter mechanism allows the interpreter to escape
|
||||
* possibly infinite loops. This can occur in poorly written AML
|
||||
* when the hardware does not respond within a while loop and the
|
||||
* loop does not implement a timeout.
|
||||
* This infinite loop detection mechanism allows the interpreter
|
||||
* to escape possibly infinite loops. This can occur in poorly
|
||||
* written AML when the hardware does not respond within a while
|
||||
* loop and the loop does not implement a timeout.
|
||||
*/
|
||||
control_state->control.loop_count++;
|
||||
if (control_state->control.loop_count >
|
||||
acpi_gbl_max_loop_iterations) {
|
||||
status = AE_AML_INFINITE_LOOP;
|
||||
if (ACPI_TIME_AFTER(acpi_os_get_timer(),
|
||||
control_state->control.
|
||||
loop_timeout)) {
|
||||
status = AE_AML_LOOP_TIMEOUT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -209,7 +209,8 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
|
|||
ACPI_IMODE_LOAD_PASS1, flags,
|
||||
walk_state, &node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.string, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
|
@ -383,7 +384,9 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
|
|||
walk_state,
|
||||
&info->connection_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(child->common.
|
||||
ACPI_ERROR_NAMESPACE(walk_state->
|
||||
scope_info,
|
||||
child->common.
|
||||
value.name,
|
||||
status);
|
||||
return_ACPI_STATUS(status);
|
||||
|
|
@ -402,7 +405,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
|
|||
ACPI_NS_DONT_OPEN_SCOPE,
|
||||
walk_state, &info->field_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE((char *)&arg->named.name,
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
(char *)&arg->named.name,
|
||||
status);
|
||||
return_ACPI_STATUS(status);
|
||||
} else {
|
||||
|
|
@ -498,7 +502,8 @@ acpi_ds_create_field(union acpi_parse_object *op,
|
|||
®ion_node);
|
||||
#endif
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.name, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.name, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
|
@ -618,7 +623,8 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
|
|||
ACPI_IMODE_LOAD_PASS1, flags,
|
||||
walk_state, &node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE((char *)&arg->named.name,
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
(char *)&arg->named.name,
|
||||
status);
|
||||
if (status != AE_ALREADY_EXISTS) {
|
||||
return_ACPI_STATUS(status);
|
||||
|
|
@ -681,7 +687,8 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
|
|||
®ion_node);
|
||||
#endif
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.name, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.name, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
|
@ -695,7 +702,8 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
|
|||
ACPI_NS_SEARCH_PARENT, walk_state,
|
||||
&info.register_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.string, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
@ -765,7 +773,8 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
|
|||
ACPI_NS_SEARCH_PARENT, walk_state,
|
||||
&info.register_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.string, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
@ -778,7 +787,8 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
|
|||
ACPI_NS_SEARCH_PARENT, walk_state,
|
||||
&info.data_register_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.string, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -112,7 +112,9 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|||
acpi_namespace_node,
|
||||
&(op->common.node)));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(op->common.value.
|
||||
ACPI_ERROR_NAMESPACE(walk_state->
|
||||
scope_info,
|
||||
op->common.value.
|
||||
string, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -297,8 +297,10 @@ acpi_ds_init_package_element(u8 object_type,
|
|||
{
|
||||
union acpi_operand_object **element_ptr;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ds_init_package_element);
|
||||
|
||||
if (!source_object) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -329,7 +331,7 @@ acpi_ds_init_package_element(u8 object_type,
|
|||
source_object->package.flags |= AOPOBJ_DATA_VALID;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
@ -352,6 +354,7 @@ acpi_ds_resolve_package_element(union acpi_operand_object **element_ptr)
|
|||
union acpi_generic_state scope_info;
|
||||
union acpi_operand_object *element = *element_ptr;
|
||||
struct acpi_namespace_node *resolved_node;
|
||||
struct acpi_namespace_node *original_node;
|
||||
char *external_path = NULL;
|
||||
acpi_object_type type;
|
||||
|
||||
|
|
@ -441,6 +444,7 @@ acpi_ds_resolve_package_element(union acpi_operand_object **element_ptr)
|
|||
* will remain as named references. This behavior is not described
|
||||
* in the ACPI spec, but it appears to be an oversight.
|
||||
*/
|
||||
original_node = resolved_node;
|
||||
status = acpi_ex_resolve_node_to_value(&resolved_node, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_VOID;
|
||||
|
|
@ -468,26 +472,27 @@ acpi_ds_resolve_package_element(union acpi_operand_object **element_ptr)
|
|||
*/
|
||||
case ACPI_TYPE_DEVICE:
|
||||
case ACPI_TYPE_THERMAL:
|
||||
|
||||
/* TBD: This may not be necesssary */
|
||||
|
||||
acpi_ut_add_reference(resolved_node->object);
|
||||
case ACPI_TYPE_METHOD:
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_MUTEX:
|
||||
case ACPI_TYPE_METHOD:
|
||||
case ACPI_TYPE_POWER:
|
||||
case ACPI_TYPE_PROCESSOR:
|
||||
case ACPI_TYPE_EVENT:
|
||||
case ACPI_TYPE_REGION:
|
||||
|
||||
/* acpi_ex_resolve_node_to_value gave these an extra reference */
|
||||
|
||||
acpi_ut_remove_reference(original_node->object);
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* For all other types - the node was resolved to an actual
|
||||
* operand object with a value, return the object
|
||||
* operand object with a value, return the object. Remove
|
||||
* a reference on the existing object.
|
||||
*/
|
||||
acpi_ut_remove_reference(element);
|
||||
*element_ptr = (union acpi_operand_object *)resolved_node;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -583,7 +583,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
|
|||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(name_string, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
name_string, status);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -207,7 +207,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state,
|
|||
}
|
||||
#endif
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(path, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info, path,
|
||||
status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
@ -375,7 +376,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state,
|
|||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(path, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
path, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -184,11 +184,14 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
|
|||
if (status == AE_NOT_FOUND) {
|
||||
status = AE_OK;
|
||||
} else {
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr,
|
||||
ACPI_ERROR_NAMESPACE(walk_state->
|
||||
scope_info,
|
||||
buffer_ptr,
|
||||
status);
|
||||
}
|
||||
#else
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
buffer_ptr, status);
|
||||
#endif
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
@ -343,7 +346,8 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
|
|||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
buffer_ptr, status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
@ -719,7 +723,8 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
|
|||
*/
|
||||
op->common.node = new_node;
|
||||
} else {
|
||||
ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info,
|
||||
arg->common.value.string, status);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -298,6 +298,16 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
ACPI_EXCEPTION((AE_INFO, status, "Returned by Handler for [%s]",
|
||||
acpi_ut_get_region_name(region_obj->region.
|
||||
space_id)));
|
||||
|
||||
/*
|
||||
* Special case for an EC timeout. These are seen so frequently
|
||||
* that an additional error message is helpful
|
||||
*/
|
||||
if ((region_obj->region.space_id == ACPI_ADR_SPACE_EC) &&
|
||||
(status == AE_TIME)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Timeout from EC hardware or EC device driver"));
|
||||
}
|
||||
}
|
||||
|
||||
if (!(handler_desc->address_space.handler_flags &
|
||||
|
|
|
|||
|
|
@ -617,10 +617,11 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
u32 length;
|
||||
u32 index;
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_dump_operand)
|
||||
ACPI_FUNCTION_NAME(ex_dump_operand);
|
||||
|
||||
/* Check if debug output enabled */
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_EXEC, _COMPONENT)) {
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_EXEC, _COMPONENT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -904,7 +905,7 @@ void
|
|||
acpi_ex_dump_operands(union acpi_operand_object **operands,
|
||||
const char *opcode_name, u32 num_operands)
|
||||
{
|
||||
ACPI_FUNCTION_NAME(ex_dump_operands);
|
||||
ACPI_FUNCTION_TRACE(ex_dump_operands);
|
||||
|
||||
if (!opcode_name) {
|
||||
opcode_name = "UNKNOWN";
|
||||
|
|
@ -928,7 +929,7 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"**** End operand dump for [%s]\n", opcode_name));
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -150,10 +150,10 @@ ACPI_EXPORT_SYMBOL(acpi_get_timer)
|
|||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)
|
||||
acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 *time_elapsed)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 delta_ticks;
|
||||
u64 delta_ticks;
|
||||
u64 quotient;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_get_timer_duration);
|
||||
|
|
@ -168,30 +168,29 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)
|
|||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
||||
if (start_ticks == end_ticks) {
|
||||
*time_elapsed = 0;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute Tick Delta:
|
||||
* Handle (max one) timer rollovers on 24-bit versus 32-bit timers.
|
||||
*/
|
||||
if (start_ticks < end_ticks) {
|
||||
delta_ticks = end_ticks - start_ticks;
|
||||
} else if (start_ticks > end_ticks) {
|
||||
delta_ticks = end_ticks;
|
||||
if (start_ticks > end_ticks) {
|
||||
if ((acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) == 0) {
|
||||
|
||||
/* 24-bit Timer */
|
||||
|
||||
delta_ticks =
|
||||
(((0x00FFFFFF - start_ticks) +
|
||||
end_ticks) & 0x00FFFFFF);
|
||||
delta_ticks |= (u64)1 << 24;
|
||||
} else {
|
||||
/* 32-bit Timer */
|
||||
|
||||
delta_ticks = (0xFFFFFFFF - start_ticks) + end_ticks;
|
||||
delta_ticks |= (u64)1 << 32;
|
||||
}
|
||||
} else { /* start_ticks == end_ticks */
|
||||
|
||||
*time_elapsed = 0;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
delta_ticks -= start_ticks;
|
||||
|
||||
/*
|
||||
* Compute Duration (Requires a 64-bit multiply and divide):
|
||||
|
|
@ -199,10 +198,10 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)
|
|||
* time_elapsed (microseconds) =
|
||||
* (delta_ticks * ACPI_USEC_PER_SEC) / ACPI_PM_TIMER_FREQUENCY;
|
||||
*/
|
||||
status = acpi_ut_short_divide(((u64)delta_ticks) * ACPI_USEC_PER_SEC,
|
||||
status = acpi_ut_short_divide(delta_ticks * ACPI_USEC_PER_SEC,
|
||||
ACPI_PM_TIMER_FREQUENCY, "ient, NULL);
|
||||
|
||||
*time_elapsed = (u32) quotient;
|
||||
*time_elapsed = (u32)quotient;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -128,14 +128,14 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
acpi_io_address last_address;
|
||||
const struct acpi_port_info *port_info;
|
||||
|
||||
ACPI_FUNCTION_NAME(hw_validate_io_request);
|
||||
ACPI_FUNCTION_TRACE(hw_validate_io_request);
|
||||
|
||||
/* Supported widths are 8/16/32 */
|
||||
|
||||
if ((bit_width != 8) && (bit_width != 16) && (bit_width != 32)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Bad BitWidth parameter: %8.8X", bit_width));
|
||||
return (AE_BAD_PARAMETER);
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
port_info = acpi_protected_ports;
|
||||
|
|
@ -153,13 +153,13 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
ACPI_ERROR((AE_INFO,
|
||||
"Illegal I/O port address/length above 64K: %8.8X%8.8X/0x%X",
|
||||
ACPI_FORMAT_UINT64(address), byte_width));
|
||||
return (AE_LIMIT);
|
||||
return_ACPI_STATUS(AE_LIMIT);
|
||||
}
|
||||
|
||||
/* Exit if requested address is not within the protected port table */
|
||||
|
||||
if (address > acpi_protected_ports[ACPI_PORT_INFO_ENTRIES - 1].end) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Check request against the list of protected I/O ports */
|
||||
|
|
@ -180,8 +180,8 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
/* Port illegality may depend on the _OSI calls made by the BIOS */
|
||||
|
||||
if (acpi_gbl_osi_data >= port_info->osi_dependency) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"Denied AML access to port 0x%8.8X%8.8X/%X (%s 0x%.4X-0x%.4X)",
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
|
||||
"Denied AML access to port 0x%8.8X%8.8X/%X (%s 0x%.4X-0x%.4X)\n",
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
byte_width, port_info->name,
|
||||
port_info->start,
|
||||
|
|
@ -198,7 +198,7 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
}
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
|||
|
|
@ -644,17 +644,18 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
this_node->object;
|
||||
}
|
||||
}
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
if (!acpi_gbl_disasm_flag &&
|
||||
(this_node->flags & ANOBJ_IS_EXTERNAL)) {
|
||||
this_node->flags |= IMPLICIT_EXTERNAL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Special handling for the last segment (num_segments == 0) */
|
||||
|
||||
else {
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
if (!acpi_gbl_disasm_flag
|
||||
&& (this_node->flags & ANOBJ_IS_EXTERNAL)) {
|
||||
this_node->flags &= ~IMPLICIT_EXTERNAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Sanity typecheck of the target object:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -495,7 +495,8 @@ acpi_ns_convert_to_reference(struct acpi_namespace_node *scope,
|
|||
|
||||
/* Check if we are resolving a named reference within a package */
|
||||
|
||||
ACPI_ERROR_NAMESPACE(original_object->string.pointer, status);
|
||||
ACPI_ERROR_NAMESPACE(&scope_info,
|
||||
original_object->string.pointer, status);
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,9 @@
|
|||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsnames")
|
||||
|
||||
/* Local Prototypes */
|
||||
static void acpi_ns_normalize_pathname(char *original_path);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_get_external_pathname
|
||||
|
|
@ -63,6 +66,7 @@ ACPI_MODULE_NAME("nsnames")
|
|||
* for error and debug statements.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
|
||||
{
|
||||
char *name_buffer;
|
||||
|
|
@ -352,3 +356,148 @@ char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
|
|||
|
||||
return_PTR(name_buffer);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_build_prefixed_pathname
|
||||
*
|
||||
* PARAMETERS: prefix_scope - Scope/Path that prefixes the internal path
|
||||
* internal_path - Name or path of the namespace node
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Construct a fully qualified pathname from a concatenation of:
|
||||
* 1) Path associated with the prefix_scope namespace node
|
||||
* 2) External path representation of the Internal path
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ns_build_prefixed_pathname(union acpi_generic_state *prefix_scope,
|
||||
const char *internal_path)
|
||||
{
|
||||
acpi_status status;
|
||||
char *full_path = NULL;
|
||||
char *external_path = NULL;
|
||||
char *prefix_path = NULL;
|
||||
u32 prefix_path_length = 0;
|
||||
|
||||
/* If there is a prefix, get the pathname to it */
|
||||
|
||||
if (prefix_scope && prefix_scope->scope.node) {
|
||||
prefix_path =
|
||||
acpi_ns_get_normalized_pathname(prefix_scope->scope.node,
|
||||
TRUE);
|
||||
if (prefix_path) {
|
||||
prefix_path_length = strlen(prefix_path);
|
||||
}
|
||||
}
|
||||
|
||||
status = acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_path,
|
||||
NULL, &external_path);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Merge the prefix path and the path. 2 is for one dot and trailing null */
|
||||
|
||||
full_path =
|
||||
ACPI_ALLOCATE_ZEROED(prefix_path_length + strlen(external_path) +
|
||||
2);
|
||||
if (!full_path) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Don't merge if the External path is already fully qualified */
|
||||
|
||||
if (prefix_path && (*external_path != '\\') && (*external_path != '^')) {
|
||||
strcat(full_path, prefix_path);
|
||||
if (prefix_path[1]) {
|
||||
strcat(full_path, ".");
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ns_normalize_pathname(external_path);
|
||||
strcat(full_path, external_path);
|
||||
|
||||
cleanup:
|
||||
if (prefix_path) {
|
||||
ACPI_FREE(prefix_path);
|
||||
}
|
||||
if (external_path) {
|
||||
ACPI_FREE(external_path);
|
||||
}
|
||||
|
||||
return (full_path);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_normalize_pathname
|
||||
*
|
||||
* PARAMETERS: original_path - Path to be normalized, in External format
|
||||
*
|
||||
* RETURN: The original path is processed in-place
|
||||
*
|
||||
* DESCRIPTION: Remove trailing underscores from each element of a path.
|
||||
*
|
||||
* For example: \A___.B___.C___ becomes \A.B.C
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_ns_normalize_pathname(char *original_path)
|
||||
{
|
||||
char *input_path = original_path;
|
||||
char *new_path_buffer;
|
||||
char *new_path;
|
||||
u32 i;
|
||||
|
||||
/* Allocate a temp buffer in which to construct the new path */
|
||||
|
||||
new_path_buffer = ACPI_ALLOCATE_ZEROED(strlen(input_path) + 1);
|
||||
new_path = new_path_buffer;
|
||||
if (!new_path_buffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Special characters may appear at the beginning of the path */
|
||||
|
||||
if (*input_path == '\\') {
|
||||
*new_path = *input_path;
|
||||
new_path++;
|
||||
input_path++;
|
||||
}
|
||||
|
||||
while (*input_path == '^') {
|
||||
*new_path = *input_path;
|
||||
new_path++;
|
||||
input_path++;
|
||||
}
|
||||
|
||||
/* Remainder of the path */
|
||||
|
||||
while (*input_path) {
|
||||
|
||||
/* Do one nameseg at a time */
|
||||
|
||||
for (i = 0; (i < ACPI_NAME_SIZE) && *input_path; i++) {
|
||||
if ((i == 0) || (*input_path != '_')) { /* First char is allowed to be underscore */
|
||||
*new_path = *input_path;
|
||||
new_path++;
|
||||
}
|
||||
|
||||
input_path++;
|
||||
}
|
||||
|
||||
/* Dot means that there are more namesegs to come */
|
||||
|
||||
if (*input_path == '.') {
|
||||
*new_path = *input_path;
|
||||
new_path++;
|
||||
input_path++;
|
||||
}
|
||||
}
|
||||
|
||||
*new_path = 0;
|
||||
strcpy(original_path, new_path_buffer);
|
||||
ACPI_FREE(new_path_buffer);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -417,6 +417,7 @@ acpi_ns_search_and_enter(u32 target_name,
|
|||
if (flags & ACPI_NS_EXTERNAL ||
|
||||
(walk_state && walk_state->opcode == AML_SCOPE_OP)) {
|
||||
new_node->flags |= ANOBJ_IS_EXTERNAL;
|
||||
new_node->flags |= IMPLICIT_EXTERNAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -61,10 +61,10 @@ static void acpi_ns_resolve_references(struct acpi_evaluate_info *info);
|
|||
*
|
||||
* PARAMETERS: handle - Object handle (optional)
|
||||
* pathname - Object pathname (optional)
|
||||
* external_params - List of parameters to pass to method,
|
||||
* external_params - List of parameters to pass to a method,
|
||||
* terminated by NULL. May be NULL
|
||||
* if no parameters are being passed.
|
||||
* return_buffer - Where to put method's return value (if
|
||||
* return_buffer - Where to put the object's return value (if
|
||||
* any). If NULL, no value is returned.
|
||||
* return_type - Expected type of return object
|
||||
*
|
||||
|
|
@ -100,13 +100,14 @@ acpi_evaluate_object_typed(acpi_handle handle,
|
|||
free_buffer_on_error = TRUE;
|
||||
}
|
||||
|
||||
/* Get a handle here, in order to build an error message if needed */
|
||||
|
||||
target_handle = handle;
|
||||
if (pathname) {
|
||||
status = acpi_get_handle(handle, pathname, &target_handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
} else {
|
||||
target_handle = handle;
|
||||
}
|
||||
|
||||
full_pathname = acpi_ns_get_external_pathname(target_handle);
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
|
|||
/* Final exception check (may have been changed from code above) */
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR_NAMESPACE(path, status);
|
||||
ACPI_ERROR_NAMESPACE(walk_state->scope_info, path, status);
|
||||
|
||||
if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
|
||||
ACPI_PARSE_EXECUTE) {
|
||||
|
|
|
|||
|
|
@ -372,16 +372,10 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
|||
* external declaration opcode. Setting walk_state->Aml to
|
||||
* walk_state->parser_state.Aml + 2 moves increments the
|
||||
* walk_state->Aml past the object type and the paramcount of the
|
||||
* external opcode. For the error message, only print the AML
|
||||
* offset. We could attempt to print the name but this may cause
|
||||
* a segmentation fault when printing the namepath because the
|
||||
* AML may be incorrect.
|
||||
* external opcode.
|
||||
*/
|
||||
acpi_os_printf
|
||||
("// Invalid external declaration at AML offset 0x%x.\n",
|
||||
walk_state->aml -
|
||||
walk_state->parser_state.aml_start);
|
||||
walk_state->aml = walk_state->parser_state.aml + 2;
|
||||
walk_state->parser_state.aml = walk_state->aml;
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -94,9 +94,11 @@ void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode)
|
|||
op->common.descriptor_type = ACPI_DESC_TYPE_PARSER;
|
||||
op->common.aml_opcode = opcode;
|
||||
|
||||
ACPI_DISASM_ONLY_MEMBERS(strncpy(op->common.aml_op_name,
|
||||
(acpi_ps_get_opcode_info(opcode))->
|
||||
name, sizeof(op->common.aml_op_name)));
|
||||
ACPI_DISASM_ONLY_MEMBERS(acpi_ut_safe_strncpy(op->common.aml_op_name,
|
||||
(acpi_ps_get_opcode_info
|
||||
(opcode))->name,
|
||||
sizeof(op->common.
|
||||
aml_op_name)));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
@ -158,10 +160,10 @@ union acpi_parse_object *acpi_ps_alloc_op(u16 opcode, u8 *aml)
|
|||
if (opcode == AML_SCOPE_OP) {
|
||||
acpi_gbl_current_scope = op;
|
||||
}
|
||||
}
|
||||
|
||||
if (gbl_capture_comments) {
|
||||
ASL_CV_TRANSFER_COMMENTS(op);
|
||||
if (acpi_gbl_capture_comments) {
|
||||
ASL_CV_TRANSFER_COMMENTS(op);
|
||||
}
|
||||
}
|
||||
|
||||
return (op);
|
||||
|
|
|
|||
|
|
@ -163,6 +163,9 @@ acpi_debug_print(u32 requested_debug_level,
|
|||
{
|
||||
acpi_thread_id thread_id;
|
||||
va_list args;
|
||||
#ifdef ACPI_APPLICATION
|
||||
int fill_count;
|
||||
#endif
|
||||
|
||||
/* Check if debug output enabled */
|
||||
|
||||
|
|
@ -202,10 +205,21 @@ acpi_debug_print(u32 requested_debug_level,
|
|||
acpi_os_printf("[%u] ", (u32)thread_id);
|
||||
}
|
||||
|
||||
acpi_os_printf("[%02ld] ", acpi_gbl_nesting_level);
|
||||
#endif
|
||||
fill_count = 48 - acpi_gbl_nesting_level -
|
||||
strlen(acpi_ut_trim_function_name(function_name));
|
||||
if (fill_count < 0) {
|
||||
fill_count = 0;
|
||||
}
|
||||
|
||||
acpi_os_printf("[%02ld] %*s",
|
||||
acpi_gbl_nesting_level, acpi_gbl_nesting_level + 1, " ");
|
||||
acpi_os_printf("%s%*s: ",
|
||||
acpi_ut_trim_function_name(function_name), fill_count,
|
||||
" ");
|
||||
|
||||
#else
|
||||
acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name));
|
||||
#endif
|
||||
|
||||
va_start(args, format);
|
||||
acpi_os_vprintf(format, args);
|
||||
|
|
|
|||
|
|
@ -395,11 +395,6 @@ const char *acpi_ut_get_reference_name(union acpi_operand_object *object)
|
|||
return (acpi_gbl_ref_class_names[object->reference.class]);
|
||||
}
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
/*
|
||||
* Strings and procedures used for debug only
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_get_mutex_name
|
||||
|
|
@ -433,6 +428,12 @@ const char *acpi_ut_get_mutex_name(u32 mutex_id)
|
|||
return (acpi_gbl_mutex_names[mutex_id]);
|
||||
}
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
|
||||
/*
|
||||
* Strings and procedures used for debug only
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_get_notify_name
|
||||
|
|
|
|||
|
|
@ -180,6 +180,78 @@ acpi_ut_predefined_bios_error(const char *module_name,
|
|||
va_end(arg_list);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_prefixed_namespace_error
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* prefix_scope - Scope/Path that prefixes the internal path
|
||||
* internal_path - Name or path of the namespace node
|
||||
* lookup_status - Exception code from NS lookup
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print error message with the full pathname constructed this way:
|
||||
*
|
||||
* prefix_scope_node_full_path.externalized_internal_path
|
||||
*
|
||||
* NOTE: 10/2017: Treat the major ns_lookup errors as firmware errors
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_prefixed_namespace_error(const char *module_name,
|
||||
u32 line_number,
|
||||
union acpi_generic_state *prefix_scope,
|
||||
const char *internal_path,
|
||||
acpi_status lookup_status)
|
||||
{
|
||||
char *full_path;
|
||||
const char *message;
|
||||
|
||||
/*
|
||||
* Main cases:
|
||||
* 1) Object creation, object must not already exist
|
||||
* 2) Object lookup, object must exist
|
||||
*/
|
||||
switch (lookup_status) {
|
||||
case AE_ALREADY_EXISTS:
|
||||
|
||||
acpi_os_printf(ACPI_MSG_BIOS_ERROR);
|
||||
message = "Failure creating";
|
||||
break;
|
||||
|
||||
case AE_NOT_FOUND:
|
||||
|
||||
acpi_os_printf(ACPI_MSG_BIOS_ERROR);
|
||||
message = "Failure looking up";
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
message = "Failure looking up";
|
||||
break;
|
||||
}
|
||||
|
||||
/* Concatenate the prefix path and the internal path */
|
||||
|
||||
full_path =
|
||||
acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);
|
||||
|
||||
acpi_os_printf("%s [%s], %s", message,
|
||||
full_path ? full_path : "Could not get pathname",
|
||||
acpi_format_exception(lookup_status));
|
||||
|
||||
if (full_path) {
|
||||
ACPI_FREE(full_path);
|
||||
}
|
||||
|
||||
ACPI_MSG_SUFFIX;
|
||||
}
|
||||
|
||||
#ifdef __OBSOLETE_FUNCTION
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_namespace_error
|
||||
|
|
@ -240,6 +312,7 @@ acpi_ut_namespace_error(const char *module_name,
|
|||
ACPI_MSG_SUFFIX;
|
||||
ACPI_MSG_REDIRECT_END;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -206,7 +206,6 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_gbl_next_owner_id_offset = 0;
|
||||
acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
|
||||
acpi_gbl_osi_mutex = NULL;
|
||||
acpi_gbl_max_loop_iterations = ACPI_MAX_LOOP_COUNT;
|
||||
|
||||
/* Hardware oriented */
|
||||
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ acpi_status acpi_ut_short_shift_left(u64 operand, u32 count, u64 *out_result)
|
|||
|
||||
if ((count & 63) >= 32) {
|
||||
operand_ovl.part.hi = operand_ovl.part.lo;
|
||||
operand_ovl.part.lo ^= operand_ovl.part.lo;
|
||||
operand_ovl.part.lo = 0;
|
||||
count = (count & 63) - 32;
|
||||
}
|
||||
ACPI_SHIFT_LEFT_64_BY_32(operand_ovl.part.hi,
|
||||
|
|
@ -171,7 +171,7 @@ acpi_status acpi_ut_short_shift_right(u64 operand, u32 count, u64 *out_result)
|
|||
|
||||
if ((count & 63) >= 32) {
|
||||
operand_ovl.part.lo = operand_ovl.part.hi;
|
||||
operand_ovl.part.hi ^= operand_ovl.part.hi;
|
||||
operand_ovl.part.hi = 0;
|
||||
count = (count & 63) - 32;
|
||||
}
|
||||
ACPI_SHIFT_RIGHT_64_BY_32(operand_ovl.part.hi,
|
||||
|
|
|
|||
|
|
@ -286,8 +286,9 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
|
|||
acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id;
|
||||
} else {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Thread %u could not acquire Mutex [0x%X]",
|
||||
(u32)this_thread_id, mutex_id));
|
||||
"Thread %u could not acquire Mutex [%s] (0x%X)",
|
||||
(u32)this_thread_id,
|
||||
acpi_ut_get_mutex_name(mutex_id), mutex_id));
|
||||
}
|
||||
|
||||
return (status);
|
||||
|
|
@ -322,8 +323,8 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
|
|||
*/
|
||||
if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Mutex [0x%X] is not acquired, cannot release",
|
||||
mutex_id));
|
||||
"Mutex [%s] (0x%X) is not acquired, cannot release",
|
||||
acpi_ut_get_mutex_name(mutex_id), mutex_id));
|
||||
|
||||
return (AE_NOT_ACQUIRED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ int acpi_ut_stricmp(char *string1, char *string2)
|
|||
return (c1 - c2);
|
||||
}
|
||||
|
||||
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
|
||||
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat
|
||||
|
|
@ -199,4 +199,13 @@ acpi_ut_safe_strncat(char *dest,
|
|||
strncat(dest, source, max_transfer_length);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
void acpi_ut_safe_strncpy(char *dest, char *source, acpi_size dest_size)
|
||||
{
|
||||
/* Always terminate destination string */
|
||||
|
||||
strncpy(dest, source, dest_size);
|
||||
dest[dest_size - 1] = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -101,6 +101,8 @@ static struct acpi_interface_info acpi_default_supported_interfaces[] = {
|
|||
{"Windows 2012", NULL, 0, ACPI_OSI_WIN_8}, /* Windows 8 and Server 2012 - Added 08/2012 */
|
||||
{"Windows 2013", NULL, 0, ACPI_OSI_WIN_8}, /* Windows 8.1 and Server 2012 R2 - Added 01/2014 */
|
||||
{"Windows 2015", NULL, 0, ACPI_OSI_WIN_10}, /* Windows 10 - Added 03/2015 */
|
||||
{"Windows 2016", NULL, 0, ACPI_OSI_WIN_10_RS1}, /* Windows 10 version 1607 - Added 12/2017 */
|
||||
{"Windows 2017", NULL, 0, ACPI_OSI_WIN_10_RS2}, /* Windows 10 version 1703 - Added 12/2017 */
|
||||
|
||||
/* Feature Group Strings */
|
||||
|
||||
|
|
|
|||
|
|
@ -52,10 +52,9 @@ static acpi_status
|
|||
acpi_ut_insert_digit(u64 *accumulated_value, u32 base, int ascii_digit);
|
||||
|
||||
static acpi_status
|
||||
acpi_ut_strtoul_multiply64(u64 multiplicand, u64 multiplier, u64 *out_product);
|
||||
acpi_ut_strtoul_multiply64(u64 multiplicand, u32 base, u64 *out_product);
|
||||
|
||||
static acpi_status
|
||||
acpi_ut_strtoul_add64(u64 addend1, u64 addend2, u64 *out_sum);
|
||||
static acpi_status acpi_ut_strtoul_add64(u64 addend1, u32 digit, u64 *out_sum);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
|
@ -357,7 +356,7 @@ acpi_ut_insert_digit(u64 *accumulated_value, u32 base, int ascii_digit)
|
|||
* FUNCTION: acpi_ut_strtoul_multiply64
|
||||
*
|
||||
* PARAMETERS: multiplicand - Current accumulated converted integer
|
||||
* multiplier - Base/Radix
|
||||
* base - Base/Radix
|
||||
* out_product - Where the product is returned
|
||||
*
|
||||
* RETURN: Status and 64-bit product
|
||||
|
|
@ -369,33 +368,40 @@ acpi_ut_insert_digit(u64 *accumulated_value, u32 base, int ascii_digit)
|
|||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ut_strtoul_multiply64(u64 multiplicand, u64 multiplier, u64 *out_product)
|
||||
acpi_ut_strtoul_multiply64(u64 multiplicand, u32 base, u64 *out_product)
|
||||
{
|
||||
u64 val;
|
||||
u64 product;
|
||||
u64 quotient;
|
||||
|
||||
/* Exit if either operand is zero */
|
||||
|
||||
*out_product = 0;
|
||||
if (!multiplicand || !multiplier) {
|
||||
if (!multiplicand || !base) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Check for 64-bit overflow before the actual multiplication */
|
||||
|
||||
acpi_ut_short_divide(ACPI_UINT64_MAX, (u32)multiplier, &val, NULL);
|
||||
if (multiplicand > val) {
|
||||
/*
|
||||
* Check for 64-bit overflow before the actual multiplication.
|
||||
*
|
||||
* Notes: 64-bit division is often not supported on 32-bit platforms
|
||||
* (it requires a library function), Therefore ACPICA has a local
|
||||
* 64-bit divide function. Also, Multiplier is currently only used
|
||||
* as the radix (8/10/16), to the 64/32 divide will always work.
|
||||
*/
|
||||
acpi_ut_short_divide(ACPI_UINT64_MAX, base, "ient, NULL);
|
||||
if (multiplicand > quotient) {
|
||||
return (AE_NUMERIC_OVERFLOW);
|
||||
}
|
||||
|
||||
val = multiplicand * multiplier;
|
||||
product = multiplicand * base;
|
||||
|
||||
/* Check for 32-bit overflow if necessary */
|
||||
|
||||
if ((acpi_gbl_integer_bit_width == 32) && (val > ACPI_UINT32_MAX)) {
|
||||
if ((acpi_gbl_integer_bit_width == 32) && (product > ACPI_UINT32_MAX)) {
|
||||
return (AE_NUMERIC_OVERFLOW);
|
||||
}
|
||||
|
||||
*out_product = val;
|
||||
*out_product = product;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
|
@ -404,7 +410,7 @@ acpi_ut_strtoul_multiply64(u64 multiplicand, u64 multiplier, u64 *out_product)
|
|||
* FUNCTION: acpi_ut_strtoul_add64
|
||||
*
|
||||
* PARAMETERS: addend1 - Current accumulated converted integer
|
||||
* addend2 - New hex value/char
|
||||
* digit - New hex value/char
|
||||
* out_sum - Where sum is returned (Accumulator)
|
||||
*
|
||||
* RETURN: Status and 64-bit sum
|
||||
|
|
@ -415,17 +421,17 @@ acpi_ut_strtoul_multiply64(u64 multiplicand, u64 multiplier, u64 *out_product)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status acpi_ut_strtoul_add64(u64 addend1, u64 addend2, u64 *out_sum)
|
||||
static acpi_status acpi_ut_strtoul_add64(u64 addend1, u32 digit, u64 *out_sum)
|
||||
{
|
||||
u64 sum;
|
||||
|
||||
/* Check for 64-bit overflow before the actual addition */
|
||||
|
||||
if ((addend1 > 0) && (addend2 > (ACPI_UINT64_MAX - addend1))) {
|
||||
if ((addend1 > 0) && (digit > (ACPI_UINT64_MAX - addend1))) {
|
||||
return (AE_NUMERIC_OVERFLOW);
|
||||
}
|
||||
|
||||
sum = addend1 + addend2;
|
||||
sum = addend1 + digit;
|
||||
|
||||
/* Check for 32-bit overflow if necessary */
|
||||
|
||||
|
|
|
|||
|
|
@ -402,8 +402,8 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *allocation,
|
|||
allocation->component = component;
|
||||
allocation->line = line;
|
||||
|
||||
strncpy(allocation->module, module, ACPI_MAX_MODULE_NAME);
|
||||
allocation->module[ACPI_MAX_MODULE_NAME - 1] = 0;
|
||||
acpi_ut_safe_strncpy(allocation->module, (char *)module,
|
||||
ACPI_MAX_MODULE_NAME);
|
||||
|
||||
if (!element) {
|
||||
|
||||
|
|
@ -717,7 +717,7 @@ exit:
|
|||
if (!num_outstanding) {
|
||||
ACPI_INFO(("No outstanding allocations"));
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO, "%u(0x%X) Outstanding allocations",
|
||||
ACPI_ERROR((AE_INFO, "%u (0x%X) Outstanding cache allocations",
|
||||
num_outstanding, num_outstanding));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -96,8 +96,8 @@ ACPI_EXPORT_SYMBOL(acpi_error)
|
|||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print "ACPI Exception" message with module/line/version info
|
||||
* and decoded acpi_status.
|
||||
* DESCRIPTION: Print an "ACPI Error" message with module/line/version
|
||||
* info as well as decoded acpi_status.
|
||||
*
|
||||
******************************************************************************/
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
|
|
@ -111,10 +111,10 @@ acpi_exception(const char *module_name,
|
|||
/* For AE_OK, just print the message */
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_os_printf(ACPI_MSG_EXCEPTION);
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
|
||||
} else {
|
||||
acpi_os_printf(ACPI_MSG_EXCEPTION "%s, ",
|
||||
acpi_os_printf(ACPI_MSG_ERROR "%s, ",
|
||||
acpi_format_exception(status));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -414,6 +414,51 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* PCIe AER errors need to be sent to the AER driver for reporting and
|
||||
* recovery. The GHES severities map to the following AER severities and
|
||||
* require the following handling:
|
||||
*
|
||||
* GHES_SEV_CORRECTABLE -> AER_CORRECTABLE
|
||||
* These need to be reported by the AER driver but no recovery is
|
||||
* necessary.
|
||||
* GHES_SEV_RECOVERABLE -> AER_NONFATAL
|
||||
* GHES_SEV_RECOVERABLE && CPER_SEC_RESET -> AER_FATAL
|
||||
* These both need to be reported and recovered from by the AER driver.
|
||||
* GHES_SEV_PANIC does not make it to this handling since the kernel must
|
||||
* panic.
|
||||
*/
|
||||
static void ghes_handle_aer(struct acpi_hest_generic_data *gdata)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_APEI_PCIEAER
|
||||
struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
|
||||
|
||||
if (pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
|
||||
pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
|
||||
unsigned int devfn;
|
||||
int aer_severity;
|
||||
|
||||
devfn = PCI_DEVFN(pcie_err->device_id.device,
|
||||
pcie_err->device_id.function);
|
||||
aer_severity = cper_severity_to_aer(gdata->error_severity);
|
||||
|
||||
/*
|
||||
* If firmware reset the component to contain
|
||||
* the error, we must reinitialize it before
|
||||
* use, so treat it as a fatal AER error.
|
||||
*/
|
||||
if (gdata->flags & CPER_SEC_RESET)
|
||||
aer_severity = AER_FATAL;
|
||||
|
||||
aer_recover_queue(pcie_err->device_id.segment,
|
||||
pcie_err->device_id.bus,
|
||||
devfn, aer_severity,
|
||||
(struct aer_capability_regs *)
|
||||
pcie_err->aer_info);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void ghes_do_proc(struct ghes *ghes,
|
||||
const struct acpi_hest_generic_status *estatus)
|
||||
{
|
||||
|
|
@ -441,38 +486,9 @@ static void ghes_do_proc(struct ghes *ghes,
|
|||
arch_apei_report_mem_error(sev, mem_err);
|
||||
ghes_handle_memory_failure(gdata, sev);
|
||||
}
|
||||
#ifdef CONFIG_ACPI_APEI_PCIEAER
|
||||
else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
|
||||
struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
|
||||
|
||||
if (sev == GHES_SEV_RECOVERABLE &&
|
||||
sec_sev == GHES_SEV_RECOVERABLE &&
|
||||
pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
|
||||
pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
|
||||
unsigned int devfn;
|
||||
int aer_severity;
|
||||
|
||||
devfn = PCI_DEVFN(pcie_err->device_id.device,
|
||||
pcie_err->device_id.function);
|
||||
aer_severity = cper_severity_to_aer(gdata->error_severity);
|
||||
|
||||
/*
|
||||
* If firmware reset the component to contain
|
||||
* the error, we must reinitialize it before
|
||||
* use, so treat it as a fatal AER error.
|
||||
*/
|
||||
if (gdata->flags & CPER_SEC_RESET)
|
||||
aer_severity = AER_FATAL;
|
||||
|
||||
aer_recover_queue(pcie_err->device_id.segment,
|
||||
pcie_err->device_id.bus,
|
||||
devfn, aer_severity,
|
||||
(struct aer_capability_regs *)
|
||||
pcie_err->aer_info);
|
||||
}
|
||||
|
||||
ghes_handle_aer(gdata);
|
||||
}
|
||||
#endif
|
||||
else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
|
||||
struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
|
||||
|
||||
|
|
@ -870,7 +886,6 @@ static void ghes_print_queued_estatus(void)
|
|||
struct ghes_estatus_node *estatus_node;
|
||||
struct acpi_hest_generic *generic;
|
||||
struct acpi_hest_generic_status *estatus;
|
||||
u32 len, node_len;
|
||||
|
||||
llnode = llist_del_all(&ghes_estatus_llist);
|
||||
/*
|
||||
|
|
@ -882,8 +897,6 @@ static void ghes_print_queued_estatus(void)
|
|||
estatus_node = llist_entry(llnode, struct ghes_estatus_node,
|
||||
llnode);
|
||||
estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
|
||||
len = cper_estatus_len(estatus);
|
||||
node_len = GHES_ESTATUS_NODE_LEN(len);
|
||||
generic = estatus_node->generic;
|
||||
ghes_print_estatus(NULL, generic, estatus);
|
||||
llnode = llnode->next;
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ static async_cookie_t async_cookie;
|
|||
static bool battery_driver_registered;
|
||||
static int battery_bix_broken_package;
|
||||
static int battery_notification_delay_ms;
|
||||
static int battery_full_discharging;
|
||||
static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
|
@ -214,9 +215,12 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
|||
return -ENODEV;
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
if (battery->state & ACPI_BATTERY_STATE_DISCHARGING)
|
||||
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
|
||||
if (battery->state & ACPI_BATTERY_STATE_DISCHARGING) {
|
||||
if (battery_full_discharging && battery->rate_now == 0)
|
||||
val->intval = POWER_SUPPLY_STATUS_FULL;
|
||||
else
|
||||
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
} else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
|
||||
val->intval = POWER_SUPPLY_STATUS_CHARGING;
|
||||
else if (acpi_battery_is_charged(battery))
|
||||
val->intval = POWER_SUPPLY_STATUS_FULL;
|
||||
|
|
@ -1166,6 +1170,12 @@ battery_notification_delay_quirk(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init battery_full_discharging_quirk(const struct dmi_system_id *d)
|
||||
{
|
||||
battery_full_discharging = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id bat_dmi_table[] __initconst = {
|
||||
{
|
||||
.callback = battery_bix_broken_package_quirk,
|
||||
|
|
@ -1183,6 +1193,22 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-573G"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_full_discharging_quirk,
|
||||
.ident = "ASUS GL502VSK",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "GL502VSK"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_full_discharging_quirk,
|
||||
.ident = "ASUS UX305LA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "UX305LA"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
|
@ -1237,13 +1263,11 @@ static int acpi_battery_add(struct acpi_device *device)
|
|||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
result = acpi_battery_add_fs(device);
|
||||
#endif
|
||||
if (result) {
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_remove_fs(device);
|
||||
#endif
|
||||
goto fail;
|
||||
}
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
|
||||
ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <acpi/button.h>
|
||||
|
||||
#define PREFIX "ACPI: "
|
||||
|
|
@ -76,6 +77,22 @@ static const struct acpi_device_id button_device_ids[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(acpi, button_device_ids);
|
||||
|
||||
/*
|
||||
* Some devices which don't even have a lid in anyway have a broken _LID
|
||||
* method (e.g. pointing to a floating gpio pin) causing spurious LID events.
|
||||
*/
|
||||
static const struct dmi_system_id lid_blacklst[] = {
|
||||
{
|
||||
/* GP-electronic T701 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "T701"),
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "BYT70A.YNCHENG.WIN.007"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int acpi_button_add(struct acpi_device *device);
|
||||
static int acpi_button_remove(struct acpi_device *device);
|
||||
static void acpi_button_notify(struct acpi_device *device, u32 event);
|
||||
|
|
@ -210,6 +227,8 @@ static int acpi_lid_notify_state(struct acpi_device *device, int state)
|
|||
}
|
||||
/* Send the platform triggered reliable event */
|
||||
if (do_update) {
|
||||
acpi_handle_debug(device->handle, "ACPI LID %s\n",
|
||||
state ? "open" : "closed");
|
||||
input_report_switch(button->input, SW_LID, !state);
|
||||
input_sync(button->input);
|
||||
button->last_state = !!state;
|
||||
|
|
@ -473,6 +492,9 @@ static int acpi_button_add(struct acpi_device *device)
|
|||
char *name, *class;
|
||||
int error;
|
||||
|
||||
if (!strcmp(hid, ACPI_BUTTON_HID_LID) && dmi_check_system(lid_blacklst))
|
||||
return -ENODEV;
|
||||
|
||||
button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL);
|
||||
if (!button)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -1516,7 +1516,7 @@ static int acpi_ec_setup(struct acpi_ec *ec, bool handle_events)
|
|||
}
|
||||
|
||||
acpi_handle_info(ec->handle,
|
||||
"GPE=0x%lx, EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n",
|
||||
"GPE=0x%x, EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n",
|
||||
ec->gpe, ec->command_addr, ec->data_addr);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ static int acpi_ec_add_debugfs(struct acpi_ec *ec, unsigned int ec_device_count)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (!debugfs_create_x32("gpe", 0444, dev_dir, (u32 *)&first_ec->gpe))
|
||||
if (!debugfs_create_x32("gpe", 0444, dev_dir, &first_ec->gpe))
|
||||
goto error;
|
||||
if (!debugfs_create_bool("use_global_lock", 0444, dev_dir,
|
||||
&first_ec->global_lock))
|
||||
|
|
|
|||
|
|
@ -49,6 +49,11 @@
|
|||
|
||||
#define MODULE_NAME "acpi-ged"
|
||||
|
||||
struct acpi_ged_device {
|
||||
struct device *dev;
|
||||
struct list_head event_list;
|
||||
};
|
||||
|
||||
struct acpi_ged_event {
|
||||
struct list_head node;
|
||||
struct device *dev;
|
||||
|
|
@ -76,7 +81,8 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
|
|||
unsigned int irq;
|
||||
unsigned int gsi;
|
||||
unsigned int irqflags = IRQF_ONESHOT;
|
||||
struct device *dev = context;
|
||||
struct acpi_ged_device *geddev = context;
|
||||
struct device *dev = geddev->dev;
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
acpi_handle evt_handle;
|
||||
struct resource r;
|
||||
|
|
@ -102,8 +108,6 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
|
|||
return AE_ERROR;
|
||||
}
|
||||
|
||||
dev_info(dev, "GED listening GSI %u @ IRQ %u\n", gsi, irq);
|
||||
|
||||
event = devm_kzalloc(dev, sizeof(*event), GFP_KERNEL);
|
||||
if (!event)
|
||||
return AE_ERROR;
|
||||
|
|
@ -116,29 +120,58 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
|
|||
if (r.flags & IORESOURCE_IRQ_SHAREABLE)
|
||||
irqflags |= IRQF_SHARED;
|
||||
|
||||
if (devm_request_threaded_irq(dev, irq, NULL, acpi_ged_irq_handler,
|
||||
irqflags, "ACPI:Ged", event)) {
|
||||
if (request_threaded_irq(irq, NULL, acpi_ged_irq_handler,
|
||||
irqflags, "ACPI:Ged", event)) {
|
||||
dev_err(dev, "failed to setup event handler for irq %u\n", irq);
|
||||
return AE_ERROR;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "GED listening GSI %u @ IRQ %u\n", gsi, irq);
|
||||
list_add_tail(&event->node, &geddev->event_list);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
static int ged_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct acpi_ged_device *geddev;
|
||||
acpi_status acpi_ret;
|
||||
|
||||
geddev = devm_kzalloc(&pdev->dev, sizeof(*geddev), GFP_KERNEL);
|
||||
if (!geddev)
|
||||
return -ENOMEM;
|
||||
|
||||
geddev->dev = &pdev->dev;
|
||||
INIT_LIST_HEAD(&geddev->event_list);
|
||||
acpi_ret = acpi_walk_resources(ACPI_HANDLE(&pdev->dev), "_CRS",
|
||||
acpi_ged_request_interrupt, &pdev->dev);
|
||||
acpi_ged_request_interrupt, geddev);
|
||||
if (ACPI_FAILURE(acpi_ret)) {
|
||||
dev_err(&pdev->dev, "unable to parse the _CRS record\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
platform_set_drvdata(pdev, geddev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ged_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
struct acpi_ged_device *geddev = platform_get_drvdata(pdev);
|
||||
struct acpi_ged_event *event, *next;
|
||||
|
||||
list_for_each_entry_safe(event, next, &geddev->event_list, node) {
|
||||
free_irq(event->irq, event);
|
||||
list_del(&event->node);
|
||||
dev_dbg(geddev->dev, "GED releasing GSI %u @ IRQ %u\n",
|
||||
event->gsi, event->irq);
|
||||
}
|
||||
}
|
||||
|
||||
static int ged_remove(struct platform_device *pdev)
|
||||
{
|
||||
ged_shutdown(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id ged_acpi_ids[] = {
|
||||
{"ACPI0013"},
|
||||
{},
|
||||
|
|
@ -146,6 +179,8 @@ static const struct acpi_device_id ged_acpi_ids[] = {
|
|||
|
||||
static struct platform_driver ged_driver = {
|
||||
.probe = ged_probe,
|
||||
.remove = ged_remove,
|
||||
.shutdown = ged_shutdown,
|
||||
.driver = {
|
||||
.name = MODULE_NAME,
|
||||
.acpi_match_table = ACPI_PTR(ged_acpi_ids),
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ static inline void acpi_early_processor_osc(void) {}
|
|||
-------------------------------------------------------------------------- */
|
||||
struct acpi_ec {
|
||||
acpi_handle handle;
|
||||
unsigned long gpe;
|
||||
u32 gpe;
|
||||
unsigned long command_addr;
|
||||
unsigned long data_addr;
|
||||
bool global_lock;
|
||||
|
|
|
|||
|
|
@ -838,6 +838,18 @@ static bool add_flush(struct acpi_nfit_desc *acpi_desc,
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool add_platform_cap(struct acpi_nfit_desc *acpi_desc,
|
||||
struct acpi_nfit_capabilities *pcap)
|
||||
{
|
||||
struct device *dev = acpi_desc->dev;
|
||||
u32 mask;
|
||||
|
||||
mask = (1 << (pcap->highest_capability + 1)) - 1;
|
||||
acpi_desc->platform_cap = pcap->capabilities & mask;
|
||||
dev_dbg(dev, "%s: cap: %#x\n", __func__, acpi_desc->platform_cap);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void *add_table(struct acpi_nfit_desc *acpi_desc,
|
||||
struct nfit_table_prev *prev, void *table, const void *end)
|
||||
{
|
||||
|
|
@ -883,6 +895,10 @@ static void *add_table(struct acpi_nfit_desc *acpi_desc,
|
|||
case ACPI_NFIT_TYPE_SMBIOS:
|
||||
dev_dbg(dev, "%s: smbios\n", __func__);
|
||||
break;
|
||||
case ACPI_NFIT_TYPE_CAPABILITIES:
|
||||
if (!add_platform_cap(acpi_desc, table))
|
||||
return err;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "unknown table '%d' parsing nfit\n", hdr->type);
|
||||
break;
|
||||
|
|
@ -2659,6 +2675,12 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,
|
|||
else
|
||||
ndr_desc->numa_node = NUMA_NO_NODE;
|
||||
|
||||
if(acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_CACHE_FLUSH)
|
||||
set_bit(ND_REGION_PERSIST_CACHE, &ndr_desc->flags);
|
||||
|
||||
if (acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_MEM_FLUSH)
|
||||
set_bit(ND_REGION_PERSIST_MEMCTRL, &ndr_desc->flags);
|
||||
|
||||
list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
|
||||
struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;
|
||||
struct nd_mapping_desc *mapping;
|
||||
|
|
@ -3467,6 +3489,7 @@ static __init int nfit_init(void)
|
|||
BUILD_BUG_ON(sizeof(struct acpi_nfit_smbios) != 9);
|
||||
BUILD_BUG_ON(sizeof(struct acpi_nfit_control_region) != 80);
|
||||
BUILD_BUG_ON(sizeof(struct acpi_nfit_data_region) != 40);
|
||||
BUILD_BUG_ON(sizeof(struct acpi_nfit_capabilities) != 16);
|
||||
|
||||
guid_parse(UUID_VOLATILE_MEMORY, &nfit_uuid[NFIT_SPA_VOLATILE]);
|
||||
guid_parse(UUID_PERSISTENT_MEMORY, &nfit_uuid[NFIT_SPA_PM]);
|
||||
|
|
|
|||
|
|
@ -202,6 +202,7 @@ struct acpi_nfit_desc {
|
|||
unsigned long dimm_cmd_force_en;
|
||||
unsigned long bus_cmd_force_en;
|
||||
unsigned long bus_nfit_cmd_force_en;
|
||||
unsigned int platform_cap;
|
||||
int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,
|
||||
void *iobuf, u64 len, int rw);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -460,8 +460,7 @@ int __init acpi_numa_init(void)
|
|||
srat_proc, ARRAY_SIZE(srat_proc), 0);
|
||||
|
||||
cnt = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
|
||||
acpi_parse_memory_affinity,
|
||||
NR_NODE_MEMBLKS);
|
||||
acpi_parse_memory_affinity, 0);
|
||||
}
|
||||
|
||||
/* SLIT: System Locality Information Table */
|
||||
|
|
|
|||
|
|
@ -612,7 +612,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
|||
acpi_isa_irq_penalty[link->irq.active] +=
|
||||
PIRQ_PENALTY_PCI_USING;
|
||||
|
||||
printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
|
||||
pr_info("%s [%s] enabled at IRQ %d\n",
|
||||
acpi_device_name(link->device),
|
||||
acpi_device_bid(link->device), link->irq.active);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -400,7 +400,7 @@ static int intel_bxtwc_pmic_opregion_probe(struct platform_device *pdev)
|
|||
&intel_bxtwc_pmic_opregion_data);
|
||||
}
|
||||
|
||||
static struct platform_device_id bxt_wc_opregion_id_table[] = {
|
||||
static const struct platform_device_id bxt_wc_opregion_id_table[] = {
|
||||
{ .name = "bxt_wcove_region" },
|
||||
{},
|
||||
};
|
||||
|
|
@ -412,9 +412,4 @@ static struct platform_driver intel_bxtwc_pmic_opregion_driver = {
|
|||
},
|
||||
.id_table = bxt_wc_opregion_id_table,
|
||||
};
|
||||
|
||||
static int __init intel_bxtwc_pmic_opregion_driver_init(void)
|
||||
{
|
||||
return platform_driver_register(&intel_bxtwc_pmic_opregion_driver);
|
||||
}
|
||||
device_initcall(intel_bxtwc_pmic_opregion_driver_init);
|
||||
builtin_platform_driver(intel_bxtwc_pmic_opregion_driver);
|
||||
|
|
|
|||
|
|
@ -131,7 +131,4 @@ static struct platform_driver chtdc_ti_pmic_opregion_driver = {
|
|||
},
|
||||
.id_table = chtdc_ti_pmic_opregion_id_table,
|
||||
};
|
||||
module_platform_driver(chtdc_ti_pmic_opregion_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Dollar Cove TI PMIC opregion driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
builtin_platform_driver(chtdc_ti_pmic_opregion_driver);
|
||||
|
|
|
|||
|
|
@ -260,11 +260,10 @@ static int intel_cht_wc_pmic_opregion_probe(struct platform_device *pdev)
|
|||
&intel_cht_wc_pmic_opregion_data);
|
||||
}
|
||||
|
||||
static struct platform_device_id cht_wc_opregion_id_table[] = {
|
||||
static const struct platform_device_id cht_wc_opregion_id_table[] = {
|
||||
{ .name = "cht_wcove_region" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(platform, cht_wc_opregion_id_table);
|
||||
|
||||
static struct platform_driver intel_cht_wc_pmic_opregion_driver = {
|
||||
.probe = intel_cht_wc_pmic_opregion_probe,
|
||||
|
|
@ -273,8 +272,4 @@ static struct platform_driver intel_cht_wc_pmic_opregion_driver = {
|
|||
},
|
||||
.id_table = cht_wc_opregion_id_table,
|
||||
};
|
||||
module_platform_driver(intel_cht_wc_pmic_opregion_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel CHT Whiskey Cove PMIC operation region driver");
|
||||
MODULE_AUTHOR("Hans de Goede <[email protected]>");
|
||||
MODULE_LICENSE("GPL");
|
||||
builtin_platform_driver(intel_cht_wc_pmic_opregion_driver);
|
||||
|
|
|
|||
|
|
@ -201,9 +201,4 @@ static struct platform_driver intel_crc_pmic_opregion_driver = {
|
|||
.name = "crystal_cove_pmic",
|
||||
},
|
||||
};
|
||||
|
||||
static int __init intel_crc_pmic_opregion_driver_init(void)
|
||||
{
|
||||
return platform_driver_register(&intel_crc_pmic_opregion_driver);
|
||||
}
|
||||
device_initcall(intel_crc_pmic_opregion_driver_init);
|
||||
builtin_platform_driver(intel_crc_pmic_opregion_driver);
|
||||
|
|
|
|||
|
|
@ -278,9 +278,4 @@ static struct platform_driver intel_xpower_pmic_opregion_driver = {
|
|||
.name = "axp288_pmic_acpi",
|
||||
},
|
||||
};
|
||||
|
||||
static int __init intel_xpower_pmic_opregion_driver_init(void)
|
||||
{
|
||||
return platform_driver_register(&intel_xpower_pmic_opregion_driver);
|
||||
}
|
||||
device_initcall(intel_xpower_pmic_opregion_driver_init);
|
||||
builtin_platform_driver(intel_xpower_pmic_opregion_driver);
|
||||
|
|
|
|||
|
|
@ -816,14 +816,8 @@ end:
|
|||
* interface:
|
||||
* echo unmask > /sys/firmware/acpi/interrupts/gpe00
|
||||
*/
|
||||
|
||||
/*
|
||||
* Currently, the GPE flooding prevention only supports to mask the GPEs
|
||||
* numbered from 00 to 7f.
|
||||
*/
|
||||
#define ACPI_MASKABLE_GPE_MAX 0x80
|
||||
|
||||
static u64 __initdata acpi_masked_gpes;
|
||||
#define ACPI_MASKABLE_GPE_MAX 0xFF
|
||||
static DECLARE_BITMAP(acpi_masked_gpes_map, ACPI_MASKABLE_GPE_MAX) __initdata;
|
||||
|
||||
static int __init acpi_gpe_set_masked_gpes(char *val)
|
||||
{
|
||||
|
|
@ -831,7 +825,7 @@ static int __init acpi_gpe_set_masked_gpes(char *val)
|
|||
|
||||
if (kstrtou8(val, 0, &gpe) || gpe > ACPI_MASKABLE_GPE_MAX)
|
||||
return -EINVAL;
|
||||
acpi_masked_gpes |= ((u64)1<<gpe);
|
||||
set_bit(gpe, acpi_masked_gpes_map);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -843,15 +837,11 @@ void __init acpi_gpe_apply_masked_gpes(void)
|
|||
acpi_status status;
|
||||
u8 gpe;
|
||||
|
||||
for (gpe = 0;
|
||||
gpe < min_t(u8, ACPI_MASKABLE_GPE_MAX, acpi_current_gpe_count);
|
||||
gpe++) {
|
||||
if (acpi_masked_gpes & ((u64)1<<gpe)) {
|
||||
status = acpi_get_gpe_device(gpe, &handle);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
pr_info("Masking GPE 0x%x.\n", gpe);
|
||||
(void)acpi_mask_gpe(handle, gpe, TRUE);
|
||||
}
|
||||
for_each_set_bit(gpe, acpi_masked_gpes_map, ACPI_MASKABLE_GPE_MAX) {
|
||||
status = acpi_get_gpe_device(gpe, &handle);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
pr_info("Masking GPE 0x%x.\n", gpe);
|
||||
(void)acpi_mask_gpe(handle, gpe, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -737,16 +737,17 @@ bool acpi_dev_found(const char *hid)
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_dev_found);
|
||||
|
||||
struct acpi_dev_present_info {
|
||||
struct acpi_dev_match_info {
|
||||
const char *dev_name;
|
||||
struct acpi_device_id hid[2];
|
||||
const char *uid;
|
||||
s64 hrv;
|
||||
};
|
||||
|
||||
static int acpi_dev_present_cb(struct device *dev, void *data)
|
||||
static int acpi_dev_match_cb(struct device *dev, void *data)
|
||||
{
|
||||
struct acpi_device *adev = to_acpi_device(dev);
|
||||
struct acpi_dev_present_info *match = data;
|
||||
struct acpi_dev_match_info *match = data;
|
||||
unsigned long long hrv;
|
||||
acpi_status status;
|
||||
|
||||
|
|
@ -757,6 +758,8 @@ static int acpi_dev_present_cb(struct device *dev, void *data)
|
|||
strcmp(adev->pnp.unique_id, match->uid)))
|
||||
return 0;
|
||||
|
||||
match->dev_name = acpi_dev_name(adev);
|
||||
|
||||
if (match->hrv == -1)
|
||||
return 1;
|
||||
|
||||
|
|
@ -789,20 +792,44 @@ static int acpi_dev_present_cb(struct device *dev, void *data)
|
|||
*/
|
||||
bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
|
||||
{
|
||||
struct acpi_dev_present_info match = {};
|
||||
struct acpi_dev_match_info match = {};
|
||||
struct device *dev;
|
||||
|
||||
strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id));
|
||||
match.uid = uid;
|
||||
match.hrv = hrv;
|
||||
|
||||
dev = bus_find_device(&acpi_bus_type, NULL, &match,
|
||||
acpi_dev_present_cb);
|
||||
|
||||
dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb);
|
||||
return !!dev;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_dev_present);
|
||||
|
||||
/**
|
||||
* acpi_dev_get_first_match_name - Return name of first match of ACPI device
|
||||
* @hid: Hardware ID of the device.
|
||||
* @uid: Unique ID of the device, pass NULL to not check _UID
|
||||
* @hrv: Hardware Revision of the device, pass -1 to not check _HRV
|
||||
*
|
||||
* Return device name if a matching device was present
|
||||
* at the moment of invocation, or NULL otherwise.
|
||||
*
|
||||
* See additional information in acpi_dev_present() as well.
|
||||
*/
|
||||
const char *
|
||||
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
|
||||
{
|
||||
struct acpi_dev_match_info match = {};
|
||||
struct device *dev;
|
||||
|
||||
strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id));
|
||||
match.uid = uid;
|
||||
match.hrv = hrv;
|
||||
|
||||
dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb);
|
||||
return dev ? match.dev_name : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_dev_get_first_match_name);
|
||||
|
||||
/*
|
||||
* acpi_backlight= handling, this is done here rather then in video_detect.c
|
||||
* because __setup cannot be used in modules.
|
||||
|
|
|
|||
Loading…
Reference in a new issue