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