ReactOS 0.4.16-dev-1946-g52006dd
utilities.h File Reference
#include <uacpi/status.h>
#include <uacpi/types.h>
#include <uacpi/namespace.h>
Include dependency graph for utilities.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  uacpi_pci_routing_table_entry
 
struct  uacpi_pci_routing_table
 
struct  uacpi_id_string
 
struct  uacpi_pnp_id_list
 
struct  uacpi_namespace_node_info
 

Macros

#define UACPI_NS_NODE_INFO_HAS_ADR   (1 << 0)
 
#define UACPI_NS_NODE_INFO_HAS_HID   (1 << 1)
 
#define UACPI_NS_NODE_INFO_HAS_UID   (1 << 2)
 
#define UACPI_NS_NODE_INFO_HAS_CID   (1 << 3)
 
#define UACPI_NS_NODE_INFO_HAS_CLS   (1 << 4)
 
#define UACPI_NS_NODE_INFO_HAS_SXD   (1 << 5)
 
#define UACPI_NS_NODE_INFO_HAS_SXW   (1 << 6)
 

Typedefs

typedef enum uacpi_interrupt_model uacpi_interrupt_model
 
typedef struct uacpi_pci_routing_table_entry uacpi_pci_routing_table_entry
 
typedef struct uacpi_pci_routing_table uacpi_pci_routing_table
 
typedef struct uacpi_id_string uacpi_id_string
 
typedef struct uacpi_pnp_id_list uacpi_pnp_id_list
 
typedef struct uacpi_namespace_node_info uacpi_namespace_node_info
 

Enumerations

enum  uacpi_interrupt_model { UACPI_INTERRUPT_MODEL_PIC = 0 , UACPI_INTERRUPT_MODEL_IOAPIC = 1 , UACPI_INTERRUPT_MODEL_IOSAPIC = 2 }
 

Functions

uacpi_bool uacpi_device_matches_pnp_id (uacpi_namespace_node *node, const uacpi_char *const *list)
 
uacpi_status uacpi_find_devices_at (uacpi_namespace_node *parent, const uacpi_char *const *hids, uacpi_iteration_callback cb, void *user)
 
uacpi_status uacpi_find_devices (const uacpi_char *hid, uacpi_iteration_callback cb, void *user)
 
uacpi_status uacpi_set_interrupt_model (uacpi_interrupt_model)
 
void uacpi_free_pci_routing_table (uacpi_pci_routing_table *)
 
uacpi_status uacpi_get_pci_routing_table (uacpi_namespace_node *parent, uacpi_pci_routing_table **out_table)
 
void uacpi_free_id_string (uacpi_id_string *id)
 
uacpi_status uacpi_eval_hid (uacpi_namespace_node *, uacpi_id_string **out_id)
 
void uacpi_free_pnp_id_list (uacpi_pnp_id_list *list)
 
uacpi_status uacpi_eval_cid (uacpi_namespace_node *, uacpi_pnp_id_list **out_list)
 
uacpi_status uacpi_eval_sta (uacpi_namespace_node *, uacpi_u32 *flags)
 
uacpi_status uacpi_eval_adr (uacpi_namespace_node *, uacpi_u64 *out)
 
uacpi_status uacpi_eval_cls (uacpi_namespace_node *, uacpi_id_string **out_id)
 
uacpi_status uacpi_eval_uid (uacpi_namespace_node *, uacpi_id_string **out_uid)
 
void uacpi_free_namespace_node_info (uacpi_namespace_node_info *)
 
uacpi_status uacpi_get_namespace_node_info (uacpi_namespace_node *node, uacpi_namespace_node_info **out_info)
 

Macro Definition Documentation

◆ UACPI_NS_NODE_INFO_HAS_ADR

#define UACPI_NS_NODE_INFO_HAS_ADR   (1 << 0)

Definition at line 133 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_CID

#define UACPI_NS_NODE_INFO_HAS_CID   (1 << 3)

Definition at line 136 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_CLS

#define UACPI_NS_NODE_INFO_HAS_CLS   (1 << 4)

Definition at line 137 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_HID

#define UACPI_NS_NODE_INFO_HAS_HID   (1 << 1)

Definition at line 134 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_SXD

#define UACPI_NS_NODE_INFO_HAS_SXD   (1 << 5)

