dm: core: Add a new sequence number for devices
[platform/kernel/u-boot.git] / drivers / core / root.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2013 Google, Inc
4  *
5  * (C) Copyright 2012
6  * Pavel Herrmann <morpheus.ibis@gmail.com>
7  */
8
9 #include <common.h>
10 #include <errno.h>
11 #include <fdtdec.h>
12 #include <log.h>
13 #include <malloc.h>
14 #include <linux/libfdt.h>
15 #include <dm/acpi.h>
16 #include <dm/device.h>
17 #include <dm/device-internal.h>
18 #include <dm/lists.h>
19 #include <dm/of.h>
20 #include <dm/of_access.h>
21 #include <dm/platdata.h>
22 #include <dm/read.h>
23 #include <dm/root.h>
24 #include <dm/uclass.h>
25 #include <dm/util.h>
26 #include <linux/list.h>
27
28 DECLARE_GLOBAL_DATA_PTR;
29
30 static struct driver_info root_info = {
31         .name           = "root_driver",
32 };
33
34 struct udevice *dm_root(void)
35 {
36         if (!gd->dm_root) {
37                 dm_warn("Virtual root driver does not exist!\n");
38                 return NULL;
39         }
40
41         return gd->dm_root;
42 }
43
44 void dm_fixup_for_gd_move(struct global_data *new_gd)
45 {
46         /* The sentinel node has moved, so update things that point to it */
47         if (gd->dm_root) {
48                 new_gd->uclass_root.next->prev = &new_gd->uclass_root;
49                 new_gd->uclass_root.prev->next = &new_gd->uclass_root;
50         }
51 }
52
53 void fix_drivers(void)
54 {
55         struct driver *drv =
56                 ll_entry_start(struct driver, driver);
57         const int n_ents = ll_entry_count(struct driver, driver);
58         struct driver *entry;
59
60         for (entry = drv; entry != drv + n_ents; entry++) {
61                 if (entry->of_match)
62                         entry->of_match = (const struct udevice_id *)
63                                 ((ulong)entry->of_match + gd->reloc_off);
64                 if (entry->bind)
65                         entry->bind += gd->reloc_off;
66                 if (entry->probe)
67                         entry->probe += gd->reloc_off;
68                 if (entry->remove)
69                         entry->remove += gd->reloc_off;
70                 if (entry->unbind)
71                         entry->unbind += gd->reloc_off;
72                 if (entry->of_to_plat)
73                         entry->of_to_plat += gd->reloc_off;
74                 if (entry->child_post_bind)
75                         entry->child_post_bind += gd->reloc_off;
76                 if (entry->child_pre_probe)
77                         entry->child_pre_probe += gd->reloc_off;
78                 if (entry->child_post_remove)
79                         entry->child_post_remove += gd->reloc_off;
80                 /* OPS are fixed in every uclass post_probe function */
81                 if (entry->ops)
82                         entry->ops += gd->reloc_off;
83         }
84 }
85
86 void fix_uclass(void)
87 {
88         struct uclass_driver *uclass =
89                 ll_entry_start(struct uclass_driver, uclass);
90         const int n_ents = ll_entry_count(struct uclass_driver, uclass);
91         struct uclass_driver *entry;
92
93         for (entry = uclass; entry != uclass + n_ents; entry++) {
94                 if (entry->post_bind)
95                         entry->post_bind += gd->reloc_off;
96                 if (entry->pre_unbind)
97                         entry->pre_unbind += gd->reloc_off;
98                 if (entry->pre_probe)
99                         entry->pre_probe += gd->reloc_off;
100                 if (entry->post_probe)
101                         entry->post_probe += gd->reloc_off;
102                 if (entry->pre_remove)
103                         entry->pre_remove += gd->reloc_off;
104                 if (entry->child_post_bind)
105                         entry->child_post_bind += gd->reloc_off;
106                 if (entry->child_pre_probe)
107                         entry->child_pre_probe += gd->reloc_off;
108                 if (entry->init)
109                         entry->init += gd->reloc_off;
110                 if (entry->destroy)
111                         entry->destroy += gd->reloc_off;
112                 /* FIXME maybe also need to fix these ops */
113                 if (entry->ops)
114                         entry->ops += gd->reloc_off;
115         }
116 }
117
118 void fix_devices(void)
119 {
120         struct driver_info *dev =
121                 ll_entry_start(struct driver_info, driver_info);
122         const int n_ents = ll_entry_count(struct driver_info, driver_info);
123         struct driver_info *entry;
124
125         for (entry = dev; entry != dev + n_ents; entry++) {
126                 if (entry->plat)
127                         entry->plat += gd->reloc_off;
128         }
129 }
130
131 int dm_init(bool of_live)
132 {
133         int ret;
134
135         if (gd->dm_root) {
136                 dm_warn("Virtual root driver already exists!\n");
137                 return -EINVAL;
138         }
139         INIT_LIST_HEAD(&DM_UCLASS_ROOT_NON_CONST);
140
141         if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) {
142                 fix_drivers();
143                 fix_uclass();
144                 fix_devices();
145         }
146
147         ret = device_bind_by_name(NULL, false, &root_info, &DM_ROOT_NON_CONST);
148         if (ret)
149                 return ret;
150         if (CONFIG_IS_ENABLED(OF_CONTROL))
151                 DM_ROOT_NON_CONST->node = ofnode_root();
152         ret = device_probe(DM_ROOT_NON_CONST);
153         if (ret)
154                 return ret;
155
156         return 0;
157 }
158
159 int dm_uninit(void)
160 {
161         device_remove(dm_root(), DM_REMOVE_NORMAL);
162         device_unbind(dm_root());
163         gd->dm_root = NULL;
164
165         return 0;
166 }
167
168 #if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
169 int dm_remove_devices_flags(uint flags)
170 {
171         device_remove(dm_root(), flags);
172
173         return 0;
174 }
175 #endif
176
177 int dm_scan_plat(bool pre_reloc_only)
178 {
179         int ret;
180
181         if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
182                 struct driver_rt *dyn;
183                 int n_ents;
184
185                 n_ents = ll_entry_count(struct driver_info, driver_info);
186                 dyn = calloc(n_ents, sizeof(struct driver_rt));
187                 if (!dyn)
188                         return -ENOMEM;
189                 gd_set_dm_driver_rt(dyn);
190         }
191
192         ret = lists_bind_drivers(DM_ROOT_NON_CONST, pre_reloc_only);
193         if (ret == -ENOENT) {
194                 dm_warn("Some drivers were not found\n");
195                 ret = 0;
196         }
197
198         return ret;
199 }
200
201 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
202 /**
203  * dm_scan_fdt_node() - Scan the device tree and bind drivers for a node
204  *
205  * This scans the subnodes of a device tree node and and creates a driver
206  * for each one.
207  *
208  * @parent: Parent device for the devices that will be created
209  * @node: Node to scan
210  * @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
211  * flag. If false bind all drivers.
212  * @return 0 if OK, -ve on error
213  */
214 static int dm_scan_fdt_node(struct udevice *parent, ofnode parent_node,
215                             bool pre_reloc_only)
216 {
217         int ret = 0, err;
218         ofnode node;
219
220         if (!ofnode_valid(parent_node))
221                 return 0;
222
223         for (node = ofnode_first_subnode(parent_node);
224              ofnode_valid(node);
225              node = ofnode_next_subnode(node)) {
226                 const char *node_name = ofnode_get_name(node);
227
228                 if (!ofnode_is_enabled(node)) {
229                         pr_debug("   - ignoring disabled device\n");
230                         continue;
231                 }
232                 err = lists_bind_fdt(parent, node, NULL, pre_reloc_only);
233                 if (err && !ret) {
234                         ret = err;
235                         debug("%s: ret=%d\n", node_name, ret);
236                 }
237         }
238
239         if (ret)
240                 dm_warn("Some drivers failed to bind\n");
241
242         return ret;
243 }
244
245 int dm_scan_fdt_dev(struct udevice *dev)
246 {
247         return dm_scan_fdt_node(dev, dev_ofnode(dev),
248                                 gd->flags & GD_FLG_RELOC ? false : true);
249 }
250
251 int dm_scan_fdt(bool pre_reloc_only)
252 {
253         return dm_scan_fdt_node(gd->dm_root, ofnode_root(), pre_reloc_only);
254 }
255
256 static int dm_scan_fdt_ofnode_path(const char *path, bool pre_reloc_only)
257 {
258         ofnode node;
259
260         node = ofnode_path(path);
261
262         return dm_scan_fdt_node(gd->dm_root, node, pre_reloc_only);
263 }
264
265 int dm_extended_scan(bool pre_reloc_only)
266 {
267         int ret, i;
268         const char * const nodes[] = {
269                 "/chosen",
270                 "/clocks",
271                 "/firmware"
272         };
273
274         ret = dm_scan_fdt(pre_reloc_only);
275         if (ret) {
276                 debug("dm_scan_fdt() failed: %d\n", ret);
277                 return ret;
278         }
279
280         /* Some nodes aren't devices themselves but may contain some */
281         for (i = 0; i < ARRAY_SIZE(nodes); i++) {
282                 ret = dm_scan_fdt_ofnode_path(nodes[i], pre_reloc_only);
283                 if (ret) {
284                         debug("dm_scan_fdt() scan for %s failed: %d\n",
285                               nodes[i], ret);
286                         return ret;
287                 }
288         }
289
290         return ret;
291 }
292 #endif
293
294 __weak int dm_scan_other(bool pre_reloc_only)
295 {
296         return 0;
297 }
298
299 int dm_init_and_scan(bool pre_reloc_only)
300 {
301         int ret;
302
303         if (CONFIG_IS_ENABLED(OF_PLATDATA))
304                 dm_populate_phandle_data();
305
306         ret = dm_init(CONFIG_IS_ENABLED(OF_LIVE));
307         if (ret) {
308                 debug("dm_init() failed: %d\n", ret);
309                 return ret;
310         }
311         ret = dm_scan_plat(pre_reloc_only);
312         if (ret) {
313                 debug("dm_scan_plat() failed: %d\n", ret);
314                 goto fail;
315         }
316
317         if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
318                 ret = dm_extended_scan(pre_reloc_only);
319                 if (ret) {
320                         debug("dm_extended_scan() failed: %d\n", ret);
321                         goto fail;
322                 }
323         }
324
325         ret = dm_scan_other(pre_reloc_only);
326         if (ret)
327                 goto fail;
328
329         return 0;
330 fail:
331         return ret;
332 }
333
334 #ifdef CONFIG_ACPIGEN
335 static int root_acpi_get_name(const struct udevice *dev, char *out_name)
336 {
337         return acpi_copy_name(out_name, "\\_SB");
338 }
339
340 struct acpi_ops root_acpi_ops = {
341         .get_name       = root_acpi_get_name,
342 };
343 #endif
344
345 /* This is the root driver - all drivers are children of this */
346 U_BOOT_DRIVER(root_driver) = {
347         .name   = "root_driver",
348         .id     = UCLASS_ROOT,
349         ACPI_OPS_PTR(&root_acpi_ops)
350 };
351
352 /* This is the root uclass */
353 UCLASS_DRIVER(root) = {
354         .name   = "root",
355         .id     = UCLASS_ROOT,
356 };