ReactOS 0.4.17-dev-684-ga6524ef
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 , UACPI_INTERRUPT_MODEL_IOSAPIC , UACPI_INTERRUPT_MODEL_PLATFORM_SPECIFIC ,
  UACPI_INTERRUPT_MODEL_GIC , UACPI_INTERRUPT_MODEL_LPIC , UACPI_INTERRUPT_MODEL_RINTC
}
 

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 137 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_CID

#define UACPI_NS_NODE_INFO_HAS_CID   (1 << 3)

Definition at line 140 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_CLS

#define UACPI_NS_NODE_INFO_HAS_CLS   (1 << 4)

Definition at line 141 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_HID

#define UACPI_NS_NODE_INFO_HAS_HID   (1 << 1)

Definition at line 138 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_SXD

#define UACPI_NS_NODE_INFO_HAS_SXD   (1 << 5)

Definition at line 142 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_SXW

#define UACPI_NS_NODE_INFO_HAS_SXW   (1 << 6)

Definition at line 143 of file utilities.h.

◆ UACPI_NS_NODE_INFO_HAS_UID

#define UACPI_NS_NODE_INFO_HAS_UID   (1 << 2)

Definition at line 139 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 
UACPI_INTERRUPT_MODEL_PLATFORM_SPECIFIC 
UACPI_INTERRUPT_MODEL_GIC 
UACPI_INTERRUPT_MODEL_LPIC 
UACPI_INTERRUPT_MODEL_RINTC 

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
@ UACPI_INTERRUPT_MODEL_PLATFORM_SPECIFIC
Definition: utilities.h:52
@ UACPI_INTERRUPT_MODEL_GIC
Definition: utilities.h:53
@ UACPI_INTERRUPT_MODEL_LPIC
Definition: utilities.h:54
@ UACPI_INTERRUPT_MODEL_RINTC
Definition: utilities.h:55

Function Documentation

◆ uacpi_device_matches_pnp_id()

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

Checks whether the device at 'node' matches any of the PNP ids provided in 'list' (terminated by a UACPI_NULL). This is done by first attempting to match the value returned from _HID and then the value(s) from _CID.

Note that the presence of the device (_STA) is not verified here.

Definition at line 905 of file utilities.c.

908{
909 uacpi_status st;
912 uacpi_pnp_id_list *id_list = UACPI_NULL;
913
914 st = uacpi_eval_hid(node, &id);
915 if (st == UACPI_STATUS_OK && matches_any(id, ids)) {
916 ret = UACPI_TRUE;
917 goto out;
918 }
919
920 st = uacpi_eval_cid(node, &id_list);
921 if (st == UACPI_STATUS_OK) {
923
924 for (i = 0; i < id_list->num_ids; ++i) {
925 if (matches_any(&id_list->ids[i], ids)) {
926 ret = UACPI_TRUE;
927 goto out;
928 }
929 }
930 }
931
932out:
934 uacpi_free_pnp_id_list(id_list);
935 return ret;
936}
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:147
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:92
uacpi_id_string ids[]
Definition: utilities.h:98
Definition: dlist.c:348
static uacpi_bool matches_any(uacpi_id_string *id, const uacpi_char *const *ids)
Definition: utilities.c:726
void uacpi_free_id_string(uacpi_id_string *id)
Definition: utilities.c:438
void uacpi_free_pnp_id_list(uacpi_pnp_id_list *list)
Definition: utilities.c:569
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:446
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 
)

Evaluate a device's _ADR method and get its value.

Definition at line 600 of file utilities.c.

601{
602 return uacpi_eval_integer(node, "_ADR", UACPI_NULL, out);
603}
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:892

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 
)

Evaluate a device's _CID method and get its value. The returned structure must be freed using uacpi_free_pnp_id_list.

Definition at line 446 of file utilities.c.

