ReactOS 0.4.16-dev-1506-g117cd33
resources.c File Reference
Include dependency graph for resources.c:

Go to the source code of this file.

Classes

struct  resource_conversion_ctx
 

Macros

#define LARGE_RESOURCE_BASE   (ACPI_RESOURCE_END_TAG + 1)
 
#define L(x)   (x + LARGE_RESOURCE_BASE)
 
#define SMALL_ITEM_HEADER_SIZE   sizeof(struct acpi_small_item)
 
#define LARGE_ITEM_HEADER_SIZE   sizeof(struct acpi_large_item)
 
#define AML_SERIAL_RESOURCE_EXTRA_SIZE(type)
 
#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE(type)
 
#define OP(short_code, ...)
 
#define END()   OP(END)
 
#define AML_O(short_aml_name, field)    uacpi_offsetof(struct acpi_resource_##short_aml_name, field)
 
#define AML_F(short_aml_name, field)    .aml_offset = AML_O(short_aml_name, field)
 
#define NATIVE_O(short_name, field)    uacpi_offsetof(uacpi_resource_##short_name, field)
 
#define NATIVE_F(short_native_name, field)    .native_offset = NATIVE_O(short_native_name, field)
 
#define IMM(value)   .imm = value
 
#define ARG0(value)   .arg0 = (value)
 
#define ARG1(value)   .arg1 = (value)
 
#define ARG2(value)   .arg2 = (value)
 
#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type)
 
#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type)
 
#define DEFINE_ADDRESS_CONVERSION(width)
 
#define DECODE_SOURCE_INDEX(short_aml_name)
 
#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( short_aml_name, res_opcode, offset_field, res_field)
 
#define DECODE_PIN_GROUP_RES_SOURCES(postfix)
 
#define NATIVE_RESOURCE_HEADER_SIZE   8
 
#define DEFINE_SMALL_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct, ...)
 
#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR( aml_type_enum, native_type_enum, aml_struct, ...)
 
#define DEFINE_LARGE_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct, ...)
 
#define CONVERSION_OPCODES_COMMON(native_buf)
 
#define PTR_AT(ptr, offset)   (void*)((uacpi_u8*)(ptr) + (offset))
 
#define NATIVE_OFFSET(res, offset)    PTR_AT(res, (offset) + (sizeof(uacpi_u32) * 2))
 
#define NATIVE_FIELD(res, name, field)    NATIVE_OFFSET(res, NATIVE_O(name, field))
 
#define CHECK_AML_OOB(offset, prefix, what)
 
#define CHECK_AML_OFFSET_BASE(offset, what)
 
#define CHECK_AML_OFFSET(offset, what)
 
#define INLINE_END_TAG   &(uacpi_resource) { .type = UACPI_RESOURCE_TYPE_END_TAG }
 

Functions

static uacpi_size aml_size_with_header (const struct uacpi_resource_spec *spec)
 