Definition at line 138 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_SXW

#define UACPI_NS_NODE_INFO_HAS_SXW   (1 << 6)

Definition at line 139 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_UID

#define UACPI_NS_NODE_INFO_HAS_UID   (1 << 2)

Definition at line 135 of file utilities.h.

Typedef Documentation

◆ uacpi_id_string

◆ uacpi_interrupt_model

◆ uacpi_namespace_node_info

◆ uacpi_pci_routing_table

◆ uacpi_pci_routing_table_entry

◆ uacpi_pnp_id_list

Enumeration Type Documentation

◆ uacpi_interrupt_model

Enumerator
UACPI_INTERRUPT_MODEL_PIC 
UACPI_INTERRUPT_MODEL_IOAPIC 
UACPI_INTERRUPT_MODEL_IOSAPIC 

Definition at line 48 of file utilities.h.

48 {
uacpi_interrupt_model
Definition: utilities.h:48
@ UACPI_INTERRUPT_MODEL_PIC
Definition: utilities.h:49
@ UACPI_INTERRUPT_MODEL_IOSAPIC
Definition: utilities.h:51
@ UACPI_INTERRUPT_MODEL_IOAPIC
Definition: utilities.h:50

Function Documentation

◆ uacpi_device_matches_pnp_id()

uacpi_bool uacpi_device_matches_pnp_id ( uacpi_namespace_node node,
const uacpi_char *const list 
)

Definition at line 894 of file utilities.c.

897{
898 uacpi_status st;
901 uacpi_pnp_id_list *id_list = UACPI_NULL;
902
903 st = uacpi_eval_hid(node, &id);
904 if (st == UACPI_STATUS_OK && matches_any(id, ids)) {
905 ret = UACPI_TRUE;
906 goto out;
907 }
908
909 st = uacpi_eval_cid(node, &id_list);
910 if (st == UACPI_STATUS_OK) {
912
913 for (i = 0; i < id_list->num_ids; ++i) {
914 if (matches_any(&id_list->ids[i], ids)) {
915 ret = UACPI_TRUE;
916 goto out;
917 }
918 }
919 }
920
921out:
923 uacpi_free_pnp_id_list(id_list);
924 return ret;
925}
size_t uacpi_size
Definition: types.h:37
bool uacpi_bool
Definition: types.h:31
#define UACPI_FALSE
Definition: types.h:30
#define UACPI_NULL
Definition: types.h:33
#define UACPI_TRUE
Definition: types.h:29
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_OK
Definition: status.h:11
return ret
Definition: mutex.c:146
GLuint * ids
Definition: glext.h:5907
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
uacpi_u32 num_ids
Definition: utilities.h:88
uacpi_id_string ids[]
Definition: utilities.h:94
Definition: dlist.c:348
static uacpi_bool matches_any(uacpi_id_string *id, const uacpi_char *const *ids)
Definition: utilities.c:715
void uacpi_free_id_string(uacpi_id_string *id)
Definition: utilities.c:436
void uacpi_free_pnp_id_list(uacpi_pnp_id_list *list)
Definition: utilities.c:560
uacpi_status uacpi_eval_hid(uacpi_namespace_node *node, uacpi_id_string **out_id)
Definition: utilities.c:371
uacpi_status uacpi_eval_cid(uacpi_namespace_node *node, uacpi_pnp_id_list **out_list)
Definition: utilities.c:444
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by find_one_device(), and find_pci_root().

◆ uacpi_eval_adr()

uacpi_status uacpi_eval_adr ( uacpi_namespace_node node,
uacpi_u64 out 
)

Definition at line 591 of file utilities.c.

592{
593 return uacpi_eval_integer(node, "_ADR", UACPI_NULL, out);
594}
uacpi_status uacpi_eval_integer(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_u64 *out_value)
Definition: uacpi.c:882

Referenced by uacpi_get_namespace_node_info().

◆ uacpi_eval_cid()

uacpi_status uacpi_eval_cid ( uacpi_namespace_node node,
uacpi_pnp_id_list **  out_list 
)

Definition at line 444 of file utilities.c.

447{
449 uacpi_object *object, *cid_ret;
451 uacpi_size num_ids, i;
454 uacpi_char *id_buffer;
456
458 node, "_CID", UACPI_NULL,
461 &cid_ret
462 );
463 if (ret != UACPI_STATUS_OK)
464 return ret;
465
466 switch (cid_ret->type) {
468 objects = cid_ret->package->objects;
469 num_ids = cid_ret->package->count;
470 break;
471 default:
472 objects = &cid_ret;
473 num_ids = 1;
474 break;
475 }
476
477 size = sizeof(uacpi_pnp_id_list);
478 size += num_ids * sizeof(uacpi_id_string);
479
480 for (i = 0; i < num_ids; ++i) {
481 object = objects[i];
482
483 switch (object->type) {
484 case UACPI_OBJECT_STRING: {
485 uacpi_size buf_size = object->buffer->size;
486
487 if (uacpi_unlikely(buf_size == 0)) {
489 "%.4s._CID: empty EISA ID string (sub-object %zu)\n",
491 );
493 }
494
495 size += buf_size;
496 if (uacpi_unlikely(size < buf_size)) {
498 "%.4s._CID: buffer size overflow (+ %zu)\n",
500 );
502 }
503
504 break;
505 }
506
509 break;
510 default:
512 "%.4s._CID: invalid package sub-object %zu type: %s\n",
515 );
517 }
518 }
519
523 list->num_ids = num_ids;
524 list->size = size - sizeof(uacpi_pnp_id_list);
525
526 id_buffer = UACPI_PTR_ADD(list, sizeof(uacpi_pnp_id_list));
527 id_buffer += num_ids * sizeof(uacpi_id_string);
528
529 for (i = 0; i < num_ids; ++i) {
530 object = objects[i];
531 id = &list->ids[i];
532
533 switch (object->type) {
534 case UACPI_OBJECT_STRING: {
535 uacpi_buffer *buf = object->buffer;
536
537 id->size = buf->size;
538 id->value = id_buffer;
539
540 uacpi_memcpy(id->value, buf->text, id->size);
541 id->value[id->size - 1] = '\0';
542 break;
543 }
544
546 id->size = PNP_ID_LENGTH;
547 id->value = id_buffer;
548 uacpi_eisa_id_to_string(object->integer, id_buffer);
549 break;
550 }
551
552 id_buffer += id->size;
553 }
554
555 uacpi_object_unref(cid_ret);
556 *out_list = list;
557 return ret;
558}
Definition: list.h:37
size_type size() const
Definition: _list.h:379
const WCHAR * text
Definition: package.c:1794
#define uacpi_error(...)
Definition: log.h:21
#define uacpi_memcpy
Definition: stdlib.h:34
uacpi_object_name uacpi_namespace_node_name(const uacpi_namespace_node *node)
Definition: namespace.c:752
#define uacpi_unlikely(expr)
Definition: compiler.h:58
uint32_t uacpi_u32
Definition: types.h:21
char uacpi_char
Definition: types.h:44
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_AML_INCOMPATIBLE_OBJECT_TYPE
Definition: status.h:38
@ UACPI_STATUS_AML_BAD_ENCODING
Definition: status.h:39
@ UACPI_OBJECT_STRING_BIT
Definition: types.h:130
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:129
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:132
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type)
Definition: types.c:51
@ UACPI_OBJECT_STRING
Definition: types.h:107
@ UACPI_OBJECT_PACKAGE
Definition: types.h:109
@ UACPI_OBJECT_INTEGER
Definition: types.h:106
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint id
Definition: glext.h:5910
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
struct output_fragment * out_list
Definition: write.c:75
static const CLSID * objects[]
Definition: apphelp.c:112
#define list
Definition: rosglue.h:35
char * value
Definition: compiler.c:67
uacpi_size size
Definition: types.h:31
uacpi_u8 type
Definition: types.h:249
uacpi_package * package
Definition: types.h:254
uacpi_object ** objects
Definition: types.h:36
uacpi_size count
Definition: types.h:37
uacpi_status uacpi_eval_typed(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object_type_bits ret_mask, uacpi_object **ret)
Definition: uacpi.c:844
#define PNP_ID_LENGTH
Definition: utilities.c:369
void uacpi_eisa_id_to_string(uacpi_u32 id, uacpi_char *out_string)
Definition: utilities.c:323

