1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#define pr_fmt(fmt) "OF: " fmt
22
23#include <linux/console.h>
24#include <linux/ctype.h>
25#include <linux/cpu.h>
26#include <linux/module.h>
27#include <linux/of.h>
28#include <linux/of_device.h>
29#include <linux/of_graph.h>
30#include <linux/spinlock.h>
31#include <linux/slab.h>
32#include <linux/string.h>
33#include <linux/proc_fs.h>
34
35#include "of_private.h"
36
37LIST_HEAD(aliases_lookup);
38
39struct device_node *of_root;
40EXPORT_SYMBOL(of_root);
41struct device_node *of_chosen;
42struct device_node *of_aliases;
43struct device_node *of_stdout;
44static const char *of_stdout_options;
45
46struct kset *of_kset;
47
48
49
50
51
52
53
54DEFINE_MUTEX(of_mutex);
55
56
57
58
59DEFINE_RAW_SPINLOCK(devtree_lock);
60
61int of_n_addr_cells(struct device_node *np)
62{
63 u32 cells;
64
65 do {
66 if (np->parent)
67 np = np->parent;
68 if (!of_property_read_u32(np, "#address-cells", &cells))
69 return cells;
70 } while (np->parent);
71
72 return OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
73}
74EXPORT_SYMBOL(of_n_addr_cells);
75
76int of_n_size_cells(struct device_node *np)
77{
78 u32 cells;
79
80 do {
81 if (np->parent)
82 np = np->parent;
83 if (!of_property_read_u32(np, "#size-cells", &cells))
84 return cells;
85 } while (np->parent);
86
87 return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
88}
89EXPORT_SYMBOL(of_n_size_cells);
90
91#ifdef CONFIG_NUMA
92int __weak of_node_to_nid(struct device_node *np)
93{
94 return NUMA_NO_NODE;
95}
96#endif
97
98#ifndef CONFIG_OF_DYNAMIC
99static void of_node_release(struct kobject *kobj)
100{
101
102}
103#endif
104
105struct kobj_type of_node_ktype = {
106 .release = of_node_release,
107};
108
109static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj,
110 struct bin_attribute *bin_attr, char *buf,
111 loff_t offset, size_t count)
112{
113 struct property *pp = container_of(bin_attr, struct property, attr);
114 return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length);
115}
116
117
118static const char *safe_name(struct kobject *kobj, const char *orig_name)
119{
120 const char *name = orig_name;
121 struct kernfs_node *kn;
122 int i = 0;
123
124
125 while (i < 16 && (kn = sysfs_get_dirent(kobj->sd, name))) {
126 sysfs_put(kn);
127 if (name != orig_name)
128 kfree(name);
129 name = kasprintf(GFP_KERNEL, "%s#%i", orig_name, ++i);
130 }
131
132 if (name == orig_name) {
133 name = kstrdup(orig_name, GFP_KERNEL);
134 } else {
135 pr_warn("Duplicate name in %s, renamed to \"%s\"\n",
136 kobject_name(kobj), name);
137 }
138 return name;
139}
140
141int __of_add_property_sysfs(struct device_node *np, struct property *pp)
142{
143 int rc;
144
145
146 bool secure = strncmp(pp->name, "security-", 9) == 0;
147
148 if (!IS_ENABLED(CONFIG_SYSFS))
149 return 0;
150
151 if (!of_kset || !of_node_is_attached(np))
152 return 0;
153
154 sysfs_bin_attr_init(&pp->attr);
155 pp->attr.attr.name = safe_name(&np->kobj, pp->name);
156 pp->attr.attr.mode = secure ? 0400 : 0444;
157 pp->attr.size = secure ? 0 : pp->length;
158 pp->attr.read = of_node_property_read;
159
160 rc = sysfs_create_bin_file(&np->kobj, &pp->attr);
161 WARN(rc, "error adding attribute %s to node %pOF\n", pp->name, np);
162 return rc;
163}
164
165int __of_attach_node_sysfs(struct device_node *np)
166{
167 const char *name;
168 struct kobject *parent;
169 struct property *pp;
170 int rc;
171
172 if (!IS_ENABLED(CONFIG_SYSFS))
173 return 0;
174
175 if (!of_kset)
176 return 0;
177
178 np->kobj.kset = of_kset;
179 if (!np->parent) {
180
181 name = safe_name(&of_kset->kobj, "base");
182 parent = NULL;
183 } else {
184 name = safe_name(&np->parent->kobj, kbasename(np->full_name));
185 parent = &np->parent->kobj;
186 }
187 if (!name)
188 return -ENOMEM;
189 rc = kobject_add(&np->kobj, parent, "%s", name);
190 kfree(name);
191 if (rc)
192 return rc;
193
194 for_each_property_of_node(np, pp)
195 __of_add_property_sysfs(np, pp);
196
197 return 0;
198}
199
200void __init of_core_init(void)
201{
202 struct device_node *np;
203
204
205 mutex_lock(&of_mutex);
206 of_kset = kset_create_and_add("devicetree", NULL, firmware_kobj);
207 if (!of_kset) {
208 mutex_unlock(&of_mutex);
209 pr_err("failed to register existing nodes\n");
210 return;
211 }
212 for_each_of_allnodes(np)
213 __of_attach_node_sysfs(np);
214 mutex_unlock(&of_mutex);
215
216
217 if (of_root)
218 proc_symlink("device-tree", NULL, "/sys/firmware/devicetree/base");
219}
220
221static struct property *__of_find_property(const struct device_node *np,
222 const char *name, int *lenp)
223{
224 struct property *pp;
225
226 if (!np)
227 return NULL;
228
229 for (pp = np->properties; pp; pp = pp->next) {
230 if (of_prop_cmp(pp->name, name) == 0) {
231 if (lenp)
232 *lenp = pp->length;
233 break;
234 }
235 }
236
237 return pp;
238}
239
240struct property *of_find_property(const struct device_node *np,
241 const char *name,
242 int *lenp)
243{
244 struct property *pp;
245 unsigned long flags;
246
247 raw_spin_lock_irqsave(&devtree_lock, flags);
248 pp = __of_find_property(np, name, lenp);
249 raw_spin_unlock_irqrestore(&devtree_lock, flags);
250
251 return pp;
252}
253EXPORT_SYMBOL(of_find_property);
254
255struct device_node *__of_find_all_nodes(struct device_node *prev)
256{
257 struct device_node *np;
258 if (!prev) {
259 np = of_root;
260 } else if (prev->child) {
261 np = prev->child;
262 } else {
263
264 np = prev;
265 while (np->parent && !np->sibling)
266 np = np->parent;
267 np = np->sibling;
268 }
269 return np;
270}
271
272
273
274
275
276
277
278
279
280struct device_node *of_find_all_nodes(struct device_node *prev)
281{
282 struct device_node *np;
283 unsigned long flags;
284
285 raw_spin_lock_irqsave(&devtree_lock, flags);
286 np = __of_find_all_nodes(prev);
287 of_node_get(np);
288 of_node_put(prev);
289 raw_spin_unlock_irqrestore(&devtree_lock, flags);
290 return np;
291}
292EXPORT_SYMBOL(of_find_all_nodes);
293
294
295
296
297
298const void *__of_get_property(const struct device_node *np,
299 const char *name, int *lenp)
300{
301 struct property *pp = __of_find_property(np, name, lenp);
302
303 return pp ? pp->value : NULL;
304}
305
306
307
308
309
310const void *of_get_property(const struct device_node *np, const char *name,
311 int *lenp)
312{
313 struct property *pp = of_find_property(np, name, lenp);
314
315 return pp ? pp->value : NULL;
316}
317EXPORT_SYMBOL(of_get_property);
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333bool __weak arch_match_cpu_phys_id(int cpu, u64 phys_id)
334{
335 return (u32)phys_id == cpu;
336}
337
338
339
340
341
342
343static bool __of_find_n_match_cpu_property(struct device_node *cpun,
344 const char *prop_name, int cpu, unsigned int *thread)
345{
346 const __be32 *cell;
347 int ac, prop_len, tid;
348 u64 hwid;
349
350 ac = of_n_addr_cells(cpun);
351 cell = of_get_property(cpun, prop_name, &prop_len);
352 if (!cell || !ac)
353 return false;
354 prop_len /= sizeof(*cell) * ac;
355 for (tid = 0; tid < prop_len; tid++) {
356 hwid = of_read_number(cell, ac);
357 if (arch_match_cpu_phys_id(cpu, hwid)) {
358 if (thread)
359 *thread = tid;
360 return true;
361 }
362 cell += ac;
363 }
364 return false;
365}
366
367
368
369
370
371
372
373bool __weak arch_find_n_match_cpu_physical_id(struct device_node *cpun,
374 int cpu, unsigned int *thread)
375{
376
377
378
379
380 if (IS_ENABLED(CONFIG_PPC) &&
381 __of_find_n_match_cpu_property(cpun,
382 "ibm,ppc-interrupt-server#s",
383 cpu, thread))
384 return true;
385
386 return __of_find_n_match_cpu_property(cpun, "reg", cpu, thread);
387}
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
409{
410 struct device_node *cpun;
411
412 for_each_node_by_type(cpun, "cpu") {
413 if (arch_find_n_match_cpu_physical_id(cpun, cpu, thread))
414 return cpun;
415 }
416 return NULL;
417}
418EXPORT_SYMBOL(of_get_cpu_node);
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450static int __of_device_is_compatible(const struct device_node *device,
451 const char *compat, const char *type, const char *name)
452{
453 struct property *prop;
454 const char *cp;
455 int index = 0, score = 0;
456
457
458 if (compat && compat[0]) {
459 prop = __of_find_property(device, "compatible", NULL);
460 for (cp = of_prop_next_string(prop, NULL); cp;
461 cp = of_prop_next_string(prop, cp), index++) {
462 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) {
463 score = INT_MAX/2 - (index << 2);
464 break;
465 }
466 }
467 if (!score)
468 return 0;
469 }
470
471
472 if (type && type[0]) {
473 if (!device->type || of_node_cmp(type, device->type))
474 return 0;
475 score += 2;
476 }
477
478
479 if (name && name[0]) {
480 if (!device->name || of_node_cmp(name, device->name))
481 return 0;
482 score++;
483 }
484
485 return score;
486}
487
488
489
490
491int of_device_is_compatible(const struct device_node *device,
492 const char *compat)
493{
494 unsigned long flags;
495 int res;
496
497 raw_spin_lock_irqsave(&devtree_lock, flags);
498 res = __of_device_is_compatible(device, compat, NULL, NULL);
499 raw_spin_unlock_irqrestore(&devtree_lock, flags);
500 return res;
501}
502EXPORT_SYMBOL(of_device_is_compatible);
503
504
505
506
507
508int of_device_compatible_match(struct device_node *device,
509 const char *const *compat)
510{
511 unsigned int tmp, score = 0;
512
513 if (!compat)
514 return 0;
515
516 while (*compat) {
517 tmp = of_device_is_compatible(device, *compat);
518 if (tmp > score)
519 score = tmp;
520 compat++;
521 }
522
523 return score;
524}
525
526
527
528
529
530
531
532
533int of_machine_is_compatible(const char *compat)
534{
535 struct device_node *root;
536 int rc = 0;
537
538 root = of_find_node_by_path("/");
539 if (root) {
540 rc = of_device_is_compatible(root, compat);
541 of_node_put(root);
542 }
543 return rc;
544}
545EXPORT_SYMBOL(of_machine_is_compatible);
546
547
548
549
550
551
552
553
554
555static bool __of_device_is_available(const struct device_node *device)
556{
557 const char *status;
558 int statlen;
559
560 if (!device)
561 return false;
562
563 status = __of_get_property(device, "status", &statlen);
564 if (status == NULL)
565 return true;
566
567 if (statlen > 0) {
568 if (!strcmp(status, "okay") || !strcmp(status, "ok"))
569 return true;
570 }
571
572 return false;
573}
574
575
576
577
578
579
580
581
582
583bool of_device_is_available(const struct device_node *device)
584{
585 unsigned long flags;
586 bool res;
587
588 raw_spin_lock_irqsave(&devtree_lock, flags);
589 res = __of_device_is_available(device);
590 raw_spin_unlock_irqrestore(&devtree_lock, flags);
591 return res;
592
593}
594EXPORT_SYMBOL(of_device_is_available);
595
596
597
598
599
600
601
602
603
604
605
606
607
608bool of_device_is_big_endian(const struct device_node *device)
609{
610 if (of_property_read_bool(device, "big-endian"))
611 return true;
612 if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) &&
613 of_property_read_bool(device, "native-endian"))
614 return true;
615 return false;
616}
617EXPORT_SYMBOL(of_device_is_big_endian);
618
619
620
621
622
623
624
625
626struct device_node *of_get_parent(const struct device_node *node)
627{
628 struct device_node *np;
629 unsigned long flags;
630
631 if (!node)
632 return NULL;
633
634 raw_spin_lock_irqsave(&devtree_lock, flags);
635 np = of_node_get(node->parent);
636 raw_spin_unlock_irqrestore(&devtree_lock, flags);
637 return np;
638}
639EXPORT_SYMBOL(of_get_parent);
640
641
642
643
644
645
646
647
648
649
650
651
652struct device_node *of_get_next_parent(struct device_node *node)
653{
654 struct device_node *parent;
655 unsigned long flags;
656
657 if (!node)
658 return NULL;
659
660 raw_spin_lock_irqsave(&devtree_lock, flags);
661 parent = of_node_get(node->parent);
662 of_node_put(node);
663 raw_spin_unlock_irqrestore(&devtree_lock, flags);
664 return parent;
665}
666EXPORT_SYMBOL(of_get_next_parent);
667
668static struct device_node *__of_get_next_child(const struct device_node *node,
669 struct device_node *prev)
670{
671 struct device_node *next;
672
673 if (!node)
674 return NULL;
675
676 next = prev ? prev->sibling : node->child;
677 for (; next; next = next->sibling)
678 if (of_node_get(next))
679 break;
680 of_node_put(prev);
681 return next;
682}
683#define __for_each_child_of_node(parent, child) \
684 for (child = __of_get_next_child(parent, NULL); child != NULL; \
685 child = __of_get_next_child(parent, child))
686
687
688
689
690
691
692
693
694
695
696struct device_node *of_get_next_child(const struct device_node *node,
697 struct device_node *prev)
698{
699 struct device_node *next;
700 unsigned long flags;
701
702 raw_spin_lock_irqsave(&devtree_lock, flags);
703 next = __of_get_next_child(node, prev);
704 raw_spin_unlock_irqrestore(&devtree_lock, flags);
705 return next;
706}
707EXPORT_SYMBOL(of_get_next_child);
708
709
710
711
712
713
714
715
716
717struct device_node *of_get_next_available_child(const struct device_node *node,
718 struct device_node *prev)
719{
720 struct device_node *next;
721 unsigned long flags;
722
723 if (!node)
724 return NULL;
725
726 raw_spin_lock_irqsave(&devtree_lock, flags);
727 next = prev ? prev->sibling : node->child;
728 for (; next; next = next->sibling) {
729 if (!__of_device_is_available(next))
730 continue;
731 if (of_node_get(next))
732 break;
733 }
734 of_node_put(prev);
735 raw_spin_unlock_irqrestore(&devtree_lock, flags);
736 return next;
737}
738EXPORT_SYMBOL(of_get_next_available_child);
739
740
741
742
743
744
745
746
747
748
749
750
751struct device_node *of_get_child_by_name(const struct device_node *node,
752 const char *name)
753{
754 struct device_node *child;
755
756 for_each_child_of_node(node, child)
757 if (child->name && (of_node_cmp(child->name, name) == 0))
758 break;
759 return child;
760}
761EXPORT_SYMBOL(of_get_child_by_name);
762
763static struct device_node *__of_find_node_by_path(struct device_node *parent,
764 const char *path)
765{
766 struct device_node *child;
767 int len;
768
769 len = strcspn(path, "/:");
770 if (!len)
771 return NULL;
772
773 __for_each_child_of_node(parent, child) {
774 const char *name = kbasename(child->full_name);
775 if (strncmp(path, name, len) == 0 && (strlen(name) == len))
776 return child;
777 }
778 return NULL;
779}
780
781struct device_node *__of_find_node_by_full_path(struct device_node *node,
782 const char *path)
783{
784 const char *separator = strchr(path, ':');
785
786 while (node && *path == '/') {
787 struct device_node *tmp = node;
788
789 path++;
790 node = __of_find_node_by_path(node, path);
791 of_node_put(tmp);
792 path = strchrnul(path, '/');
793 if (separator && separator < path)
794 break;
795 }
796 return node;
797}
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817struct device_node *of_find_node_opts_by_path(const char *path, const char **opts)
818{
819 struct device_node *np = NULL;
820 struct property *pp;
821 unsigned long flags;
822 const char *separator = strchr(path, ':');
823
824 if (opts)
825 *opts = separator ? separator + 1 : NULL;
826
827 if (strcmp(path, "/") == 0)
828 return of_node_get(of_root);
829
830
831 if (*path != '/') {
832 int len;
833 const char *p = separator;
834
835 if (!p)
836 p = strchrnul(path, '/');
837 len = p - path;
838
839
840 if (!of_aliases)
841 return NULL;
842
843 for_each_property_of_node(of_aliases, pp) {
844 if (strlen(pp->name) == len && !strncmp(pp->name, path, len)) {
845 np = of_find_node_by_path(pp->value);
846 break;
847 }
848 }
849 if (!np)
850 return NULL;
851 path = p;
852 }
853
854
855 raw_spin_lock_irqsave(&devtree_lock, flags);
856 if (!np)
857 np = of_node_get(of_root);
858 np = __of_find_node_by_full_path(np, path);
859 raw_spin_unlock_irqrestore(&devtree_lock, flags);
860 return np;
861}
862EXPORT_SYMBOL(of_find_node_opts_by_path);
863
864
865
866
867
868
869
870
871
872
873
874
875struct device_node *of_find_node_by_name(struct device_node *from,
876 const char *name)
877{
878 struct device_node *np;
879 unsigned long flags;
880
881 raw_spin_lock_irqsave(&devtree_lock, flags);
882 for_each_of_allnodes_from(from, np)
883 if (np->name && (of_node_cmp(np->name, name) == 0)
884 && of_node_get(np))
885 break;
886 of_node_put(from);
887 raw_spin_unlock_irqrestore(&devtree_lock, flags);
888 return np;
889}
890EXPORT_SYMBOL(of_find_node_by_name);
891
892
893
894
895
896
897
898
899
900
901
902
903
904struct device_node *of_find_node_by_type(struct device_node *from,
905 const char *type)
906{
907 struct device_node *np;
908 unsigned long flags;
909
910 raw_spin_lock_irqsave(&devtree_lock, flags);
911 for_each_of_allnodes_from(from, np)
912 if (np->type && (of_node_cmp(np->type, type) == 0)
913 && of_node_get(np))
914 break;
915 of_node_put(from);
916 raw_spin_unlock_irqrestore(&devtree_lock, flags);
917 return np;
918}
919EXPORT_SYMBOL(of_find_node_by_type);
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935struct device_node *of_find_compatible_node(struct device_node *from,
936 const char *type, const char *compatible)
937{
938 struct device_node *np;
939 unsigned long flags;
940
941 raw_spin_lock_irqsave(&devtree_lock, flags);
942 for_each_of_allnodes_from(from, np)
943 if (__of_device_is_compatible(np, compatible, type, NULL) &&
944 of_node_get(np))
945 break;
946 of_node_put(from);
947 raw_spin_unlock_irqrestore(&devtree_lock, flags);
948 return np;
949}
950EXPORT_SYMBOL(of_find_compatible_node);
951
952
953
954
955
956
957
958
959
960
961
962
963
964struct device_node *of_find_node_with_property(struct device_node *from,
965 const char *prop_name)
966{
967 struct device_node *np;
968 struct property *pp;
969 unsigned long flags;
970
971 raw_spin_lock_irqsave(&devtree_lock, flags);
972 for_each_of_allnodes_from(from, np) {
973 for (pp = np->properties; pp; pp = pp->next) {
974 if (of_prop_cmp(pp->name, prop_name) == 0) {
975 of_node_get(np);
976 goto out;
977 }
978 }
979 }
980out:
981 of_node_put(from);
982 raw_spin_unlock_irqrestore(&devtree_lock, flags);
983 return np;
984}
985EXPORT_SYMBOL(of_find_node_with_property);
986
987static
988const struct of_device_id *__of_match_node(const struct of_device_id *matches,
989 const struct device_node *node)
990{
991 const struct of_device_id *best_match = NULL;
992 int score, best_score = 0;
993
994 if (!matches)
995 return NULL;
996
997 for (; matches->name[0] || matches->type[0] || matches->compatible[0]; matches++) {
998 score = __of_device_is_compatible(node, matches->compatible,
999 matches->type, matches->name);
1000 if (score > best_score) {
1001 best_match = matches;
1002 best_score = score;
1003 }
1004 }
1005
1006 return best_match;
1007}
1008
1009
1010
1011
1012
1013
1014
1015
1016const struct of_device_id *of_match_node(const struct of_device_id *matches,
1017 const struct device_node *node)
1018{
1019 const struct of_device_id *match;
1020 unsigned long flags;
1021
1022 raw_spin_lock_irqsave(&devtree_lock, flags);
1023 match = __of_match_node(matches, node);
1024 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1025 return match;
1026}
1027EXPORT_SYMBOL(of_match_node);
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042struct device_node *of_find_matching_node_and_match(struct device_node *from,
1043 const struct of_device_id *matches,
1044 const struct of_device_id **match)
1045{
1046 struct device_node *np;
1047 const struct of_device_id *m;
1048 unsigned long flags;
1049
1050 if (match)
1051 *match = NULL;
1052
1053 raw_spin_lock_irqsave(&devtree_lock, flags);
1054 for_each_of_allnodes_from(from, np) {
1055 m = __of_match_node(matches, np);
1056 if (m && of_node_get(np)) {
1057 if (match)
1058 *match = m;
1059 break;
1060 }
1061 }
1062 of_node_put(from);
1063 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1064 return np;
1065}
1066EXPORT_SYMBOL(of_find_matching_node_and_match);
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081int of_modalias_node(struct device_node *node, char *modalias, int len)
1082{
1083 const char *compatible, *p;
1084 int cplen;
1085
1086 compatible = of_get_property(node, "compatible", &cplen);
1087 if (!compatible || strlen(compatible) > cplen)
1088 return -ENODEV;
1089 p = strchr(compatible, ',');
1090 strlcpy(modalias, p ? p + 1 : compatible, len);
1091 return 0;
1092}
1093EXPORT_SYMBOL_GPL(of_modalias_node);
1094
1095
1096
1097
1098
1099
1100
1101
1102struct device_node *of_find_node_by_phandle(phandle handle)
1103{
1104 struct device_node *np;
1105 unsigned long flags;
1106
1107 if (!handle)
1108 return NULL;
1109
1110 raw_spin_lock_irqsave(&devtree_lock, flags);
1111 for_each_of_allnodes(np)
1112 if (np->phandle == handle)
1113 break;
1114 of_node_get(np);
1115 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1116 return np;
1117}
1118EXPORT_SYMBOL(of_find_node_by_phandle);
1119
1120void of_print_phandle_args(const char *msg, const struct of_phandle_args *args)
1121{
1122 int i;
1123 printk("%s %pOF", msg, args->np);
1124 for (i = 0; i < args->args_count; i++) {
1125 const char delim = i ? ',' : ':';
1126
1127 pr_cont("%c%08x", delim, args->args[i]);
1128 }
1129 pr_cont("\n");
1130}
1131
1132int of_phandle_iterator_init(struct of_phandle_iterator *it,
1133 const struct device_node *np,
1134 const char *list_name,
1135 const char *cells_name,
1136 int cell_count)
1137{
1138 const __be32 *list;
1139 int size;
1140
1141 memset(it, 0, sizeof(*it));
1142
1143 list = of_get_property(np, list_name, &size);
1144 if (!list)
1145 return -ENOENT;
1146
1147 it->cells_name = cells_name;
1148 it->cell_count = cell_count;
1149 it->parent = np;
1150 it->list_end = list + size / sizeof(*list);
1151 it->phandle_end = list;
1152 it->cur = list;
1153
1154 return 0;
1155}
1156EXPORT_SYMBOL_GPL(of_phandle_iterator_init);
1157
1158int of_phandle_iterator_next(struct of_phandle_iterator *it)
1159{
1160 uint32_t count = 0;
1161
1162 if (it->node) {
1163 of_node_put(it->node);
1164 it->node = NULL;
1165 }
1166
1167 if (!it->cur || it->phandle_end >= it->list_end)
1168 return -ENOENT;
1169
1170 it->cur = it->phandle_end;
1171
1172
1173 it->phandle = be32_to_cpup(it->cur++);
1174
1175 if (it->phandle) {
1176
1177
1178
1179
1180
1181 it->node = of_find_node_by_phandle(it->phandle);
1182
1183 if (it->cells_name) {
1184 if (!it->node) {
1185 pr_err("%pOF: could not find phandle\n",
1186 it->parent);
1187 goto err;
1188 }
1189
1190 if (of_property_read_u32(it->node, it->cells_name,
1191 &count)) {
1192 pr_err("%pOF: could not get %s for %pOF\n",
1193 it->parent,
1194 it->cells_name,
1195 it->node);
1196 goto err;
1197 }
1198 } else {
1199 count = it->cell_count;
1200 }
1201
1202
1203
1204
1205
1206 if (it->cur + count > it->list_end) {
1207 pr_err("%pOF: arguments longer than property\n",
1208 it->parent);
1209 goto err;
1210 }
1211 }
1212
1213 it->phandle_end = it->cur + count;
1214 it->cur_count = count;
1215
1216 return 0;
1217
1218err:
1219 if (it->node) {
1220 of_node_put(it->node);
1221 it->node = NULL;
1222 }
1223
1224 return -EINVAL;
1225}
1226EXPORT_SYMBOL_GPL(of_phandle_iterator_next);
1227
1228int of_phandle_iterator_args(struct of_phandle_iterator *it,
1229 uint32_t *args,
1230 int size)
1231{
1232 int i, count;
1233
1234 count = it->cur_count;
1235
1236 if (WARN_ON(size < count))
1237 count = size;
1238
1239 for (i = 0; i < count; i++)
1240 args[i] = be32_to_cpup(it->cur++);
1241
1242 return count;
1243}
1244
1245static int __of_parse_phandle_with_args(const struct device_node *np,
1246 const char *list_name,
1247 const char *cells_name,
1248 int cell_count, int index,
1249 struct of_phandle_args *out_args)
1250{
1251 struct of_phandle_iterator it;
1252 int rc, cur_index = 0;
1253
1254
1255 of_for_each_phandle(&it, rc, np, list_name, cells_name, cell_count) {
1256
1257
1258
1259
1260
1261
1262 rc = -ENOENT;
1263 if (cur_index == index) {
1264 if (!it.phandle)
1265 goto err;
1266
1267 if (out_args) {
1268 int c;
1269
1270 c = of_phandle_iterator_args(&it,
1271 out_args->args,
1272 MAX_PHANDLE_ARGS);
1273 out_args->np = it.node;
1274 out_args->args_count = c;
1275 } else {
1276 of_node_put(it.node);
1277 }
1278
1279
1280 return 0;
1281 }
1282
1283 cur_index++;
1284 }
1285
1286
1287
1288
1289
1290
1291
1292 err:
1293 of_node_put(it.node);
1294 return rc;
1295}
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307struct device_node *of_parse_phandle(const struct device_node *np,
1308 const char *phandle_name, int index)
1309{
1310 struct of_phandle_args args;
1311
1312 if (index < 0)
1313 return NULL;
1314
1315 if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
1316 index, &args))
1317 return NULL;
1318
1319 return args.np;
1320}
1321EXPORT_SYMBOL(of_parse_phandle);
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
1356 const char *cells_name, int index,
1357 struct of_phandle_args *out_args)
1358{
1359 if (index < 0)
1360 return -EINVAL;
1361 return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
1362 index, out_args);
1363}
1364EXPORT_SYMBOL(of_parse_phandle_with_args);
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396int of_parse_phandle_with_fixed_args(const struct device_node *np,
1397 const char *list_name, int cell_count,
1398 int index, struct of_phandle_args *out_args)
1399{
1400 if (index < 0)
1401 return -EINVAL;
1402 return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
1403 index, out_args);
1404}
1405EXPORT_SYMBOL(of_parse_phandle_with_fixed_args);
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422int of_count_phandle_with_args(const struct device_node *np, const char *list_name,
1423 const char *cells_name)
1424{
1425 struct of_phandle_iterator it;
1426 int rc, cur_index = 0;
1427
1428 rc = of_phandle_iterator_init(&it, np, list_name, cells_name, 0);
1429 if (rc)
1430 return rc;
1431
1432 while ((rc = of_phandle_iterator_next(&it)) == 0)
1433 cur_index += 1;
1434
1435 if (rc != -ENOENT)
1436 return rc;
1437
1438 return cur_index;
1439}
1440EXPORT_SYMBOL(of_count_phandle_with_args);
1441
1442
1443
1444
1445int __of_add_property(struct device_node *np, struct property *prop)
1446{
1447 struct property **next;
1448
1449 prop->next = NULL;
1450 next = &np->properties;
1451 while (*next) {
1452 if (strcmp(prop->name, (*next)->name) == 0)
1453
1454 return -EEXIST;
1455
1456 next = &(*next)->next;
1457 }
1458 *next = prop;
1459
1460 return 0;
1461}
1462
1463
1464
1465
1466int of_add_property(struct device_node *np, struct property *prop)
1467{
1468 unsigned long flags;
1469 int rc;
1470
1471 mutex_lock(&of_mutex);
1472
1473 raw_spin_lock_irqsave(&devtree_lock, flags);
1474 rc = __of_add_property(np, prop);
1475 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1476
1477 if (!rc)
1478 __of_add_property_sysfs(np, prop);
1479
1480 mutex_unlock(&of_mutex);
1481
1482 if (!rc)
1483 of_property_notify(OF_RECONFIG_ADD_PROPERTY, np, prop, NULL);
1484
1485 return rc;
1486}
1487
1488int __of_remove_property(struct device_node *np, struct property *prop)
1489{
1490 struct property **next;
1491
1492 for (next = &np->properties; *next; next = &(*next)->next) {
1493 if (*next == prop)
1494 break;
1495 }
1496 if (*next == NULL)
1497 return -ENODEV;
1498
1499
1500 *next = prop->next;
1501 prop->next = np->deadprops;
1502 np->deadprops = prop;
1503
1504 return 0;
1505}
1506
1507void __of_sysfs_remove_bin_file(struct device_node *np, struct property *prop)
1508{
1509 sysfs_remove_bin_file(&np->kobj, &prop->attr);
1510 kfree(prop->attr.attr.name);
1511}
1512
1513void __of_remove_property_sysfs(struct device_node *np, struct property *prop)
1514{
1515 if (!IS_ENABLED(CONFIG_SYSFS))
1516 return;
1517
1518
1519 if (of_kset && of_node_is_attached(np))
1520 __of_sysfs_remove_bin_file(np, prop);
1521}
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531int of_remove_property(struct device_node *np, struct property *prop)
1532{
1533 unsigned long flags;
1534 int rc;
1535
1536 if (!prop)
1537 return -ENODEV;
1538
1539 mutex_lock(&of_mutex);
1540
1541 raw_spin_lock_irqsave(&devtree_lock, flags);
1542 rc = __of_remove_property(np, prop);
1543 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1544
1545 if (!rc)
1546 __of_remove_property_sysfs(np, prop);
1547
1548 mutex_unlock(&of_mutex);
1549
1550 if (!rc)
1551 of_property_notify(OF_RECONFIG_REMOVE_PROPERTY, np, prop, NULL);
1552
1553 return rc;
1554}
1555
1556int __of_update_property(struct device_node *np, struct property *newprop,
1557 struct property **oldpropp)
1558{
1559 struct property **next, *oldprop;
1560
1561 for (next = &np->properties; *next; next = &(*next)->next) {
1562 if (of_prop_cmp((*next)->name, newprop->name) == 0)
1563 break;
1564 }
1565 *oldpropp = oldprop = *next;
1566
1567 if (oldprop) {
1568
1569 newprop->next = oldprop->next;
1570 *next = newprop;
1571 oldprop->next = np->deadprops;
1572 np->deadprops = oldprop;
1573 } else {
1574
1575 newprop->next = NULL;
1576 *next = newprop;
1577 }
1578
1579 return 0;
1580}
1581
1582void __of_update_property_sysfs(struct device_node *np, struct property *newprop,
1583 struct property *oldprop)
1584{
1585 if (!IS_ENABLED(CONFIG_SYSFS))
1586 return;
1587
1588
1589 if (!of_kset)
1590 return;
1591
1592 if (oldprop)
1593 __of_sysfs_remove_bin_file(np, oldprop);
1594 __of_add_property_sysfs(np, newprop);
1595}
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606int of_update_property(struct device_node *np, struct property *newprop)
1607{
1608 struct property *oldprop;
1609 unsigned long flags;
1610 int rc;
1611
1612 if (!newprop->name)
1613 return -EINVAL;
1614
1615 mutex_lock(&of_mutex);
1616
1617 raw_spin_lock_irqsave(&devtree_lock, flags);
1618 rc = __of_update_property(np, newprop, &oldprop);
1619 raw_spin_unlock_irqrestore(&devtree_lock, flags);
1620
1621 if (!rc)
1622 __of_update_property_sysfs(np, newprop, oldprop);
1623
1624 mutex_unlock(&of_mutex);
1625
1626 if (!rc)
1627 of_property_notify(OF_RECONFIG_UPDATE_PROPERTY, np, newprop, oldprop);
1628
1629 return rc;
1630}
1631
1632static void of_alias_add(struct alias_prop *ap, struct device_node *np,
1633 int id, const char *stem, int stem_len)
1634{
1635 ap->np = np;
1636 ap->id = id;
1637 strncpy(ap->stem, stem, stem_len);
1638 ap->stem[stem_len] = 0;
1639 list_add_tail(&ap->link, &aliases_lookup);
1640 pr_debug("adding DT alias:%s: stem=%s id=%i node=%pOF\n",
1641 ap->alias, ap->stem, ap->id, np);
1642}
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
1655{
1656 struct property *pp;
1657
1658 of_aliases = of_find_node_by_path("/aliases");
1659 of_chosen = of_find_node_by_path("/chosen");
1660 if (of_chosen == NULL)
1661 of_chosen = of_find_node_by_path("/chosen@0");
1662
1663 if (of_chosen) {
1664
1665 const char *name = NULL;
1666
1667 if (of_property_read_string(of_chosen, "stdout-path", &name))
1668 of_property_read_string(of_chosen, "linux,stdout-path",
1669 &name);
1670 if (IS_ENABLED(CONFIG_PPC) && !name)
1671 of_property_read_string(of_aliases, "stdout", &name);
1672 if (name)
1673 of_stdout = of_find_node_opts_by_path(name, &of_stdout_options);
1674 }
1675
1676 if (!of_aliases)
1677 return;
1678
1679 for_each_property_of_node(of_aliases, pp) {
1680 const char *start = pp->name;
1681 const char *end = start + strlen(start);
1682 struct device_node *np;
1683 struct alias_prop *ap;
1684 int id, len;
1685
1686
1687 if (!strcmp(pp->name, "name") ||
1688 !strcmp(pp->name, "phandle") ||
1689 !strcmp(pp->name, "linux,phandle"))
1690 continue;
1691
1692 np = of_find_node_by_path(pp->value);
1693 if (!np)
1694 continue;
1695
1696
1697
1698 while (isdigit(*(end-1)) && end > start)
1699 end--;
1700 len = end - start;
1701
1702 if (kstrtoint(end, 10, &id) < 0)
1703 continue;
1704
1705
1706 ap = dt_alloc(sizeof(*ap) + len + 1, __alignof__(*ap));
1707 if (!ap)
1708 continue;
1709 memset(ap, 0, sizeof(*ap) + len + 1);
1710 ap->alias = start;
1711 of_alias_add(ap, np, id, start, len);
1712 }
1713}
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723int of_alias_get_id(struct device_node *np, const char *stem)
1724{
1725 struct alias_prop *app;
1726 int id = -ENODEV;
1727
1728 mutex_lock(&of_mutex);
1729 list_for_each_entry(app, &aliases_lookup, link) {
1730 if (strcmp(app->stem, stem) != 0)
1731 continue;
1732
1733 if (np == app->np) {
1734 id = app->id;
1735 break;
1736 }
1737 }
1738 mutex_unlock(&of_mutex);
1739
1740 return id;
1741}
1742EXPORT_SYMBOL_GPL(of_alias_get_id);
1743
1744
1745
1746
1747
1748
1749
1750
1751int of_alias_get_highest_id(const char *stem)
1752{
1753 struct alias_prop *app;
1754 int id = -ENODEV;
1755
1756 mutex_lock(&of_mutex);
1757 list_for_each_entry(app, &aliases_lookup, link) {
1758 if (strcmp(app->stem, stem) != 0)
1759 continue;
1760
1761 if (app->id > id)
1762 id = app->id;
1763 }
1764 mutex_unlock(&of_mutex);
1765
1766 return id;
1767}
1768EXPORT_SYMBOL_GPL(of_alias_get_highest_id);
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780bool of_console_check(struct device_node *dn, char *name, int index)
1781{
1782 if (!dn || dn != of_stdout || console_set_on_cmdline)
1783 return false;
1784
1785
1786
1787
1788
1789 return !add_preferred_console(name, index, (char *)of_stdout_options);
1790}
1791EXPORT_SYMBOL_GPL(of_console_check);
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801struct device_node *of_find_next_cache_node(const struct device_node *np)
1802{
1803 struct device_node *child, *cache_node;
1804
1805 cache_node = of_parse_phandle(np, "l2-cache", 0);
1806 if (!cache_node)
1807 cache_node = of_parse_phandle(np, "next-level-cache", 0);
1808
1809 if (cache_node)
1810 return cache_node;
1811
1812
1813
1814
1815 if (!strcmp(np->type, "cpu"))
1816 for_each_child_of_node(np, child)
1817 if (!strcmp(child->type, "cache"))
1818 return child;
1819
1820 return NULL;
1821}
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832int of_find_last_cache_level(unsigned int cpu)
1833{
1834 u32 cache_level = 0;
1835 struct device_node *prev = NULL, *np = of_cpu_device_node_get(cpu);
1836
1837 while (np) {
1838 prev = np;
1839 of_node_put(np);
1840 np = of_find_next_cache_node(np);
1841 }
1842
1843 of_property_read_u32(prev, "cache-level", &cache_level);
1844
1845 return cache_level;
1846}
1847