-
Notifications
You must be signed in to change notification settings - Fork 102
/
acpi.txt
138 lines (113 loc) · 4.32 KB
/
acpi.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
\section{acpi}
\begin{verbatim}
coordinator(void):
static device_t sys_device = {
.parent = &root_device,
.flags = DEV_CTX_IMMORTAL | DEV_CTX_MUST_ISOLATE,
.name = "sys",
.libname = "",
.args = "sys,",
.children = LIST_INITIAL_VALUE(sys_device.children),
.pending = LIST_INITIAL_VALUE(sys_device.pending),
.metadata = LIST_INITIAL_VALUE(sys_device.metadata),
.refcount = 1,
};
sys_device.libname = "/boot/driver/bus-acpi.so";
dc_prepare_proxy(&sys_device);
dc_create_proxy(dev)
parent->proxy = dev;
need_proxy_rpc = false
h1 = bootdata_vmo;
dc_new_devhost(devhostname, dev->host, &dev->proxy->host)
dev->proxy->host 具备了与devhost进程通信的通道hrpc
dh_create_device(dev->proxy, dev->proxy->host, arg1, h1)
dev是sys_device, dev->proxy->host通向devhost, h1是bootdata_vmo, arg1指向dev->args逗号后面,这里是空
handle[0]: rpc通道
handle[1]: bus-acpi.so vmo
handle[2]: bootdata vmo
msg.op = DC_OP_CREATE_DEVICE;
zx_channel_write(dh->hrpc, 0, &msg, mlen, handle, hcount)
通过刚刚建立的rpc通道发送过去
把新的rpc通道挂到dev->proxy上面
case DC_OP_ADD_DEVICE:
dc_add_device(dev, hin[0], &msg, name, args, data,
msg.op == DC_OP_ADD_DEVICE_INVISIBLE))
case WORK_DEVICE_ADDED:
dc_handle_new_device(dev);
dc_attempt_bind(drv, dev);
non-bus设备不用启动新的devhost kpci是non bus设备
dh_bind_driver(dev, drv->libname);
引起devhost端的kpci.c:pci_init_child
----
devhost: device_host_main()
启动阶段:
devhost_io_init();
fd: 1,2->log output
port_wait(&dh_port, &root_ios.ph)
建立最初的通道:dev->proxy->host->hrpc <=> root_ios.ph.handle
port_dispatch(&dh_port, ZX_TIME_INFINITE, false)
监听port
----
devhost:
case DC_OP_CREATE_DEVICE:
dh_find_driver(name, hin[1], &drv)
zx_device_t parent = {
.name = "device_create dummy",
};
creation_context_t ctx = {
.parent = &parent,
.child = NULL,
.rpc = hin[0],
};
devhost_set_creation_context(&ctx);
r = drv->ops->create(drv->ctx, &parent, "proxy", args, hin[2]); drv->ctx == null
acpi_drv_create(void* ctx, zx_device_t* parent, const char* name,
const char* _args, zx_handle_t zbi_vmo)
init()
install_powerbtn_handlers();
pci_report_current_resources(get_root_resource());
device_add_args_t args = {
.version = DEVICE_ADD_ARGS_VERSION,
.name = name,
.ops = &sys_device_proto,
.flags = DEVICE_ADD_NON_BINDABLE,
};
device_add(parent, &args, &sys_root);
device_add_from_driver(__zircon_driver_rec__.driver, parent, args, out)
devhost_device_create(drv, parent, args->name, args->ctx, args->ops, &dev);
devhost_device_add(dev, parent, args->props, args->prop_count, NULL);
dev->flags |= DEV_FLAG_ADDED;
dev->flags &= (~DEV_FLAG_BUSY);
dev->rpc = ctx->rpc;
ctx->child = dev;
return ZX_OK;
device_add_args_t args2 = {
.version = DEVICE_ADD_ARGS_VERSION,
.name = "acpi",
.ops = &acpi_root_device_proto,
.flags = DEVICE_ADD_NON_BINDABLE,
};
acpi_root = NULL;
device_add(sys_root, &args2, &acpi_root);
device_add_from_driver(__zircon_driver_rec__.driver, parent, args, out)
devhost_device_create(drv, parent, args->name, args->ctx, args->ops, &dev);
devhost_device_add(dev, parent, args->props, args->prop_count, NULL);
devhost_add(parent, dev, proxy_args, props, prop_count);
msg.op = DC_OP_ADD_DEVICE;
"acpi"设备创建了, protocol id == 0
publish_acpi_devices(acpi_root);
publish_acpi_device_ctx_t ctx = {
.parent = parent,
.found_pci = false,
.last_pci = -1,
};
AcpiWalkNamespace(ACPI_TYPE_DEVICE,
ACPI_ROOT_OBJECT,
MAX_NAMESPACE_DEPTH,
acpi_ns_walk_callback,
NULL, &ctx, NULL);
publish_device(parent, object, info, "pci",
ZX_PROTOCOL_PCIROOT, &pciroot_proto);
device_add()
"pci root"设备创建了
\end{verbatim}