static uacpi_size extra_size_for_native_irq_or_dma (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_irq (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size size_for_aml_start_dependent (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_native_vendor (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_vendor (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_resource_source (uacpi_size base_size, uacpi_size reported_size)
 
static uacpi_size size_for_aml_resource_source (uacpi_resource_source *source, uacpi_bool with_index)
 
static uacpi_size extra_size_for_native_address_or_clock_input (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_address_or_clock_input (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_extended_irq (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_extended_irq (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_native_gpio_or_pins (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_gpio_or_pins (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_native_pin_group (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size size_for_aml_pin_group (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static uacpi_size extra_size_for_serial_connection (const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
 
static uacpi_size aml_size_for_serial_connection (const struct uacpi_resource_spec *spec, uacpi_resource *resource)
 
static enum uacpi_aml_resource get_aml_resource_type (uacpi_u8 raw_byte)
 
static uacpi_status get_aml_resource_size (uacpi_u8 *data, uacpi_size bytes_left, uacpi_u16 *out_size)
 
static uacpi_status validate_aml_serial_type (uacpi_u8 type)
 
uacpi_status uacpi_for_each_aml_resource (uacpi_data_view buffer, uacpi_aml_resource_iteration_callback cb, void *user)
 
static uacpi_iteration_decision find_end (void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
 
static uacpi_size native_size_for_aml_resource (uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec)
 
uacpi_status uacpi_find_aml_resource_end_tag (uacpi_data_view buffer, uacpi_size *out_offset)
 
static uacpi_iteration_decision conditional_continue (struct resource_conversion_ctx *ctx)
 
static uacpi_resource_type aml_serial_to_native_type (uacpi_u8 type)
 
static uacpi_iteration_decision do_aml_resource_to_native (void *opaque, uacpi_u8 *data, uacpi_u16 aml_size, const struct uacpi_resource_spec *spec)
 
static uacpi_iteration_decision accumulate_native_buffer_size (void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
 
static uacpi_status eval_resource_helper (uacpi_namespace_node *node, const uacpi_char *method, uacpi_object **out_obj)
 
uacpi_status uacpi_native_resources_from_aml (uacpi_data_view aml_buffer, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_resource_from_buffer (uacpi_data_view aml_buffer, uacpi_resource **out_resource)
 
void uacpi_free_resources (uacpi_resources *resources)
 
void uacpi_free_resource (uacpi_resource *resource)
 
static uacpi_status extract_native_resources_from_method (uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_current_resources (uacpi_namespace_node *device, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_possible_resources (uacpi_namespace_node *device, uacpi_resources **out_resources)
 
uacpi_status uacpi_get_device_resources (uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
 
uacpi_status uacpi_for_each_resource (uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user)
 
uacpi_status uacpi_for_each_device_resource (uacpi_namespace_node *device, const uacpi_char *method, uacpi_resource_iteration_callback cb, void *user)
 
static const struct uacpi_resource_specresource_spec_from_native (uacpi_resource *resource)
 
static uacpi_size aml_size_for_native_resource (uacpi_resource *resource, const struct uacpi_resource_spec *spec)
 
static uacpi_iteration_decision do_native_resource_to_aml (void *opaque, uacpi_resource *resource)
 
static uacpi_status native_resources_to_aml (uacpi_resources *native_resources, void *aml_buffer)
 
static uacpi_iteration_decision accumulate_aml_buffer_size (void *opaque, uacpi_resource *resource)
 
uacpi_status uacpi_native_resources_to_aml (uacpi_resources *resources, uacpi_object **out_template)
 
uacpi_status uacpi_set_resources (uacpi_namespace_node *device, uacpi_resources *resources)
 

Variables

static const uacpi_u8 aml_resource_to_type [256]
 
static const uacpi_u8 type_to_aml_resource []
 
static const uacpi_u8 native_resource_to_type [UACPI_RESOURCE_TYPE_MAX+1]
 
static const uacpi_u8 aml_resource_kind_to_header_size [2]
 
static const uacpi_u8 aml_serial_resource_to_extra_aml_size [ACPI_SERIAL_TYPE_MAX+1]
 
static const uacpi_u8 aml_serial_resource_to_extra_native_size [ACPI_SERIAL_TYPE_MAX+1]
 
static const struct uacpi_resource_convert_instruction convert_irq_to_native []
 
const struct uacpi_resource_convert_instruction convert_irq_to_aml []
 
static const struct uacpi_resource_convert_instruction convert_dma []
 
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_native []
 
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_aml []
 
static const struct uacpi_resource_convert_instruction convert_io []
 
static const struct uacpi_resource_convert_instruction convert_fixed_io []
 
static const struct uacpi_resource_convert_instruction convert_fixed_dma []
 
static const struct uacpi_resource_convert_instruction convert_vendor_type0 []
 
static const struct uacpi_resource_convert_instruction convert_vendor_type1 []
 
static const struct uacpi_resource_convert_instruction convert_memory24 []
 
static const struct uacpi_resource_convert_instruction convert_memory32 []
 
static const struct uacpi_resource_convert_instruction convert_fixed_memory32 []
 
static const struct uacpi_resource_convert_instruction convert_generic_register []
 
static const struct uacpi_resource_convert_instruction convert_address64_extended []
 
static const struct uacpi_resource_convert_instruction convert_extended_irq []
 
static const struct uacpi_resource_convert_instruction convert_clock_input []
 
static const struct uacpi_resource_convert_instruction convert_gpio_connection []
 
static const struct uacpi_resource_convert_instruction convert_pin_function []
 
static const struct uacpi_resource_convert_instruction convert_pin_configuration []
 
static const struct uacpi_resource_convert_instruction convert_pin_group []
 
static const struct uacpi_resource_convert_instruction convert_pin_group_function []
 
static const struct uacpi_resource_convert_instruction convert_pin_group_configuration []
 
static const struct uacpi_resource_convert_instruction convert_generic_serial_bus []
 
const struct uacpi_resource_spec aml_resources [UACPI_AML_RESOURCE_MAX+1]
 

Macro Definition Documentation

◆ AML_F

#define AML_F (   short_aml_name,
  field 
)     .aml_offset = AML_O(short_aml_name, field)

Definition at line 589 of file resources.c.

◆ AML_O

#define AML_O (   short_aml_name,
  field 
)     uacpi_offsetof(struct acpi_resource_##short_aml_name, field)

Definition at line 586 of file resources.c.

◆ AML_SERIAL_RESOURCE_EXTRA_SIZE

#define AML_SERIAL_RESOURCE_EXTRA_SIZE (   type)
Value:
(sizeof(struct acpi_resource_serial_##type) \
- sizeof(struct acpi_resource_serial))
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList

Definition at line 525 of file resources.c.

◆ ARG0

#define ARG0 (   value)    .arg0 = (value)

Definition at line 599 of file resources.c.

◆ ARG1

#define ARG1 (   value)    .arg1 = (value)

Definition at line 600 of file resources.c.

◆ ARG2

#define ARG2 (   value)    .arg2 = (value)

Definition at line 601 of file resources.c.

◆ CHECK_AML_OFFSET

#define CHECK_AML_OFFSET (   offset,
  what 
)
Value:
CHECK_AML_OOB(offset, "end of ", what) \
CHECK_AML_OFFSET_BASE(offset, what)
#define CHECK_AML_OOB(offset, prefix, what)
Definition: resources.c:1644
GLintptr offset
Definition: glext.h:5920

Definition at line 1661 of file resources.c.

◆ CHECK_AML_OFFSET_BASE

#define CHECK_AML_OFFSET_BASE (   offset,
  what 
)
Value:
if (uacpi_unlikely(offset < base_aml_size_with_header)) { \
uacpi_error( \
"invalid " what " offset: %zu, expected at least %u\n", \
(uacpi_size)offset, base_aml_size_with_header); \
}
#define uacpi_unlikely(expr)
Definition: compiler.h:58
size_t uacpi_size
Definition: types.h:37
@ UACPI_STATUS_AML_INVALID_RESOURCE
Definition: status.h:42
@ UACPI_ITERATION_DECISION_BREAK
Definition: types.h:30

Definition at line 1652 of file resources.c.

◆ CHECK_AML_OOB

#define CHECK_AML_OOB (   offset,
  prefix,
  what 
)
Value:
if (uacpi_unlikely(offset > ((uacpi_u32)aml_size + header_size))) { \
uacpi_error(prefix what " is OOB: %zu > %u\n", \
(uacpi_size)offset, (uacpi_u32)aml_size + header_size); \
}
uint32_t uacpi_u32
Definition: types.h:21
Character const *const prefix
Definition: tempnam.cpp:195

Definition at line 1644 of file resources.c.

◆ CONVERSION_OPCODES_COMMON

#define CONVERSION_OPCODES_COMMON (   native_buf)

Definition at line 1570 of file resources.c.

◆ CONVERT_GENERAL_ADDRESS_FLAGS

#define CONVERT_GENERAL_ADDRESS_FLAGS (   addr_type)
Value:
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.direction), IMM(0)), \
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.decode_type), IMM(1)), \
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.fixed_min_address), IMM(2)), \
OP(BIT_FIELD_1, \
AML_F(addr_type, common.flags), \
NATIVE_F(addr_type, common.fixed_max_address), IMM(3)) \
#define OP(short_code,...)
Definition: resources.c:578
#define NATIVE_F(short_native_name, field)
Definition: resources.c:595
#define IMM(value)
Definition: resources.c:598
#define AML_F(short_aml_name, field)
Definition: resources.c:589

Definition at line 773 of file resources.c.

◆ CONVERT_TYPE_SPECIFIC_FLAGS

#define CONVERT_TYPE_SPECIFIC_FLAGS (   addr_type)

Definition at line 740 of file resources.c.

◆ DECODE_PIN_GROUP_RES_SOURCES

#define DECODE_PIN_GROUP_RES_SOURCES (   postfix)
Value:
DECODE_SOURCE_INDEX(pin_group_##postfix), \
OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(pin_group_##postfix, source), \
AML_F(pin_group_##postfix, source_offset), \
ARG2(AML_O(pin_group_##postfix, source_lable_offset))), \
OP(LOAD_16_NATIVE, NATIVE_F(pin_group_##postfix, source.length)), \
OP(RESOURCE_LABEL, NATIVE_F(pin_group_##postfix, label), \
AML_F(pin_group_##postfix, source_lable_offset), \
ARG2(AML_O(pin_group_##postfix, vendor_data_offset))), \
OP(VENDOR_DATA, AML_F(pin_group_##postfix, vendor_data_offset), \
NATIVE_F(pin_group_##postfix, vendor_data_length), \
ARG2(NATIVE_O(pin_group_##postfix, vendor_data)))
#define AML_O(short_aml_name, field)
Definition: resources.c:586
#define ARG2(value)
Definition: resources.c:601
#define NATIVE_O(short_name, field)
Definition: resources.c:592
#define DECODE_SOURCE_INDEX(short_aml_name)
Definition: resources.c:846
static const WCHAR label[]
Definition: itemdlg.c:1546

Definition at line 948 of file resources.c.

◆ DECODE_RES_PIN_TBL_AND_VENDOR_DATA

#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA (   short_aml_name,
  res_opcode,
  offset_field,
  res_field 
)
Value:
OP(LOAD_PIN_TABLE_LENGTH, AML_F(short_aml_name, offset_field), \
NATIVE_F(short_aml_name, pin_table_length)), \
OP(RESOURCE_##res_opcode, NATIVE_F(short_aml_name, res_field), \
AML_F(short_aml_name, offset_field), \
ARG2(AML_O(short_aml_name, vendor_data_offset))), \
OP(PIN_TABLE, AML_F(short_aml_name, pin_table_offset), \
NATIVE_F(short_aml_name, pin_table_length), \
ARG2(NATIVE_O(short_aml_name, pin_table))), \
OP(VENDOR_DATA, AML_F(short_aml_name, vendor_data_offset), \
NATIVE_F(short_aml_name, vendor_data_length), \
ARG2(NATIVE_O(short_aml_name, vendor_data)))

Definition at line 850 of file resources.c.

◆ DECODE_SOURCE_INDEX

#define DECODE_SOURCE_INDEX (   short_aml_name)
Value:
OP(FIELD_8, AML_F(short_aml_name, source_index), \
NATIVE_F(short_aml_name, source.index)) \
DWORD index
Definition: pdh_main.c:175

Definition at line 846 of file resources.c.

◆ DEFINE_ADDRESS_CONVERSION

#define DEFINE_ADDRESS_CONVERSION (   width)
Value:
static const struct uacpi_resource_convert_instruction \
convert_address##width[] = { \
CONVERT_GENERAL_ADDRESS_FLAGS(address##width), \
OP(FIELD_##width, AML_F(address##width, granularity), \
NATIVE_F(address##width, granularity), IMM(5)), \
OP(RESOURCE_SOURCE, NATIVE_F(address##width, source)), \
CONVERT_TYPE_SPECIFIC_FLAGS(address##width), \
};
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint address
Definition: glext.h:9393

Definition at line 787 of file resources.c.

◆ DEFINE_LARGE_AML_RESOURCE

#define DEFINE_LARGE_AML_RESOURCE (   aml_type_enum,
  native_type_enum,
  aml_struct,
  native_struct,
  ... 
)
Value:
[aml_type_enum] = { \
.type = aml_type_enum, \
.native_type = native_type_enum, \
.resource_kind = UACPI_AML_RESOURCE_KIND_LARGE, \
.aml_size = sizeof(aml_struct) - LARGE_ITEM_HEADER_SIZE, \
.native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
__VA_ARGS__ \
}
@ UACPI_AML_RESOURCE_KIND_LARGE
Definition: resources.h:52
#define LARGE_ITEM_HEADER_SIZE
Definition: resources.c:118
#define NATIVE_RESOURCE_HEADER_SIZE
Definition: resources.c:1059

Definition at line 1084 of file resources.c.

◆ DEFINE_SMALL_AML_RESOURCE

#define DEFINE_SMALL_AML_RESOURCE (   aml_type_enum,
  native_type_enum,
  aml_struct,
  native_struct,
  ... 
)
Value:
[aml_type_enum] = { \
.type = aml_type_enum, \
.native_type = native_type_enum, \
.resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
.aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
.native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
__VA_ARGS__ \
}
@ UACPI_AML_RESOURCE_KIND_SMALL
Definition: resources.h:51
#define SMALL_ITEM_HEADER_SIZE
Definition: resources.c:117

Definition at line 1061 of file resources.c.

◆ DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR

#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR (   aml_type_enum,
  native_type_enum,
  aml_struct,
  ... 
)
Value:
[aml_type_enum] = { \
.type = aml_type_enum, \
.native_type = native_type_enum, \
.resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
.aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
.native_size = NATIVE_RESOURCE_HEADER_SIZE, \
__VA_ARGS__ \
}

Definition at line 1072 of file resources.c.

◆ END

#define END ( )    OP(END)

Definition at line 584 of file resources.c.

◆ IMM

#define IMM (   value)    .imm = value

Definition at line 598 of file resources.c.

◆ INLINE_END_TAG

#define INLINE_END_TAG   &(uacpi_resource) { .type = UACPI_RESOURCE_TYPE_END_TAG }

Definition at line 2443 of file resources.c.

◆ L

#define L (   x)    (x + LARGE_RESOURCE_BASE)

◆ LARGE_ITEM_HEADER_SIZE

#define LARGE_ITEM_HEADER_SIZE   sizeof(struct acpi_large_item)

Definition at line 118 of file resources.c.

◆ LARGE_RESOURCE_BASE

#define LARGE_RESOURCE_BASE   (ACPI_RESOURCE_END_TAG + 1)

Definition at line 12 of file resources.c.

◆ NATIVE_F

#define NATIVE_F (   short_native_name,
  field 
)     .native_offset = NATIVE_O(short_native_name, field)

Definition at line 595 of file resources.c.

◆ NATIVE_FIELD

#define NATIVE_FIELD (   res,
  name,
  field 
)     NATIVE_OFFSET(res, NATIVE_O(name, field))

Definition at line 1641 of file resources.c.

◆ NATIVE_O

#define NATIVE_O (   short_name,
  field 
)     uacpi_offsetof(uacpi_resource_##short_name, field)

Definition at line 592 of file resources.c.

◆ NATIVE_OFFSET

#define NATIVE_OFFSET (   res,
  offset 
)     PTR_AT(res, (offset) + (sizeof(uacpi_u32) * 2))

Definition at line 1638 of file resources.c.

◆ NATIVE_RESOURCE_HEADER_SIZE

#define NATIVE_RESOURCE_HEADER_SIZE   8

Definition at line 1059 of file resources.c.

◆ NATIVE_SERIAL_RESOURCE_EXTRA_SIZE

#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE (   type)
Value:
(sizeof(uacpi_resource_##type##_connection) \

Definition at line 529 of file resources.c.

◆ OP

#define OP (   short_code,
  ... 
)
Value:
{ \
.code = UACPI_RESOURCE_CONVERT_OPCODE_##short_code, \
__VA_ARGS__ \
}

Definition at line 578 of file resources.c.

◆ PTR_AT

#define PTR_AT (   ptr,
  offset 
)    (void*)((uacpi_u8*)(ptr) + (offset))

Definition at line 1636 of file resources.c.

◆ SMALL_ITEM_HEADER_SIZE

#define SMALL_ITEM_HEADER_SIZE   sizeof(struct acpi_small_item)

Definition at line 117 of file resources.c.

Function Documentation

◆ accumulate_aml_buffer_size()

static uacpi_iteration_decision accumulate_aml_buffer_size ( void opaque,
uacpi_resource resource 
)
static

Definition at line 2468 of file resources.c.

2471{
2472 struct resource_conversion_ctx *ctx = opaque;
2473 const struct uacpi_resource_spec *spec;
2474 uacpi_size size_for_this;
2475
2476 // resource->type is sanitized to be valid here by the iteration function
2478
2479 size_for_this = aml_size_for_native_resource(resource, spec);
2480 if (size_for_this == 0 || (ctx->size + size_for_this) < ctx->size) {
2481 uacpi_error("invalid aml size for native resource: %zu\n",
2482 size_for_this);
2485 }
2486
2487 ctx->size += size_for_this;
2489}
#define uacpi_error(...)
Definition: log.h:21
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
static uacpi_size aml_size_for_native_resource(uacpi_resource *resource, const struct uacpi_resource_spec *spec)
Definition: resources.c:2180
static const struct uacpi_resource_spec * resource_spec_from_native(uacpi_resource *resource)
Definition: resources.c:2173

Referenced by uacpi_native_resources_to_aml().

◆ accumulate_native_buffer_size()

static uacpi_iteration_decision accumulate_native_buffer_size ( void opaque,
uacpi_u8 data,
uacpi_u16  resource_size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1938 of file resources.c.

1942{
1943 struct resource_conversion_ctx *ctx = opaque;
1944 uacpi_size size_for_this;
1945
1946 size_for_this = native_size_for_aml_resource(data, resource_size, spec);
1947 if (size_for_this == 0 || (ctx->size + size_for_this) < ctx->size) {
1948 uacpi_error("invalid native size for aml resource: %zu\n",
1949 size_for_this);
1952 }
1953
1954 ctx->size += size_for_this;
1955 return conditional_continue(ctx);
1956}
static uacpi_iteration_decision conditional_continue(struct resource_conversion_ctx *ctx)
Definition: resources.c:1561
static uacpi_size native_size_for_aml_resource(uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1514
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

Referenced by uacpi_get_resource_from_buffer(), and uacpi_native_resources_from_aml().

◆ aml_serial_to_native_type()

static uacpi_resource_type aml_serial_to_native_type ( uacpi_u8  type)
static

Definition at line 1665 of file resources.c.

1668{
1669 return (type - ACPI_SERIAL_TYPE_I2C) +
1671}
#define ACPI_SERIAL_TYPE_I2C
Definition: acpi.h:1306
@ UACPI_RESOURCE_TYPE_SERIAL_I2C_CONNECTION
Definition: resources.h:43

Referenced by do_aml_resource_to_native(), and do_native_resource_to_aml().

◆ aml_size_for_native_resource()

static uacpi_size aml_size_for_native_resource ( uacpi_resource resource,
const struct uacpi_resource_spec spec 
)
static

Definition at line 2180 of file resources.c.

2183{
2184 return spec->size_for_aml ?
2185 spec->size_for_aml(spec, resource) :
2187}
static uacpi_size aml_size_with_header(const struct uacpi_resource_spec *spec)
Definition: resources.c:125
uacpi_size(* size_for_aml)(const struct uacpi_resource_spec *, uacpi_resource *)
Definition: resources.h:298

Referenced by accumulate_aml_buffer_size(), and do_native_resource_to_aml().

◆ aml_size_for_serial_connection()

static uacpi_size aml_size_for_serial_connection ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 563 of file resources.c.

566{
568 uacpi_resource_serial_bus_common *serial_bus = &resource->serial_bus_common;
569
572 size += serial_bus->vendor_data_length;
573 size += serial_bus->source.length;
574
575 return size;
576}
static const uacpi_u8 aml_serial_resource_to_extra_aml_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:534
GLsizeiptr size
Definition: glext.h:5919
uacpi_resource_source source
Definition: resources.h:405

◆ aml_size_with_header()

◆ conditional_continue()

static uacpi_iteration_decision conditional_continue ( struct resource_conversion_ctx ctx)
static

Definition at line 1561 of file resources.c.

1564{
1565 return ctx->just_one ? UACPI_ITERATION_DECISION_BREAK :
1567}

Referenced by accumulate_native_buffer_size(), and do_aml_resource_to_native().

◆ do_aml_resource_to_native()

static uacpi_iteration_decision do_aml_resource_to_native ( void opaque,
uacpi_u8 data,
uacpi_u16  aml_size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1673 of file resources.c.

1677{
1678 struct resource_conversion_ctx *ctx = opaque;
1679 uacpi_resource *resource = ctx->buf;
1680 const struct uacpi_resource_convert_instruction *insns, *insn;
1681 uacpi_u8 header_size, pc = 0;
1682 uacpi_u8 *src, *dst;
1683 void *resource_end;
1684 uacpi_u16 base_aml_size;
1685 uacpi_u32 base_aml_size_with_header, accumulator = 0;
1686
1687 insns = spec->to_native;
1688
1690 resource->type = spec->native_type;
1691 resource->length = native_size_for_aml_resource(data, aml_size, spec);
1692 resource_end = ctx->byte_buf + spec->native_size;
1693 ctx->byte_buf += resource->length;
1694
1695 base_aml_size = base_aml_size_with_header = spec->aml_size;
1696 base_aml_size_with_header += header_size;
1697
1698 if (insns == UACPI_NULL)
1699 return conditional_continue(ctx);
1700
1701 for (;;) {
1702 insn = &insns[pc++];
1703
1704 src = data + insn->aml_offset;
1706
1707 switch (insn->code) {
1710 uacpi_size i, j, max_bit;
1712
1714 max_bit = 16;
1715 uacpi_memcpy(&value, src, sizeof(uacpi_u16));
1716 } else {
1717 max_bit = 8;
1719 &value, src, sizeof(value), sizeof(uacpi_u8)
1720 );
1721 }
1722
1723 for (i = 0, j = 0; i < max_bit; ++i) {
1724 if (!(value & (1 << i)))
1725 continue;
1726
1727 dst[j++] = i;
1728 }
1729
1731 break;
1732 }
1733
1739
1741 mask = (1 << mask) - 1;
1742
1743 value = (*src >> insn->imm) & mask;
1744 uacpi_memcpy(dst, &value, sizeof(value));
1745 break;
1746 }
1747
1749 accumulator = aml_size;
1750 uacpi_memcpy(dst, &accumulator, 4);
1751 break;
1752
1756 uacpi_size offset = 0, max_offset, length = 0;
1757 uacpi_char *src_string, *dst_string;
1758 union {
1759 void *ptr;
1762 } dst_name = { .ptr = dst };
1763
1764 /*
1765 * Check if the string is bounded by anything at the top. If not, we
1766 * just assume it ends at the end of the resource.
1767 */
1768 if (insn->arg2) {
1769 uacpi_memcpy_zerout(&max_offset, data + insn->arg2,
1770 sizeof(max_offset), sizeof(uacpi_u16));
1771 CHECK_AML_OFFSET(max_offset, "resource source");
1772 } else {
1773 max_offset = aml_size + header_size;
1774 }
1775
1776 offset += base_aml_size_with_header;
1777 offset += accumulator;
1778
1780 dst_name.source->index_present = UACPI_TRUE;
1781
1782 if (offset >= max_offset) {
1784 dst_name.source->index_present = UACPI_FALSE;
1785 break;
1786 }
1787
1788 src_string = PTR_AT(data, offset);
1789
1791 uacpi_memcpy(&dst_name.source->index, src_string++, 1);
1792 offset++;
1793 }
1794
1795 if (offset == max_offset)
1796 break;
1797
1798 while (offset++ < max_offset) {
1799 if (src_string[length++] == '\0')
1800 break;
1801 }
1802
1803 if (src_string[length - 1] != '\0') {
1804 uacpi_error("non-null-terminated resource source string\n");
1807 }
1808
1809 dst_string = PTR_AT(resource_end, accumulator);
1810 uacpi_memcpy(dst_string, src_string, length);
1811
1813 dst_name.label->length = length;
1814 dst_name.label->string = dst_string;
1815 } else {
1816 dst_name.source->length = length;
1817 dst_name.source->string = dst_string;
1818 }
1819
1820 break;
1821 }
1822
1824 uacpi_memcpy_zerout(&accumulator, src,
1825 sizeof(accumulator), sizeof(uacpi_u16));
1826 CHECK_AML_OFFSET(accumulator, "pin table");
1827
1828 accumulator -= base_aml_size_with_header;
1829 break;
1830
1832 uacpi_u16 entry_count = accumulator / 2;
1833
1834 /*
1835 * Pin table is stored right at the end of the resource buffer,
1836 * copy the data there.
1837 */
1839 resource_end,
1840 data + base_aml_size_with_header,
1841 accumulator
1842 );
1843
1844 // Set pin_table_length
1845 uacpi_memcpy(dst, &entry_count, sizeof(entry_count));
1846
1847 // Set pin_table pointer
1849 &resource_end, sizeof(void*));
1850 break;
1851 }
1852
1855 uacpi_u16 data_offset, offset_from_end;
1856 void *native_dst, *vendor_data;
1857
1858 uacpi_memcpy(&data_offset, src, sizeof(data_offset));
1859 CHECK_AML_OFFSET(data_offset, "vendor data");
1860
1861 vendor_data = data + data_offset;
1862
1863 /*
1864 * Rebase the offset to cut off the header as it's not included
1865 * in the size fields.
1866 */
1867 data_offset -= header_size;
1868
1869 length = aml_size - data_offset;
1870 if (length == 0)
1871 break;
1872
1873 uacpi_memcpy(dst, &length, sizeof(uacpi_u16));
1874
1875 offset_from_end = data_offset - base_aml_size;
1876 native_dst = PTR_AT(resource_end, offset_from_end);
1877
1878 uacpi_memcpy(native_dst, vendor_data, length);
1880 &native_dst, sizeof(void*));
1881 break;
1882 }
1883
1885 uacpi_resource_serial_bus_common *serial_bus_common;
1886 uacpi_u8 serial_type, extra_size, type_length;
1887
1888 serial_bus_common = &resource->serial_bus_common;
1889 serial_type = *src;
1890 serial_bus_common->type = serial_type;
1891 resource->type = aml_serial_to_native_type(serial_type);
1892
1893 /*
1894 * Now that we know the serial type rebase the end pointers and
1895 * sizes.
1896 */
1897 resource_end = PTR_AT(
1898 resource_end,
1900 );
1901 extra_size = aml_serial_resource_to_extra_aml_size[serial_type];
1902 base_aml_size += extra_size;
1903 base_aml_size_with_header += extra_size;
1904
1905 type_length = serial_bus_common->type_data_length;
1906 if (uacpi_unlikely(type_length < extra_size)) {
1908 "invalid type-specific data length: %d, "
1909 "expected at least %d\n", type_length, extra_size
1910 );
1913 }
1914
1915 /*
1916 * Calculate the length of the vendor data. All the extra data
1917 * beyond the end of type-specific size is considered vendor data.
1918 */
1919 accumulator = type_length - extra_size;
1920 if (accumulator == 0)
1921 break;
1922
1923 serial_bus_common->vendor_data_length = accumulator;
1924 serial_bus_common->vendor_data = resource_end;
1926 resource_end,
1927 data + base_aml_size_with_header,
1928 accumulator
1929 );
1930 break;
1931 }
1932
1934 }
1935 }
1936}
@ UACPI_RESOURCE_CONVERT_OPCODE_PACKED_ARRAY_8
Definition: resources.h:69
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_2
Definition: resources.h:85
@ UACPI_RESOURCE_CONVERT_OPCODE_PIN_TABLE
Definition: resources.h:203
@ UACPI_RESOURCE_CONVERT_OPCODE_PACKED_ARRAY_16
Definition: resources.h:70
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_1
Definition: resources.h:84
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_3
Definition: resources.h:86
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_6
Definition: resources.h:87
@ UACPI_RESOURCE_CONVERT_OPCODE_LOAD_AML_SIZE_32
Definition: resources.h:138
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_LABEL
Definition: resources.h:179
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_SOURCE_NO_INDEX
Definition: resources.h:178
@ UACPI_RESOURCE_CONVERT_OPCODE_LOAD_PIN_TABLE_LENGTH
Definition: resources.h:191
@ UACPI_RESOURCE_CONVERT_OPCODE_SERIAL_TYPE_SPECIFIC
Definition: resources.h:237
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_SOURCE
Definition: resources.h:177
@ UACPI_RESOURCE_CONVERT_OPCODE_VENDOR_DATA
Definition: resources.h:219
#define uacpi_memcpy
Definition: stdlib.h:34
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
Definition: stdlib.c:112
#define UACPI_FALSE
Definition: types.h:30
char uacpi_char
Definition: types.h:44
uint16_t uacpi_u16
Definition: types.h:20
#define UACPI_NULL
Definition: types.h:33
uint8_t uacpi_u8
Definition: types.h:19
#define UACPI_TRUE
Definition: types.h:29
static uacpi_resource_type aml_serial_to_native_type(uacpi_u8 type)
Definition: resources.c:1665
static const uacpi_u8 aml_serial_resource_to_extra_native_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:542
#define PTR_AT(ptr, offset)
Definition: resources.c:1636
#define NATIVE_OFFSET(res, offset)
Definition: resources.c:1638
#define CHECK_AML_OFFSET(offset, what)
Definition: resources.c:1661
#define CONVERSION_OPCODES_COMMON(native_buf)
Definition: resources.c:1570
GLenum src
Definition: glext.h:6340
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum GLenum dst
Definition: glext.h:6340
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
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
Definition: glfuncs.h:248
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
Definition: glfuncs.h:250
static PVOID ptr
Definition: dispmode.c:27
uacpi_u8 native_type
Definition: resources.h:268
const struct uacpi_resource_convert_instruction * to_native
Definition: resources.h:302
uacpi_u16 native_size
Definition: resources.h:283
Definition: pdh_main.c:96

Referenced by uacpi_get_resource_from_buffer(), and uacpi_native_resources_from_aml().

◆ do_native_resource_to_aml()

static uacpi_iteration_decision do_native_resource_to_aml ( void opaque,
uacpi_resource resource 
)
static

Definition at line 2189 of file resources.c.

2192{
2193 struct resource_conversion_ctx *ctx = opaque;
2194 const struct uacpi_resource_spec *spec;
2195 const struct uacpi_resource_convert_instruction *insns, *insn;
2196 uacpi_u8 pc = 0;
2197 uacpi_u8 *dst_base, *src, *dst;
2198 uacpi_u32 aml_size, base_aml_size_with_header, accumulator = 0;
2199 void *resource_end;
2200
2202 aml_size = aml_size_for_native_resource(resource, spec);
2203 insns = spec->to_aml;
2204
2205 dst_base = ctx->byte_buf;
2206 ctx->byte_buf += aml_size;
2208
2209 base_aml_size_with_header = spec->aml_size;
2210 base_aml_size_with_header += aml_resource_kind_to_header_size[
2211 spec->resource_kind
2212 ];
2213 resource_end = PTR_AT(resource, spec->native_size);
2214
2216 *dst_base = ACPI_LARGE_ITEM | type_to_aml_resource[spec->type];
2217 uacpi_memcpy(dst_base + 1, &aml_size, sizeof(uacpi_u16));
2218 } else {
2220 *dst_base |= aml_size;
2221 }
2222
2223 if (insns == UACPI_NULL)
2225
2226 for (;;) {
2227 insn = &insns[pc++];
2228
2230 dst = dst_base + insn->aml_offset;
2231
2232 switch (insn->code) {
2235 uacpi_u8 i, *array_size, bytes = 1;
2236 uacpi_u16 mask = 0;
2237
2239 for (i = 0; i < *array_size; ++i)
2240 mask |= 1 << src[i];
2241
2243 bytes = 2;
2244
2246 break;
2247 }
2248
2253 *dst |= *src << insn->imm;
2254 break;
2255
2257 accumulator = aml_size;
2258 break;
2259
2263 uacpi_size source_offset, length;
2264 uacpi_u8 *dst_string;
2265 const uacpi_char *src_string;
2266 union {
2267 void *ptr;
2270 } src_name = { .ptr = src };
2271
2272 source_offset = base_aml_size_with_header + accumulator;
2273 dst_string = dst_base + source_offset;
2274
2275 if (insn->aml_offset)
2276 uacpi_memcpy(dst, &source_offset, sizeof(uacpi_u16));
2277
2279 src_name.source->index_present)
2280 uacpi_memcpy(dst_string++, &src_name.source->index, 1);
2281
2283 length = src_name.label->length;
2284 src_string = src_name.label->string;
2285 } else {
2286 length = src_name.source->length;
2287 src_string = src_name.source->string;
2288 }
2289
2290 if (length == 0)
2291 break;
2292
2293 if (uacpi_unlikely(src_string == UACPI_NULL)) {
2295 "source string length is %zu but the pointer is NULL\n",
2296 length
2297 );
2300 }
2301
2302 uacpi_memcpy(dst_string, src_string, length);
2303 break;
2304 }
2305
2307 uacpi_memcpy_zerout(&accumulator, src,
2308 sizeof(accumulator), sizeof(uacpi_u16));
2309 accumulator *= sizeof(uacpi_u16);
2310 break;
2311
2313 /*
2314 * The pin table resides right at the end of the base resource,
2315 * set the offset to it in the AML we're encoding.
2316 */
2317 uacpi_memcpy(dst, &base_aml_size_with_header, sizeof(uacpi_u16));
2318
2319 /*
2320 * Copy the actual data. It also resides right at the end of the
2321 * native base resource.
2322 */
2324 dst_base + base_aml_size_with_header,
2325 resource_end,
2326 accumulator
2327 );
2328 break;
2329
2331 uacpi_u16 vendor_data_length, data_offset, vendor_data_offset;
2332 uacpi_u8 *vendor_data;
2333
2334 // Read the vendor_data pointer
2335 uacpi_memcpy(&vendor_data, NATIVE_OFFSET(resource, insn->arg2),
2336 sizeof(void*));
2337 uacpi_memcpy(&vendor_data_length, src, sizeof(uacpi_u16));
2338
2339 if (vendor_data == UACPI_NULL) {
2340 uacpi_size full_aml_size;
2341
2342 if (uacpi_unlikely(vendor_data_length != 0)) {
2344 "vendor_data_length is %d, but pointer is NULL\n",
2345 vendor_data_length
2346 );
2349 }
2350
2351 /*
2352 * There's no vendor data. The specification still mandates
2353 * that we fill the vendor data offset field correctly, meaning
2354 * we set it to the total length of the resource.
2355 */
2356 full_aml_size = aml_size;
2357 full_aml_size += aml_resource_kind_to_header_size[
2358 spec->resource_kind
2359 ];
2360
2361 uacpi_memcpy(dst, &full_aml_size, sizeof(uacpi_u16));
2362 break;
2363 }
2364
2365 /*
2366 * Calculate the offset of vendor data from the end of the native
2367 * resource and use it since it matches the offset from the end of
2368 * the AML resource.
2369 *
2370 * Non-zero value means there's a source string in between.
2371 */
2372 data_offset = vendor_data - (uacpi_u8*)resource_end;
2373 vendor_data_offset = data_offset + base_aml_size_with_header;
2374
2375 // Write vendor_data_offset
2376 uacpi_memcpy(dst, &vendor_data_offset, sizeof(uacpi_u16));
2377
2378 /*
2379 * Write vendor_data_length, this field is right after
2380 * vendor_data_offset, and is completely redundant, but it exists
2381 * nonetheless.
2382 */
2384 dst + sizeof(uacpi_u16),
2385 &vendor_data_length,
2386 sizeof(vendor_data_length)
2387 );
2388
2389 // Finally write the data itself
2391 dst_base + vendor_data_offset,
2392 vendor_data,
2393 vendor_data_length
2394 );
2395 break;
2396 }
2397
2399 uacpi_u8 serial_type = *src;
2400 *dst = serial_type;
2401
2402 ctx->st = validate_aml_serial_type(serial_type);
2403 if (uacpi_unlikely_error(ctx->st))
2405
2406 if (uacpi_unlikely(resource->type !=
2407 aml_serial_to_native_type(serial_type))) {
2409 "native serial resource type %d doesn't match expected %d\n",
2410 resource->type, aml_serial_to_native_type(serial_type)
2411 );
2414 }
2415
2416 // Rebase the end pointer & size now that we know the serial type
2417 resource_end = PTR_AT(
2418 resource_end,
2420 );
2421 base_aml_size_with_header += aml_serial_resource_to_extra_aml_size[
2422 serial_type
2423 ];
2424
2425 accumulator = resource->serial_bus_common.vendor_data_length;
2426 if (accumulator == 0)
2427 break;
2428
2429 // Copy vendor data
2431 dst_base + base_aml_size_with_header,
2432 resource_end,
2433 accumulator
2434 );
2435 break;
2436 }
2437
2439 }
2440 }
2441}
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define ACPI_SMALL_ITEM_NAME_IDX
Definition: acpi.h:1072
#define ACPI_LARGE_ITEM
Definition: acpi.h:1070
#define uacpi_unlikely_error(expr)
Definition: status.h:49
static const uacpi_u8 type_to_aml_resource[]
Definition: resources.c:52
static uacpi_status validate_aml_serial_type(uacpi_u8 type)
Definition: resources.c:1412
static UINT array_size
Definition: msctf.c:67
const struct uacpi_resource_convert_instruction * to_aml
Definition: resources.h:303

