ReactOS 0.4.17-dev-683-g0dafdc5
default_handlers.c File Reference
Include dependency graph for default_handlers.c:

Go to the source code of this file.

Classes

struct  pci_region_ctx
 
struct  memory_region_ctx
 
struct  io_region_ctx
 

Macros

#define PCI_ROOT_PNP_ID   "PNP0A03"
 
#define PCI_EXPRESS_ROOT_PNP_ID   "PNP0A08"
 

Functions

static uacpi_namespace_nodefind_pci_root (uacpi_namespace_node *node)
 
static uacpi_status pci_region_attach (uacpi_region_attach_data *data)
 
static uacpi_status pci_region_detach (uacpi_region_detach_data *data)
 
static uacpi_status pci_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 memory_region_detach (uacpi_region_detach_data *data)
 
static uacpi_status io_region_attach (uacpi_region_attach_data *data)
 
static uacpi_status io_region_detach (uacpi_region_detach_data *data)
 
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 table_data_region_do_rw (uacpi_region_op op, uacpi_region_rw_data *data)
 
static uacpi_status handle_table_data_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_io_region (uacpi_region_op op, uacpi_handle op_data)
 
void uacpi_install_default_address_space_handlers (void)
 

Macro Definition Documentation

◆ PCI_EXPRESS_ROOT_PNP_ID

#define PCI_EXPRESS_ROOT_PNP_ID   "PNP0A08"

Definition at line 13 of file default_handlers.c.

◆ PCI_ROOT_PNP_ID

#define PCI_ROOT_PNP_ID   "PNP0A03"

Definition at line 12 of file default_handlers.c.

Function Documentation

◆ find_pci_root()

static uacpi_namespace_node * find_pci_root ( uacpi_namespace_node node)
static

Definition at line 15 of file default_handlers.c.

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",
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}
#define PCI_EXPRESS_ROOT_PNP_ID
#define PCI_ROOT_PNP_ID
#define uacpi_trace(...)
Definition: log.h:33
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:264
char uacpi_char
Definition: types.h:44
#define UACPI_NULL
Definition: types.h:33
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
r parent
Definition: btrfs.c:3010
void uacpi_trace_region_error(uacpi_namespace_node *node, uacpi_char *message, uacpi_status ret)
Definition: opregion.c:25
Definition: dlist.c:348
uacpi_bool uacpi_device_matches_pnp_id(uacpi_namespace_node *node, const uacpi_char *const *list)
Definition: utilities.c:905

Referenced by pci_region_attach().

◆ handle_io_region()

static uacpi_status handle_io_region ( uacpi_region_op  op,
uacpi_handle  op_data 
)
static

Definition at line 327 of file default_handlers.c.

328{
329 switch (op) {
331 return io_region_attach(op_data);
333 return io_region_detach(op_data);
336 return io_region_do_rw(op, op_data);
337 default:
339 }
340}
static uacpi_status io_region_detach(uacpi_region_detach_data *data)
static uacpi_status io_region_attach(uacpi_region_attach_data *data)
static uacpi_status io_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
UINT op
Definition: effect.c:236
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_REGION_OP_DETACH
Definition: types.h:377
@ UACPI_REGION_OP_WRITE
Definition: types.h:381
@ UACPI_REGION_OP_READ
Definition: types.h:380
@ UACPI_REGION_OP_ATTACH
Definition: types.h:375

Referenced by uacpi_install_default_address_space_handlers().

◆ handle_memory_region()

static uacpi_status handle_memory_region ( uacpi_region_op  op,
uacpi_handle  op_data 
)
static

Definition at line 271 of file default_handlers.c.

272{
273 switch (op) {
275 return memory_region_attach(op_data);
277 return memory_region_detach(op_data);
280 return memory_region_do_rw(op, op_data);
281 default:
283 }
284}
static uacpi_status memory_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
static uacpi_status memory_region_attach(uacpi_region_attach_data *data)
static uacpi_status memory_region_detach(uacpi_region_detach_data *data)

Referenced by uacpi_install_default_address_space_handlers().

◆ handle_pci_region()