Referenced by uacpi_device_matches_pnp_id().

◆ uacpi_eval_cls()

uacpi_status uacpi_eval_cls ( uacpi_namespace_node node,
uacpi_id_string **  out_id 
)

Definition at line 612 of file utilities.c.

615{
618 uacpi_package *pkg;
619 uacpi_u8 class_codes[3];
620 uacpi_id_string *id_string;
621
624 );
625 if (ret != UACPI_STATUS_OK)
626 return ret;
627
628 pkg = obj->package;
629 class_codes[0] = extract_package_byte_or_zero(pkg, 0);
630 class_codes[1] = extract_package_byte_or_zero(pkg, 1);
631 class_codes[2] = extract_package_byte_or_zero(pkg, 2);
632
633 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + CLS_REPR_SIZE);
634 if (uacpi_unlikely(id_string == UACPI_NULL)) {
636 goto out;
637 }
638
639 id_string->size = CLS_REPR_SIZE;
640 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
641
643 id_string->value, CLS_REPR_SIZE, "%02X%02X%02X",
644 class_codes[0], class_codes[1], class_codes[2]
645 );
646
647out:
649 *out_id = id_string;
650
652 return ret;
653}
uacpi_i32 uacpi_snprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
Definition: stdlib.c:661
uint8_t uacpi_u8
Definition: types.h:19
#define uacpi_likely_success(expr)
Definition: status.h:53
uacpi_char * value
Definition: utilities.h:76
uacpi_u32 size
Definition: utilities.h:75
static uacpi_u8 extract_package_byte_or_zero(uacpi_package *pkg, uacpi_size i)
Definition: utilities.c:598
#define CLS_REPR_SIZE
Definition: utilities.c:596