Referenced by native_resources_to_aml().

◆ eval_resource_helper()

static uacpi_status eval_resource_helper ( uacpi_namespace_node node,
const uacpi_char method,
uacpi_object **  out_obj 
)
static

Definition at line 1958 of file resources.c.

1962{
1964 uacpi_bool is_device;
1965
1968 return ret;
1969
1970 if (uacpi_unlikely(!is_device))
1972
1974 node, method, out_obj
1975 );
1976}
method
Definition: dragdrop.c:54
uacpi_status uacpi_namespace_node_is(const uacpi_namespace_node *node, uacpi_object_type type, uacpi_bool *out)
Definition: namespace.c:825
bool uacpi_bool
Definition: types.h:31
uacpi_status
Definition: status.h:10
@ UACPI_OBJECT_DEVICE
Definition: types.h:111
return ret
Definition: mutex.c:146
uacpi_status uacpi_eval_simple_buffer(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
Definition: uacpi.c:961
Definition: dlist.c:348

Referenced by extract_native_resources_from_method().

◆ extra_size_for_extended_irq()

static uacpi_size extra_size_for_extended_irq ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 327 of file resources.c.

330{
332 uacpi_size extra_size = 0;
333
334 extra_size += irq->num_irqs * sizeof(uacpi_u32);
335 extra_size += extra_size_for_resource_source(
336 spec->aml_size, size - extra_size
337 );
338
339 return extra_size;
340}
static uacpi_size extra_size_for_resource_source(uacpi_size base_size, uacpi_size reported_size)
Definition: resources.c:255
unsigned char irq
Definition: dsp.h:13

◆ extra_size_for_native_address_or_clock_input()

static uacpi_size extra_size_for_native_address_or_clock_input ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 290 of file resources.c.

293{
296}
#define UACPI_UNUSED(x)
Definition: helpers.h:7

◆ extra_size_for_native_gpio_or_pins()

static uacpi_size extra_size_for_native_gpio_or_pins ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 356 of file resources.c.

359{
360 uacpi_size pin_table_offset;
361
362 /*
363 * These resources pretend to have variable layout by declaring "offset"
364 * fields, but the layout is hardcoded and mandated by the spec to be
365 * very specific. We can use the offset numbers here to calculate the final
366 * length.
367 *
368 * For example, the layout of GPIO connection _always_ looks as follows:
369 * [0...22] -> fixed data
370 * [23...<source name offset - 1>] -> pin table
371 * [<source name offset>...<vendor data offset - 1>] -> source name
372 * [<vendor data offset>...<data offset + data length>] -> vendor data
373 */
374 switch (spec->type) {
376 struct acpi_resource_gpio_connection *gpio = data;
377 pin_table_offset = gpio->pin_table_offset;
378 break;
379 }
380
383 pin_table_offset = pin->pin_table_offset;
384 break;
385 }
386
388 struct acpi_resource_pin_configuration *config = data;
389 pin_table_offset = config->pin_table_offset;
390 break;
391 }
392
395 pin_table_offset = group->pin_table_offset;
396 break;
397 }
398
399 default:
400 return 0;
401 }
402
403 /*
404 * The size we get passed here does not include the header size because
405 * that's how resources are encoded. Subtract it here so that we get the
406 * correct final length.
407 */
408 return size - (pin_table_offset - LARGE_ITEM_HEADER_SIZE);
409}
@ UACPI_AML_RESOURCE_PIN_GROUP
Definition: resources.h:37
@ UACPI_AML_RESOURCE_PIN_CONFIGURATION
Definition: resources.h:36
@ UACPI_AML_RESOURCE_PIN_FUNCTION
Definition: resources.h:34
@ UACPI_AML_RESOURCE_GPIO_CONNECTION
Definition: resources.h:33
GLboolean GLuint group
Definition: glext.h:11120
Definition: regsvr.c:104