449{
451 uacpi_object *object, *cid_ret;
453 uacpi_size num_ids, i;
456 uacpi_char *id_buffer;
458
460 node, "_CID", UACPI_NULL,
463 &cid_ret
464 );
465 if (ret != UACPI_STATUS_OK)
466 return ret;
467
468 switch (cid_ret->type) {
470 objects = cid_ret->package->objects;
471 num_ids = cid_ret->package->count;
472 break;
473 default:
474 objects = &cid_ret;
475 num_ids = 1;
476 break;
477 }
478
479 size = sizeof(uacpi_pnp_id_list);
480 size += num_ids * sizeof(uacpi_id_string);
481
482 for (i = 0; i < num_ids; ++i) {
483 object = objects[i];
484
485 switch (object->type) {
486 case UACPI_OBJECT_STRING: {
487 uacpi_size buf_size = object->buffer->size;
488
489 if (uacpi_unlikely(buf_size == 0)) {
491
493 "%.4s._CID: empty EISA ID string (sub-object %zu)",
494 name.text, i
495 );
497 }
498
499 size += buf_size;
500 if (uacpi_unlikely(size < buf_size)) {
502
504 "%.4s._CID: buffer size overflow (+ %zu)",
505 name.text, buf_size
506 );
508 }
509
510 break;
511 }
512
515 break;
516 default: {
518
520 "%.4s._CID: invalid package sub-object %zu type: %s",
521 name.text, i,
523 );
525 }
526 }
527 }
528
532 list->num_ids = num_ids;
533 list->size = size - sizeof(uacpi_pnp_id_list);
534
535 id_buffer = UACPI_PTR_ADD(list, sizeof(uacpi_pnp_id_list));
536 id_buffer += num_ids * sizeof(uacpi_id_string);
537
538 for (i = 0; i < num_ids; ++i) {
539 object = objects[i];
540 id = &list->ids[i];
541
542 switch (object->type) {
543 case UACPI_OBJECT_STRING: {
544 uacpi_buffer *buf = object->buffer;
545
546 id->size = buf->size;
547 id->value = id_buffer;
548
549 uacpi_memcpy(id->value, buf->text, id->size);
550 id->value[id->size - 1] = '\0';
551 break;
552 }
553
555 id->size = PNP_ID_LENGTH;
556 id->value = id_buffer;
557 uacpi_eisa_id_to_string(object->integer, id_buffer);
558 break;
559 }
560
561 id_buffer += id->size;
562 }
563
564 uacpi_object_unref(cid_ret);
565 *out_list = list;
566 return ret;
567}
Definition: list.h:37
size_type size() const
Definition: _list.h:379
#define uacpi_error(...)
Definition: log.h:36
#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:88
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:136
@ UACPI_OBJECT_INTEGER_BIT
Definition: types.h:135
@ UACPI_OBJECT_PACKAGE_BIT
Definition: types.h:138
const uacpi_char * uacpi_object_type_to_string(uacpi_object_type)
Definition: types.c:51
@ UACPI_OBJECT_STRING
Definition: types.h:113
@ UACPI_OBJECT_PACKAGE
Definition: types.h:115
@ UACPI_OBJECT_INTEGER
Definition: types.h:112
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:762
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
Definition: name.c:39
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:854
#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 
)

Evaluate a device's _CLS method and get its value. The format of returned string is BBSSPP where: BB => Base Class (e.g. 01 => Mass Storage) SS => Sub-Class (e.g. 06 => SATA) PP => Programming Interface (e.g. 01 => AHCI) The returned struture must be freed using uacpi_free_id_string.

Definition at line 621 of file utilities.c.

624{
627 uacpi_package *pkg;
628 uacpi_u8 class_codes[3];
629 uacpi_id_string *id_string;
630
633 );
634 if (ret != UACPI_STATUS_OK)
635 return ret;
636
637 pkg = obj->package;
638 class_codes[0] = extract_package_byte_or_zero(pkg, 0);
639 class_codes[1] = extract_package_byte_or_zero(pkg, 1);
640 class_codes[2] = extract_package_byte_or_zero(pkg, 2);
641
642 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + CLS_REPR_SIZE);
643 if (uacpi_unlikely(id_string == UACPI_NULL)) {
645 goto out;
646 }
647
648 id_string->size = CLS_REPR_SIZE;
649 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
650
652 id_string->value, CLS_REPR_SIZE, "%02X%02X%02X",
653 class_codes[0], class_codes[1], class_codes[2]
654 );
655
656out:
658 *out_id = id_string;
659
661 return ret;
662}
uacpi_i32 uacpi_snprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
Definition: stdlib.c:684
uint8_t uacpi_u8
Definition: types.h:19
#define uacpi_likely_success(expr)
Definition: status.h:53
uacpi_char * value
Definition: utilities.h:80
uacpi_u32 size
Definition: utilities.h:79
static uacpi_u8 extract_package_byte_or_zero(uacpi_package *pkg, uacpi_size i)
Definition: utilities.c:607
#define CLS_REPR_SIZE
Definition: utilities.c:605

