11#ifndef UACPI_BAREBONES_MODE
41 "%s (%s) operation region %s: %s\n",
60 type_str =
"read from";
63 type_str =
"write to";
66 type_str =
"<INVALID-OP>";
77 "<buffer of %zu bytes>\n",
path,
86 "<buffer of %zu bytes>\n", type_str,
path,
102 type_str,
path,
field->access_width_bytes,
155 args[1]->integer = connection_code;
157 method_args.
count = 2;
187 return object->address_space_handlers;
221 while (
parent->next != region) {
248 region =
obj->op_region;
258 switch (region->
space) {
331 region =
obj->op_region;
339 uacpi_error(
"operation region @%p not in the handler@%p list(?)\n",
342 }
else if (
link == region) {
354 .handler_context =
handler->user_context,
367 node,
"error during handler detach for",
ret
375 region->
state_flags &= ~UACPI_OP_REGION_STATE_REG_EXECUTED;
380 region->
state_flags &= ~UACPI_OP_REGION_STATE_ATTACHED;
439 if (region->
space !=
ctx->handler->space)
450 node,
"handler mismatch for",
502 region->
state_flags &= ~UACPI_OP_REGION_STATE_REG_EXECUTED;
556 "%sactivated all '%s' opregions controlled by '%.4s', "
557 "%zu _REG() calls (%zu errors)\n",
668 iter_ctx.
handler = new_handler;
761 while (prev_handler) {
762 if (prev_handler->next ==
handler) {
763 prev_handler->next =
handler->next;
767 prev_handler = prev_handler->next;
879 field->region,
"unable to attach",
ret
892 region =
obj->op_region;
897 offset_end +=
field->access_width_bytes;
900 is_oob = region->
length < offset_end || abs_offset <
offset;
906 "out-of-bounds access to opregion %s[0x%"UACPI_PRIX64"->"
918 handler_data.rw.handler_context =
handler->user_context;
920 switch (region->
space) {
933 field->access_width_bytes
959 handler_data.gpio.pin_offset =
field->pin_offset;
960 handler_data.gpio.num_pins =
field->bit_length;
961 handler_data.gpio.value = *
data.integer;
964 field->connection, &handler_data.gpio.connection
973 handler_data.ipmi.in_out_message =
data.buffer;
974 handler_data.ipmi.command = abs_offset;
978 handler_data.ffixedhw.in_out_message =
data.buffer;
979 handler_data.ffixedhw.command = abs_offset;
983 handler_data.prm.in_out_message =
data.buffer;
989 field->connection, &handler_data.serial.connection
994 handler_data.serial.command = abs_offset;
995 handler_data.serial.in_out_buffer =
data.buffer;
996 handler_data.serial.access_attribute =
field->attributes;
998 switch (
field->attributes) {
1002 handler_data.serial.access_length =
field->access_length;
1005 handler_data.serial.access_length = 0;
1012 handler_data.rw.byte_width =
field->access_width_bytes;
1013 handler_data.rw.offset = abs_offset;
1014 handler_data.rw.value = *
data.integer;
1033 switch (region->
space) {
1042 *
data.integer = handler_data.gpio.value;
1045 *
data.integer = handler_data.rw.value;
#define ACPI_REG_DISCONNECT
uacpi_status uacpi_recursive_lock_deinit(struct uacpi_recursive_lock *lock)
uacpi_status uacpi_recursive_lock_init(struct uacpi_recursive_lock *lock)
uacpi_status uacpi_recursive_lock_acquire(struct uacpi_recursive_lock *lock)
uacpi_status uacpi_recursive_lock_release(struct uacpi_recursive_lock *lock)
UINT(* handler)(MSIPACKAGE *)
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
struct uacpi_runtime_context g_uacpi_rt_ctx
static uacpi_bool uacpi_should_log(enum uacpi_log_level lvl)
void uacpi_namespace_node_unref(uacpi_namespace_node *node)
uacpi_status uacpi_namespace_do_for_each_child(uacpi_namespace_node *parent, uacpi_iteration_callback descending_callback, uacpi_iteration_callback ascending_callback, uacpi_object_type_bits, uacpi_u32 max_depth, enum uacpi_should_lock, enum uacpi_permanent_only, void *user)
uacpi_status uacpi_namespace_write_unlock(void)
uacpi_object * uacpi_namespace_node_get_object_typed(const uacpi_namespace_node *node, uacpi_object_type_bits type_mask)
@ UACPI_PERMANENT_ONLY_YES
@ UACPI_PERMANENT_ONLY_NO
uacpi_bool uacpi_namespace_node_is_dangling(uacpi_namespace_node *node)
uacpi_object * uacpi_namespace_node_get_object(const uacpi_namespace_node *node)
uacpi_status uacpi_namespace_write_lock(void)
@ UACPI_MAY_SEARCH_ABOVE_PARENT_NO
uacpi_status uacpi_namespace_node_resolve(uacpi_namespace_node *scope, const uacpi_char *path, enum uacpi_should_lock, enum uacpi_may_search_above_parent, enum uacpi_permanent_only, uacpi_namespace_node **out_node)
#define uacpi_kernel_alloc_zeroed
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
uacpi_object * uacpi_create_object(uacpi_object_type type)
#define UACPI_OP_REGION_STATE_REG_EXECUTED
void uacpi_address_space_handler_unref(uacpi_address_space_handler *handler)
#define UACPI_ADDRESS_SPACE_HANDLER_DEFAULT
#define UACPI_OP_REGION_STATE_ATTACHED
#define UACPI_MAX_DEPTH_ANY
const uacpi_char * uacpi_namespace_node_generate_absolute_path(const uacpi_namespace_node *node)
uacpi_namespace_node * uacpi_namespace_root(void)
#define uacpi_unlikely_error(expr)
@ UACPI_STATUS_INVALID_ARGUMENT
@ UACPI_STATUS_AML_OUT_OF_BOUNDS_INDEX
@ UACPI_STATUS_INTERNAL_ERROR
@ UACPI_STATUS_NAMESPACE_NODE_DANGLING
@ UACPI_STATUS_OUT_OF_MEMORY
@ UACPI_STATUS_ALREADY_EXISTS
@ UACPI_STATUS_NO_HANDLER
const uacpi_char * uacpi_status_to_string(uacpi_status)
void uacpi_object_ref(uacpi_object *obj)
const uacpi_char * uacpi_address_space_to_string(uacpi_address_space space)
@ UACPI_ITERATION_DECISION_NEXT_PEER
@ UACPI_ITERATION_DECISION_CONTINUE
@ UACPI_OBJECT_METHOD_BIT
@ UACPI_OBJECT_PROCESSOR_BIT
@ UACPI_OBJECT_OPERATION_REGION_BIT
@ UACPI_OBJECT_THERMAL_ZONE_BIT
@ UACPI_OBJECT_DEVICE_BIT
@ UACPI_ACCESS_ATTRIBUTE_RAW_BYTES
@ UACPI_ACCESS_ATTRIBUTE_RAW_PROCESS_BYTES
@ UACPI_ACCESS_ATTRIBUTE_BYTES
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
uacpi_status(* uacpi_region_handler)(uacpi_region_op op, uacpi_handle op_data)
@ UACPI_OBJECT_OPERATION_REGION
@ UACPI_OBJECT_THERMAL_ZONE
@ UACPI_REGION_OP_FFIXEDHW_COMMAND
@ UACPI_REGION_OP_PCC_SEND
@ UACPI_REGION_OP_GPIO_READ
@ UACPI_REGION_OP_SERIAL_WRITE
@ UACPI_REGION_OP_PRM_COMMAND
@ UACPI_REGION_OP_GPIO_WRITE
@ UACPI_REGION_OP_SERIAL_READ
@ UACPI_REGION_OP_IPMI_COMMAND
@ UACPI_ADDRESS_SPACE_IPMI
@ UACPI_ADDRESS_SPACE_PRM
@ UACPI_ADDRESS_SPACE_SYSTEM_MEMORY
@ UACPI_ADDRESS_SPACE_GENERAL_PURPOSE_IO
@ UACPI_ADDRESS_SPACE_FFIXEDHW
@ UACPI_ADDRESS_SPACE_TABLE_DATA
@ UACPI_ADDRESS_SPACE_GENERIC_SERIAL_BUS
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
@ UACPI_ADDRESS_SPACE_SMBUS
@ UACPI_ADDRESS_SPACE_PCC
uacpi_status uacpi_object_get_string_or_buffer(uacpi_object *, uacpi_data_view *out)
void uacpi_object_unref(uacpi_object *obj)
static xmlCharEncodingHandlerPtr * handlers
GLint GLint GLsizei GLsizei GLsizei depth
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
void uacpi_free_dynamic_string(const uacpi_char *str)
uacpi_status uacpi_execute_control_method(uacpi_namespace_node *scope, uacpi_control_method *method, const uacpi_object_array *args, uacpi_object **ret)
void * uacpi_kernel_alloc(uacpi_size size)
static uacpi_operation_region * find_previous_region_link(uacpi_operation_region *region)
uacpi_status uacpi_install_address_space_handler_with_flags(uacpi_namespace_node *device_node, enum uacpi_address_space space, uacpi_region_handler handler, uacpi_handle handler_context, uacpi_u16 flags)
uacpi_status uacpi_install_address_space_handler(uacpi_namespace_node *device_node, enum uacpi_address_space space, uacpi_region_handler handler, uacpi_handle handler_context)
static void trace_region_io(uacpi_field_unit *field, uacpi_address_space space, uacpi_u64 offset, uacpi_region_op op, union uacpi_opregion_io_data data)
static uacpi_address_space_handler * find_handler(uacpi_address_space_handlers *handlers, enum uacpi_address_space space)
void uacpi_trace_region_error(uacpi_namespace_node *node, uacpi_char *message, uacpi_status ret)
uacpi_status uacpi_initialize_opregion(void)
static void region_uninstall_handler(uacpi_namespace_node *node, enum unreg unreg)
static uacpi_status reg_or_unreg_all_opregions(uacpi_namespace_node *device_node, enum uacpi_address_space space, uacpi_u8 connection_code)
static uacpi_iteration_decision do_install_or_uninstall_handler(uacpi_handle opaque, uacpi_namespace_node *node, uacpi_u32 depth)
static uacpi_bool space_needs_reg(enum uacpi_address_space space)
static uacpi_bool space_needs_bounds_checking(uacpi_address_space space)
static uacpi_address_space_handlers * extract_handlers(uacpi_namespace_node *node)
void uacpi_opregion_uninstall_handler(uacpi_namespace_node *node)
static void region_install_handler(uacpi_namespace_node *node, uacpi_address_space_handler *handler)
uacpi_status uacpi_reg_all_opregions(uacpi_namespace_node *device_node, enum uacpi_address_space space)
uacpi_status uacpi_opregion_attach(uacpi_namespace_node *node)
uacpi_address_space_handlers * uacpi_node_get_address_space_handlers(uacpi_namespace_node *node)
@ OPREGION_ITER_ACTION_UNINSTALL
@ OPREGION_ITER_ACTION_INSTALL
static uacpi_iteration_decision do_run_reg(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
uacpi_status uacpi_uninstall_address_space_handler(uacpi_namespace_node *device_node, enum uacpi_address_space space)
uacpi_bool uacpi_address_space_handler_is_default(uacpi_address_space_handler *handler)
struct uacpi_recursive_lock g_opregion_lock
static uacpi_status upgrade_to_opregion_lock(void)
uacpi_bool uacpi_is_buffer_access_address_space(uacpi_address_space space)
void uacpi_deinitialize_opregion(void)
static uacpi_status region_run_reg(uacpi_namespace_node *node, uacpi_u8 connection_code)
uacpi_status uacpi_dispatch_opregion_io(uacpi_field_unit *field, uacpi_u32 offset, uacpi_region_op op, union uacpi_opregion_io_data data)
uacpi_status uacpi_initialize_opregion_node(uacpi_namespace_node *node)
void uacpi_shareable_init(uacpi_handle)
uacpi_u32 uacpi_shareable_ref(uacpi_handle)
enum opregion_iter_action action
uacpi_address_space_handler * handler
uacpi_region_handler callback
uacpi_handle user_context
struct uacpi_address_space_handler * next
struct uacpi_operation_region * regions
uacpi_address_space_handlers * address_space_handlers
uacpi_control_method * method
uacpi_operation_region * op_region
struct uacpi_operation_region * next
uacpi_u8 * internal_buffer
uacpi_address_space_handler * handler
uacpi_handle user_context
void * out_region_context
uacpi_gpio_region_info gpio_info
uacpi_pcc_region_info pcc_info
uacpi_namespace_node * region_node
uacpi_generic_region_info generic_info
uacpi_namespace_node * region_node
uacpi_init_level uacpi_get_current_init_level(void)
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out