1#pragma once
2
3#include <uacpi/types.h>
4#include <uacpi/internal/shareable.h>
5#include <uacpi/status.h>
6#include <uacpi/namespace.h>
7
8#ifndef UACPI_BAREBONES_MODE
9
10#define UACPI_NAMESPACE_NODE_FLAG_ALIAS (1 << 0)
11
12/*
13 * This node has been uninstalled and has no object associated with it.
14 *
15 * This is used to handle edge cases where an object needs to reference
16 * a namespace node, where the node might end up going out of scope before
17 * the object lifetime ends.
18 */
19#define UACPI_NAMESPACE_NODE_FLAG_DANGLING (1u << 1)
20
21/*
22 * This node is method-local and must not be exposed via public API as its
23 * lifetime is limited.
24 */
25#define UACPI_NAMESPACE_NODE_FLAG_TEMPORARY (1u << 2)
26
27typedef struct uacpi_namespace_node {
28 struct uacpi_shareable shareable;
29 uacpi_object_name name;
30 uacpi_u32 flags;
31 uacpi_object *object;
32 struct uacpi_namespace_node *parent;
33 struct uacpi_namespace_node *child;
34 struct uacpi_namespace_node *next;
35} uacpi_namespace_node;
36
37uacpi_status uacpi_initialize_namespace(void);
38void uacpi_deinitialize_namespace(void);
39
40uacpi_namespace_node *uacpi_namespace_node_alloc(uacpi_object_name name);
41void uacpi_namespace_node_unref(uacpi_namespace_node *node);
42
43
44uacpi_status uacpi_namespace_node_type_unlocked(
45 const uacpi_namespace_node *node, uacpi_object_type *out_type
46);
47uacpi_status uacpi_namespace_node_is_one_of_unlocked(
48 const uacpi_namespace_node *node, uacpi_object_type_bits type_mask,
49 uacpi_bool *out
50);
51
52uacpi_object *uacpi_namespace_node_get_object(const uacpi_namespace_node *node);
53
54uacpi_object *uacpi_namespace_node_get_object_typed(
55 const uacpi_namespace_node *node, uacpi_object_type_bits type_mask
56);
57
58uacpi_status uacpi_namespace_node_acquire_object(
59 const uacpi_namespace_node *node, uacpi_object **out_obj
60);
61uacpi_status uacpi_namespace_node_acquire_object_typed(
62 const uacpi_namespace_node *node, uacpi_object_type_bits,
63 uacpi_object **out_obj
64);
65
66uacpi_status uacpi_namespace_node_reacquire_object(
67 uacpi_object *obj
68);
69uacpi_status uacpi_namespace_node_release_object(
70 uacpi_object *obj
71);
72
73uacpi_status uacpi_namespace_node_install(
74 uacpi_namespace_node *parent, uacpi_namespace_node *node
75);
76uacpi_status uacpi_namespace_node_uninstall(uacpi_namespace_node *node);
77
78uacpi_namespace_node *uacpi_namespace_node_find_sub_node(
79 uacpi_namespace_node *parent,
80 uacpi_object_name name
81);
82
83enum uacpi_may_search_above_parent {
84 UACPI_MAY_SEARCH_ABOVE_PARENT_NO,
85 UACPI_MAY_SEARCH_ABOVE_PARENT_YES,
86};
87
88enum uacpi_permanent_only {
89 UACPI_PERMANENT_ONLY_NO,
90 UACPI_PERMANENT_ONLY_YES,
91};
92
93enum uacpi_should_lock {
94 UACPI_SHOULD_LOCK_NO,
95 UACPI_SHOULD_LOCK_YES,
96};
97
98uacpi_status uacpi_namespace_node_resolve(
99 uacpi_namespace_node *scope, const uacpi_char *path, enum uacpi_should_lock,
100 enum uacpi_may_search_above_parent, enum uacpi_permanent_only,
101 uacpi_namespace_node **out_node
102);
103
104uacpi_status uacpi_namespace_do_for_each_child(
105 uacpi_namespace_node *parent, uacpi_iteration_callback descending_callback,
106 uacpi_iteration_callback ascending_callback,
107 uacpi_object_type_bits, uacpi_u32 max_depth, enum uacpi_should_lock,
108 enum uacpi_permanent_only, void *user
109);
110
111uacpi_bool uacpi_namespace_node_is_dangling(uacpi_namespace_node *node);
112uacpi_bool uacpi_namespace_node_is_temporary(uacpi_namespace_node *node);
113uacpi_bool uacpi_namespace_node_is_predefined(uacpi_namespace_node *node);
114
115uacpi_status uacpi_namespace_read_lock(void);
116uacpi_status uacpi_namespace_read_unlock(void);
117
118uacpi_status uacpi_namespace_write_lock(void);
119uacpi_status uacpi_namespace_write_unlock(void);
120
121#endif // !UACPI_BAREBONES_MODE
122