static uacpi_status handle_pci_region ( uacpi_region_op  op,
uacpi_handle  op_data 
)
static

Definition at line 161 of file default_handlers.c.

162{
163 switch (op) {
165 return pci_region_attach(op_data);
167 return pci_region_detach(op_data);
170 return pci_region_do_rw(op, op_data);
171 default:
173 }
174}
static uacpi_status pci_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
static uacpi_status pci_region_detach(uacpi_region_detach_data *data)
static uacpi_status pci_region_attach(uacpi_region_attach_data *data)

Referenced by uacpi_install_default_address_space_handlers().

◆ handle_table_data_region()

static uacpi_status handle_table_data_region ( uacpi_region_op  op,
uacpi_handle  op_data 
)
static

Definition at line 297 of file default_handlers.c.

298{
299 switch (op) {
302 return UACPI_STATUS_OK;
305 return table_data_region_do_rw(op, op_data);
306 default:
308 }
309}
static uacpi_status table_data_region_do_rw(uacpi_region_op op, uacpi_region_rw_data *data)
@ UACPI_STATUS_OK
Definition: status.h:11

Referenced by uacpi_install_default_address_space_handlers().

◆ io_region_attach()

static uacpi_status io_region_attach ( uacpi_region_attach_data data)
static

Definition at line 223 of file default_handlers.c.

224{
225 struct io_region_ctx *ctx;
226 uacpi_generic_region_info *info = &data->generic_info;
228
229 ctx = uacpi_kernel_alloc(sizeof(*ctx));
230 if (ctx == UACPI_NULL)
232
233 ctx->base = info->base;
234
235 ret = uacpi_kernel_io_map(ctx->base, info->length, &ctx->handle);
238 data->region_node, "unable to map an IO", ret
239 );
240 uacpi_free(ctx, sizeof(*ctx));
241 return ret;
242 }
243
244 data->out_region_context = ctx;
245 return ret;
246}
#define uacpi_free(mem, _)
Definition: stdlib.h:96
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
return ret
Definition: mutex.c:147
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
uacpi_status uacpi_kernel_io_map(uacpi_io_addr base, uacpi_size len, uacpi_handle *out_handle)
Definition: uacpiosl.c:165
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111

Referenced by handle_io_region().

◆ io_region_detach()

static uacpi_status io_region_detach ( uacpi_region_detach_data data)
static

Definition at line 248 of file default_handlers.c.

249{
250 struct io_region_ctx *ctx = data->region_context;
251
252 uacpi_kernel_io_unmap(ctx->handle);
253 uacpi_free(ctx, sizeof(*ctx));
254 return UACPI_STATUS_OK;
255}
void uacpi_kernel_io_unmap(uacpi_handle handle)
Definition: uacpiosl.c:171

Referenced by handle_io_region().

◆ io_region_do_rw()

static uacpi_status io_region_do_rw ( uacpi_region_op  op,
uacpi_region_rw_data data 
)
static

Definition at line 311 of file default_handlers.c.

314{
315 struct io_region_ctx *ctx = data->region_context;
318
319 offset = data->offset - ctx->base;
320 width = data->byte_width;
321
322 return op == UACPI_REGION_OP_READ ?
323 uacpi_system_io_read(ctx->handle, offset, width, &data->value) :
325}
uacpi_status uacpi_system_io_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:1158
uacpi_status uacpi_system_io_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:1126
size_t uacpi_size
Definition: types.h:37
uint8_t uacpi_u8
Definition: types.h:19
GLint GLint GLsizei width
Definition: gl.h:1546
GLintptr offset
Definition: glext.h:5920
Definition: pdh_main.c:96

Referenced by handle_io_region().

◆ memory_region_attach()

static uacpi_status memory_region_attach ( uacpi_region_attach_data data)
static

Definition at line 182 of file default_handlers.c.

