#pragma once #include #ifdef __cplusplus extern "C" { #endif #ifndef UACPI_BAREBONES_MODE typedef enum uacpi_resource_type { UACPI_RESOURCE_TYPE_IRQ, UACPI_RESOURCE_TYPE_EXTENDED_IRQ, UACPI_RESOURCE_TYPE_DMA, UACPI_RESOURCE_TYPE_FIXED_DMA, UACPI_RESOURCE_TYPE_IO, UACPI_RESOURCE_TYPE_FIXED_IO, UACPI_RESOURCE_TYPE_ADDRESS16, UACPI_RESOURCE_TYPE_ADDRESS32, UACPI_RESOURCE_TYPE_ADDRESS64, UACPI_RESOURCE_TYPE_ADDRESS64_EXTENDED, UACPI_RESOURCE_TYPE_MEMORY24, UACPI_RESOURCE_TYPE_MEMORY32, UACPI_RESOURCE_TYPE_FIXED_MEMORY32, UACPI_RESOURCE_TYPE_START_DEPENDENT, UACPI_RESOURCE_TYPE_END_DEPENDENT, // Up to 7 bytes UACPI_RESOURCE_TYPE_VENDOR_SMALL, // Up to 2^16 - 1 bytes UACPI_RESOURCE_TYPE_VENDOR_LARGE, UACPI_RESOURCE_TYPE_GENERIC_REGISTER, UACPI_RESOURCE_TYPE_GPIO_CONNECTION, // These must always be contiguous in this order UACPI_RESOURCE_TYPE_SERIAL_I2C_CONNECTION, UACPI_RESOURCE_TYPE_SERIAL_SPI_CONNECTION, UACPI_RESOURCE_TYPE_SERIAL_UART_CONNECTION, UACPI_RESOURCE_TYPE_SERIAL_CSI2_CONNECTION, UACPI_RESOURCE_TYPE_PIN_FUNCTION, UACPI_RESOURCE_TYPE_PIN_CONFIGURATION, UACPI_RESOURCE_TYPE_PIN_GROUP, UACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION, UACPI_RESOURCE_TYPE_PIN_GROUP_CONFIGURATION, UACPI_RESOURCE_TYPE_CLOCK_INPUT, UACPI_RESOURCE_TYPE_END_TAG, UACPI_RESOURCE_TYPE_MAX = UACPI_RESOURCE_TYPE_END_TAG, } uacpi_resource_type; typedef struct uacpi_resource_source { uacpi_u8 index; uacpi_bool index_present; uacpi_u16 length; uacpi_char *string; } uacpi_resource_source; /* * This applies to IRQ & StartDependent resources only. The DONT_CARE value is * used for deserialization into the AML format to signify that the serializer * is allowed to optimize the length down if possible. Note that this is * generally not allowed unless the resource is generated by the caller: * * -- ACPI 6.5 ------------------------------------------------------------ * The resource descriptors in the byte stream argument must be specified * exactly as listed in the _CRS byte stream - meaning that the identical * resource descriptors must appear in the identical order, resulting in a * buffer of exactly the same length. Optimizations such as changing an * IRQ descriptor to an IRQNoFlags descriptor (or vice-versa) must not be * performed. Similarly, changing StartDependentFn to StartDependentFnNoPri * is not allowed. * ------------------------------------------------------------------------ */ enum uacpi_resource_length_kind { UACPI_RESOURCE_LENGTH_KIND_DONT_CARE = 0, UACPI_RESOURCE_LENGTH_KIND_ONE_LESS, UACPI_RESOURCE_LENGTH_KIND_FULL, }; // triggering fields #define UACPI_TRIGGERING_EDGE 1 #define UACPI_TRIGGERING_LEVEL 0 // polarity #define UACPI_POLARITY_ACTIVE_HIGH 0 #define UACPI_POLARITY_ACTIVE_LOW 1 #define UACPI_POLARITY_ACTIVE_BOTH 2 // sharing #define UACPI_EXCLUSIVE 0 #define UACPI_SHARED 1 // wake_capability #define UACPI_WAKE_CAPABLE 1 #define UACPI_NOT_WAKE_CAPABLE 0 typedef struct uacpi_resource_irq { uacpi_u8 length_kind; uacpi_u8 triggering; uacpi_u8 polarity; uacpi_u8 sharing; uacpi_u8 wake_capability; uacpi_u8 num_irqs; uacpi_u8 irqs[]; } uacpi_resource_irq; typedef struct uacpi_resource_extended_irq { uacpi_u8 direction; uacpi_u8 triggering; uacpi_u8 polarity; uacpi_u8 sharing; uacpi_u8 wake_capability; uacpi_u8 num_irqs; uacpi_resource_source source; uacpi_u32 irqs[]; } uacpi_resource_extended_irq; // transfer_type #define UACPI_TRANSFER_TYPE_8_BIT 0b00 #define UACPI_TRANSFER_TYPE_8_AND_16_BIT 0b01 #define UACPI_TRANSFER_TYPE_16_BIT 0b10 // bus_master_status #define UACPI_BUS_MASTER 0b1 // channel_speed #define UACPI_DMA_COMPATIBILITY 0b00 #define UACPI_DMA_TYPE_A 0b01 #define UACPI_DMA_TYPE_B 0b10 #define UACPI_DMA_TYPE_F 0b11 // transfer_width #define UACPI_TRANSFER_WIDTH_8 0x00 #define UACPI_TRANSFER_WIDTH_16 0x01 #define UACPI_TRANSFER_WIDTH_32 0x02 #define UACPI_TRANSFER_WIDTH_64 0x03 #define UACPI_TRANSFER_WIDTH_128 0x04 #define UACPI_TRANSFER_WIDTH_256 0x05 typedef struct uacpi_resource_dma { uacpi_u8 transfer_type; uacpi_u8 bus_master_status; uacpi_u8 channel_speed; uacpi_u8 num_channels; uacpi_u8 channels[]; } uacpi_resource_dma; typedef struct uacpi_resource_fixed_dma { uacpi_u16 request_line; uacpi_u16 channel; uacpi_u8 transfer_width; } uacpi_resource_fixed_dma; // decode_type #define UACPI_DECODE_16 0b1 #define UACPI_DECODE_10 0b0 typedef struct uacpi_resource_io { uacpi_u8 decode_type; uacpi_u16 minimum; uacpi_u16 maximum; uacpi_u8 alignment; uacpi_u8 length; } uacpi_resource_io; typedef struct uacpi_resource_fixed_io { uacpi_u16 address; uacpi_u8 length; } uacpi_resource_fixed_io; // write_status #define UACPI_NON_WRITABLE 0 #define UACPI_WRITABLE 1 // caching #define UACPI_NON_CACHEABLE 0 #define UACPI_CACHEABLE 1 #define UACPI_CACHEABLE_WRITE_COMBINING 2 #define UACPI_PREFETCHABLE 3 // range_type #define UACPI_RANGE_TYPE_MEMORY 0 #define UACPI_RANGE_TYPE_RESERVED 1 #define UACPI_RANGE_TYPE_ACPI 2 #define UACPI_RANGE_TYPE_NVS 3 // address_common->type #define UACPI_RANGE_MEMORY 0 #define UACPI_RANGE_IO 1 #define UACPI_RANGE_BUS 2 // translation #define UACPI_IO_MEM_TRANSLATION 1 #define UACPI_IO_MEM_STATIC 0 // translation_type #define UACPI_TRANSLATION_DENSE 0 #define UACPI_TRANSLATION_SPARSE 1 // direction #define UACPI_PRODUCER 0 #define UACPI_CONSUMER 1 // decode_type #define UACPI_POSITIVE_DECODE 0 #define UACPI_SUBTRACTIVE_DECODE 1 // fixed_min_address & fixed_max_address #define UACPI_ADDRESS_NOT_FIXED 0 #define UACPI_ADDRESS_FIXED 1 typedef struct uacpi_memory_attribute { uacpi_u8 write_status; uacpi_u8 caching; uacpi_u8 range_type; uacpi_u8 translation; } uacpi_memory_attribute; typedef struct uacpi_io_attribute { uacpi_u8 range_type; uacpi_u8 translation; uacpi_u8 translation_type; } uacpi_io_attribute; typedef union uacpi_address_attribute { uacpi_memory_attribute memory; uacpi_io_attribute io; uacpi_u8 type_specific; } uacpi_address_attribute; typedef struct uacpi_resource_address_common { uacpi_address_attribute attribute; uacpi_u8 type; uacpi_u8 direction; uacpi_u8 decode_type; uacpi_u8 fixed_min_address; uacpi_u8 fixed_max_address; } uacpi_resource_address_common; typedef struct uacpi_resource_address16 { uacpi_resource_address_common common; uacpi_u16 granularity; uacpi_u16 minimum; uacpi_u16 maximum; uacpi_u16 translation_offset; uacpi_u16 address_length; uacpi_resource_source source; } uacpi_resource_address16; typedef struct uacpi_resource_address32 { uacpi_resource_address_common common; uacpi_u32 granularity; uacpi_u32 minimum; uacpi_u32 maximum; uacpi_u32 translation_offset; uacpi_u32 address_length; uacpi_resource_source source; } uacpi_resource_address32; typedef struct uacpi_resource_address64 { uacpi_resource_address_common common; uacpi_u64 granularity; uacpi_u64 minimum; uacpi_u64 maximum; uacpi_u64 translation_offset; uacpi_u64 address_length; uacpi_resource_source source; } uacpi_resource_address64; typedef struct uacpi_resource_address64_extended { uacpi_resource_address_common common; uacpi_u8 revision_id; uacpi_u64 granularity; uacpi_u64 minimum; uacpi_u64 maximum; uacpi_u64 translation_offset; uacpi_u64 address_length; uacpi_u64 attributes; } uacpi_resource_address64_extended; typedef struct uacpi_resource_memory24 { uacpi_u8 write_status; uacpi_u16 minimum; uacpi_u16 maximum; uacpi_u16 alignment; uacpi_u16 length; } uacpi_resource_memory24; typedef struct uacpi_resource_memory32 { uacpi_u8 write_status; uacpi_u32 minimum; uacpi_u32 maximum; uacpi_u32 alignment; uacpi_u32 length; } uacpi_resource_memory32; typedef struct uacpi_resource_fixed_memory32 { uacpi_u8 write_status; uacpi_u32 address; uacpi_u32 length; } uacpi_resource_fixed_memory32; // compatibility & performance #define UACPI_GOOD 0 #define UACPI_ACCEPTABLE 1 #define UACPI_SUB_OPTIMAL 2 typedef struct uacpi_resource_start_dependent { uacpi_u8 length_kind; uacpi_u8 compatibility; uacpi_u8 performance; } uacpi_resource_start_dependent; typedef struct uacpi_resource_vendor_defined { uacpi_u8 length; uacpi_u8 data[]; } uacpi_resource_vendor; typedef struct uacpi_resource_vendor_typed { uacpi_u16 length; uacpi_u8 sub_type; uacpi_u8 uuid[16]; uacpi_u8 data[]; } uacpi_resource_vendor_typed; typedef struct uacpi_resource_generic_register { uacpi_u8 address_space_id; uacpi_u8 bit_width; uacpi_u8 bit_offset; uacpi_u8 access_size; uacpi_u64 address; } uacpi_resource_generic_register; // type #define UACPI_GPIO_CONNECTION_INTERRUPT 0x00 #define UACPI_GPIO_CONNECTION_IO 0x01 typedef struct uacpi_interrupt_connection_flags { uacpi_u8 triggering; uacpi_u8 polarity; uacpi_u8 sharing; uacpi_u8 wake_capability; } uacpi_interrupt_connection_flags; // restriction #define UACPI_IO_RESTRICTION_NONE 0x0 #define UACPI_IO_RESTRICTION_INPUT 0x1 #define UACPI_IO_RESTRICTION_OUTPUT 0x2 #define UACPI_IO_RESTRICTION_NONE_PRESERVE 0x3 typedef struct uacpi_io_connection_flags { uacpi_u8 restriction; uacpi_u8 sharing; } uacpi_io_connection_flags; // pull_configuration #define UACPI_PIN_CONFIG_DEFAULT 0x00 #define UACPI_PIN_CONFIG_PULL_UP 0x01 #define UACPI_PIN_CONFIG_PULL_DOWN 0x02 #define UACPI_PIN_CONFIG_NO_PULL 0x03 typedef struct uacpi_resource_gpio_connection { uacpi_u8 revision_id; uacpi_u8 type; uacpi_u8 direction; union { uacpi_interrupt_connection_flags intr; uacpi_io_connection_flags io; uacpi_u16 type_specific; }; uacpi_u8 pull_configuration; uacpi_u16 drive_strength; uacpi_u16 debounce_timeout; uacpi_u16 vendor_data_length; uacpi_u16 pin_table_length; uacpi_resource_source source; uacpi_u16 *pin_table; uacpi_u8 *vendor_data; } uacpi_resource_gpio_connection; // mode #define UACPI_MODE_CONTROLLER_INITIATED 0x0 #define UACPI_MODE_DEVICE_INITIATED 0x1 typedef struct uacpi_resource_serial_bus_common { uacpi_u8 revision_id; uacpi_u8 type; uacpi_u8 mode; uacpi_u8 direction; uacpi_u8 sharing; uacpi_u8 type_revision_id; uacpi_u16 type_data_length; uacpi_u16 vendor_data_length; uacpi_resource_source source; uacpi_u8 *vendor_data; } uacpi_resource_serial_bus_common; // addressing_mode #define UACPI_I2C_7BIT 0x0 #define UACPI_I2C_10BIT 0x1 typedef struct uacpi_resource_i2c_connection { uacpi_resource_serial_bus_common common; uacpi_u8 addressing_mode; uacpi_u16 slave_address; uacpi_u32 connection_speed; } uacpi_resource_i2c_connection; // wire_mode #define UACPI_SPI_4_WIRES 0 #define UACPI_SPI_3_WIRES 1 // device_polarity #define UACPI_SPI_ACTIVE_LOW 0 #define UACPI_SPI_ACTIVE_HIGH 1 // phase #define UACPI_SPI_PHASE_FIRST 0 #define UACPI_SPI_PHASE_SECOND 1 // polarity #define UACPI_SPI_START_LOW 0 #define UACPI_SPI_START_HIGH 1 typedef struct uacpi_resource_spi_connection { uacpi_resource_serial_bus_common common; uacpi_u8 wire_mode; uacpi_u8 device_polarity; uacpi_u8 data_bit_length; uacpi_u8 phase; uacpi_u8 polarity; uacpi_u16 device_selection; uacpi_u32 connection_speed; } uacpi_resource_spi_connection; // stop_bits #define UACPI_UART_STOP_BITS_NONE 0b00 #define UACPI_UART_STOP_BITS_1 0b01 #define UACPI_UART_STOP_BITS_1_5 0b10 #define UACPI_UART_STOP_BITS_2 0b11 // data_bits #define UACPI_UART_DATA_5BITS 0b000 #define UACPI_UART_DATA_6BITS 0b001 #define UACPI_UART_DATA_7BITS 0b010 #define UACPI_UART_DATA_8BITS 0b011 #define UACPI_UART_DATA_9BITS 0b100 // endianness #define UACPI_UART_LITTLE_ENDIAN 0 #define UACPI_UART_BIG_ENDIAN 1 // parity #define UACPI_UART_PARITY_NONE 0x00 #define UACPI_UART_PARITY_EVEN 0x01 #define UACPI_UART_PARITY_ODD 0x02 #define UACPI_UART_PARITY_MARK 0x03 #define UACPI_UART_PARITY_SPACE 0x04 // lines_enabled #define UACPI_UART_DATA_CARRIER_DETECT (1 << 2) #define UACPI_UART_RING_INDICATOR (1 << 3) #define UACPI_UART_DATA_SET_READY (1 << 4) #define UACPI_UART_DATA_TERMINAL_READY (1 << 5) #define UACPI_UART_CLEAR_TO_SEND (1 << 6) #define UACPI_UART_REQUEST_TO_SEND (1 << 7) // flow_control #define UACPI_UART_FLOW_CONTROL_NONE 0b00 #define UACPI_UART_FLOW_CONTROL_HW 0b01 #define UACPI_UART_FLOW_CONTROL_XON_XOFF 0b10 typedef struct uacpi_resource_uart_connection { uacpi_resource_serial_bus_common common; uacpi_u8 stop_bits; uacpi_u8 data_bits; uacpi_u8 endianness; uacpi_u8 parity; uacpi_u8 lines_enabled; uacpi_u8 flow_control; uacpi_u32 baud_rate; uacpi_u16 rx_fifo; uacpi_u16 tx_fifo; } uacpi_resource_uart_connection; // phy_type #define UACPI_CSI2_PHY_C 0b00 #define UACPI_CSI2_PHY_D 0b01 typedef struct uacpi_resource_csi2_connection { uacpi_resource_serial_bus_common common; uacpi_u8 phy_type; uacpi_u8 local_port; } uacpi_resource_csi2_connection; typedef struct uacpi_resource_pin_function { uacpi_u8 revision_id; uacpi_u8 sharing; uacpi_u8 pull_configuration; uacpi_u16 function_number; uacpi_u16 pin_table_length; uacpi_u16 vendor_data_length; uacpi_resource_source source; uacpi_u16 *pin_table; uacpi_u8 *vendor_data; } uacpi_resource_pin_function; // type #define UACPI_PIN_CONFIG_DEFAULT 0x00 #define UACPI_PIN_CONFIG_BIAS_PULL_UP 0x01 #define UACPI_PIN_CONFIG_BIAS_PULL_DOWN 0x02 #define UACPI_PIN_CONFIG_BIAS_DEFAULT 0x03 #define UACPI_PIN_CONFIG_BIAS_DISABLE 0x04 #define UACPI_PIN_CONFIG_BIAS_HIGH_IMPEDANCE 0x05 #define UACPI_PIN_CONFIG_BIAS_BUS_HOLD 0x06 #define UACPI_PIN_CONFIG_DRIVE_OPEN_DRAIN 0x07 #define UACPI_PIN_CONFIG_DRIVE_OPEN_SOURCE 0x08 #define UACPI_PIN_CONFIG_DRIVE_PUSH_PULL 0x09 #define UACPI_PIN_CONFIG_DRIVE_STRENGTH 0x0A #define UACPI_PIN_CONFIG_SLEW_RATE 0x0B #define UACPI_PIN_CONFIG_INPUT_DEBOUNCE 0x0C #define UACPI_PIN_CONFIG_INPUT_SCHMITT_TRIGGER 0x0D typedef struct uacpi_resource_pin_configuration { uacpi_u8 revision_id; uacpi_u8 sharing; uacpi_u8 direction; uacpi_u8 type; uacpi_u32 value; uacpi_u16 pin_table_length; uacpi_u16 vendor_data_length; uacpi_resource_source source; uacpi_u16 *pin_table; uacpi_u8 *vendor_data; } uacpi_resource_pin_configuration; typedef struct uacpi_resource_label { uacpi_u16 length; const uacpi_char *string; } uacpi_resource_label; typedef struct uacpi_resource_pin_group { uacpi_u8 revision_id; uacpi_u8 direction; uacpi_u16 pin_table_length; uacpi_u16 vendor_data_length; uacpi_resource_label label; uacpi_u16 *pin_table; uacpi_u8 *vendor_data; } uacpi_resource_pin_group; typedef struct uacpi_resource_pin_group_function { uacpi_u8 revision_id; uacpi_u8 sharing; uacpi_u8 direction; uacpi_u16 function; uacpi_u16 vendor_data_length; uacpi_resource_source source; uacpi_resource_label label; uacpi_u8 *vendor_data; } uacpi_resource_pin_group_function; typedef struct uacpi_resource_pin_group_configuration { uacpi_u8 revision_id; uacpi_u8 sharing; uacpi_u8 direction; uacpi_u8 type; uacpi_u32 value; uacpi_u16 vendor_data_length; uacpi_resource_source source; uacpi_resource_label label; uacpi_u8 *vendor_data; } uacpi_resource_pin_group_configuration; // scale #define UACPI_SCALE_HZ 0b00 #define UACPI_SCALE_KHZ 0b01 #define UACPI_SCALE_MHZ 0b10 // frequency #define UACPI_FREQUENCY_FIXED 0x0 #define UACPI_FREQUENCY_VARIABLE 0x1 typedef struct uacpi_resource_clock_input { uacpi_u8 revision_id; uacpi_u8 frequency; uacpi_u8 scale; uacpi_u16 divisor; uacpi_u32 numerator; uacpi_resource_source source; } uacpi_resource_clock_input; typedef struct uacpi_resource { uacpi_u32 type; uacpi_u32 length; union { uacpi_resource_irq irq; uacpi_resource_extended_irq extended_irq; uacpi_resource_dma dma; uacpi_resource_fixed_dma fixed_dma; uacpi_resource_io io; uacpi_resource_fixed_io fixed_io; uacpi_resource_address16 address16; uacpi_resource_address32 address32; uacpi_resource_address64 address64; uacpi_resource_address64_extended address64_extended; uacpi_resource_memory24 memory24; uacpi_resource_memory32 memory32; uacpi_resource_fixed_memory32 fixed_memory32; uacpi_resource_start_dependent start_dependent; uacpi_resource_vendor vendor; uacpi_resource_vendor_typed vendor_typed; uacpi_resource_generic_register generic_register; uacpi_resource_gpio_connection gpio_connection; uacpi_resource_serial_bus_common serial_bus_common; uacpi_resource_i2c_connection i2c_connection; uacpi_resource_spi_connection spi_connection; uacpi_resource_uart_connection uart_connection; uacpi_resource_csi2_connection csi2_connection; uacpi_resource_pin_function pin_function; uacpi_resource_pin_configuration pin_configuration; uacpi_resource_pin_group pin_group; uacpi_resource_pin_group_function pin_group_function; uacpi_resource_pin_group_configuration pin_group_configuration; uacpi_resource_clock_input clock_input; }; } uacpi_resource; #define UACPI_NEXT_RESOURCE(cur) \ ((uacpi_resource*)((uacpi_u8*)(cur) + (cur)->length)) typedef struct uacpi_resources { /* * Length of the 'entries' array in BYTES (NOT the count of resources), * see comment above 'entries' for more information. */ uacpi_size length; /* * Resources are variable length! See UACPI_NEXT_RESOURCE to see how to * retrieve the next resource. You can alternatively use * uacpi_for_each_resource instead of iterating manually. * * Resources are guaranteed to be naturally aligned and are always * terminated by a resource of type UACPI_RESOURCE_TYPE_END_TAG. */ uacpi_resource *entries; } uacpi_resources; void uacpi_free_resources(uacpi_resources*); typedef uacpi_iteration_decision (*uacpi_resource_iteration_callback) (void *user, uacpi_resource *resource); /* * Evaluate the _CRS method for a 'device' and get the returned resource list * via 'out_resources'. * * NOTE: the returned buffer must be released via uacpi_free_resources() * * If you don't need to keep the resource array for later use you can * uacpi_for_each_device_resource(device, "_CRS", ...) instead, which takes * care of iteration & memory management on its own. */ uacpi_status uacpi_get_current_resources( uacpi_namespace_node *device, uacpi_resources **out_resources ); /* * Evaluate the _PRS method for a 'device' and get the returned resource list * via 'out_resources'. * * NOTE: the returned buffer must be released via uacpi_free_resources() * * If you don't need to keep the resource array for later use you can * uacpi_for_each_device_resource(device, "_PRS", ...) instead, which takes * care of iteration & memory management on its own. */ uacpi_status uacpi_get_possible_resources( uacpi_namespace_node *device, uacpi_resources **out_resources ); /* * Evaluate an arbitrary method that is expected to return an AML resource * buffer for a 'device' and get the returned resource list via 'out_resources'. * * NOTE: the returned buffer must be released via uacpi_free_resources() * * If you don't need to keep the resource array for later use you can * uacpi_for_each_device_resource(device, method, ...) instead, which takes * care of iteration & memory management on its own. */ uacpi_status uacpi_get_device_resources( uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources ); /* * Set the configuration to be used by the 'device' by calling its _SRS method. * * Note that this expects 'resources' in the normal 'uacpi_resources' format, * and not the raw AML resources bytestream, the conversion to the latter is * done automatically by this API. If you want to _SRS a raw AML resources * bytestream, use 'uacpi_execute' or similar API directly. */ uacpi_status uacpi_set_resources( uacpi_namespace_node *device, uacpi_resources *resources ); /* * A convenience helper for iterating over the resource list returned by any * of the uacpi_get_*_resources functions. */ uacpi_status uacpi_for_each_resource( uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user ); /* * A shorthand for uacpi_get_device_resources() + uacpi_for_each_resource(). * * Use if you don't actually want to save the 'resources' list, but simply want * to iterate it once to extract the resources you care about and then free it * right away. */ uacpi_status uacpi_for_each_device_resource( uacpi_namespace_node *device, const uacpi_char *method, uacpi_resource_iteration_callback cb, void *user ); /* * Convert a single AML-encoded resource to native format. * * This should be used for converting Connection() fields (passed during IO on * GeneralPurposeIO or GenericSerialBus operation regions) or other similar * buffers with only one resource to native format. * * NOTE: the returned buffer must be released via uacpi_free_resource() */ uacpi_status uacpi_get_resource_from_buffer( uacpi_data_view aml_buffer, uacpi_resource **out_resource ); void uacpi_free_resource(uacpi_resource*); #endif // !UACPI_BAREBONES_MODE #ifdef __cplusplus } #endif