◆ uacpi_eval_hid()

uacpi_status uacpi_eval_hid ( uacpi_namespace_node node,
uacpi_id_string **  out_id 
)

Definition at line 371 of file utilities.c.

372{
374 uacpi_object *hid_ret;
377
379 node, "_HID", UACPI_NULL,
381 &hid_ret
382 );
383 if (ret != UACPI_STATUS_OK)
384 return ret;
385
386 size = sizeof(uacpi_id_string);
387
388 switch (hid_ret->type) {
389 case UACPI_OBJECT_STRING: {
390 uacpi_buffer *buf = hid_ret->buffer;
391
392 size += buf->size;
393 if (uacpi_unlikely(buf->size == 0 || size < buf->size)) {
395 "%.4s._HID: empty/invalid EISA ID string (%zu bytes)\n",
397 );
399 break;
400 }
401
403 if (uacpi_unlikely(id == UACPI_NULL)) {
405 break;
406 }
407 id->size = buf->size;
408 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
409
410 uacpi_memcpy(id->value, buf->text, buf->size);
411 id->value[buf->size - 1] = '\0';
412 break;
413 }
414
417
419 if (uacpi_unlikely(id == UACPI_NULL)) {
421 break;
422 }
423 id->size = PNP_ID_LENGTH;
424 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
425
426 uacpi_eisa_id_to_string(hid_ret->integer, id->value);
427 break;
428 }
429
430 uacpi_object_unref(hid_ret);
432 *out_id = id;
433 return ret;
434}
uacpi_u64 integer
Definition: types.h:253
uacpi_buffer * buffer
Definition: types.h:258

Referenced by uacpi_device_matches_pnp_id().

◆ uacpi_eval_sta()

uacpi_status uacpi_eval_sta ( uacpi_namespace_node node,
uacpi_u32 flags 
)

Definition at line 568 of file utilities.c.

569{
571 uacpi_u64 value = 0;
572
574
575 /*
576 * ACPI 6.5 specification:
577 * If a device object (including the processor object) does not have
578 * an _STA object, then OSPM assumes that all of the above bits are
579 * set (i.e., the device is present, enabled, shown in the UI,
580 * and functioning).
581 */
583 value = 0xFFFFFFFF;
585 }
586
587 *flags = value;
588 return ret;
589}
uint64_t uacpi_u64
Definition: types.h:22
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
GLbitfield flags
Definition: glext.h:7161
Definition: pdh_main.c:96

Referenced by find_one_device(), and sta_eval().

◆ uacpi_eval_uid()

uacpi_status uacpi_eval_uid ( uacpi_namespace_node node,
uacpi_id_string **  out_uid 
)

