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