1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Functions for working with the Flattened Device Tree data format 4 * 5 * Copyright 2009 Benjamin Herrenschmidt, IBM Corp 6 * benh@kernel.crashing.org 7 */ 8 9 #define pr_fmt(fmt) "OF: fdt: " fmt 10 11 #include <linux/crc32.h> 12 #include <linux/kernel.h> 13 #include <linux/initrd.h> 14 #include <linux/memblock.h> 15 #include <linux/mutex.h> 16 #include <linux/of.h> 17 #include <linux/of_fdt.h> 18 #include <linux/of_reserved_mem.h> 19 #include <linux/sizes.h> 20 #include <linux/string.h> 21 #include <linux/errno.h> 22 #include <linux/slab.h> 23 #include <linux/libfdt.h> 24 #include <linux/debugfs.h> 25 #include <linux/serial_core.h> 26 #include <linux/sysfs.h> 27 #include <linux/random.h> 28 29 #include <asm/setup.h> /* for COMMAND_LINE_SIZE */ 30 #include <asm/page.h> 31 32 #include "of_private.h" 33 34 /* 35 * of_fdt_limit_memory - limit the number of regions in the /memory node 36 * @limit: maximum entries 37 * 38 * Adjust the flattened device tree to have at most 'limit' number of 39 * memory entries in the /memory node. This function may be called 40 * any time after initial_boot_param is set. 41 */ 42 void __init of_fdt_limit_memory(int limit) 43 { 44 int memory; 45 int len; 46 const void *val; 47 int nr_address_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 48 int nr_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 49 const __be32 *addr_prop; 50 const __be32 *size_prop; 51 int root_offset; 52 int cell_size; 53 54 root_offset = fdt_path_offset(initial_boot_params, "/"); 55 if (root_offset < 0) 56 return; 57 58 addr_prop = fdt_getprop(initial_boot_params, root_offset, 59 "#address-cells", NULL); 60 if (addr_prop) 61 nr_address_cells = fdt32_to_cpu(*addr_prop); 62 63 size_prop = fdt_getprop(initial_boot_params, root_offset, 64 "#size-cells", NULL); 65 if (size_prop) 66 nr_size_cells = fdt32_to_cpu(*size_prop); 67 68 cell_size = sizeof(uint32_t)*(nr_address_cells + nr_size_cells); 69 70 memory = fdt_path_offset(initial_boot_params, "/memory"); 71 if (memory > 0) { 72 val = fdt_getprop(initial_boot_params, memory, "reg", &len); 73 if (len > limit*cell_size) { 74 len = limit*cell_size; 75 pr_debug("Limiting number of entries to %d\n", limit); 76 fdt_setprop(initial_boot_params, memory, "reg", val, 77 len); 78 } 79 } 80 } 81 82 static bool of_fdt_device_is_available(const void *blob, unsigned long node) 83 { 84 const char *status = fdt_getprop(blob, node, "status", NULL); 85 86 if (!status) 87 return true; 88 89 if (!strcmp(status, "ok") || !strcmp(status, "okay")) 90 return true; 91 92 return false; 93 } 94 95 static void *unflatten_dt_alloc(void **mem, unsigned long size, 96 unsigned long align) 97 { 98 void *res; 99 100 *mem = PTR_ALIGN(*mem, align); 101 res = *mem; 102 *mem += size; 103 104 return res; 105 } 106 107 static void populate_properties(const void *blob, 108 int offset, 109 void **mem, 110 struct device_node *np, 111 const char *nodename, 112 bool dryrun) 113 { 114 struct property *pp, **pprev = NULL; 115 int cur; 116 bool has_name = false; 117 118 pprev = &np->properties; 119 for (cur = fdt_first_property_offset(blob, offset); 120 cur >= 0; 121 cur = fdt_next_property_offset(blob, cur)) { 122 const __be32 *val; 123 const char *pname; 124 u32 sz; 125 126 val = fdt_getprop_by_offset(blob, cur, &pname, &sz); 127 if (!val) { 128 pr_warn("Cannot locate property at 0x%x\n", cur); 129 continue; 130 } 131 132 if (!pname) { 133 pr_warn("Cannot find property name at 0x%x\n", cur); 134 continue; 135 } 136 137 if (!strcmp(pname, "name")) 138 has_name = true; 139 140 pp = unflatten_dt_alloc(mem, sizeof(struct property), 141 __alignof__(struct property)); 142 if (dryrun) 143 continue; 144 145 /* We accept flattened tree phandles either in 146 * ePAPR-style "phandle" properties, or the 147 * legacy "linux,phandle" properties. If both 148 * appear and have different values, things 149 * will get weird. Don't do that. 150 */ 151 if (!strcmp(pname, "phandle") || 152 !strcmp(pname, "linux,phandle")) { 153 if (!np->phandle) 154 np->phandle = be32_to_cpup(val); 155 } 156 157 /* And we process the "ibm,phandle" property 158 * used in pSeries dynamic device tree 159 * stuff 160 */ 161 if (!strcmp(pname, "ibm,phandle")) 162 np->phandle = be32_to_cpup(val); 163 164 pp->name = (char *)pname; 165 pp->length = sz; 166 pp->value = (__be32 *)val; 167 *pprev = pp; 168 pprev = &pp->next; 169 } 170 171 /* With version 0x10 we may not have the name property, 172 * recreate it here from the unit name if absent 173 */ 174 if (!has_name) { 175 const char *p = nodename, *ps = p, *pa = NULL; 176 int len; 177 178 while (*p) { 179 if ((*p) == '@') 180 pa = p; 181 else if ((*p) == '/') 182 ps = p + 1; 183 p++; 184 } 185 186 if (pa < ps) 187 pa = p; 188 len = (pa - ps) + 1; 189 pp = unflatten_dt_alloc(mem, sizeof(struct property) + len, 190 __alignof__(struct property)); 191 if (!dryrun) { 192 pp->name = "name"; 193 pp->length = len; 194 pp->value = pp + 1; 195 *pprev = pp; 196 memcpy(pp->value, ps, len - 1); 197 ((char *)pp->value)[len - 1] = 0; 198 pr_debug("fixed up name for %s -> %s\n", 199 nodename, (char *)pp->value); 200 } 201 } 202 } 203 204 static int populate_node(const void *blob, 205 int offset, 206 void **mem, 207 struct device_node *dad, 208 struct device_node **pnp, 209 bool dryrun) 210 { 211 struct device_node *np; 212 const char *pathp; 213 int len; 214 215 pathp = fdt_get_name(blob, offset, &len); 216 if (!pathp) { 217 *pnp = NULL; 218 return len; 219 } 220 221 len++; 222 223 np = unflatten_dt_alloc(mem, sizeof(struct device_node) + len, 224 __alignof__(struct device_node)); 225 if (!dryrun) { 226 char *fn; 227 of_node_init(np); 228 np->full_name = fn = ((char *)np) + sizeof(*np); 229 230 memcpy(fn, pathp, len); 231 232 if (dad != NULL) { 233 np->parent = dad; 234 np->sibling = dad->child; 235 dad->child = np; 236 } 237 } 238 239 populate_properties(blob, offset, mem, np, pathp, dryrun); 240 if (!dryrun) { 241 np->name = of_get_property(np, "name", NULL); 242 if (!np->name) 243 np->name = "<NULL>"; 244 } 245 246 *pnp = np; 247 return true; 248 } 249 250 static void reverse_nodes(struct device_node *parent) 251 { 252 struct device_node *child, *next; 253 254 /* In-depth first */ 255 child = parent->child; 256 while (child) { 257 reverse_nodes(child); 258 259 child = child->sibling; 260 } 261 262 /* Reverse the nodes in the child list */ 263 child = parent->child; 264 parent->child = NULL; 265 while (child) { 266 next = child->sibling; 267 268 child->sibling = parent->child; 269 parent->child = child; 270 child = next; 271 } 272 } 273 274 /** 275 * unflatten_dt_nodes - Alloc and populate a device_node from the flat tree 276 * @blob: The parent device tree blob 277 * @mem: Memory chunk to use for allocating device nodes and properties 278 * @dad: Parent struct device_node 279 * @nodepp: The device_node tree created by the call 280 * 281 * Return: The size of unflattened device tree or error code 282 */ 283 static int unflatten_dt_nodes(const void *blob, 284 void *mem, 285 struct device_node *dad, 286 struct device_node **nodepp) 287 { 288 struct device_node *root; 289 int offset = 0, depth = 0, initial_depth = 0; 290 #define FDT_MAX_DEPTH 64 291 struct device_node *nps[FDT_MAX_DEPTH]; 292 void *base = mem; 293 bool dryrun = !base; 294 int ret; 295 296 if (nodepp) 297 *nodepp = NULL; 298 299 /* 300 * We're unflattening device sub-tree if @dad is valid. There are 301 * possibly multiple nodes in the first level of depth. We need 302 * set @depth to 1 to make fdt_next_node() happy as it bails 303 * immediately when negative @depth is found. Otherwise, the device 304 * nodes except the first one won't be unflattened successfully. 305 */ 306 if (dad) 307 depth = initial_depth = 1; 308 309 root = dad; 310 nps[depth] = dad; 311 312 for (offset = 0; 313 offset >= 0 && depth >= initial_depth; 314 offset = fdt_next_node(blob, offset, &depth)) { 315 if (WARN_ON_ONCE(depth >= FDT_MAX_DEPTH)) 316 continue; 317 318 if (!IS_ENABLED(CONFIG_OF_KOBJ) && 319 !of_fdt_device_is_available(blob, offset)) 320 continue; 321 322 ret = populate_node(blob, offset, &mem, nps[depth], 323 &nps[depth+1], dryrun); 324 if (ret < 0) 325 return ret; 326 327 if (!dryrun && nodepp && !*nodepp) 328 *nodepp = nps[depth+1]; 329 if (!dryrun && !root) 330 root = nps[depth+1]; 331 } 332 333 if (offset < 0 && offset != -FDT_ERR_NOTFOUND) { 334 pr_err("Error %d processing FDT\n", offset); 335 return -EINVAL; 336 } 337 338 /* 339 * Reverse the child list. Some drivers assumes node order matches .dts 340 * node order 341 */ 342 if (!dryrun) 343 reverse_nodes(root); 344 345 return mem - base; 346 } 347 348 /** 349 * __unflatten_device_tree - create tree of device_nodes from flat blob 350 * @blob: The blob to expand 351 * @dad: Parent device node 352 * @mynodes: The device_node tree created by the call 353 * @dt_alloc: An allocator that provides a virtual address to memory 354 * for the resulting tree 355 * @detached: if true set OF_DETACHED on @mynodes 356 * 357 * unflattens a device-tree, creating the tree of struct device_node. It also 358 * fills the "name" and "type" pointers of the nodes so the normal device-tree 359 * walking functions can be used. 360 * 361 * Return: NULL on failure or the memory chunk containing the unflattened 362 * device tree on success. 363 */ 364 void *__unflatten_device_tree(const void *blob, 365 struct device_node *dad, 366 struct device_node **mynodes, 367 void *(*dt_alloc)(u64 size, u64 align), 368 bool detached) 369 { 370 int size; 371 void *mem; 372 int ret; 373 374 if (mynodes) 375 *mynodes = NULL; 376 377 pr_debug(" -> unflatten_device_tree()\n"); 378 379 if (!blob) { 380 pr_debug("No device tree pointer\n"); 381 return NULL; 382 } 383 384 pr_debug("Unflattening device tree:\n"); 385 pr_debug("magic: %08x\n", fdt_magic(blob)); 386 pr_debug("size: %08x\n", fdt_totalsize(blob)); 387 pr_debug("version: %08x\n", fdt_version(blob)); 388 389 if (fdt_check_header(blob)) { 390 pr_err("Invalid device tree blob header\n"); 391 return NULL; 392 } 393 394 /* First pass, scan for size */ 395 size = unflatten_dt_nodes(blob, NULL, dad, NULL); 396 if (size <= 0) 397 return NULL; 398 399 size = ALIGN(size, 4); 400 pr_debug(" size is %d, allocating...\n", size); 401 402 /* Allocate memory for the expanded device tree */ 403 mem = dt_alloc(size + 4, __alignof__(struct device_node)); 404 if (!mem) 405 return NULL; 406 407 memset(mem, 0, size); 408 409 *(__be32 *)(mem + size) = cpu_to_be32(0xdeadbeef); 410 411 pr_debug(" unflattening %p...\n", mem); 412 413 /* Second pass, do actual unflattening */ 414 ret = unflatten_dt_nodes(blob, mem, dad, mynodes); 415 416 if (be32_to_cpup(mem + size) != 0xdeadbeef) 417 pr_warn("End of tree marker overwritten: %08x\n", 418 be32_to_cpup(mem + size)); 419 420 if (ret <= 0) 421 return NULL; 422 423 if (detached && mynodes && *mynodes) { 424 of_node_set_flag(*mynodes, OF_DETACHED); 425 pr_debug("unflattened tree is detached\n"); 426 } 427 428 pr_debug(" <- unflatten_device_tree()\n"); 429 return mem; 430 } 431 432 static void *kernel_tree_alloc(u64 size, u64 align) 433 { 434 return kzalloc(size, GFP_KERNEL); 435 } 436 437 static DEFINE_MUTEX(of_fdt_unflatten_mutex); 438 439 /** 440 * of_fdt_unflatten_tree - create tree of device_nodes from flat blob 441 * @blob: Flat device tree blob 442 * @dad: Parent device node 443 * @mynodes: The device tree created by the call 444 * 445 * unflattens the device-tree passed by the firmware, creating the 446 * tree of struct device_node. It also fills the "name" and "type" 447 * pointers of the nodes so the normal device-tree walking functions 448 * can be used. 449 * 450 * Return: NULL on failure or the memory chunk containing the unflattened 451 * device tree on success. 452 */ 453 void *of_fdt_unflatten_tree(const unsigned long *blob, 454 struct device_node *dad, 455 struct device_node **mynodes) 456 { 457 void *mem; 458 459 mutex_lock(&of_fdt_unflatten_mutex); 460 mem = __unflatten_device_tree(blob, dad, mynodes, &kernel_tree_alloc, 461 true); 462 mutex_unlock(&of_fdt_unflatten_mutex); 463 464 return mem; 465 } 466 EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree); 467 468 /* Everything below here references initial_boot_params directly. */ 469 int __initdata dt_root_addr_cells; 470 int __initdata dt_root_size_cells; 471 472 void *initial_boot_params __ro_after_init; 473 474 #ifdef CONFIG_OF_EARLY_FLATTREE 475 476 static u32 of_fdt_crc32; 477 478 static int __init early_init_dt_reserve_memory_arch(phys_addr_t base, 479 phys_addr_t size, bool nomap) 480 { 481 if (nomap) { 482 /* 483 * If the memory is already reserved (by another region), we 484 * should not allow it to be marked nomap. 485 */ 486 if (memblock_is_region_reserved(base, size)) 487 return -EBUSY; 488 489 return memblock_mark_nomap(base, size); 490 } 491 return memblock_reserve(base, size); 492 } 493 494 /* 495 * __reserved_mem_reserve_reg() - reserve all memory described in 'reg' property 496 */ 497 static int __init __reserved_mem_reserve_reg(unsigned long node, 498 const char *uname) 499 { 500 int t_len = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32); 501 phys_addr_t base, size; 502 int len; 503 const __be32 *prop; 504 int first = 1; 505 bool nomap; 506 507 prop = of_get_flat_dt_prop(node, "reg", &len); 508 if (!prop) 509 return -ENOENT; 510 511 if (len && len % t_len != 0) { 512 pr_err("Reserved memory: invalid reg property in '%s', skipping node.\n", 513 uname); 514 return -EINVAL; 515 } 516 517 nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; 518 519 while (len >= t_len) { 520 base = dt_mem_next_cell(dt_root_addr_cells, &prop); 521 size = dt_mem_next_cell(dt_root_size_cells, &prop); 522 523 if (size && 524 early_init_dt_reserve_memory_arch(base, size, nomap) == 0) 525 pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", 526 uname, &base, (unsigned long)(size / SZ_1M)); 527 else 528 pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n", 529 uname, &base, (unsigned long)(size / SZ_1M)); 530 531 len -= t_len; 532 if (first) { 533 fdt_reserved_mem_save_node(node, uname, base, size); 534 first = 0; 535 } 536 } 537 return 0; 538 } 539 540 /* 541 * __reserved_mem_check_root() - check if #size-cells, #address-cells provided 542 * in /reserved-memory matches the values supported by the current implementation, 543 * also check if ranges property has been provided 544 */ 545 static int __init __reserved_mem_check_root(unsigned long node) 546 { 547 const __be32 *prop; 548 549 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 550 if (!prop || be32_to_cpup(prop) != dt_root_size_cells) 551 return -EINVAL; 552 553 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 554 if (!prop || be32_to_cpup(prop) != dt_root_addr_cells) 555 return -EINVAL; 556 557 prop = of_get_flat_dt_prop(node, "ranges", NULL); 558 if (!prop) 559 return -EINVAL; 560 return 0; 561 } 562 563 /* 564 * __fdt_scan_reserved_mem() - scan a single FDT node for reserved memory 565 */ 566 static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname, 567 int depth, void *data) 568 { 569 static int found; 570 int err; 571 572 if (!found && depth == 1 && strcmp(uname, "reserved-memory") == 0) { 573 if (__reserved_mem_check_root(node) != 0) { 574 pr_err("Reserved memory: unsupported node format, ignoring\n"); 575 /* break scan */ 576 return 1; 577 } 578 found = 1; 579 /* scan next node */ 580 return 0; 581 } else if (!found) { 582 /* scan next node */ 583 return 0; 584 } else if (found && depth < 2) { 585 /* scanning of /reserved-memory has been finished */ 586 return 1; 587 } 588 589 if (!of_fdt_device_is_available(initial_boot_params, node)) 590 return 0; 591 592 err = __reserved_mem_reserve_reg(node, uname); 593 if (err == -ENOENT && of_get_flat_dt_prop(node, "size", NULL)) 594 fdt_reserved_mem_save_node(node, uname, 0, 0); 595 596 /* scan next node */ 597 return 0; 598 } 599 600 /** 601 * early_init_fdt_scan_reserved_mem() - create reserved memory regions 602 * 603 * This function grabs memory from early allocator for device exclusive use 604 * defined in device tree structures. It should be called by arch specific code 605 * once the early allocator (i.e. memblock) has been fully activated. 606 */ 607 void __init early_init_fdt_scan_reserved_mem(void) 608 { 609 int n; 610 u64 base, size; 611 612 if (!initial_boot_params) 613 return; 614 615 /* Process header /memreserve/ fields */ 616 for (n = 0; ; n++) { 617 fdt_get_mem_rsv(initial_boot_params, n, &base, &size); 618 if (!size) 619 break; 620 early_init_dt_reserve_memory_arch(base, size, false); 621 } 622 623 of_scan_flat_dt(__fdt_scan_reserved_mem, NULL); 624 fdt_init_reserved_mem(); 625 } 626 627 /** 628 * early_init_fdt_reserve_self() - reserve the memory used by the FDT blob 629 */ 630 void __init early_init_fdt_reserve_self(void) 631 { 632 if (!initial_boot_params) 633 return; 634 635 /* Reserve the dtb region */ 636 early_init_dt_reserve_memory_arch(__pa(initial_boot_params), 637 fdt_totalsize(initial_boot_params), 638 false); 639 } 640 641 /** 642 * of_scan_flat_dt - scan flattened tree blob and call callback on each. 643 * @it: callback function 644 * @data: context data pointer 645 * 646 * This function is used to scan the flattened device-tree, it is 647 * used to extract the memory information at boot before we can 648 * unflatten the tree 649 */ 650 int __init of_scan_flat_dt(int (*it)(unsigned long node, 651 const char *uname, int depth, 652 void *data), 653 void *data) 654 { 655 const void *blob = initial_boot_params; 656 const char *pathp; 657 int offset, rc = 0, depth = -1; 658 659 if (!blob) 660 return 0; 661 662 for (offset = fdt_next_node(blob, -1, &depth); 663 offset >= 0 && depth >= 0 && !rc; 664 offset = fdt_next_node(blob, offset, &depth)) { 665 666 pathp = fdt_get_name(blob, offset, NULL); 667 rc = it(offset, pathp, depth, data); 668 } 669 return rc; 670 } 671 672 /** 673 * of_scan_flat_dt_subnodes - scan sub-nodes of a node call callback on each. 674 * @parent: parent node 675 * @it: callback function 676 * @data: context data pointer 677 * 678 * This function is used to scan sub-nodes of a node. 679 */ 680 int __init of_scan_flat_dt_subnodes(unsigned long parent, 681 int (*it)(unsigned long node, 682 const char *uname, 683 void *data), 684 void *data) 685 { 686 const void *blob = initial_boot_params; 687 int node; 688 689 fdt_for_each_subnode(node, blob, parent) { 690 const char *pathp; 691 int rc; 692 693 pathp = fdt_get_name(blob, node, NULL); 694 rc = it(node, pathp, data); 695 if (rc) 696 return rc; 697 } 698 return 0; 699 } 700 701 /** 702 * of_get_flat_dt_subnode_by_name - get the subnode by given name 703 * 704 * @node: the parent node 705 * @uname: the name of subnode 706 * @return offset of the subnode, or -FDT_ERR_NOTFOUND if there is none 707 */ 708 709 int __init of_get_flat_dt_subnode_by_name(unsigned long node, const char *uname) 710 { 711 return fdt_subnode_offset(initial_boot_params, node, uname); 712 } 713 714 /* 715 * of_get_flat_dt_root - find the root node in the flat blob 716 */ 717 unsigned long __init of_get_flat_dt_root(void) 718 { 719 return 0; 720 } 721 722 /* 723 * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr 724 * 725 * This function can be used within scan_flattened_dt callback to get 726 * access to properties 727 */ 728 const void *__init of_get_flat_dt_prop(unsigned long node, const char *name, 729 int *size) 730 { 731 return fdt_getprop(initial_boot_params, node, name, size); 732 } 733 734 /** 735 * of_fdt_is_compatible - Return true if given node from the given blob has 736 * compat in its compatible list 737 * @blob: A device tree blob 738 * @node: node to test 739 * @compat: compatible string to compare with compatible list. 740 * 741 * Return: a non-zero value on match with smaller values returned for more 742 * specific compatible values. 743 */ 744 static int of_fdt_is_compatible(const void *blob, 745 unsigned long node, const char *compat) 746 { 747 const char *cp; 748 int cplen; 749 unsigned long l, score = 0; 750 751 cp = fdt_getprop(blob, node, "compatible", &cplen); 752 if (cp == NULL) 753 return 0; 754 while (cplen > 0) { 755 score++; 756 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) 757 return score; 758 l = strlen(cp) + 1; 759 cp += l; 760 cplen -= l; 761 } 762 763 return 0; 764 } 765 766 /** 767 * of_flat_dt_is_compatible - Return true if given node has compat in compatible list 768 * @node: node to test 769 * @compat: compatible string to compare with compatible list. 770 */ 771 int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) 772 { 773 return of_fdt_is_compatible(initial_boot_params, node, compat); 774 } 775 776 /* 777 * of_flat_dt_match - Return true if node matches a list of compatible values 778 */ 779 static int __init of_flat_dt_match(unsigned long node, const char *const *compat) 780 { 781 unsigned int tmp, score = 0; 782 783 if (!compat) 784 return 0; 785 786 while (*compat) { 787 tmp = of_fdt_is_compatible(initial_boot_params, node, *compat); 788 if (tmp && (score == 0 || (tmp < score))) 789 score = tmp; 790 compat++; 791 } 792 793 return score; 794 } 795 796 /* 797 * of_get_flat_dt_phandle - Given a node in the flat blob, return the phandle 798 */ 799 uint32_t __init of_get_flat_dt_phandle(unsigned long node) 800 { 801 return fdt_get_phandle(initial_boot_params, node); 802 } 803 804 struct fdt_scan_status { 805 const char *name; 806 int namelen; 807 int depth; 808 int found; 809 int (*iterator)(unsigned long node, const char *uname, int depth, void *data); 810 void *data; 811 }; 812 813 const char * __init of_flat_dt_get_machine_name(void) 814 { 815 const char *name; 816 unsigned long dt_root = of_get_flat_dt_root(); 817 818 name = of_get_flat_dt_prop(dt_root, "model", NULL); 819 if (!name) 820 name = of_get_flat_dt_prop(dt_root, "compatible", NULL); 821 return name; 822 } 823 824 /** 825 * of_flat_dt_match_machine - Iterate match tables to find matching machine. 826 * 827 * @default_match: A machine specific ptr to return in case of no match. 828 * @get_next_compat: callback function to return next compatible match table. 829 * 830 * Iterate through machine match tables to find the best match for the machine 831 * compatible string in the FDT. 832 */ 833 const void * __init of_flat_dt_match_machine(const void *default_match, 834 const void * (*get_next_compat)(const char * const**)) 835 { 836 const void *data = NULL; 837 const void *best_data = default_match; 838 const char *const *compat; 839 unsigned long dt_root; 840 unsigned int best_score = ~1, score = 0; 841 842 dt_root = of_get_flat_dt_root(); 843 while ((data = get_next_compat(&compat))) { 844 score = of_flat_dt_match(dt_root, compat); 845 if (score > 0 && score < best_score) { 846 best_data = data; 847 best_score = score; 848 } 849 } 850 if (!best_data) { 851 const char *prop; 852 int size; 853 854 pr_err("\n unrecognized device tree list:\n[ "); 855 856 prop = of_get_flat_dt_prop(dt_root, "compatible", &size); 857 if (prop) { 858 while (size > 0) { 859 printk("'%s' ", prop); 860 size -= strlen(prop) + 1; 861 prop += strlen(prop) + 1; 862 } 863 } 864 printk("]\n\n"); 865 return NULL; 866 } 867 868 pr_info("Machine model: %s\n", of_flat_dt_get_machine_name()); 869 870 return best_data; 871 } 872 873 #ifdef CONFIG_BLK_DEV_INITRD 874 static void __early_init_dt_declare_initrd(unsigned long start, 875 unsigned long end) 876 { 877 /* ARM64 would cause a BUG to occur here when CONFIG_DEBUG_VM is 878 * enabled since __va() is called too early. ARM64 does make use 879 * of phys_initrd_start/phys_initrd_size so we can skip this 880 * conversion. 881 */ 882 if (!IS_ENABLED(CONFIG_ARM64)) { 883 initrd_start = (unsigned long)__va(start); 884 initrd_end = (unsigned long)__va(end); 885 initrd_below_start_ok = 1; 886 } 887 } 888 889 /** 890 * early_init_dt_check_for_initrd - Decode initrd location from flat tree 891 * @node: reference to node containing initrd location ('chosen') 892 */ 893 static void __init early_init_dt_check_for_initrd(unsigned long node) 894 { 895 u64 start, end; 896 int len; 897 const __be32 *prop; 898 899 pr_debug("Looking for initrd properties... "); 900 901 prop = of_get_flat_dt_prop(node, "linux,initrd-start", &len); 902 if (!prop) 903 return; 904 start = of_read_number(prop, len/4); 905 906 prop = of_get_flat_dt_prop(node, "linux,initrd-end", &len); 907 if (!prop) 908 return; 909 end = of_read_number(prop, len/4); 910 911 __early_init_dt_declare_initrd(start, end); 912 phys_initrd_start = start; 913 phys_initrd_size = end - start; 914 915 pr_debug("initrd_start=0x%llx initrd_end=0x%llx\n", start, end); 916 } 917 #else 918 static inline void early_init_dt_check_for_initrd(unsigned long node) 919 { 920 } 921 #endif /* CONFIG_BLK_DEV_INITRD */ 922 923 #ifdef CONFIG_SERIAL_EARLYCON 924 925 int __init early_init_dt_scan_chosen_stdout(void) 926 { 927 int offset; 928 const char *p, *q, *options = NULL; 929 int l; 930 const struct earlycon_id *match; 931 const void *fdt = initial_boot_params; 932 933 offset = fdt_path_offset(fdt, "/chosen"); 934 if (offset < 0) 935 offset = fdt_path_offset(fdt, "/chosen@0"); 936 if (offset < 0) 937 return -ENOENT; 938 939 p = fdt_getprop(fdt, offset, "stdout-path", &l); 940 if (!p) 941 p = fdt_getprop(fdt, offset, "linux,stdout-path", &l); 942 if (!p || !l) 943 return -ENOENT; 944 945 q = strchrnul(p, ':'); 946 if (*q != '\0') 947 options = q + 1; 948 l = q - p; 949 950 /* Get the node specified by stdout-path */ 951 offset = fdt_path_offset_namelen(fdt, p, l); 952 if (offset < 0) { 953 pr_warn("earlycon: stdout-path %.*s not found\n", l, p); 954 return 0; 955 } 956 957 for (match = __earlycon_table; match < __earlycon_table_end; match++) { 958 if (!match->compatible[0]) 959 continue; 960 961 if (fdt_node_check_compatible(fdt, offset, match->compatible)) 962 continue; 963 964 if (of_setup_earlycon(match, offset, options) == 0) 965 return 0; 966 } 967 return -ENODEV; 968 } 969 #endif 970 971 /* 972 * early_init_dt_scan_root - fetch the top level address and size cells 973 */ 974 int __init early_init_dt_scan_root(unsigned long node, const char *uname, 975 int depth, void *data) 976 { 977 const __be32 *prop; 978 979 if (depth != 0) 980 return 0; 981 982 dt_root_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 983 dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 984 985 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 986 if (prop) 987 dt_root_size_cells = be32_to_cpup(prop); 988 pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells); 989 990 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 991 if (prop) 992 dt_root_addr_cells = be32_to_cpup(prop); 993 pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells); 994 995 /* break now */ 996 return 1; 997 } 998 999 u64 __init dt_mem_next_cell(int s, const __be32 **cellp) 1000 { 1001 const __be32 *p = *cellp; 1002 1003 *cellp = p + s; 1004 return of_read_number(p, s); 1005 } 1006 1007 /* 1008 * early_init_dt_scan_memory - Look for and parse memory nodes 1009 */ 1010 int __init early_init_dt_scan_memory(unsigned long node, const char *uname, 1011 int depth, void *data) 1012 { 1013 const char *type = of_get_flat_dt_prop(node, "device_type", NULL); 1014 const __be32 *reg, *endp; 1015 int l; 1016 bool hotpluggable; 1017 1018 /* We are scanning "memory" nodes only */ 1019 if (type == NULL || strcmp(type, "memory") != 0) 1020 return 0; 1021 1022 reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l); 1023 if (reg == NULL) 1024 reg = of_get_flat_dt_prop(node, "reg", &l); 1025 if (reg == NULL) 1026 return 0; 1027 1028 endp = reg + (l / sizeof(__be32)); 1029 hotpluggable = of_get_flat_dt_prop(node, "hotpluggable", NULL); 1030 1031 pr_debug("memory scan node %s, reg size %d,\n", uname, l); 1032 1033 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 1034 u64 base, size; 1035 1036 base = dt_mem_next_cell(dt_root_addr_cells, ®); 1037 size = dt_mem_next_cell(dt_root_size_cells, ®); 1038 1039 if (size == 0) 1040 continue; 1041 pr_debug(" - %llx, %llx\n", base, size); 1042 1043 early_init_dt_add_memory_arch(base, size); 1044 1045 if (!hotpluggable) 1046 continue; 1047 1048 if (memblock_mark_hotplug(base, size)) 1049 pr_warn("failed to mark hotplug range 0x%llx - 0x%llx\n", 1050 base, base + size); 1051 } 1052 1053 return 0; 1054 } 1055 1056 int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, 1057 int depth, void *data) 1058 { 1059 int l; 1060 const char *p; 1061 const void *rng_seed; 1062 1063 pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 1064 1065 if (depth != 1 || !data || 1066 (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) 1067 return 0; 1068 1069 early_init_dt_check_for_initrd(node); 1070 1071 /* Retrieve command line */ 1072 p = of_get_flat_dt_prop(node, "bootargs", &l); 1073 if (p != NULL && l > 0) 1074 strlcpy(data, p, min(l, COMMAND_LINE_SIZE)); 1075 1076 /* 1077 * CONFIG_CMDLINE is meant to be a default in case nothing else 1078 * managed to set the command line, unless CONFIG_CMDLINE_FORCE 1079 * is set in which case we override whatever was found earlier. 1080 */ 1081 #ifdef CONFIG_CMDLINE 1082 #if defined(CONFIG_CMDLINE_EXTEND) 1083 strlcat(data, " ", COMMAND_LINE_SIZE); 1084 strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 1085 #elif defined(CONFIG_CMDLINE_FORCE) 1086 strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 1087 #else 1088 /* No arguments from boot loader, use kernel's cmdl*/ 1089 if (!((char *)data)[0]) 1090 strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 1091 #endif 1092 #endif /* CONFIG_CMDLINE */ 1093 1094 pr_debug("Command line is: %s\n", (char *)data); 1095 1096 rng_seed = of_get_flat_dt_prop(node, "rng-seed", &l); 1097 if (rng_seed && l > 0) { 1098 add_bootloader_randomness(rng_seed, l); 1099 1100 /* try to clear seed so it won't be found. */ 1101 fdt_nop_property(initial_boot_params, node, "rng-seed"); 1102 1103 /* update CRC check value */ 1104 of_fdt_crc32 = crc32_be(~0, initial_boot_params, 1105 fdt_totalsize(initial_boot_params)); 1106 } 1107 1108 /* break now */ 1109 return 1; 1110 } 1111 1112 #ifndef MIN_MEMBLOCK_ADDR 1113 #define MIN_MEMBLOCK_ADDR __pa(PAGE_OFFSET) 1114 #endif 1115 #ifndef MAX_MEMBLOCK_ADDR 1116 #define MAX_MEMBLOCK_ADDR ((phys_addr_t)~0) 1117 #endif 1118 1119 void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) 1120 { 1121 const u64 phys_offset = MIN_MEMBLOCK_ADDR; 1122 1123 if (size < PAGE_SIZE - (base & ~PAGE_MASK)) { 1124 pr_warn("Ignoring memory block 0x%llx - 0x%llx\n", 1125 base, base + size); 1126 return; 1127 } 1128 1129 if (!PAGE_ALIGNED(base)) { 1130 size -= PAGE_SIZE - (base & ~PAGE_MASK); 1131 base = PAGE_ALIGN(base); 1132 } 1133 size &= PAGE_MASK; 1134 1135 if (base > MAX_MEMBLOCK_ADDR) { 1136 pr_warn("Ignoring memory block 0x%llx - 0x%llx\n", 1137 base, base + size); 1138 return; 1139 } 1140 1141 if (base + size - 1 > MAX_MEMBLOCK_ADDR) { 1142 pr_warn("Ignoring memory range 0x%llx - 0x%llx\n", 1143 ((u64)MAX_MEMBLOCK_ADDR) + 1, base + size); 1144 size = MAX_MEMBLOCK_ADDR - base + 1; 1145 } 1146 1147 if (base + size < phys_offset) { 1148 pr_warn("Ignoring memory block 0x%llx - 0x%llx\n", 1149 base, base + size); 1150 return; 1151 } 1152 if (base < phys_offset) { 1153 pr_warn("Ignoring memory range 0x%llx - 0x%llx\n", 1154 base, phys_offset); 1155 size -= phys_offset - base; 1156 base = phys_offset; 1157 } 1158 memblock_add(base, size); 1159 } 1160 1161 static void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) 1162 { 1163 void *ptr = memblock_alloc(size, align); 1164 1165 if (!ptr) 1166 panic("%s: Failed to allocate %llu bytes align=0x%llx\n", 1167 __func__, size, align); 1168 1169 return ptr; 1170 } 1171 1172 bool __init early_init_dt_verify(void *params) 1173 { 1174 if (!params) 1175 return false; 1176 1177 /* check device tree validity */ 1178 if (fdt_check_header(params)) 1179 return false; 1180 1181 /* Setup flat device-tree pointer */ 1182 initial_boot_params = params; 1183 of_fdt_crc32 = crc32_be(~0, initial_boot_params, 1184 fdt_totalsize(initial_boot_params)); 1185 return true; 1186 } 1187 1188 1189 void __init early_init_dt_scan_nodes(void) 1190 { 1191 int rc = 0; 1192 1193 /* Retrieve various information from the /chosen node */ 1194 rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); 1195 if (!rc) 1196 pr_warn("No chosen node found, continuing without\n"); 1197 1198 /* Initialize {size,address}-cells info */ 1199 of_scan_flat_dt(early_init_dt_scan_root, NULL); 1200 1201 /* Setup memory, calling early_init_dt_add_memory_arch */ 1202 of_scan_flat_dt(early_init_dt_scan_memory, NULL); 1203 } 1204 1205 bool __init early_init_dt_scan(void *params) 1206 { 1207 bool status; 1208 1209 status = early_init_dt_verify(params); 1210 if (!status) 1211 return false; 1212 1213 early_init_dt_scan_nodes(); 1214 return true; 1215 } 1216 1217 /** 1218 * unflatten_device_tree - create tree of device_nodes from flat blob 1219 * 1220 * unflattens the device-tree passed by the firmware, creating the 1221 * tree of struct device_node. It also fills the "name" and "type" 1222 * pointers of the nodes so the normal device-tree walking functions 1223 * can be used. 1224 */ 1225 void __init unflatten_device_tree(void) 1226 { 1227 __unflatten_device_tree(initial_boot_params, NULL, &of_root, 1228 early_init_dt_alloc_memory_arch, false); 1229 1230 /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */ 1231 of_alias_scan(early_init_dt_alloc_memory_arch); 1232 1233 unittest_unflatten_overlay_base(); 1234 } 1235 1236 /** 1237 * unflatten_and_copy_device_tree - copy and create tree of device_nodes from flat blob 1238 * 1239 * Copies and unflattens the device-tree passed by the firmware, creating the 1240 * tree of struct device_node. It also fills the "name" and "type" 1241 * pointers of the nodes so the normal device-tree walking functions 1242 * can be used. This should only be used when the FDT memory has not been 1243 * reserved such is the case when the FDT is built-in to the kernel init 1244 * section. If the FDT memory is reserved already then unflatten_device_tree 1245 * should be used instead. 1246 */ 1247 void __init unflatten_and_copy_device_tree(void) 1248 { 1249 int size; 1250 void *dt; 1251 1252 if (!initial_boot_params) { 1253 pr_warn("No valid device tree found, continuing without\n"); 1254 return; 1255 } 1256 1257 size = fdt_totalsize(initial_boot_params); 1258 dt = early_init_dt_alloc_memory_arch(size, 1259 roundup_pow_of_two(FDT_V17_SIZE)); 1260 1261 if (dt) { 1262 memcpy(dt, initial_boot_params, size); 1263 initial_boot_params = dt; 1264 } 1265 unflatten_device_tree(); 1266 } 1267 1268 #ifdef CONFIG_SYSFS 1269 static ssize_t of_fdt_raw_read(struct file *filp, struct kobject *kobj, 1270 struct bin_attribute *bin_attr, 1271 char *buf, loff_t off, size_t count) 1272 { 1273 memcpy(buf, initial_boot_params + off, count); 1274 return count; 1275 } 1276 1277 static int __init of_fdt_raw_init(void) 1278 { 1279 static struct bin_attribute of_fdt_raw_attr = 1280 __BIN_ATTR(fdt, S_IRUSR, of_fdt_raw_read, NULL, 0); 1281 1282 if (!initial_boot_params) 1283 return 0; 1284 1285 if (of_fdt_crc32 != crc32_be(~0, initial_boot_params, 1286 fdt_totalsize(initial_boot_params))) { 1287 pr_warn("not creating '/sys/firmware/fdt': CRC check failed\n"); 1288 return 0; 1289 } 1290 of_fdt_raw_attr.size = fdt_totalsize(initial_boot_params); 1291 return sysfs_create_bin_file(firmware_kobj, &of_fdt_raw_attr); 1292 } 1293 late_initcall(of_fdt_raw_init); 1294 #endif 1295 1296 #endif /* CONFIG_OF_EARLY_FLATTREE */ 1297