Definition at line 655 of file utilities.c.

658{
661 uacpi_id_string *id_string;
663
665 node, "_UID", UACPI_NULL,
667 &obj
668 );
669 if (ret != UACPI_STATUS_OK)
670 return ret;
671
672 if (obj->type == UACPI_OBJECT_STRING) {
673 size = obj->buffer->size;
674 if (uacpi_unlikely(size == 0 || size > 0xE0000000)) {
676 "invalid %.4s._UID string size: %u\n",
678 );
680 goto out;
681 }
682 } else {
684 UACPI_NULL, 0, "%"UACPI_PRIu64, UACPI_FMT64(obj->integer)
685 ) + 1;
686 }
687
688 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + size);
689 if (uacpi_unlikely(id_string == UACPI_NULL)) {
691 goto out;
692 }
693
694 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
695 id_string->size = size;
696
697 if (obj->type == UACPI_OBJECT_STRING) {
698 uacpi_memcpy(id_string->value, obj->buffer->text, size);
699 id_string->value[size - 1] = '\0';
700 } else {
702 id_string->value, id_string->size, "%"UACPI_PRIu64,
703 UACPI_FMT64(obj->integer)
704 );
705 }
706
707out:
709 *out_uid = id_string;
710
712 return ret;
713}
#define UACPI_FMT64(val)
Definition: types.h:62
#define UACPI_PRIu64
Definition: types.h:59

◆ uacpi_find_devices()

uacpi_status uacpi_find_devices ( const uacpi_char hid,
uacpi_iteration_callback  cb,
void user 
)

Definition at line 975 of file utilities.c.

978{
979 const uacpi_char *hids[] = {
980 hid, UACPI_NULL
981 };
982
984}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:267
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
uacpi_status uacpi_find_devices_at(uacpi_namespace_node *parent, const uacpi_char *const *hids, uacpi_iteration_callback cb, void *user)
Definition: utilities.c:956

◆ uacpi_find_devices_at()

uacpi_status uacpi_find_devices_at ( uacpi_namespace_node parent,
const uacpi_char *const hids,
uacpi_iteration_callback  cb,
void user 
)

Definition at line 956 of file utilities.c.

960{
962
963 struct device_find_ctx ctx = {
964 .target_hids = hids,
965 .user = user,
966 .cb = cb,
967 };
968
972 );
973}
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
#define UACPI_MAX_DEPTH_ANY
Definition: namespace.h:102
uacpi_status uacpi_namespace_for_each_child(uacpi_namespace_node *parent, uacpi_iteration_callback descending_callback, uacpi_iteration_callback ascending_callback, uacpi_object_type_bits type_mask, uacpi_u32 max_depth, void *user)
Definition: namespace.c:948
@ UACPI_OBJECT_DEVICE_BIT
Definition: types.h:134
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:72
r parent
Definition: btrfs.c:3010
static uacpi_iteration_decision find_one_device(void *opaque, uacpi_namespace_node *node, uacpi_u32 depth)
Definition: utilities.c:933

Referenced by uacpi_find_devices().

◆ uacpi_free_id_string()

void uacpi_free_id_string ( uacpi_id_string id)

Definition at line 436 of file utilities.c.

437{
438 if (id == UACPI_NULL)
439 return;
440
441 uacpi_free(id, sizeof(uacpi_id_string) + id->size);
442}
#define uacpi_free(mem, _)
Definition: stdlib.h:96

Referenced by uacpi_device_matches_pnp_id(), and uacpi_get_namespace_node_info().

◆ uacpi_free_namespace_node_info()

void uacpi_free_namespace_node_info ( uacpi_namespace_node_info info)

Definition at line 886 of file utilities.c.

887{
888 if (info == UACPI_NULL)
889 return;
890
891 uacpi_free(info, info->size);
892}

◆ uacpi_free_pci_routing_table()

void uacpi_free_pci_routing_table ( uacpi_pci_routing_table table)

Definition at line 1123 of file utilities.c.

1124{
1125 if (table == UACPI_NULL)
1126 return;
1127
1128 uacpi_free(
1129 table,
1130 sizeof(uacpi_pci_routing_table) +
1131 table->num_entries * sizeof(uacpi_pci_routing_table_entry)
1132 );
1133}
Definition: utilities.h:56