◆ uacpi_eval_hid()

uacpi_status uacpi_eval_hid ( uacpi_namespace_node node,
uacpi_id_string **  out_id 
)

Evaluate a device's _HID method and get its value. The returned struture must be freed using uacpi_free_id_string.

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
397 "%.4s._HID: empty/invalid EISA ID string (%zu bytes)",
398 name.text, buf->size
399 );
401 break;
402 }
403
405 if (uacpi_unlikely(id == UACPI_NULL)) {
407 break;
408 }
409 id->size = buf->size;
410 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
411
412 uacpi_memcpy(id->value, buf->text, buf->size);
413 id->value[buf->size - 1] = '\0';
414 break;
415 }
416
419
421 if (uacpi_unlikely(id == UACPI_NULL)) {
423 break;
424 }
425 id->size = PNP_ID_LENGTH;
426 id->value = UACPI_PTR_ADD(id, sizeof(uacpi_id_string));
427
428 uacpi_eisa_id_to_string(hid_ret->integer, id->value);
429 break;
430 }
431
432 uacpi_object_unref(hid_ret);
434 *out_id = id;
435 return ret;
436}
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 
)

Evaluate a device's _STA method and get its value. If this method is not found, the value of 'flags' is set to all ones.

Definition at line 577 of file utilities.c.

578{
580 uacpi_u64 value = 0;
581
583
584 /*
585 * ACPI 6.5 specification:
586 * If a device object (including the processor object) does not have
587 * an _STA object, then OSPM assumes that all of the above bits are
588 * set (i.e., the device is present, enabled, shown in the UI,
589 * and functioning).
590 */
592 value = 0xFFFFFFFF;
594 }
595
596 *flags = value;
597 return ret;
598}
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 
)

Evaluate a device's _UID method and get its value. The returned struture must be freed using uacpi_free_id_string.

Definition at line 664 of file utilities.c.

667{
670 uacpi_id_string *id_string;
672
674 node, "_UID", UACPI_NULL,
676 &obj
677 );
678 if (ret != UACPI_STATUS_OK)
679 return ret;
680
681 if (obj->type == UACPI_OBJECT_STRING) {
682 size = obj->buffer->size;
683 if (uacpi_unlikely(size == 0 || size > 0xE0000000)) {
685
687 "invalid %.4s._UID string size: %u",
688 name.text, size
689 );
691 goto out;
692 }
693 } else {
695 UACPI_NULL, 0, "%"UACPI_PRIu64, UACPI_FMT64(obj->integer)
696 ) + 1;
697 }
698
699 id_string = uacpi_kernel_alloc(sizeof(uacpi_id_string) + size);
700 if (uacpi_unlikely(id_string == UACPI_NULL)) {
702 goto out;
703 }
704
705 id_string->value = UACPI_PTR_ADD(id_string, sizeof(uacpi_id_string));
706 id_string->size = size;
707
708 if (obj->type == UACPI_OBJECT_STRING) {
709 uacpi_memcpy(id_string->value, obj->buffer->text, size);
710 id_string->value[size - 1] = '\0';
711 } else {
713 id_string->value, id_string->size, "%"UACPI_PRIu64,
714 UACPI_FMT64(obj->integer)
715 );
716 }
717
718out:
720 *out_uid = id_string;
721
723 return ret;
724}
#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 
)

Same as uacpi_find_devices_at, except this starts at the root and only matches one hid.

Definition at line 986 of file utilities.c.

989{
990 const uacpi_char *hids[2] = {
992 };
993
994 hids[0] = hid;
995
997}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:264
uacpi_status uacpi_find_devices_at(uacpi_namespace_node *parent, const uacpi_char *const *hids, uacpi_iteration_callback cb, void *user)
Definition: utilities.c:967

◆ 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 
)

Find all the devices in the namespace starting at 'parent' matching the specified 'hids' (terminated by a UACPI_NULL) against any value from _HID or _CID. Only devices reported as present via _STA are checked. Any matching devices are then passed to the 'cb'.

Definition at line 967 of file utilities.c.