◆ extra_size_for_native_irq_or_dma()

static uacpi_size extra_size_for_native_irq_or_dma ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 131 of file resources.c.

134{
137 uacpi_u8 i, total_bits, num_bits = 0;
138
139 if (spec->type == UACPI_AML_RESOURCE_IRQ) {
140 struct acpi_resource_irq *irq = data;
141 mask = irq->irq_mask;
142 total_bits = 16;
143 } else {
144 struct acpi_resource_dma *dma = data;
145 mask = dma->channel_mask;
146 total_bits = 8;
147 }
148
149 for (i = 0; i < total_bits; ++i)
150 num_bits += !!(mask & (1 << i));
151
152 return num_bits;
153}
@ UACPI_AML_RESOURCE_IRQ
Definition: resources.h:12

◆ extra_size_for_native_pin_group()

static uacpi_size extra_size_for_native_pin_group ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 462 of file resources.c.

465{
466 uacpi_size source_offset;
467
468 switch (spec->type) {
471 source_offset = func->source_offset;
472 break;
473 }
474
476 struct acpi_resource_pin_group_configuration *config = data;
477 source_offset = config->source_offset;
478 break;
479 }
480
481 default:
482 return 0;
483 }
484
485 // Same logic as extra_size_for_native_gpio_or_pins
486 return size - (source_offset - LARGE_ITEM_HEADER_SIZE);
487}
@ UACPI_AML_RESOURCE_PIN_GROUP_FUNCTION
Definition: resources.h:38
@ UACPI_AML_RESOURCE_PIN_GROUP_CONFIGURATION
Definition: resources.h:39
GLenum func
Definition: glext.h:6028