183{
184 struct memory_region_ctx *ctx;
186
187 ctx = uacpi_kernel_alloc(sizeof(*ctx));
188 if (ctx == UACPI_NULL)
190
191 ctx->size = data->generic_info.length;
192
193 // FIXME: this really shouldn't try to map everything at once
194 ctx->phys = data->generic_info.base;
195 ctx->virt = uacpi_kernel_map(ctx->phys, ctx->size);
196
197 if (uacpi_unlikely(ctx->virt == UACPI_MAP_FAILED)) {
199 uacpi_trace_region_error(data->region_node, "unable to map", ret);
200 uacpi_free(ctx, sizeof(*ctx));
201 goto out;
202 }
203
204 data->out_region_context = ctx;
205out:
206 return ret;
207}
#define uacpi_unlikely(expr)
Definition: compiler.h:88
@ UACPI_STATUS_MAPPING_FAILED
Definition: status.h:12
#define UACPI_MAP_FAILED
Definition: kernel_api.h:13
void * uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len)
Definition: uacpiosl.c:191
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by handle_memory_region().

◆ memory_region_detach()

static uacpi_status memory_region_detach ( uacpi_region_detach_data data)
static

Definition at line 209 of file default_handlers.c.

210{
211 struct memory_region_ctx *ctx = data->region_context;
212
213 uacpi_kernel_unmap(ctx->virt, ctx->size);
214 uacpi_free(ctx, sizeof(*ctx));
215 return UACPI_STATUS_OK;
216}
void uacpi_kernel_unmap(void *addr, uacpi_size len)
Definition: uacpiosl.c:198

Referenced by handle_memory_region().

◆ memory_region_do_rw()

static uacpi_status memory_region_do_rw ( uacpi_region_op  op,
uacpi_region_rw_data data 
)
static

Definition at line 257 of file default_handlers.c.

260{
261 struct memory_region_ctx *ctx = data->region_context;
263
264 offset = data->address - ctx->phys;
265
266 return op == UACPI_REGION_OP_READ ?
267 uacpi_system_memory_read(ctx->virt, offset, data->byte_width, &data->value) :
269}
uacpi_status uacpi_system_memory_read(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:1067
uacpi_status uacpi_system_memory_write(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:1093

Referenced by handle_memory_region().

◆ pci_region_attach()

static uacpi_status pci_region_attach ( uacpi_region_attach_data data)
static

Definition at line 48 of file default_handlers.c.

49{
50 uacpi_namespace_node *node, *pci_root, *device;
51 struct pci_region_ctx *ctx;
55
56 node = data->region_node;
57 pci_root = find_pci_root(node);
58
59 /*
60 * Find the actual device object that is supposed to be controlling
61 * this operation region.
62 */
63 device = node;
64 while (device) {
66
69 return ret;
70
72 break;
73
74 device = device->parent;
75 }
76
80 node, "unable to find device responsible for", ret
81 );
82 return ret;
83 }
84
86 if (ret == UACPI_STATUS_OK) {
87 address.function = (value >> 0) & 0xFF;
88 address.device = (value >> 16) & 0xFF;
89 }
90
91 ret = uacpi_eval_simple_integer(pci_root, "_SEG", &value);
92 if (ret == UACPI_STATUS_OK)
93 address.segment = value;
94
95 ret = uacpi_eval_simple_integer(pci_root, "_BBN", &value);
96 if (ret == UACPI_STATUS_OK)
97 address.bus = value;
98
100 "detected PCI device %.4s@%04X:%02X:%02X:%01X",
101 device->name.text, address.segment, address.bus,
102 address.device, address.function
103 );
104
108
109 data->out_region_context = ctx;
110
111 ret = uacpi_kernel_pci_device_open(address, &ctx->device_handle);
113 return UACPI_STATUS_OK;
114
115 ctx->handle_is_valid = UACPI_TRUE;
116 return UACPI_STATUS_OK;
117}
static uacpi_namespace_node * find_pci_root(uacpi_namespace_node *node)
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
uacpi_status uacpi_namespace_node_type(const uacpi_namespace_node *node, uacpi_object_type *out_type)
Definition: namespace.c:774
uint64_t uacpi_u64
Definition: types.h:22
#define UACPI_TRUE
Definition: types.h:29
uacpi_object_type
Definition: types.h:110
@ UACPI_OBJECT_DEVICE
Definition: types.h:117
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint address
Definition: glext.h:9393
uacpi_status uacpi_kernel_pci_device_open(uacpi_pci_address address, uacpi_handle *out_handle)
Definition: uacpiosl.c:242
Definition: devices.h:37
uacpi_status uacpi_eval_simple_integer(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_u64 *out_value)
Definition: uacpi.c:912