971{
972 struct device_find_ctx ctx = { 0 };
973
975
976 ctx.target_hids = hids;
977 ctx.user = user;
978 ctx.cb = cb;
979
983 );
984}
#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:140
@ UACPI_INIT_LEVEL_NAMESPACE_LOADED
Definition: types.h:78
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:944

Referenced by uacpi_find_devices().

◆ uacpi_free_id_string()

void uacpi_free_id_string ( uacpi_id_string id)

Definition at line 438 of file utilities.c.

439{
440 if (id == UACPI_NULL)
441 return;
442
443 uacpi_free(id, sizeof(uacpi_id_string) + id->size);
444}
#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 897 of file utilities.c.

898{
899 if (info == UACPI_NULL)
900 return;
901
902 uacpi_free(info, info->size);
903}

◆ uacpi_free_pci_routing_table()

void uacpi_free_pci_routing_table ( uacpi_pci_routing_table table)

Definition at line 1136 of file utilities.c.

1137{
1138 if (table == UACPI_NULL)
1139 return;
1140
1141 uacpi_free(
1142 table,
1143 sizeof(uacpi_pci_routing_table) +
1144 table->num_entries * sizeof(uacpi_pci_routing_table_entry)
1145 );
1146}
Definition: utilities.h:60

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 569 of file utilities.c.

570{
571 if (list == UACPI_NULL)
572 return;
573
575}

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 
)

Retrieve information about a namespace node. This includes the attached object's type, name, number of parameters (if it's a method), the result of evaluating _ADR, _UID, _CLS, _HID, _CID, as well as _SxD and _SxW.

The returned structure must be freed with uacpi_free_namespace_node_info.

Definition at line 797 of file utilities.c.

800{
805 uacpi_id_string *hid = UACPI_NULL, *uid = UACPI_NULL, *cls = UACPI_NULL;
808 uacpi_u64 adr = 0;
809 uacpi_u8 flags = 0;
810 uacpi_u8 sxd[4], sxw[5];
811
815
816 if (obj->type == UACPI_OBJECT_DEVICE ||
817 obj->type == UACPI_OBJECT_PROCESSOR) {
818 char dstate_method_template[5] = { '_', 'S', '1', 'D', '\0' };
819
824
825 if (uacpi_eval_adr(node, &adr) == UACPI_STATUS_OK)
827
829 node, dstate_method_template, sizeof(sxd), sxd
830 ) == UACPI_STATUS_OK)
832
833 dstate_method_template[2] = '0';
834 dstate_method_template[3] = 'W';
835
837 node, dstate_method_template, sizeof(sxw), sxw
838 ) == UACPI_STATUS_OK)
840 }
841
845 goto out;
846 }
847 info->size = size;
850 info->type = obj->type;
851 info->num_params = info->type == UACPI_OBJECT_METHOD ? obj->method->args : 0;
852
853 info->adr = adr;
855 uacpi_memcpy(info->sxd, sxd, sizeof(sxd));
856 else
857 uacpi_memzero(info->sxd, sizeof(info->sxd));
858
860 uacpi_memcpy(info->sxw, sxw, sizeof(sxw));
861 else
862 uacpi_memzero(info->sxw, sizeof(info->sxw));
863
864 if (cid != UACPI_NULL) {
865 uacpi_u32 i;
866
867 uacpi_memcpy(&info->cid, cid, cid->size + sizeof(*cid));
868 cursor += cid->num_ids * sizeof(uacpi_id_string);
869
870 for (i = 0; i < cid->num_ids; ++i) {
871 info->cid.ids[i].value = cursor;
872 cursor += info->cid.ids[i].size;
873 }
874
876 } else {
877 uacpi_memzero(&info->cid, sizeof(*cid));
878 }
879
880 NODE_INFO_COPY_ID(hid, HID)
883
884out:
886 info->flags = flags;
887 *out_info = info;
888 }
889
894 return ret;
895}
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:119
@ UACPI_OBJECT_PROCESSOR
Definition: types.h:123
@ UACPI_OBJECT_DEVICE
Definition: types.h:117
#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:777
#define NODE_INFO_COPY_ID(name, flag)
Definition: utilities.c:786
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:740
uacpi_status uacpi_eval_adr(uacpi_namespace_node *node, uacpi_u64 *out)
Definition: utilities.c:600
#define UACPI_NS_NODE_INFO_HAS_ADR
Definition: utilities.h:137
#define UACPI_NS_NODE_INFO_HAS_SXD
Definition: utilities.h:142
#define UACPI_NS_NODE_INFO_HAS_CID
Definition: utilities.h:140
#define UACPI_NS_NODE_INFO_HAS_SXW
Definition: utilities.h:143