◆ extra_size_for_native_vendor()

static uacpi_size extra_size_for_native_vendor ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 220 of file resources.c.

223{
224 UACPI_UNUSED(spec);
226 return size;
227}

◆ extra_size_for_resource_source()

static uacpi_size extra_size_for_resource_source ( uacpi_size  base_size,
uacpi_size  reported_size 
)
static

Definition at line 255 of file resources.c.

258{
259 uacpi_size string_length;
260
261 if (reported_size <= base_size)
262 return 0;
263
264 /*
265 * The remainder of the descriptor minus the resource index field
266 */
267 string_length = (reported_size - base_size) - 1;
268 return UACPI_ALIGN_UP(string_length, sizeof(void*), uacpi_size);
269}
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106

Referenced by extra_size_for_extended_irq(), and extra_size_for_native_address_or_clock_input().

◆ extra_size_for_serial_connection()

static uacpi_size extra_size_for_serial_connection ( const struct uacpi_resource_spec spec,
void data,
uacpi_size  size 
)
static

Definition at line 549 of file resources.c.

552{
553 struct acpi_resource_serial *serial = data;
554 uacpi_size extra_bytes = size;
555
556 extra_bytes -= spec->aml_size;
557 extra_bytes -= aml_serial_resource_to_extra_aml_size[serial->type];
559
560 return extra_bytes;
561}
uint32_t serial
Definition: fsck.fat.h:29

◆ extract_native_resources_from_method()

static uacpi_status extract_native_resources_from_method ( uacpi_namespace_node device,
const uacpi_char method,
uacpi_resources **  out_resources 
)
static

Definition at line 2072 of file resources.c.

2076{
2080
2083 return ret;
2084
2085 uacpi_buffer_to_view(obj->buffer, &buffer);
2086
2087 ret = uacpi_native_resources_from_aml(buffer, out_resources);
2089
2090 return ret;
2091}
void uacpi_buffer_to_view(uacpi_buffer *, uacpi_data_view *)
Definition: types.c:1034
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
uacpi_status uacpi_native_resources_from_aml(uacpi_data_view aml_buffer, uacpi_resources **out_resources)
Definition: resources.c:1978
static uacpi_status eval_resource_helper(uacpi_namespace_node *node, const uacpi_char *method, uacpi_object **out_obj)
Definition: resources.c:1958
GLuint buffer
Definition: glext.h:5915
Definition: devices.h:37

Referenced by uacpi_for_each_device_resource(), uacpi_get_current_resources(), uacpi_get_device_resources(), and uacpi_get_possible_resources().

◆ find_end()

static uacpi_iteration_decision find_end ( void opaque,
uacpi_u8 data,
uacpi_u16  resource_size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1499 of file resources.c.

1503{
1504 uacpi_u8 **out_ptr = opaque;
1505 UACPI_UNUSED(resource_size);
1506
1507 if (spec->type != UACPI_AML_RESOURCE_END_TAG)
1509
1510 *out_ptr = data;
1512}
@ UACPI_AML_RESOURCE_END_TAG
Definition: resources.h:20

Referenced by uacpi_find_aml_resource_end_tag().

◆ get_aml_resource_size()

static uacpi_status get_aml_resource_size ( uacpi_u8 data,
uacpi_size  bytes_left,
uacpi_u16 out_size 
)
static

Definition at line 1380 of file resources.c.

1383{
1385
1386 /*
1387 * Resource header is not included in size for both, so we subtract
1388 * the header size from bytes_left to validate it.
1389 */
1390 if (*data & ACPI_LARGE_ITEM) {
1391 if (uacpi_unlikely(bytes_left < 3))
1393
1394 uacpi_memcpy(&size, data + 1, sizeof(size));
1397 ];
1398 } else {
1402 ];
1403 }
1404
1405 if (uacpi_unlikely(size > bytes_left))
1407
1408 *out_size = size;
1409 return UACPI_STATUS_OK;
1410}
#define ACPI_SMALL_ITEM_LENGTH_MASK
Definition: acpi.h:1074
@ UACPI_STATUS_OK
Definition: status.h:11
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:100

Referenced by uacpi_for_each_aml_resource().

◆ get_aml_resource_type()

static enum uacpi_aml_resource get_aml_resource_type ( uacpi_u8  raw_byte)
static

Definition at line 1367 of file resources.c.

1368{
1369 if (raw_byte & ACPI_LARGE_ITEM) {
1370 return aml_resource_to_type[
1372 ];
1373 }
1374
1375 return aml_resource_to_type[
1377 ];
1378}
#define ACPI_SMALL_ITEM_NAME_MASK
Definition: acpi.h:1073
#define ACPI_LARGE_ITEM_NAME_MASK
Definition: acpi.h:1076
static const uacpi_u8 aml_resource_to_type[256]
Definition: resources.c:19
#define LARGE_RESOURCE_BASE
Definition: resources.c:12

Referenced by uacpi_for_each_aml_resource().

◆ native_resources_to_aml()

static uacpi_status native_resources_to_aml ( uacpi_resources native_resources,
void aml_buffer 
)
static

Definition at line 2445 of file resources.c.

2448{
2450 struct resource_conversion_ctx ctx = {
2451 .buf = aml_buffer,
2452 };
2453
2455 native_resources, do_native_resource_to_aml, &ctx
2456 );
2458 // An end tag is always included
2461 }
2463 return ret;
2464
2465 return ctx.st;
2466}
@ UACPI_STATUS_NO_RESOURCE_END_TAG
Definition: status.h:26
static uacpi_iteration_decision do_native_resource_to_aml(void *opaque, uacpi_resource *resource)
Definition: resources.c:2189
uacpi_status uacpi_for_each_resource(uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user)
Definition: resources.c:2115
#define INLINE_END_TAG
Definition: resources.c:2443

Referenced by uacpi_native_resources_to_aml().

◆ native_size_for_aml_resource()

static uacpi_size native_size_for_aml_resource ( uacpi_u8 data,
uacpi_u16  size,
const struct uacpi_resource_spec spec 
)
static

Definition at line 1514 of file resources.c.

1517{
1518 uacpi_size final_size = spec->native_size;
1519
1520 if (spec->extra_size_for_native)
1521 final_size += spec->extra_size_for_native(spec, data, size);
1522
1523 return UACPI_ALIGN_UP(final_size, sizeof(void*), uacpi_size);
1524}
uacpi_size(* extra_size_for_native)(const struct uacpi_resource_spec *, void *, uacpi_size)
Definition: resources.h:290

Referenced by accumulate_native_buffer_size(), and do_aml_resource_to_native().

◆ resource_spec_from_native()

static const struct uacpi_resource_spec * resource_spec_from_native ( uacpi_resource resource)
static

Definition at line 2173 of file resources.c.