Referenced by handle_pci_region().

◆ pci_region_detach()

static uacpi_status pci_region_detach ( uacpi_region_detach_data data)
static

Definition at line 119 of file default_handlers.c.

120{
121 struct pci_region_ctx *ctx = data->region_context;
122
123 if (ctx->handle_is_valid)
124 uacpi_kernel_pci_device_close(ctx->device_handle);
125
126 uacpi_free(ctx, sizeof(*ctx));
127
128 return UACPI_STATUS_OK;
129}
void uacpi_kernel_pci_device_close(uacpi_handle)
Definition: uacpiosl.c:251

Referenced by handle_pci_region().

◆ pci_region_do_rw()

static uacpi_status pci_region_do_rw ( uacpi_region_op  op,
uacpi_region_rw_data data 
)
static

Definition at line 131 of file default_handlers.c.

134{
137 struct pci_region_ctx *ctx = data->region_context;
138
139 offset = data->offset;
140 width = data->byte_width;
141
142 if (!ctx->handle_is_valid) {
144 "faking a PCI device %s access",
145 op == UACPI_REGION_OP_READ ? "read" : "write"
146 );
147
148 if (op == UACPI_REGION_OP_READ) {
149 static uacpi_u64 ffs = 0xFFFFFFFFFFFFFFFF;
150 uacpi_memcpy(&data->value, &ffs, width);
151 }
152
153 return UACPI_STATUS_OK;
154 }
155
156 return op == UACPI_REGION_OP_READ ?
157 uacpi_pci_read(ctx->device_handle, offset, width, &data->value) :
159}
uacpi_status uacpi_pci_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:1217
uacpi_status uacpi_pci_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:1185
#define uacpi_memcpy
Definition: stdlib.h:34
#define ffs
Definition: port.h:360
uacpi_handle device_handle

Referenced by handle_pci_region().

◆ table_data_region_do_rw()

static uacpi_status table_data_region_do_rw ( uacpi_region_op  op,
uacpi_region_rw_data data 
)
static

Definition at line 286 of file default_handlers.c.

289{
291
292 return op == UACPI_REGION_OP_READ ?
293 uacpi_system_memory_read(addr, 0, data->byte_width, &data->value) :
294 uacpi_system_memory_write(addr, 0, data->byte_width, data->value);
295}
uacpi_uintptr uacpi_virt_addr
Definition: types.h:36
GLenum const GLvoid * addr
Definition: glext.h:9621
#define UACPI_VIRT_ADDR_TO_PTR(vaddr)
Definition: utilities.h:21

Referenced by handle_table_data_region().

◆ uacpi_install_default_address_space_handlers()

void uacpi_install_default_address_space_handlers ( void  )

Definition at line 342 of file default_handlers.c.

343{
345
347
352 );
353
358 );
359
364 );
365
370 );
371}
struct _root root
static uacpi_status handle_table_data_region(uacpi_region_op op, uacpi_handle op_data)
static uacpi_status handle_io_region(uacpi_region_op op, uacpi_handle op_data)
static uacpi_status handle_memory_region(uacpi_region_op op, uacpi_handle op_data)
static uacpi_status handle_pci_region(uacpi_region_op op, uacpi_handle op_data)
#define UACPI_ADDRESS_SPACE_HANDLER_DEFAULT
Definition: types.h:73
@ UACPI_ADDRESS_SPACE_SYSTEM_MEMORY
Definition: types.h:43
@ UACPI_ADDRESS_SPACE_PCI_CONFIG
Definition: types.h:45
@ UACPI_ADDRESS_SPACE_TABLE_DATA
Definition: types.h:58
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
Definition: types.h:44
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:625

Referenced by uacpi_initialize().