Referenced by uacpi_get_pci_routing_table().

◆ uacpi_free_pnp_id_list()

void uacpi_free_pnp_id_list ( uacpi_pnp_id_list list)

Definition at line 560 of file utilities.c.

561{
562 if (list == UACPI_NULL)
563 return;
564
566}

Referenced by uacpi_device_matches_pnp_id(), and uacpi_get_namespace_node_info().

◆ uacpi_get_namespace_node_info()

uacpi_status uacpi_get_namespace_node_info ( uacpi_namespace_node node,
uacpi_namespace_node_info **  out_info 
)

Definition at line 786 of file utilities.c.

789{
794 uacpi_id_string *hid = UACPI_NULL, *uid = UACPI_NULL, *cls = UACPI_NULL;
797 uacpi_u64 adr = 0;
798 uacpi_u8 flags = 0;
799 uacpi_u8 sxd[4], sxw[5];
800
804
805 if (obj->type == UACPI_OBJECT_DEVICE ||
806 obj->type == UACPI_OBJECT_PROCESSOR) {
807 char dstate_method_template[5] = { '_', 'S', '1', 'D', '\0' };
808
813
814 if (uacpi_eval_adr(node, &adr) == UACPI_STATUS_OK)
816
818 node, dstate_method_template, sizeof(sxd), sxd
819 ) == UACPI_STATUS_OK)
821
822 dstate_method_template[2] = '0';
823 dstate_method_template[3] = 'W';
824
826 node, dstate_method_template, sizeof(sxw), sxw
827 ) == UACPI_STATUS_OK)
829 }
830
834 goto out;
835 }
836 info->size = size;
839 info->type = obj->type;
840 info->num_params = info->type == UACPI_OBJECT_METHOD ? obj->method->args : 0;
841
842 info->adr = adr;
844 uacpi_memcpy(info->sxd, sxd, sizeof(sxd));
845 else
846 uacpi_memzero(info->sxd, sizeof(info->sxd));
847
849 uacpi_memcpy(info->sxw, sxw, sizeof(sxw));
850 else
851 uacpi_memzero(info->sxw, sizeof(info->sxw));
852
853 if (cid != UACPI_NULL) {
854 uacpi_u32 i;
855
856 uacpi_memcpy(&info->cid, cid, cid->size + sizeof(*cid));
857 cursor += cid->num_ids * sizeof(uacpi_id_string);
858
859 for (i = 0; i < cid->num_ids; ++i) {
860 info->cid.ids[i].value = cursor;
861 cursor += info->cid.ids[i].size;
862 }
863
865 } else {
866 uacpi_memzero(&info->cid, sizeof(*cid));
867 }
868
869 NODE_INFO_COPY_ID(hid, HID)
872
873out:
875 info->flags = flags;
876 *out_info = info;
877 }
878
883 return ret;
884}
uacpi_object * uacpi_namespace_node_get_object(const uacpi_namespace_node *node)
Definition: namespace.c:646
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_OBJECT_METHOD
Definition: types.h:113
@ UACPI_OBJECT_PROCESSOR
Definition: types.h:117
@ UACPI_OBJECT_DEVICE
Definition: types.h:111
#define UID
Definition: ext2fs.h:154
const char cursor[]
Definition: icontest.c:13
static TfClientId cid
Definition: ntuser.h:566
#define NODE_INFO_EVAL_ADD_ID(name)
Definition: utilities.c:766
#define NODE_INFO_COPY_ID(name, flag)
Definition: utilities.c:775
static uacpi_status uacpi_eval_dstate_method_template(uacpi_namespace_node *parent, uacpi_char *template, uacpi_u8 num_methods, uacpi_u8 *out_values)
Definition: utilities.c:729
uacpi_status uacpi_eval_adr(uacpi_namespace_node *node, uacpi_u64 *out)
Definition: utilities.c:591
#define UACPI_NS_NODE_INFO_HAS_ADR
Definition: utilities.h:133
#define UACPI_NS_NODE_INFO_HAS_SXD
Definition: utilities.h:138
#define UACPI_NS_NODE_INFO_HAS_CID
Definition: utilities.h:136
#define UACPI_NS_NODE_INFO_HAS_SXW
Definition: utilities.h:139