2176{
2178}
const struct uacpi_resource_spec aml_resources[UACPI_AML_RESOURCE_MAX+1]
Definition: resources.c:1095
static const uacpi_u8 native_resource_to_type[UACPI_RESOURCE_TYPE_MAX+1]
Definition: resources.c:84

Referenced by accumulate_aml_buffer_size(), and do_native_resource_to_aml().

◆ size_for_aml_address_or_clock_input()

static uacpi_size size_for_aml_address_or_clock_input ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 298 of file resources.c.

301{
303 bool has_index = UACPI_TRUE;
304
305 switch (resource->type) {
307 source = &resource->address16.source;
308 break;
310 source = &resource->address32.source;
311 break;
313 source = &resource->address64.source;
314 break;
316 source = &resource->clock_input.source;
317 has_index = UACPI_FALSE;
318 break;
319 default:
320 return 0;
321 }
322
323 return aml_size_with_header(spec) +
325}
@ UACPI_RESOURCE_TYPE_ADDRESS32
Definition: resources.h:22
@ UACPI_RESOURCE_TYPE_ADDRESS16
Definition: resources.h:21
@ UACPI_RESOURCE_TYPE_ADDRESS64
Definition: resources.h:23
@ UACPI_RESOURCE_TYPE_CLOCK_INPUT
Definition: resources.h:54
static uacpi_size size_for_aml_resource_source(uacpi_resource_source *source, uacpi_bool with_index)
Definition: resources.c:271

◆ size_for_aml_extended_irq()

static uacpi_size size_for_aml_extended_irq ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 342 of file resources.c.

345{
346 uacpi_resource_extended_irq *irq = &resource->extended_irq;
348
350 size += irq->num_irqs * 4;
352
353 return size;
354}

◆ size_for_aml_gpio_or_pins()

static uacpi_size size_for_aml_gpio_or_pins ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 411 of file resources.c.

414{
415 uacpi_size source_length, vendor_length, pin_table_length, size;
416
418 switch (spec->type) {
420 uacpi_resource_gpio_connection *res = &resource->gpio_connection;
421 source_length = res->source.length;
422 pin_table_length = res->pin_table_length;
423 vendor_length = res->vendor_data_length;
424 break;
425 }
426
428 uacpi_resource_pin_function *res = &resource->pin_function;
429 source_length = res->source.length;
430 pin_table_length = res->pin_table_length;
431 vendor_length = res->vendor_data_length;
432 break;
433 }
434
436 uacpi_resource_pin_configuration *res = &resource->pin_configuration;
437 source_length = res->source.length;
438 pin_table_length = res->pin_table_length;
439 vendor_length = res->vendor_data_length;
440 break;
441 }
442
445 source_length = res->label.length;
446 pin_table_length = res->pin_table_length;
447 vendor_length = res->vendor_data_length;
448 break;
449 }
450
451 default:
452 return 0;
453 }
454
455 size += source_length;
456 size += pin_table_length * 2;
457 size += vendor_length;
458
459 return size;
460}
GLuint res
Definition: glext.h:9613

◆ size_for_aml_irq()

static uacpi_size size_for_aml_irq ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 155 of file resources.c.

158{
161
163
164 switch (irq->length_kind) {
166 goto out_full;
169 if (irq->triggering != UACPI_TRIGGERING_EDGE)
170 goto out_full;
171 if (irq->polarity != UACPI_POLARITY_ACTIVE_HIGH)
172 goto out_full;
173 if (irq->sharing != UACPI_EXCLUSIVE)
174 goto out_full;
175
176 return size - 1;
177 }
178
179out_full:
180 if (uacpi_unlikely(irq->length_kind ==
182 uacpi_warn("requested IRQ resource length is "
183 "not compatible with specified flags, corrected\n");
184 }
185
186 return size;
187}
#define uacpi_warn(...)
Definition: log.h:20
#define UACPI_EXCLUSIVE
Definition: resources.h:99
#define UACPI_POLARITY_ACTIVE_HIGH
Definition: resources.h:94
@ UACPI_RESOURCE_LENGTH_KIND_DONT_CARE
Definition: resources.h:84
@ UACPI_RESOURCE_LENGTH_KIND_ONE_LESS
Definition: resources.h:85
@ UACPI_RESOURCE_LENGTH_KIND_FULL
Definition: resources.h:86
#define UACPI_TRIGGERING_EDGE
Definition: resources.h:90

◆ size_for_aml_pin_group()

static uacpi_size size_for_aml_pin_group ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 489 of file resources.c.

492{
493 uacpi_size source_length, label_length, vendor_length, size;
494
496 switch (spec->type) {
498 uacpi_resource_pin_group_function *res = &resource->pin_group_function;
499 source_length = res->source.length;
500 label_length = res->label.length;
501 vendor_length = res->vendor_data_length;
502 break;
503 }
504
507 res = &resource->pin_group_configuration;
508 source_length = res->source.length;
509 label_length = res->label.length;
510 vendor_length = res->vendor_data_length;
511 break;
512 }
513
514 default:
515 return 0;
516 }
517
518 size += source_length;
519 size += label_length;
520 size += vendor_length;
521
522 return size;
523}

◆ size_for_aml_resource_source()

static uacpi_size size_for_aml_resource_source ( uacpi_resource_source source,
uacpi_bool  with_index 
)
static

Definition at line 271 of file resources.c.

274{
275 uacpi_size length = source->length;
276
277 if (uacpi_unlikely(length && !source->index_present)) {
278 uacpi_warn("resource declares no source index with non-empty "
279 "string (%zu bytes), corrected\n", length);
280 source->index_present = UACPI_TRUE;
281 }
282
283 // If index is included in the dynamic resource source, add it to the length
284 if (with_index)
285 length += source->index_present;
286
287 return length;
288}

Referenced by size_for_aml_address_or_clock_input(), and size_for_aml_extended_irq().

◆ size_for_aml_start_dependent()

static uacpi_size size_for_aml_start_dependent ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 189 of file resources.c.

192{
193 uacpi_resource_start_dependent *start_dep = &resource->start_dependent;
195
197 switch (start_dep->length_kind) {
199 goto out_full;
202 if (start_dep->compatibility != UACPI_ACCEPTABLE)
203 goto out_full;
204 if (start_dep->performance != UACPI_ACCEPTABLE)
205 goto out_full;
206
207 return size - 1;
208 }
209
210out_full:
211 if (uacpi_unlikely(start_dep->length_kind ==
213 uacpi_warn("requested StartDependentFn resource length is "
214 "not compatible with specified flags, corrected\n");
215 }
216
217 return size;
218}
#define UACPI_ACCEPTABLE
Definition: resources.h:314

◆ size_for_aml_vendor()

static uacpi_size size_for_aml_vendor ( const struct uacpi_resource_spec spec,
uacpi_resource resource 
)
static

Definition at line 229 of file resources.c.

232{
233 UACPI_UNUSED(spec);
234 uacpi_size size = resource->vendor.length;
235
236 if (size > 7 || resource->type == UACPI_RESOURCE_TYPE_VENDOR_LARGE) {
239 ];
240
242 uacpi_warn("vendor data too large for small descriptor (%zu), "
243 "correcting to large\n", size);
245 }
246 } else {
249 ];
250 }
251
252 return size;
253}
@ UACPI_RESOURCE_TYPE_VENDOR_LARGE
Definition: resources.h:37

◆ uacpi_find_aml_resource_end_tag()

uacpi_status uacpi_find_aml_resource_end_tag ( uacpi_data_view  buffer,
uacpi_size out_offset 
)

Definition at line 1526 of file resources.c.

1529{
1530 uacpi_u8 *end_tag_ptr = UACPI_NULL;
1532
1533 if (buffer.length == 0) {
1534 *out_offset = 0;
1535 return UACPI_STATUS_OK;
1536 }
1537
1538 /*
1539 * This returning UACPI_STATUS_OK guarantees that end_tag_ptr is set to
1540 * a valid value because a missing end tag would produce a
1541 * UACPI_STATUS_NO_RESOURCE_END_TAG error.
1542 */
1545 return ret;
1546
1547 *out_offset = end_tag_ptr - buffer.bytes;
1548 return UACPI_STATUS_OK;
1549}
uacpi_status uacpi_for_each_aml_resource(uacpi_data_view buffer, uacpi_aml_resource_iteration_callback cb, void *user)
Definition: resources.c:1423
static uacpi_iteration_decision find_end(void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1499

Referenced by handle_concatenate_res().

◆ uacpi_for_each_aml_resource()

uacpi_status uacpi_for_each_aml_resource ( uacpi_data_view  buffer,
uacpi_aml_resource_iteration_callback  cb,
void user 
)

Definition at line 1423 of file resources.c.

1426{
1428 uacpi_iteration_decision decision;
1429 uacpi_u8 *data;
1430 uacpi_size bytes_left;
1431 uacpi_u16 resource_size;
1433 const struct uacpi_resource_spec *spec;
1434
1435 bytes_left = buffer.length;
1436 data = buffer.bytes;
1437
1438 while (bytes_left) {
1442
1443 ret = get_aml_resource_size(data, bytes_left, &resource_size);
1445 return ret;
1446
1447 spec = &aml_resources[type];
1448 switch (spec->size_kind) {
1450 if (resource_size != spec->aml_size)
1452 break;
1454 if (resource_size < spec->aml_size)
1456 break;
1458 if (resource_size != spec->aml_size &&
1459 resource_size != (spec->aml_size - 1))
1461 break;
1462 default:
1464 }
1465
1467 struct acpi_resource_serial *serial;
1468
1469 serial = (struct acpi_resource_serial*)data;
1470
1473 return ret;
1474 }
1475
1476 decision = cb(user, data, resource_size, spec);
1477 switch (decision) {
1479 return UACPI_STATUS_OK;
1481 uacpi_size total_size = resource_size;
1482
1484 data += total_size;
1485 bytes_left -= total_size;
1486 break;
1487 }
1488 default:
1490 }
1491
1493 return UACPI_STATUS_OK;
1494 }
1495
1497}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
uacpi_aml_resource
Definition: resources.h:8
@ UACPI_AML_RESOURCE_TYPE_INVALID
Definition: resources.h:9
@ UACPI_AML_RESOURCE_SERIAL_CONNECTION
Definition: resources.h:35
@ UACPI_AML_RESOURCE_SIZE_KIND_FIXED
Definition: resources.h:45
@ UACPI_AML_RESOURCE_SIZE_KIND_FIXED_OR_ONE_LESS
Definition: resources.h:46
@ UACPI_AML_RESOURCE_SIZE_KIND_VARIABLE
Definition: resources.h:47
@ UACPI_STATUS_INTERNAL_ERROR
Definition: status.h:21
uacpi_iteration_decision
Definition: types.h:28
static enum uacpi_aml_resource get_aml_resource_type(uacpi_u8 raw_byte)
Definition: resources.c:1367
static uacpi_status get_aml_resource_size(uacpi_u8 *data, uacpi_size bytes_left, uacpi_u16 *out_size)
Definition: resources.c:1380
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
uacpi_u8 size_kind
Definition: resources.h:270