◆ 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 1024 of file utilities.c.

1027{
1029 uacpi_object *obj, *entry_obj, *elem_obj;
1030 uacpi_package *table_pkg, *entry_pkg;
1033 uacpi_size size, i;
1034
1036
1040
1043 );
1045 return ret;
1046
1047 table_pkg = obj->package;
1048 if (uacpi_unlikely(table_pkg->count == 0 || table_pkg->count > 1024)) {
1049 uacpi_error("invalid number of _PRT entries: %zu", table_pkg->count);
1052 }
1053
1054 size = table_pkg->count * sizeof(uacpi_pci_routing_table_entry);
1059 }
1060 table->num_entries = table_pkg->count;
1061
1062 for (i = 0; i < table_pkg->count; ++i) {
1063 entry_obj = table_pkg->objects[i];
1064
1065 if (uacpi_unlikely(entry_obj->type != UACPI_OBJECT_PACKAGE)) {
1066 uacpi_error("_PRT sub-object %zu is not a package: %s",
1067 i, uacpi_object_type_to_string(entry_obj->type));
1068 goto out_bad_encoding;
1069 }
1070
1071 entry_pkg = entry_obj->package;
1072 if (uacpi_unlikely(entry_pkg->count != 4)) {
1073 uacpi_error("invalid _PRT sub-package entry count %zu",
1074 entry_pkg->count);
1075 goto out_bad_encoding;
1076 }
1077
1078 entry = &table->entries[i];
1079
1080 elem_obj = entry_pkg->objects[0];
1081 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1082 uacpi_error("invalid _PRT sub-package %zu address type: %s",
1083 i, uacpi_object_type_to_string(elem_obj->type));
1084 goto out_bad_encoding;
1085 }
1086 entry->address = elem_obj->integer;
1087
1088 elem_obj = entry_pkg->objects[1];
1089 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1090 uacpi_error("invalid _PRT sub-package %zu pin type: %s",
1091 i, uacpi_object_type_to_string(elem_obj->type));
1092 goto out_bad_encoding;
1093 }
1094 entry->pin = elem_obj->integer;
1095
1096 elem_obj = entry_pkg->objects[2];
1097 switch (elem_obj->type) {
1100 elem_obj, parent, &entry->source
1101 );
1103 uacpi_error("unable to lookup _PRT source %s: %s",
1104 elem_obj->buffer->text, uacpi_status_to_string(ret));
1105 goto out_bad_encoding;
1106 }
1107 break;
1109 entry->source = UACPI_NULL;
1110 break;
1111 default:
1112 uacpi_error("invalid _PRT sub-package %zu source type: %s",
1113 i, uacpi_object_type_to_string(elem_obj->type));
1114 goto out_bad_encoding;
1115 }
1116
1117 elem_obj = entry_pkg->objects[3];
1118 if (uacpi_unlikely(elem_obj->type != UACPI_OBJECT_INTEGER)) {
1119 uacpi_error("invalid _PRT sub-package %zu source index type: %s",
1120 i, uacpi_object_type_to_string(elem_obj->type));
1121 goto out_bad_encoding;
1122 }
1123 entry->index = elem_obj->integer;
1124 }
1125
1127 *out_table = table;
1128 return UACPI_STATUS_OK;
1129
1130out_bad_encoding:
1134}
#define uacpi_unlikely_error(expr)
Definition: status.h:49
const uacpi_char * uacpi_status_to_string(uacpi_status)
Definition: uacpi.c:60
uacpi_status uacpi_object_resolve_as_aml_namepath(uacpi_object *, uacpi_namespace_node *scope, uacpi_namespace_node **out_node)
Definition: types.c:1088
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:1136

◆ uacpi_set_interrupt_model()

uacpi_status uacpi_set_interrupt_model ( uacpi_interrupt_model  model)

Definition at line 999 of file utilities.c.

1000{
1004
1006
1010
1011 arg->integer = model;
1012 args.objects = &arg;
1013 args.count = 1;
1014
1017
1020
1021 return ret;
1022}
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:709
void * arg
Definition: msvc.h:10