15#define UACPI_EVENT_DISABLED 0
16#define UACPI_EVENT_ENABLED 1
18#if !defined(UACPI_REDUCED_HARDWARE) && !defined(UACPI_BAREBONES_MODE)
167 if (raw_value !=
value) {
313 "fixed event %u fired but no handler installed, disabling...",
371#define EVENTS_PER_GPE_REGISTER 8
508 return 1 << (
event->idx -
event->reg->base_idx);
532 if (!(
reg->current_mask & event_bit))
544 enable_mask |= event_bit;
545 reg->armed_mask |= event_bit;
548 enable_mask &= ~event_bit;
593 event->reg->armed_mask &= ~gpe_get_mask(
event);
607 if (
event->clear_on_restore ||
669 switch (
event->handler_type) {
684 "executing GPE(%02X) handler %.4s",
693 "error while executing GPE(%02X) handler %.4s: %s",
704 handler =
event->implicit_handler;
793 *out_handler_type =
event->handler_type;
794 *out_triggering =
event->triggering;
857 return event->native_handler->cb(
858 event->native_handler->ctx, device_node,
event->idx
874 in_use =
event->work_item_in_use;
906 switch (handler_type) {
908 int_ret =
event->native_handler->cb(
909 event->native_handler->ctx, device_node,
event->idx
930 uacpi_warn(
"GPE(%02X) fired but no handler, keeping disabled",
970 for (
i = 0;
i <
block->num_registers; ++
i) {
974 is_unused = !
reg->runtime_mask && !
reg->wake_mask;
1097 ctx->prev->next =
ctx->next;
1102 ctx->next->prev =
ctx->prev;
1141 handler =
event->implicit_handler;
1169 for (
i = 0;
i <
block->num_registers; ++
i) {
1206 value &= ~reg->masked_mask;
1229 for (
i = 0;
i <
block->num_registers; ++
i) {
1232 if (
reg->enable.total_bit_width)
1234 if (
reg->status.total_bit_width)
1244 for (
i = 0;
i <
block->num_events; ++
i) {
1245 event = &
block->events[
i];
1247 switch (
event->handler_type) {
1254 native_handler =
event->native_handler;
1267 uacpi_free(native_handler,
sizeof(*native_handler));
1286 sizeof(*
block->registers) *
block->num_registers);
1312 for (
i = 0;
i <
block->num_registers; ++
i)
1313 block->registers[
i].masked_mask = 0xFF;
1328 for (
i = 0;
i <
block->num_registers; ++
i) {
1347 while (prev_block) {
1353 prev_block = prev_block->
next;
1392 if (idx < block->base_idx)
1422 event->handler_type =
type;
1489 if (
node->name.text[0] !=
'_')
1492 switch (
node->name.text[1]) {
1505 uacpi_trace(
"invalid GPE method name %.4s, ignored",
node->name.text);
1519 "unable to assign GPE(%02X) to %.4s: %s", (
uacpi_u32)
idx,
1526 switch (
event->handler_type) {
1532 "unable to assign GPE(%02X) to %.4s: %s", (
uacpi_u32)
idx,
1541 if (!
ctx->post_dynamic_table_load) {
1543 "GPE(%02X) already matched %.4s, skipping %.4s",
1552 "not assigning GPE(%02X) to %.4s, override "
1562 ctx->matched_count++;
1587 while (match_ctx.
block) {
1596 irq_ctx = irq_ctx->
next;
1600 uacpi_info(
"matched %u additional GPEs post dynamic table load",
1620 struct acpi_gas tmp_gas = { 0 };
1633 tmp_gas.address_space_id = address_space_id;
1634 tmp_gas.register_bit_width = 8;
1640 block->device_node = device_node;
1641 block->base_idx = base_idx;
1680 event->idx =
reg->base_idx +
j;
1722 uacpi_trace(
"initialized GPE block %.4s[%d->%d], %u AML handlers (IRQ %u)",
1723 device_node->
name.
text, base_idx, base_idx +
block->num_events,
1772 if (
block->device_node !=
ctx->gpe_device)
1793 return ctx.out_event;
1804 reg->runtime_mask |= this_mask;
1805 reg->current_mask =
reg->runtime_mask;
1809 reg->runtime_mask &= ~this_mask;
1810 reg->current_mask =
reg->runtime_mask;
1821 if (--
event->num_users == 0) {
1868 if (++
event->num_users == 1) {
1999 is_masked = (
reg->masked_mask &
mask) != 0;
2000 if (is_masked == should_mask) {
2008 if (!
event->block_interrupts &&
event->num_users) {
2069 was_masked = (
reg->masked_mask &
mask) != 0;
2071 is_armed = (
reg->armed_mask &
mask) != 0;
2074 *out_did_mask = !was_masked;
2112 if (
block->finalized)
2115 for (
i = 0;
i <
block->num_registers; ++
i) {
2142 if (count_enabled) {
2144 "enabled %zu GPEs in block %.4s@[%d->%d]",
2145 count_enabled,
block->device_node->name.text,
2180 irq_ctx = irq_ctx->
next;
2247 native_handler->
ctx =
ctx;
2251 uacpi_free(native_handler,
sizeof(*native_handler));
2272 "GPE(%02X) user handler claims %s triggering, originally "
2273 "configured as %s",
idx,
2343 native_handler =
event->native_handler;
2373 uacpi_free(native_handler,
sizeof(*native_handler));
2636 switch (
event->handler_type) {
2638 implicit_handler =
event->implicit_handler;
2639 while (implicit_handler) {
2640 if (implicit_handler->
device == wake_device) {
2645 implicit_handler = implicit_handler->
next;
2667 uacpi_free(implicit_handler,
sizeof(*implicit_handler));
2678 implicit_handler->
device = wake_device;
2679 implicit_handler->
next =
event->implicit_handler;
2680 event->implicit_handler = implicit_handler;
2692 if (!
event->has_auto_user)
2702 num_users =
event->num_users;
2719 "not configuring implicit notify for GPE(%02X) -> %.4s: "
2720 "a user handler already installed",
event->idx,
2726 uacpi_warn(
"invalid GPE(%02X) handler type: %d",
2865 uacpi_u8 gpe0_regs = 0, gpe1_regs = 0;
2869 if (fadt->x_gpe0_blk.address && fadt->gpe0_blk_len) {
2870 gpe0_regs = fadt->gpe0_blk_len / 2;
2873 gpe_node, fadt->sci_int, 0, fadt->x_gpe0_blk.address,
2874 fadt->x_gpe0_blk.address_space_id, gpe0_regs
2877 uacpi_error(
"unable to create FADT GPE block 0: %s",
2882 if (fadt->x_gpe1_blk.address && fadt->gpe1_blk_len) {
2883 gpe1_regs = fadt->gpe1_blk_len / 2;
2888 "FADT GPE block 1 [%d->%d] collides with GPE block 0 "
2889 "[%d->%d], ignoring",
2898 gpe_node, fadt->sci_int, fadt->gpe1_base, fadt->x_gpe1_blk.address,
2899 fadt->x_gpe1_blk.address_space_id, gpe1_regs
2902 uacpi_error(
"unable to create FADT GPE block 1: %s",
2907 if (gpe0_regs == 0 && gpe1_regs == 0)
2996 uacpi_warn(
"platform has no global lock but a release event "
2997 "was fired anyway?");
3003 uacpi_trace(
"spurious firmware global lock release notification");
3007 uacpi_trace(
"received a firmware global lock release notification");
3086 "unable to install SCI interrupt handler: %s",
3107 uacpi_warn(
"platform has global lock but no FACS was provided");
3149 next_ctx =
ctx->next;
3152 next_block =
ctx->gpe_head;
3153 while (next_block) {
3155 next_block =
block->next;
3304 info |= UACPI_EVENT_INFO_HAS_HANDLER;
3312 info |= UACPI_EVENT_INFO_ENABLED | UACPI_EVENT_INFO_HW_ENABLED;
3318 info |= UACPI_EVENT_INFO_HW_STATUS;
3350 info |= UACPI_EVENT_INFO_HAS_HANDLER;
3356 info |= UACPI_EVENT_INFO_ENABLED;
3358 info |= UACPI_EVENT_INFO_MASKED;
3360 info |= UACPI_EVENT_INFO_ENABLED_FOR_WAKE;
3365 if (raw_value &
mask)
3366 info |= UACPI_EVENT_INFO_HW_ENABLED;
3371 if (raw_value &
mask)
3372 info |= UACPI_EVENT_INFO_HW_STATUS;
3380#define PM1_STATUS_BITS ( \
3381 ACPI_PM1_STS_TMR_STS_MASK | \
3382 ACPI_PM1_STS_BM_STS_MASK | \
3383 ACPI_PM1_STS_GBL_STS_MASK | \
3384 ACPI_PM1_STS_PWRBTN_STS_MASK | \
3385 ACPI_PM1_STS_SLPBTN_STS_MASK | \
3386 ACPI_PM1_STS_RTC_STS_MASK | \
3387 ACPI_PM1_STS_PCIEXP_WAKE_STS_MASK | \
3388 ACPI_PM1_STS_WAKE_STS_MASK \
unsigned long uacpi_cpu_flags
void user(int argc, const char *argv[])
uacpi_status uacpi_recursive_lock_deinit(struct uacpi_recursive_lock *lock)
static void uacpi_signal_native_event(uacpi_handle evt)
uacpi_status uacpi_recursive_lock_init(struct uacpi_recursive_lock *lock)
static uacpi_handle uacpi_create_native_event(void)
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 ACPI_PM1_EN_PWRBTN_EN_MASK
#define ACPI_PM1_STS_SLPBTN_STS_MASK
#define ACPI_PM1_EN_RTC_EN_MASK
#define ACPI_PM1_EN_SLPBTN_EN_MASK
#define ACPI_PM1_EN_TMR_EN_MASK
#define ACPI_PM1_STS_CLEAR
#define ACPI_PM1_STS_RTC_STS_MASK
#define ACPI_PM1_STS_TMR_STS_MASK
#define ACPI_PM1_STS_PWRBTN_STS_MASK
#define ACPI_PM1_EN_GBL_EN_MASK
#define ACPI_PM1_STS_GBL_STS_MASK
uacpi_interrupt_ret(* uacpi_gpe_handler)(uacpi_handle ctx, uacpi_namespace_node *gpe_device, uacpi_u16 idx)
#define UACPI_GPE_REENABLE
uacpi_u16 uacpi_gpe_triggering uacpi_gpe_handler uacpi_handle ctx uacpi_u16 uacpi_namespace_node *wake_device uacpi_u16 idx uacpi_u16 idx uacpi_u16 idx uacpi_u16 idx uacpi_u16 idx uacpi_u64 uacpi_address_space uacpi_u16 num_registers
@ UACPI_GPE_TRIGGERING_MAX
@ UACPI_GPE_TRIGGERING_EDGE
@ UACPI_GPE_TRIGGERING_LEVEL
@ UACPI_FIXED_EVENT_TIMER_STATUS
@ UACPI_FIXED_EVENT_SLEEP_BUTTON
@ UACPI_FIXED_EVENT_POWER_BUTTON
uacpi_u16 uacpi_gpe_triggering triggering
uacpi_u16 uacpi_gpe_triggering uacpi_gpe_handler uacpi_handle ctx uacpi_u16 uacpi_namespace_node *wake_device uacpi_u16 idx uacpi_u16 idx uacpi_u16 idx uacpi_u16 idx uacpi_u16 idx uacpi_u64 uacpi_address_space address_space
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
static uacpi_bool uacpi_is_hardware_reduced(void)
struct uacpi_runtime_context g_uacpi_rt_ctx
#define UACPI_FIXED_EVENT_GLOBAL_LOCK
#define UACPI_ARRAY_SIZE(arr)
void uacpi_unmap_gas_nofree(uacpi_mapped_gas *gas)
uacpi_status uacpi_map_gas_noalloc(const struct acpi_gas *gas, uacpi_mapped_gas *out_mapped)
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_status uacpi_namespace_write_lock(void)
#define uacpi_kernel_alloc_zeroed
#define uacpi_free(mem, _)
uacpi_status uacpi_gas_read_mapped(const uacpi_mapped_gas *gas, uacpi_u64 *value)
uacpi_status uacpi_gas_write_mapped(const uacpi_mapped_gas *gas, uacpi_u64 value)
uacpi_status uacpi_namespace_node_is(const uacpi_namespace_node *node, uacpi_object_type type, uacpi_bool *out)
uacpi_namespace_node * uacpi_namespace_get_predefined(uacpi_predefined_namespace)
#define UACPI_MAX_DEPTH_ANY
@ UACPI_PREDEFINED_NAMESPACE_GPE
uacpi_namespace_node * uacpi_namespace_root(void)
uacpi_object_name uacpi_namespace_node_name(const uacpi_namespace_node *node)
@ UACPI_REGISTER_FIELD_PWRBTN_EN
@ UACPI_REGISTER_FIELD_PWRBTN_STS
@ UACPI_REGISTER_FIELD_RTC_STS
@ UACPI_REGISTER_FIELD_RTC_EN
@ UACPI_REGISTER_FIELD_GBL_EN
@ UACPI_REGISTER_FIELD_SLPBTN_STS
@ UACPI_REGISTER_FIELD_SLPBTN_EN
@ UACPI_REGISTER_FIELD_GBL_STS
@ UACPI_REGISTER_FIELD_TMR_STS
@ UACPI_REGISTER_FIELD_TMR_EN
uacpi_status uacpi_read_register_field(uacpi_register_field, uacpi_u64 *)
uacpi_status uacpi_read_register(uacpi_register, uacpi_u64 *)
uacpi_status uacpi_write_register(uacpi_register, uacpi_u64)
uacpi_status uacpi_write_register_field(uacpi_register_field, uacpi_u64)
#define uacpi_likely_success(expr)
#define uacpi_unlikely_error(expr)
@ UACPI_STATUS_INVALID_ARGUMENT
@ UACPI_STATUS_INTERNAL_ERROR
@ UACPI_STATUS_OUT_OF_MEMORY
@ UACPI_STATUS_ALREADY_EXISTS
@ UACPI_STATUS_HARDWARE_TIMEOUT
@ UACPI_STATUS_NO_HANDLER
const uacpi_char * uacpi_status_to_string(uacpi_status)
#define UACPI_INTERRUPT_HANDLED
@ UACPI_ITERATION_DECISION_BREAK
@ UACPI_ITERATION_DECISION_CONTINUE
@ UACPI_OBJECT_METHOD_BIT
@ UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
uacpi_interrupt_ret(* uacpi_interrupt_handler)(uacpi_handle)
uacpi_u32 uacpi_interrupt_ret
#define UACPI_INTERRUPT_NOT_HANDLED
static struct gp_event * get_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
@ GPE_HANDLER_TYPE_NATIVE_HANDLER
@ GPE_HANDLER_TYPE_NATIVE_HANDLER_RAW
@ GPE_HANDLER_TYPE_IMPLICIT_NOTIFY
@ GPE_HANDLER_TYPE_AML_HANDLER
static void gpe_work_done(struct gp_event *event)
const uacpi_char * uacpi_gpe_triggering_to_string(uacpi_gpe_triggering triggering)
static uacpi_status gpe_enable_disable_for_wake(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_bool enabled)
uacpi_status uacpi_install_gpe_handler_raw(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_gpe_triggering triggering, uacpi_gpe_handler handler, uacpi_handle ctx)
static uacpi_handle g_gpe_state_slock
static struct uacpi_recursive_lock g_event_lock
uacpi_status uacpi_initialize_events_early(void)
static uacpi_status set_gpe_state(struct gp_event *event, enum gpe_state state)
uacpi_status uacpi_disable_gpe_for_wake(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
@ EVENT_CLEAR_IF_FIRST_YES
@ EVENT_CLEAR_IF_FIRST_NO
uacpi_status uacpi_suspend_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
static void free_gpe_block(struct gpe_block *block)
uacpi_status uacpi_enable_fixed_event(uacpi_fixed_event event)
static const struct fixed_event fixed_events[UACPI_FIXED_EVENT_MAX+1]
static uacpi_status sanitize_device_and_find_gpe(uacpi_namespace_node **gpe_device, uacpi_u16 idx, struct gp_event **out_event)
static uacpi_status set_gpe_state_unlocked(struct gp_event *event, enum gpe_state state)
uacpi_status uacpi_initialize_events(void)
static void async_run_gpe_handler(uacpi_handle opaque)
uacpi_status uacpi_resume_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
uacpi_status uacpi_enable_all_wake_gpes(void)
static uacpi_interrupt_ret handle_global_lock(uacpi_handle ctx)
static uacpi_status find_or_create_gpe_interrupt_ctx(uacpi_u32 irq, struct gpe_interrupt_ctx **out_ctx)
uacpi_status uacpi_enable_gpe_for_wake(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
uacpi_status uacpi_disable_all_gpes(void)
static struct fixed_event_handler fixed_event_handlers[UACPI_FIXED_EVENT_MAX+1]
static uacpi_interrupt_ret handle_sci(uacpi_handle ctx)
static struct gpe_interrupt_ctx * g_gpe_interrupt_head
@ GPE_DISPATCHER_INTERRUPT
uacpi_status uacpi_install_gpe_block(uacpi_namespace_node *gpe_device, uacpi_u64 address, uacpi_address_space address_space, uacpi_u16 num_registers, uacpi_u32 irq)
static uacpi_status set_event(uacpi_u8 event, uacpi_u8 value)
static uacpi_status gpe_mask_unmask(struct gp_event *event, uacpi_bool should_mask)
uacpi_status uacpi_uninstall_gpe_handler(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_gpe_handler handler)
static uacpi_status maybe_dispatch_gpe(uacpi_namespace_node *gpe_device, struct gp_event *event)
static void gpe_disarm(struct gp_event *event)
static uacpi_status create_gpe_block(uacpi_namespace_node *device_node, uacpi_u32 irq, uacpi_u16 base_idx, uacpi_u64 address, uacpi_u8 address_space_id, uacpi_u16 num_registers)
static struct gpe_block * load_gpe_block(struct gpe_block **block)
static uacpi_status restore_gpe(struct gp_event *event)
uacpi_status uacpi_enable_all_runtime_gpes(void)
static uacpi_iteration_decision do_match_gpe_methods(uacpi_handle opaque, uacpi_namespace_node *node, uacpi_u32 depth)
static void uninstall_gpe_block(struct gpe_block *block)
static uacpi_iteration_decision do_initialize_gpe_block(struct gpe_block *block, uacpi_handle opaque)
static void gpe_set_handler(struct gp_event *event, uacpi_handle handler, enum gpe_handler_type type, uacpi_u8 triggering)
#define EVENTS_PER_GPE_REGISTER
uacpi_iteration_decision(* gpe_block_iteration_callback)(struct gpe_block *, uacpi_handle)
uacpi_status uacpi_disable_fixed_event(uacpi_fixed_event event)
static uacpi_status gpe_mask_safe(struct gp_event *event, uacpi_bool *out_did_mask)
static uacpi_iteration_decision do_find_gpe(struct gpe_block *block, uacpi_handle opaque)
uacpi_status uacpi_mask_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
uacpi_status uacpi_gpe_info(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_event_info *out_info)
uacpi_status uacpi_uninstall_fixed_event_handler(uacpi_fixed_event event)
static void gpe_release_implicit_notify_handlers(struct gp_event *event)
uacpi_status uacpi_uninstall_gpe_block(uacpi_namespace_node *gpe_device)
uacpi_status uacpi_finalize_gpe_initialization(void)
static uacpi_interrupt_ret handle_gpes(uacpi_handle opaque)
static uacpi_u8 gpe_get_mask(struct gp_event *event)
static void gpe_drop_claim(struct gp_event *event)
static void event_config_unlock(void)
uacpi_status uacpi_fixed_event_info(uacpi_fixed_event event, uacpi_event_info *out_info)
static uacpi_status gpe_add_user(struct gp_event *event, enum event_clear_if_first clear_if_first, uacpi_bool *out_is_first)
static uacpi_status gpe_suspend_resume(uacpi_namespace_node *gpe_device, uacpi_u16 idx, enum gpe_state state)
static uacpi_status gpe_set_aml_handler(struct gp_event *event, uacpi_namespace_node *node, uacpi_u8 triggering)
static uacpi_interrupt_ret dispatch_fixed_event(const struct fixed_event *ev, uacpi_fixed_event event)
static uacpi_status restore_gpe_unlocked(struct gp_event *event)
static uacpi_status gpe_try_claim(struct gp_event *event, enum gpe_dispatcher dispatcher, uacpi_u8 *out_handler_type, uacpi_u8 *out_triggering, uacpi_bool *out_did_claim)
uacpi_status uacpi_install_fixed_event_handler(uacpi_fixed_event event, uacpi_interrupt_handler handler, uacpi_handle user)
static uacpi_bool g_gpes_finalized
static void for_each_gpe_block(gpe_block_iteration_callback cb, uacpi_handle handle)
static uacpi_handle g_fixed_event_slock
uacpi_status uacpi_finish_handling_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
void uacpi_deinitialize_events(void)
static uacpi_status do_install_gpe_handler(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_gpe_triggering triggering, enum gpe_handler_type type, uacpi_gpe_handler handler, uacpi_handle ctx)
#define UACPI_EVENT_DISABLED
uacpi_status uacpi_setup_gpe_for_wake(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_namespace_node *wake_device)
static uacpi_iteration_decision do_for_all_gpes(struct gpe_block *block, uacpi_handle opaque)
@ GPE_STATE_ENABLED_CONDITIONALLY
static uacpi_status gpe_mask_and_flush(struct gp_event *event)
static uacpi_status gpe_ensure_work_item(struct gp_event *event)
void uacpi_events_restore_buttons_post_wake(void)
uacpi_status uacpi_enable_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
uacpi_status uacpi_clear_fixed_event(uacpi_fixed_event event)
static uacpi_interrupt_ret handle_fixed_events(void)
static uacpi_bool gpe_is_armed(struct gp_event *event)
#define UACPI_EVENT_ENABLED
static uacpi_status gpe_block_apply_action(struct gpe_block *block, enum gpe_block_action action)
static uacpi_status gpe_remove_user_unlocked(struct gp_event *event)
static void gp_event_toggle_masks(struct gp_event *event, uacpi_bool set_on)
@ GPE_BLOCK_ACTION_ENABLE_ALL_FOR_WAKE
@ GPE_BLOCK_ACTION_ENABLE_ALL_FOR_RUNTIME
@ GPE_BLOCK_ACTION_DISABLE_ALL
@ GPE_BLOCK_ACTION_CLEAR_ALL
uacpi_status uacpi_disable_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
static uacpi_status initialize_fixed_events(void)
static uacpi_status for_all_gpes_locked(struct do_for_all_gpes_ctx *ctx)
uacpi_status uacpi_clear_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
static uacpi_status initialize_gpes(void)
static uacpi_bool gpe_needs_polling(struct gp_event *event, uacpi_bool is_first_user)
static uacpi_status event_config_lock(void)
static void async_restore_gpe(uacpi_handle opaque)
static uacpi_interrupt_ret dispatch_gpe(uacpi_namespace_node *device_node, struct gp_event *event, enum gpe_dispatcher dispatcher)
static void unlink_gpe_interrupt_ctx(struct gpe_interrupt_ctx *ctx)
uacpi_status uacpi_install_gpe_handler(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_gpe_triggering triggering, uacpi_gpe_handler handler, uacpi_handle ctx)
static uacpi_status gpe_remove_user(struct gp_event *event)
static struct uacpi_recursive_lock g_event_config_lock
uacpi_status uacpi_unmask_gpe(uacpi_namespace_node *gpe_device, uacpi_u16 idx)
static uacpi_status clear_gpe(struct gp_event *event)
static uacpi_status gpe_get_mask_unmask(uacpi_namespace_node *gpe_device, uacpi_u16 idx, uacpi_bool should_mask)
void uacpi_events_match_post_dynamic_table_load(void)
static struct gp_event * gpe_from_block(struct gpe_block *block, uacpi_u16 idx)
static uacpi_interrupt_ret detect_gpes(struct gpe_interrupt_ctx *ctx, enum gpe_dispatcher dispatcher)
static void wait_for_work_completion_unlocked(void)
uacpi_status uacpi_clear_all_events(void)
GLint GLint GLsizei GLsizei GLsizei depth
GLuint GLuint GLsizei GLenum type
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
uacpi_status uacpi_notify_all(uacpi_namespace_node *node, uacpi_u64 value)
uacpi_status uacpi_string_to_integer(const uacpi_char *str, uacpi_size max_chars, enum uacpi_base base, uacpi_u64 *out_value)
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)
uacpi_status uacpi_kernel_wait_for_work_completion(void)
uacpi_status uacpi_kernel_uninstall_interrupt_handler(uacpi_interrupt_handler, uacpi_handle irq_handle)
uacpi_status uacpi_kernel_install_interrupt_handler(uacpi_u32 irq, uacpi_interrupt_handler, uacpi_handle ctx, uacpi_handle *out_irq_handle)
void uacpi_kernel_schedule_work(uacpi_work_type, uacpi_handle work_item, uacpi_work_handler handler, uacpi_handle ctx)
@ UACPI_WORK_GPE_EXECUTION
@ UACPI_WORK_NOTIFICATION
uacpi_handle uacpi_kernel_create_spinlock(void)
uacpi_handle uacpi_kernel_create_work_item(void)
void uacpi_kernel_free_spinlock(uacpi_handle)
void uacpi_kernel_free_work_item(uacpi_handle)
uacpi_cpu_flags uacpi_kernel_lock_spinlock(uacpi_handle)
void uacpi_kernel_unlock_spinlock(uacpi_handle, uacpi_cpu_flags)
enum gpe_block_action action
uacpi_interrupt_handler handler
struct gpe_implicit_notify_handler * implicit_handler
uacpi_bool work_item_in_use
uacpi_bool clear_on_restore
struct gpe_register * reg
uacpi_bool block_interrupts
uacpi_namespace_node * aml_handler
struct gpe_native_handler * native_handler
uacpi_handle * any_handler
uacpi_namespace_node * device_node
struct gpe_register * registers
struct gpe_interrupt_ctx * irq_ctx
uacpi_namespace_node * device
struct gpe_implicit_notify_handler * next
struct gpe_interrupt_ctx * prev
struct gpe_interrupt_ctx * next
struct gpe_block * gpe_head
uacpi_bool post_dynamic_table_load
uacpi_u8 previously_enabled
uacpi_u8 previous_triggering
uacpi_handle previous_handler
uacpi_u8 previous_handler_type
uacpi_namespace_node * gpe_device
struct gp_event * out_event
struct gpe_block * out_block
uacpi_control_method * method
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
static unsigned int block