Referenced by uacpi_find_aml_resource_end_tag(), uacpi_get_resource_from_buffer(), and uacpi_native_resources_from_aml().

◆ uacpi_for_each_device_resource()

uacpi_status uacpi_for_each_device_resource ( uacpi_namespace_node device,
const uacpi_char method,
uacpi_resource_iteration_callback  cb,
void user 
)

Definition at line 2155 of file resources.c.

2159{
2162
2165 return ret;
2166
2169
2170 return ret;
2171}
void uacpi_free_resources(uacpi_resources *resources)
Definition: resources.c:2056
static uacpi_status extract_native_resources_from_method(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
Definition: resources.c:2072
FxCmResList * resources

◆ uacpi_for_each_resource()

uacpi_status uacpi_for_each_resource ( uacpi_resources resources,
uacpi_resource_iteration_callback  cb,
void user 
)

Definition at line 2115 of file resources.c.

2118{
2119 uacpi_size bytes_left = resources->length;
2120 uacpi_resource *current = resources->entries;
2121 uacpi_iteration_decision decision;
2122
2123 while (bytes_left) {
2124 // At least the head bytes
2125 if (uacpi_unlikely(bytes_left < 4)) {
2126 uacpi_error("corrupted resource buffer %p length %zu\n",
2127 resources, resources->length);
2129 }
2130
2132 uacpi_error("invalid resource type %d\n", current->type);
2134 }
2135
2136 if (uacpi_unlikely(current->length > bytes_left)) {
2137 uacpi_error("corrupted resource@%p length %u (%zu bytes left)\n",
2138 current, current->length, bytes_left);
2140 }
2141
2142 decision = cb(user, current);
2143
2144 if (decision == UACPI_ITERATION_DECISION_BREAK ||
2146 return UACPI_STATUS_OK;
2147
2148 bytes_left -= current->length;
2149 current = (uacpi_resource*)((uacpi_u8*)current + current->length);
2150 }
2151
2153}
@ UACPI_RESOURCE_TYPE_MAX
Definition: resources.h:57
@ UACPI_RESOURCE_TYPE_END_TAG
Definition: resources.h:56
struct task_struct * current
Definition: linux.c:32

Referenced by native_resources_to_aml(), uacpi_for_each_device_resource(), and uacpi_native_resources_to_aml().

◆ uacpi_free_resource()

void uacpi_free_resource ( uacpi_resource resource)

Definition at line 2064 of file resources.c.

2065{
2066 if (resource == UACPI_NULL)
2067 return;
2068
2069 uacpi_free(resource, resource->length);
2070}
#define uacpi_free(mem, _)
Definition: stdlib.h:96

Referenced by uacpi_get_resource_from_buffer().

◆ uacpi_free_resources()

void uacpi_free_resources ( uacpi_resources resources)

Definition at line 2056 of file resources.c.

2057{
2058 if (resources == UACPI_NULL)
2059 return;
2060
2061 uacpi_free(resources, sizeof(uacpi_resources) + resources->length);
2062}

Referenced by uacpi_for_each_device_resource(), and uacpi_native_resources_from_aml().

◆ uacpi_get_current_resources()

uacpi_status uacpi_get_current_resources ( uacpi_namespace_node device,
uacpi_resources **  out_resources 
)

Definition at line 2093 of file resources.c.

2096{
2097 return extract_native_resources_from_method(device, "_CRS", out_resources);
2098}

◆ uacpi_get_device_resources()

uacpi_status uacpi_get_device_resources ( uacpi_namespace_node device,
const uacpi_char method,
uacpi_resources **  out_resources 
)

Definition at line 2107 of file resources.c.

2111{
2112 return extract_native_resources_from_method(device, method, out_resources);
2113}

◆ uacpi_get_possible_resources()

uacpi_status uacpi_get_possible_resources ( uacpi_namespace_node device,
uacpi_resources **  out_resources 
)

Definition at line 2100 of file resources.c.

2103{
2104 return extract_native_resources_from_method(device, "_PRS", out_resources);
2105}

◆ uacpi_get_resource_from_buffer()

uacpi_status uacpi_get_resource_from_buffer ( uacpi_data_view  aml_buffer,
uacpi_resource **  out_resource 
)

Definition at line 2021 of file resources.c.

2024{
2026 struct resource_conversion_ctx ctx = {
2027 .just_one = UACPI_TRUE,
2028 };
2030
2033 );
2035 return ret;
2036
2040
2041 ctx = (struct resource_conversion_ctx) {
2042 .buf = resource,
2043 .just_one = UACPI_TRUE,
2044 };
2045
2049 return ret;
2050 }
2051
2052 *out_resource = resource;
2053 return ret;
2054}
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
static uacpi_iteration_decision accumulate_native_buffer_size(void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1938
static uacpi_iteration_decision do_aml_resource_to_native(void *opaque, uacpi_u8 *data, uacpi_u16 aml_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1673
void uacpi_free_resource(uacpi_resource *resource)
Definition: resources.c:2064
#define resource
Definition: kernel32.h:9

◆ uacpi_native_resources_from_aml()

uacpi_status uacpi_native_resources_from_aml ( uacpi_data_view  aml_buffer,
uacpi_resources **  out_resources 
)

Definition at line 1978 of file resources.c.

1981{
1983 struct resource_conversion_ctx ctx = { 0 };
1985
1988 );
1990 return ret;
1991
1992 if (uacpi_unlikely_error(ctx.st))
1993 return ctx.st;
1994
1995 // Realistically any resource buffer bigger than this is probably a bug
1996 if (uacpi_unlikely(ctx.size > (5 * 1024u * 1024u))) {
1997 uacpi_error("bug: bogus native resource buffer size %zu\n", ctx.size);
1999 }
2000
2004 resources->length = ctx.size;
2005 resources->entries = UACPI_PTR_ADD(resources, sizeof(uacpi_resources));
2006
2007 ctx = (struct resource_conversion_ctx) {
2008 .buf = resources->entries,
2009 };
2010
2014 return ret;
2015 }
2016
2017 *out_resources = resources;
2018 return ret;
2019}
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23

Referenced by extract_native_resources_from_method().

◆ uacpi_native_resources_to_aml()

uacpi_status uacpi_native_resources_to_aml ( uacpi_resources resources,
uacpi_object **  out_template 
)

Definition at line 2491 of file resources.c.

2494{
2497 void *buffer;
2498 struct resource_conversion_ctx ctx = { 0 };
2499
2502 );
2504 // An end tag is always included
2507 }
2509 return ret;
2510 if (uacpi_unlikely_error(ctx.st))
2511 return ctx.st;
2512
2513 // Same reasoning as native_resource_from_aml
2514 if (uacpi_unlikely(ctx.size > (5 * 1024u * 1024u))) {
2515 uacpi_error("bug: bogus target aml resource buffer size %zu\n",
2516 ctx.size);
2518 }
2519
2523
2525 if (uacpi_unlikely(obj == UACPI_NULL)) {
2526 uacpi_free(buffer, ctx.size);
2528 }
2529
2530 obj->buffer->data = buffer;
2531 obj->buffer->size = ctx.size;
2532
2536
2537 if (ret == UACPI_STATUS_OK)
2538 *out_template = obj;
2539
2540 return ret;
2541}
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
@ UACPI_OBJECT_BUFFER
Definition: types.h:108
static uacpi_iteration_decision accumulate_aml_buffer_size(void *opaque, uacpi_resource *resource)
Definition: resources.c:2468
static uacpi_status native_resources_to_aml(uacpi_resources *native_resources, void *aml_buffer)
Definition: resources.c:2445

Referenced by uacpi_set_resources().

◆ uacpi_set_resources()

uacpi_status uacpi_set_resources ( uacpi_namespace_node device,
uacpi_resources resources 
)

Definition at line 2543 of file resources.c.

2546{
2548 uacpi_object *res_template;
2550
2553 return ret;
2554
2555 args.objects = &res_template;
2556 args.count = 1;
2557 ret = uacpi_eval(device, "_SRS", &args, UACPI_NULL);
2558
2559 uacpi_object_unref(res_template);
2560 return ret;
2561}
uacpi_status uacpi_native_resources_to_aml(uacpi_resources *resources, uacpi_object **out_template)
Definition: resources.c:2491
#define args
Definition: format.c:66
Definition: match.c:390
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:699

◆ validate_aml_serial_type()

static uacpi_status validate_aml_serial_type ( uacpi_u8  type)
static

Definition at line 1412 of file resources.c.

1413{
1416 uacpi_error("invalid/unsupported serial connection type %d\n", type);
1418 }
1419
1420 return UACPI_STATUS_OK;
1421}
#define ACPI_SERIAL_TYPE_CSI2
Definition: acpi.h:1309

Referenced by do_native_resource_to_aml(), and uacpi_for_each_aml_resource().

Variable Documentation

◆ aml_resource_kind_to_header_size

◆ aml_resource_to_type

const uacpi_u8 aml_resource_to_type[256]
static

Definition at line 19 of file resources.c.

Referenced by get_aml_resource_type().

◆ aml_resources

◆ aml_serial_resource_to_extra_aml_size

const uacpi_u8 aml_serial_resource_to_extra_aml_size[ACPI_SERIAL_TYPE_MAX+1]
static

◆ aml_serial_resource_to_extra_native_size

◆ convert_address64_extended

const struct uacpi_resource_convert_instruction convert_address64_extended[]
static
Initial value:
= {
CONVERT_GENERAL_ADDRESS_FLAGS(address64_extended),
OP(FIELD_8, AML_F(address64_extended, revision_id),
NATIVE_F(address64_extended, revision_id)),
OP(FIELD_64, AML_F(address64_extended, granularity),
NATIVE_F(address64_extended, granularity), IMM(6)),
CONVERT_TYPE_SPECIFIC_FLAGS(address64_extended),
}
#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type)
Definition: resources.c:740
#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type)
Definition: resources.c:773

Definition at line 802 of file resources.c.

◆ convert_clock_input

const struct uacpi_resource_convert_instruction convert_clock_input[]
static
Initial value:
= {
OP(FIELD_8, AML_F(clock_input, revision_id),
NATIVE_F(clock_input, revision_id)),
OP(BIT_FIELD_1, AML_F(clock_input, flags), NATIVE_F(clock_input, frequency),
IMM(0)),
OP(BIT_FIELD_2, AML_F(clock_input, flags), NATIVE_F(clock_input, scale),
IMM(1)),
OP(FIELD_16, AML_F(clock_input, divisor), NATIVE_F(clock_input, divisor)),
OP(FIELD_32, AML_F(clock_input, numerator), NATIVE_F(clock_input, numerator)),
OP(FIELD_8, AML_F(clock_input, source_index), NATIVE_F(clock_input, source.index)),
OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(clock_input, source)),
END(),
}
#define END()
Definition: resources.c:584
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
GLuint divisor
Definition: glext.h:6313
GLbitfield flags
Definition: glext.h:7161
static LARGE_INTEGER * frequency
Definition: time.c:106

