ReactOS 0.4.16-dev-1537-g4e425b5
default_handlers.c
Go to the documentation of this file.
6#include <uacpi/internal/io.h>
7#include <uacpi/kernel_api.h>
8#include <uacpi/uacpi.h>
9
10#ifndef UACPI_BAREBONES_MODE
11
12#define PCI_ROOT_PNP_ID "PNP0A03"
13#define PCI_EXPRESS_ROOT_PNP_ID "PNP0A08"
14
16{
17 static const uacpi_char *pci_root_ids[] = {
21 };
23
24 while (parent != uacpi_namespace_root()) {
25 if (uacpi_device_matches_pnp_id(parent, pci_root_ids)) {
27 "found a PCI root node %.4s controlling region %.4s\n",
28 parent->name.text, node->name.text
29 );
30 return parent;
31 }
32
33 parent = parent->parent;
34 }
35
37 node, "unable to find PCI root controlling",
39 );
40 return node;
41}
42
44{
45 uacpi_namespace_node *node, *pci_root, *device;
49
50 node = data->region_node;
51 pci_root = find_pci_root(node);
52
53 /*
54 * Find the actual device object that is supposed to be controlling
55 * this operation region.
56 */
57 device = node;
58 while (device) {
60
63 return ret;
64
66 break;
67
68 device = device->parent;
69 }
70
74 node, "unable to find device responsible for", ret
75 );
76 return ret;
77 }
78
80 if (ret == UACPI_STATUS_OK) {
81 address.function = (value >> 0) & 0xFF;
82 address.device = (value >> 16) & 0xFF;
83 }
84
85 ret = uacpi_eval_simple_integer(pci_root, "_SEG", &value);
86 if (ret == UACPI_STATUS_OK)
87 address.segment = value;
88
89 ret = uacpi_eval_simple_integer(pci_root, "_BBN", &value);
90 if (ret == UACPI_STATUS_OK)
91 address.bus = value;
92
94 "detected PCI device %.4s@%04X:%02X:%02X:%01X\n",
95 device->name.text, address.segment, address.bus,
96 address.device, address.function
97 );
98
99 return uacpi_kernel_pci_device_open(address, &data->out_region_context);
100}
101
103{
104 uacpi_kernel_pci_device_close(data->region_context);
105 return UACPI_STATUS_OK;
106}
107
110)
111{
112 uacpi_handle dev = data->region_context;
115
116 offset = data->offset;
117 width = data->byte_width;
118
119 return op == UACPI_REGION_OP_READ ?
120 uacpi_pci_read(dev, offset, width, &data->value) :
122}
123
125{
126 switch (op) {
128 return pci_region_attach(op_data);
130 return pci_region_detach(op_data);
133 return pci_region_do_rw(op, op_data);
134 default:
136 }
137}
138
143};
144
146{
147 struct memory_region_ctx *ctx;
149
150 ctx = uacpi_kernel_alloc(sizeof(*ctx));
151 if (ctx == UACPI_NULL)
153
154 ctx->size = data->generic_info.length;
155
156 // FIXME: this really shouldn't try to map everything at once
157 ctx->phys = data->generic_info.base;
158 ctx->virt = uacpi_kernel_map(ctx->phys, ctx->size);
159
160 if (uacpi_unlikely(ctx->virt == UACPI_NULL)) {
162 uacpi_trace_region_error(data->region_node, "unable to map", ret);
163 uacpi_free(ctx, sizeof(*ctx));
164 goto out;
165 }
166
167 data->out_region_context = ctx;
168out:
169 return ret;
170}
171
173{
174 struct memory_region_ctx *ctx = data->region_context;
175
176 uacpi_kernel_unmap(ctx->virt, ctx->size);
177 uacpi_free(ctx, sizeof(*ctx));
178 return UACPI_STATUS_OK;
179}
180
184};
185
187{
188 struct io_region_ctx *ctx;
189 uacpi_generic_region_info *info = &data->generic_info;
191
192 ctx = uacpi_kernel_alloc(sizeof(*ctx));
193 if (ctx == UACPI_NULL)
195
196 ctx->base = info->base;
197
198 ret = uacpi_kernel_io_map(ctx->base, info->length, &ctx->handle);
201 data->region_node, "unable to map an IO", ret
202 );
203 uacpi_free(ctx, sizeof(*ctx));
204 return ret;
205 }
206
207 data->out_region_context = ctx;
208 return ret;
209}
210
212{
213 struct io_region_ctx *ctx = data->region_context;
214
215 uacpi_kernel_io_unmap(ctx->handle);
216 uacpi_free(ctx, sizeof(*ctx));
217 return UACPI_STATUS_OK;
218}
219
222)
223{
224 struct memory_region_ctx *ctx = data->region_context;
226
227 offset = data->address - ctx->phys;
228
229 return op == UACPI_REGION_OP_READ ?
230 uacpi_system_memory_read(ctx->virt, offset, data->byte_width, &data->value) :
231 uacpi_system_memory_write(ctx->virt, offset, data->byte_width, data->value);
232}
233
235{
236 switch (op) {
238 return memory_region_attach(op_data);
240 return memory_region_detach(op_data);
243 return memory_region_do_rw(op, op_data);
244 default:
246 }
247}
248
251)
252{
254
255 return op == UACPI_REGION_OP_READ ?
256 uacpi_system_memory_read(addr, 0, data->byte_width, &data->value) :
257 uacpi_system_memory_write(addr, 0, data->byte_width, data->value);
258}
259
261{
262 switch (op) {
265 return UACPI_STATUS_OK;
268 return table_data_region_do_rw(op, op_data);
269 default:
271 }
272}
273
276)
277{
278 struct io_region_ctx *ctx = data->region_context;
281
282 offset = data->offset - ctx->base;
283 width = data->byte_width;
284
285 return op == UACPI_REGION_OP_READ ?
286 uacpi_system_io_read(ctx->handle, offset, width, &data->value) :
287 uacpi_system_io_write(ctx->handle, offset, width, data->value);
288}
289
291{
292 switch (op) {
294 return io_region_attach(op_data);
296 return io_region_detach(op_data);
299 return io_region_do_rw(op, op_data);
300 default:
302 }
303}
304
306{
308
310
315 );
316
321 );
322
327 );
328
333 );
334}
335
336#endif // !UACPI_BAREBONES_MODE
struct _root root
static uacpi_status handle_table_data_region(uacpi_region_op op, uacpi_handle op_data)
static uacpi_status io_region_detach(uacpi_region_detach_data *data)
#define PCI_EXPRESS_ROOT_PNP_ID
static uacpi_status pci_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
static uacpi_status io_region_attach(uacpi_region_attach_data *data)
static uacpi_status handle_io_region(uacpi_region_op op, uacpi_handle op_data)
#define PCI_ROOT_PNP_ID
static uacpi_status pci_region_detach(uacpi_region_detach_data *data)
static uacpi_namespace_node * find_pci_root(uacpi_namespace_node *node)
void uacpi_install_default_address_space_handlers(void)
static uacpi_status memory_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
static uacpi_status handle_memory_region(uacpi_region_op op, uacpi_handle op_data)
static uacpi_status io_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
static uacpi_status handle_pci_region(uacpi_region_op op, uacpi_handle op_data)
static uacpi_status memory_region_attach(uacpi_region_attach_data *data)
static uacpi_status table_data_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
static uacpi_status memory_region_detach(uacpi_region_detach_data *data)
static uacpi_status pci_region_attach(uacpi_region_attach_data *data)
UINT op
Definition: effect.c:236
uacpi_status uacpi_pci_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:1080
uacpi_status uacpi_pci_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:1048
uacpi_status uacpi_system_io_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:1021
uacpi_status uacpi_system_memory_read(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:930
uacpi_status uacpi_system_io_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:989
uacpi_status uacpi_system_memory_write(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:956
#define uacpi_trace(...)
Definition: log.h:18
#define uacpi_free(mem, _)
Definition: stdlib.h:96
#define UACPI_ADDRESS_SPACE_HANDLER_DEFAULT
Definition: types.h:73
uacpi_status uacpi_namespace_node_type(const uacpi_namespace_node *node, uacpi_object_type *out_type)
Definition: namespace.c:774
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:267
#define uacpi_unlikely(expr)
Definition: compiler.h:58
size_t uacpi_size
Definition: types.h:37
uint64_t uacpi_u64
Definition: types.h:22
char uacpi_char
Definition: types.h:44
#define UACPI_NULL
Definition: types.h:33
uint8_t uacpi_u8
Definition: types.h:19
uacpi_uintptr uacpi_virt_addr
Definition: types.h:36
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_MAPPING_FAILED
Definition: status.h:12
@ UACPI_STATUS_OK
Definition: status.h:11
uacpi_u64 uacpi_io_addr
Definition: types.h:18
uacpi_u64 uacpi_phys_addr
Definition: types.h:17
uacpi_object_type
Definition: types.h:104
@ UACPI_OBJECT_DEVICE
Definition: types.h:111
uacpi_region_op
Definition: types.h:367
@ UACPI_REGION_OP_DETACH
Definition: types.h:371
@ UACPI_REGION_OP_WRITE
Definition: types.h:375
@ UACPI_REGION_OP_READ
Definition: types.h:374
@ UACPI_REGION_OP_ATTACH
Definition: types.h:369
@ UACPI_ADDRESS_SPACE_SYSTEM_MEMORY
Definition: types.h:37
@ UACPI_ADDRESS_SPACE_PCI_CONFIG
Definition: types.h:39
@ UACPI_ADDRESS_SPACE_TABLE_DATA
Definition: types.h:52
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
Definition: types.h:38
return ret
Definition: mutex.c:146
r parent
Definition: btrfs.c:3010
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint address
Definition: glext.h:9393
GLintptr offset
Definition: glext.h:5920
GLenum const GLvoid * addr
Definition: glext.h:9621
uacpi_status uacpi_install_address_space_handler_with_flags(uacpi_namespace_node *device_node, enum uacpi_address_space space, uacpi_region_handler handler, uacpi_handle handler_context, uacpi_u16 flags)
Definition: opregion.c:620
void uacpi_trace_region_error(uacpi_namespace_node *node, uacpi_char *message, uacpi_status ret)
Definition: opregion.c:25
#define UACPI_VIRT_ADDR_TO_PTR(vaddr)
Definition: utilities.h:21
uacpi_status uacpi_kernel_io_map(uacpi_io_addr base, uacpi_size len, uacpi_handle *out_handle)
Definition: uacpiosl.c:165
void uacpi_kernel_pci_device_close(uacpi_handle)
Definition: uacpiosl.c:251
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
uacpi_status uacpi_kernel_pci_device_open(uacpi_pci_address address, uacpi_handle *out_handle)
Definition: uacpiosl.c:242
void uacpi_kernel_unmap(void *addr, uacpi_size len)
Definition: uacpiosl.c:198
void * uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len)
Definition: uacpiosl.c:191
void uacpi_kernel_io_unmap(uacpi_handle handle)
Definition: uacpiosl.c:171
Definition: devices.h:37
uacpi_io_addr base
uacpi_handle handle
uacpi_phys_addr phys
uacpi_status uacpi_eval_simple_integer(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_u64 *out_value)
Definition: uacpi.c:902
Definition: dlist.c:348
Definition: pdh_main.c:96
uacpi_bool uacpi_device_matches_pnp_id(uacpi_namespace_node *node, const uacpi_char *const *list)
Definition: utilities.c:894
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383