◆ uacpi_get_pci_routing_table()

uacpi_status uacpi_get_pci_routing_table ( uacpi_namespace_node parent,
uacpi_pci_routing_table **  out_table 
)

Definition at line 1011 of file utilities.c.

1014{
1016 uacpi_object *obj, *entry_obj, *elem_obj;
1017 uacpi_package *table_pkg, *entry_pkg;
1020 uacpi_size size, i;
1021
1023
1027
1030 );
1032 return ret;
1033
1034 table_pkg = obj->package;
1035 if (uacpi_unlikely(table_pkg->count == 0 || table_pkg->count > 1024)) {
1036 uacpi_error("invalid number of _PRT entries: %zu\n", table_pkg->count);
1039 }
1040
1041 size = table_pkg->count * sizeof(uacpi_pci_routing_table_entry);
1046 }
1047 table->num_entries = table_pkg->count;
1048
1049 for (i = 0; i < table_pkg->count; ++i) {
1050 entry_obj = table_pkg->objects[i];
1051
1052 if (uacpi_unlikely(entry_obj->type != UACPI_OBJECT_PACKAGE)) {
1053 uacpi_error("_PRT sub-object %zu is not a package: %s\n",
1054 i, uacpi_object_type_to_string(entry_obj->type));
1055 goto out_bad_encoding;
1056 }
1057
1058 entry_pkg = entry_obj->package;
1059 if (uacpi_unlikely(entry_pkg->count != 4)) {
1060 uacpi_error("invalid _PRT sub-package entry count %zu\n",
1061 entry_pkg->count);
1062 goto out_bad_encoding;
1063 }
1064
1065 entry = &table->entries[i];
1066
1067 elem_obj = entry_pkg->objects[0];
1068 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1069 uacpi_error("invalid _PRT sub-package %zu address type: %s\n",
1070 i, uacpi_object_type_to_string(elem_obj->type));
1071 goto out_bad_encoding;
1072 }
1073 entry->address = elem_obj->integer;
1074
1075 elem_obj = entry_pkg->objects[1];
1076 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1077 uacpi_error("invalid _PRT sub-package %zu pin type: %s\n",
1078 i, uacpi_object_type_to_string(elem_obj->type));
1079 goto out_bad_encoding;
1080 }
1081 entry->pin = elem_obj->integer;
1082
1083 elem_obj = entry_pkg->objects[2];
1084 switch (elem_obj->type) {
1087 elem_obj, parent, &entry->source
1088 );
1090 uacpi_error("unable to lookup _PRT source %s: %s\n",
1091 elem_obj->buffer->text, uacpi_status_to_string(ret));
1092 goto out_bad_encoding;
1093 }
1094 break;
1096 entry->source = UACPI_NULL;
1097 break;
1098 default:
1099 uacpi_error("invalid _PRT sub-package %zu source type: %s\n",
1100 i, uacpi_object_type_to_string(elem_obj->type));
1101 goto out_bad_encoding;
1102 }
1103
1104 elem_obj = entry_pkg->objects[3];
1105 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1106 uacpi_error("invalid _PRT sub-package %zu source index type: %s\n",
1107 i, uacpi_object_type_to_string(elem_obj->type));
1108 goto out_bad_encoding;
1109 }
1110 entry->index = elem_obj->integer;
1111 }
1112
1114 *out_table = table;
1115 return UACPI_STATUS_OK;
1116
1117out_bad_encoding:
1121}
#define uacpi_unlikely_error(expr)
Definition: status.h:49
const uacpi_char * uacpi_status_to_string(uacpi_status)
Definition: uacpi.c:50
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1079
uint32_t entry
Definition: isohybrid.c:63
uacpi_char * text
Definition: types.h:29
void uacpi_free_pci_routing_table(uacpi_pci_routing_table *table)
Definition: utilities.c:1123

◆ uacpi_set_interrupt_model()

uacpi_status uacpi_set_interrupt_model ( uacpi_interrupt_model  model)

Definition at line 986 of file utilities.c.

987{
991
993
997
998 arg->integer = model;
999 args.objects = &arg;
1000 args.count = 1;
1001
1004
1007
1008 return ret;
1009}
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
#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
void * arg
Definition: msvc.h:10