Definition at line 832 of file resources.c.

◆ convert_dma

Initial value:
= {
OP(PACKED_ARRAY_8, AML_F(dma, channel_mask), NATIVE_F(dma, channels),
ARG2(NATIVE_O(dma, num_channels))),
OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, transfer_type), IMM(0)),
OP(BIT_FIELD_1, AML_F(dma, flags), NATIVE_F(dma, bus_master_status), IMM(2)),
OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, channel_speed), IMM(5)),
END(),
}
int This channels
Definition: rdpsnd_libao.c:37

Definition at line 632 of file resources.c.

◆ convert_extended_irq

const struct uacpi_resource_convert_instruction convert_extended_irq[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, direction), IMM(0)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, triggering), IMM(1)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, polarity), IMM(2)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, sharing), IMM(3)),
OP(BIT_FIELD_1, AML_F(extended_irq, flags),
NATIVE_F(extended_irq, wake_capability), IMM(4)),
OP(LOAD_8_STORE, AML_F(extended_irq, num_irqs),
NATIVE_F(extended_irq, num_irqs), IMM(4)),
OP(RESOURCE_SOURCE, NATIVE_F(extended_irq, source)),
OP(FIELD_8, AML_F(extended_irq, irqs), NATIVE_F(extended_irq, irqs)),
END(),
}
uacpi_u16 uacpi_gpe_triggering triggering
Definition: event.h:118
static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
Definition: pipe.c:70

Definition at line 812 of file resources.c.

◆ convert_fixed_dma

const struct uacpi_resource_convert_instruction convert_fixed_dma[]
static
Initial value:
= {
OP(FIELD_16, AML_F(fixed_dma, request_line),
NATIVE_F(fixed_dma, request_line)),
OP(FIELD_16, AML_F(fixed_dma, channel), NATIVE_F(fixed_dma, channel)),
OP(FIELD_8, AML_F(fixed_dma, transfer_width),
NATIVE_F(fixed_dma, transfer_width)),
END(),
}

Definition at line 685 of file resources.c.

◆ convert_fixed_io

const struct uacpi_resource_convert_instruction convert_fixed_io[]
static
Initial value:
= {
OP(FIELD_16, AML_F(fixed_io, address), NATIVE_F(fixed_io, address)),
OP(FIELD_8, AML_F(fixed_io, length), NATIVE_F(fixed_io, length)),
END(),
}

Definition at line 679 of file resources.c.

◆ convert_fixed_memory32

const struct uacpi_resource_convert_instruction convert_fixed_memory32[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(fixed_memory32, information),
NATIVE_F(fixed_memory32, write_status), IMM(0)),
OP(FIELD_32, AML_F(fixed_memory32, address),
NATIVE_F(fixed_memory32, address)),
OP(FIELD_32, AML_F(fixed_memory32, length),
NATIVE_F(fixed_memory32, length)),
END(),
}
static PDB_INFORMATION information
Definition: db.cpp:178
static void write_status(LPCWSTR lpFmt,...)
Definition: dwnl.c:45

Definition at line 721 of file resources.c.

◆ convert_generic_register

const struct uacpi_resource_convert_instruction convert_generic_register[]
static
Initial value:
= {
OP(FIELD_8, AML_F(generic_register, address_space_id),
NATIVE_F(generic_register, address_space_id), IMM(4)),
OP(FIELD_64, AML_F(generic_register, address),
NATIVE_F(generic_register, address)),
END(),
}

Definition at line 732 of file resources.c.

◆ convert_generic_serial_bus

const struct uacpi_resource_convert_instruction convert_generic_serial_bus[]
static

Definition at line 992 of file resources.c.

◆ convert_gpio_connection

const struct uacpi_resource_convert_instruction convert_gpio_connection[]
static

Definition at line 866 of file resources.c.

◆ convert_io

Initial value:
= {
OP(BIT_FIELD_1, AML_F(io, information), NATIVE_F(io, decode_type)),
OP(FIELD_16, AML_F(io, minimum), NATIVE_F(io, minimum)),
OP(FIELD_16, AML_F(io, maximum), NATIVE_F(io, maximum)),
OP(FIELD_8, AML_F(io, length), NATIVE_F(io, length)),
END(),
}
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
Definition: align.cpp:48
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:100

Definition at line 670 of file resources.c.

◆ convert_irq_to_aml

Initial value:
= {
OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
ARG2(NATIVE_O(irq, num_irqs))),
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(4)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
END(),
}
#define ARG0(value)
Definition: resources.c:599

Definition at line 621 of file resources.c.

◆ convert_irq_to_native

const struct uacpi_resource_convert_instruction convert_irq_to_native[]
static
Initial value:
= {
OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
ARG2(NATIVE_O(irq, num_irqs))),
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(6)),
OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
END(),
OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
END(),
}

Definition at line 604 of file resources.c.

◆ convert_memory24

const struct uacpi_resource_convert_instruction convert_memory24[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(memory24, information),
NATIVE_F(memory24, write_status), IMM(0)),
OP(FIELD_16, AML_F(memory24, minimum), NATIVE_F(memory24, minimum), IMM(4)),
END(),
}

Definition at line 706 of file resources.c.

◆ convert_memory32

const struct uacpi_resource_convert_instruction convert_memory32[]
static
Initial value:
= {
OP(BIT_FIELD_1, AML_F(memory32, information),
NATIVE_F(memory32, write_status), IMM(0)),
OP(FIELD_32, AML_F(memory32, minimum), NATIVE_F(memory32, minimum), IMM(4)),
END(),
}

Definition at line 713 of file resources.c.

◆ convert_pin_configuration

const struct uacpi_resource_convert_instruction convert_pin_configuration[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_configuration, revision_id),
NATIVE_F(pin_configuration, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
NATIVE_F(pin_configuration, sharing), IMM(0)),
OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
NATIVE_F(pin_configuration, direction), IMM(1)),
OP(FIELD_8, AML_F(pin_configuration, type),
NATIVE_F(pin_configuration, type)),
OP(FIELD_32, AML_F(pin_configuration, value),
NATIVE_F(pin_configuration, value)),
DECODE_SOURCE_INDEX(pin_configuration),
pin_configuration, SOURCE_NO_INDEX, source_offset, source
),
END(),
}
#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( short_aml_name, res_opcode, offset_field, res_field)
Definition: resources.c:850

Definition at line 919 of file resources.c.

◆ convert_pin_function

const struct uacpi_resource_convert_instruction convert_pin_function[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_function, revision_id),
NATIVE_F(pin_function, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_function, flags),
NATIVE_F(pin_function, sharing), IMM(0)),
OP(FIELD_8, AML_F(pin_function, pull_configuration),
NATIVE_F(pin_function, pull_configuration)),
OP(FIELD_16, AML_F(pin_function, function_number),
NATIVE_F(pin_function, function_number)),
DECODE_SOURCE_INDEX(pin_function),
pin_function, SOURCE_NO_INDEX, source_offset, source
),
END(),
}

Definition at line 902 of file resources.c.

◆ convert_pin_group

const struct uacpi_resource_convert_instruction convert_pin_group[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_group, revision_id),
NATIVE_F(pin_group, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_group, flags),
NATIVE_F(pin_group, direction), IMM(0)),
pin_group, LABEL, source_lable_offset, label
),
END(),
}

Definition at line 937 of file resources.c.

◆ convert_pin_group_configuration

const struct uacpi_resource_convert_instruction convert_pin_group_configuration[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_group_configuration, revision_id),
NATIVE_F(pin_group_configuration, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
NATIVE_F(pin_group_configuration, sharing), IMM(0)),
OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
NATIVE_F(pin_group_configuration, direction), IMM(1)),
OP(FIELD_8, AML_F(pin_group_configuration, type),
NATIVE_F(pin_group_configuration, type)),
OP(FIELD_32, AML_F(pin_group_configuration, value),
NATIVE_F(pin_group_configuration, value)),
END(),
}
#define DECODE_PIN_GROUP_RES_SOURCES(postfix)
Definition: resources.c:948

Definition at line 976 of file resources.c.

◆ convert_pin_group_function

const struct uacpi_resource_convert_instruction convert_pin_group_function[]
static
Initial value:
= {
OP(FIELD_8, AML_F(pin_group_function, revision_id),
NATIVE_F(pin_group_function, revision_id)),
OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
NATIVE_F(pin_group_function, sharing), IMM(0)),
OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
NATIVE_F(pin_group_function, direction), IMM(1)),
OP(FIELD_16, AML_F(pin_group_function, function),
NATIVE_F(pin_group_function, function)),
END(),
}

Definition at line 962 of file resources.c.

◆ convert_start_dependent_to_aml

const struct uacpi_resource_convert_instruction convert_start_dependent_to_aml[]
static
Initial value:
= {
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(1)),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, compatibility), IMM(0)),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, performance), IMM(2)),
END(),
}

Definition at line 661 of file resources.c.

◆ convert_start_dependent_to_native

const struct uacpi_resource_convert_instruction convert_start_dependent_to_native[]
static
Initial value:
= {
OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(4)),
OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, compatibility), IMM(0)),
OP(BIT_FIELD_2, AML_F(start_dependent, flags),
NATIVE_F(start_dependent, performance), IMM(2)),
END(),
OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
OP(SET_TO_IMM, NATIVE_F(start_dependent, compatibility),
OP(SET_TO_IMM, NATIVE_F(start_dependent, performance),
END(),
}

Definition at line 642 of file resources.c.

◆ convert_vendor_type0

const struct uacpi_resource_convert_instruction convert_vendor_type0[]
static
Initial value:
= {
OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
OP(FIELD_8, AML_F(vendor_defined_type0, byte_data), NATIVE_F(vendor, data)),
END(),
}
const WCHAR * vendor
Definition: db.cpp:872

Definition at line 694 of file resources.c.

◆ convert_vendor_type1

const struct uacpi_resource_convert_instruction convert_vendor_type1[]
static
Initial value:
= {
OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
OP(FIELD_8, AML_F(vendor_defined_type1, byte_data), NATIVE_F(vendor, data)),
END(),
}

Definition at line 700 of file resources.c.

◆ native_resource_to_type

const uacpi_u8 native_resource_to_type[UACPI_RESOURCE_TYPE_MAX+1]
static

Definition at line 84 of file resources.c.

Referenced by resource_spec_from_native().

◆ type_to_aml_resource

const uacpi_u8 type_to_aml_resource[]
static

Definition at line 52 of file resources.c.

Referenced by do_native_resource_to_aml().