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/kernel.h> 13 #include <linux/initrd.h> 14 #include <linux/memblock.h> 15 #include <linux/module.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 24 #include <asm/setup.h> /* for COMMAND_LINE_SIZE */ 25 #ifdef CONFIG_PPC 26 #include <asm/machdep.h> 27 #endif /* CONFIG_PPC */ 28 29 #include <asm/page.h> 30 31 char *of_fdt_get_string(struct boot_param_header *blob, u32 offset) 32 { 33 return ((char *)blob) + 34 be32_to_cpu(blob->off_dt_strings) + offset; 35 } 36 37 /** 38 * of_fdt_get_property - Given a node in the given flat blob, return 39 * the property ptr 40 */ 41 void *of_fdt_get_property(struct boot_param_header *blob, 42 unsigned long node, const char *name, 43 unsigned long *size) 44 { 45 unsigned long p = node; 46 47 do { 48 u32 tag = be32_to_cpup((__be32 *)p); 49 u32 sz, noff; 50 const char *nstr; 51 52 p += 4; 53 if (tag == OF_DT_NOP) 54 continue; 55 if (tag != OF_DT_PROP) 56 return NULL; 57 58 sz = be32_to_cpup((__be32 *)p); 59 noff = be32_to_cpup((__be32 *)(p + 4)); 60 p += 8; 61 if (be32_to_cpu(blob->version) < 0x10) 62 p = ALIGN(p, sz >= 8 ? 8 : 4); 63 64 nstr = of_fdt_get_string(blob, noff); 65 if (nstr == NULL) { 66 pr_warning("Can't find property index name !\n"); 67 return NULL; 68 } 69 if (strcmp(name, nstr) == 0) { 70 if (size) 71 *size = sz; 72 return (void *)p; 73 } 74 p += sz; 75 p = ALIGN(p, 4); 76 } while (1); 77 } 78 79 /** 80 * of_fdt_is_compatible - Return true if given node from the given blob has 81 * compat in its compatible list 82 * @blob: A device tree blob 83 * @node: node to test 84 * @compat: compatible string to compare with compatible list. 85 * 86 * On match, returns a non-zero value with smaller values returned for more 87 * specific compatible values. 88 */ 89 int of_fdt_is_compatible(struct boot_param_header *blob, 90 unsigned long node, const char *compat) 91 { 92 const char *cp; 93 unsigned long cplen, l, score = 0; 94 95 cp = of_fdt_get_property(blob, node, "compatible", &cplen); 96 if (cp == NULL) 97 return 0; 98 while (cplen > 0) { 99 score++; 100 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) 101 return score; 102 l = strlen(cp) + 1; 103 cp += l; 104 cplen -= l; 105 } 106 107 return 0; 108 } 109 110 /** 111 * of_fdt_match - Return true if node matches a list of compatible values 112 */ 113 int of_fdt_match(struct boot_param_header *blob, unsigned long node, 114 const char *const *compat) 115 { 116 unsigned int tmp, score = 0; 117 118 if (!compat) 119 return 0; 120 121 while (*compat) { 122 tmp = of_fdt_is_compatible(blob, node, *compat); 123 if (tmp && (score == 0 || (tmp < score))) 124 score = tmp; 125 compat++; 126 } 127 128 return score; 129 } 130 131 static void *unflatten_dt_alloc(void **mem, unsigned long size, 132 unsigned long align) 133 { 134 void *res; 135 136 *mem = PTR_ALIGN(*mem, align); 137 res = *mem; 138 *mem += size; 139 140 return res; 141 } 142 143 /** 144 * unflatten_dt_node - Alloc and populate a device_node from the flat tree 145 * @blob: The parent device tree blob 146 * @mem: Memory chunk to use for allocating device nodes and properties 147 * @p: pointer to node in flat tree 148 * @dad: Parent struct device_node 149 * @allnextpp: pointer to ->allnext from last allocated device_node 150 * @fpsize: Size of the node path up at the current depth. 151 */ 152 static void * unflatten_dt_node(struct boot_param_header *blob, 153 void *mem, 154 void **p, 155 struct device_node *dad, 156 struct device_node ***allnextpp, 157 unsigned long fpsize) 158 { 159 struct device_node *np; 160 struct property *pp, **prev_pp = NULL; 161 char *pathp; 162 u32 tag; 163 unsigned int l, allocl; 164 int has_name = 0; 165 int new_format = 0; 166 167 tag = be32_to_cpup(*p); 168 if (tag != OF_DT_BEGIN_NODE) { 169 pr_err("Weird tag at start of node: %x\n", tag); 170 return mem; 171 } 172 *p += 4; 173 pathp = *p; 174 l = allocl = strlen(pathp) + 1; 175 *p = PTR_ALIGN(*p + l, 4); 176 177 /* version 0x10 has a more compact unit name here instead of the full 178 * path. we accumulate the full path size using "fpsize", we'll rebuild 179 * it later. We detect this because the first character of the name is 180 * not '/'. 181 */ 182 if ((*pathp) != '/') { 183 new_format = 1; 184 if (fpsize == 0) { 185 /* root node: special case. fpsize accounts for path 186 * plus terminating zero. root node only has '/', so 187 * fpsize should be 2, but we want to avoid the first 188 * level nodes to have two '/' so we use fpsize 1 here 189 */ 190 fpsize = 1; 191 allocl = 2; 192 l = 1; 193 *pathp = '\0'; 194 } else { 195 /* account for '/' and path size minus terminal 0 196 * already in 'l' 197 */ 198 fpsize += l; 199 allocl = fpsize; 200 } 201 } 202 203 np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl, 204 __alignof__(struct device_node)); 205 if (allnextpp) { 206 char *fn; 207 of_node_init(np); 208 np->full_name = fn = ((char *)np) + sizeof(*np); 209 if (new_format) { 210 /* rebuild full path for new format */ 211 if (dad && dad->parent) { 212 strcpy(fn, dad->full_name); 213 #ifdef DEBUG 214 if ((strlen(fn) + l + 1) != allocl) { 215 pr_debug("%s: p: %d, l: %d, a: %d\n", 216 pathp, (int)strlen(fn), 217 l, allocl); 218 } 219 #endif 220 fn += strlen(fn); 221 } 222 *(fn++) = '/'; 223 } 224 memcpy(fn, pathp, l); 225 226 prev_pp = &np->properties; 227 **allnextpp = np; 228 *allnextpp = &np->allnext; 229 if (dad != NULL) { 230 np->parent = dad; 231 /* we temporarily use the next field as `last_child'*/ 232 if (dad->next == NULL) 233 dad->child = np; 234 else 235 dad->next->sibling = np; 236 dad->next = np; 237 } 238 } 239 /* process properties */ 240 while (1) { 241 u32 sz, noff; 242 char *pname; 243 244 tag = be32_to_cpup(*p); 245 if (tag == OF_DT_NOP) { 246 *p += 4; 247 continue; 248 } 249 if (tag != OF_DT_PROP) 250 break; 251 *p += 4; 252 sz = be32_to_cpup(*p); 253 noff = be32_to_cpup(*p + 4); 254 *p += 8; 255 if (be32_to_cpu(blob->version) < 0x10) 256 *p = PTR_ALIGN(*p, sz >= 8 ? 8 : 4); 257 258 pname = of_fdt_get_string(blob, noff); 259 if (pname == NULL) { 260 pr_info("Can't find property name in list !\n"); 261 break; 262 } 263 if (strcmp(pname, "name") == 0) 264 has_name = 1; 265 l = strlen(pname) + 1; 266 pp = unflatten_dt_alloc(&mem, sizeof(struct property), 267 __alignof__(struct property)); 268 if (allnextpp) { 269 /* We accept flattened tree phandles either in 270 * ePAPR-style "phandle" properties, or the 271 * legacy "linux,phandle" properties. If both 272 * appear and have different values, things 273 * will get weird. Don't do that. */ 274 if ((strcmp(pname, "phandle") == 0) || 275 (strcmp(pname, "linux,phandle") == 0)) { 276 if (np->phandle == 0) 277 np->phandle = be32_to_cpup((__be32*)*p); 278 } 279 /* And we process the "ibm,phandle" property 280 * used in pSeries dynamic device tree 281 * stuff */ 282 if (strcmp(pname, "ibm,phandle") == 0) 283 np->phandle = be32_to_cpup((__be32 *)*p); 284 pp->name = pname; 285 pp->length = sz; 286 pp->value = *p; 287 *prev_pp = pp; 288 prev_pp = &pp->next; 289 } 290 *p = PTR_ALIGN((*p) + sz, 4); 291 } 292 /* with version 0x10 we may not have the name property, recreate 293 * it here from the unit name if absent 294 */ 295 if (!has_name) { 296 char *p1 = pathp, *ps = pathp, *pa = NULL; 297 int sz; 298 299 while (*p1) { 300 if ((*p1) == '@') 301 pa = p1; 302 if ((*p1) == '/') 303 ps = p1 + 1; 304 p1++; 305 } 306 if (pa < ps) 307 pa = p1; 308 sz = (pa - ps) + 1; 309 pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz, 310 __alignof__(struct property)); 311 if (allnextpp) { 312 pp->name = "name"; 313 pp->length = sz; 314 pp->value = pp + 1; 315 *prev_pp = pp; 316 prev_pp = &pp->next; 317 memcpy(pp->value, ps, sz - 1); 318 ((char *)pp->value)[sz - 1] = 0; 319 pr_debug("fixed up name for %s -> %s\n", pathp, 320 (char *)pp->value); 321 } 322 } 323 if (allnextpp) { 324 *prev_pp = NULL; 325 np->name = of_get_property(np, "name", NULL); 326 np->type = of_get_property(np, "device_type", NULL); 327 328 if (!np->name) 329 np->name = "<NULL>"; 330 if (!np->type) 331 np->type = "<NULL>"; 332 } 333 while (tag == OF_DT_BEGIN_NODE || tag == OF_DT_NOP) { 334 if (tag == OF_DT_NOP) 335 *p += 4; 336 else 337 mem = unflatten_dt_node(blob, mem, p, np, allnextpp, 338 fpsize); 339 tag = be32_to_cpup(*p); 340 } 341 if (tag != OF_DT_END_NODE) { 342 pr_err("Weird tag at end of node: %x\n", tag); 343 return mem; 344 } 345 *p += 4; 346 return mem; 347 } 348 349 /** 350 * __unflatten_device_tree - create tree of device_nodes from flat blob 351 * 352 * unflattens a device-tree, creating the 353 * tree of struct device_node. It also fills the "name" and "type" 354 * pointers of the nodes so the normal device-tree walking functions 355 * can be used. 356 * @blob: The blob to expand 357 * @mynodes: The device_node tree created by the call 358 * @dt_alloc: An allocator that provides a virtual address to memory 359 * for the resulting tree 360 */ 361 static void __unflatten_device_tree(struct boot_param_header *blob, 362 struct device_node **mynodes, 363 void * (*dt_alloc)(u64 size, u64 align)) 364 { 365 unsigned long size; 366 void *start, *mem; 367 struct device_node **allnextp = mynodes; 368 369 pr_debug(" -> unflatten_device_tree()\n"); 370 371 if (!blob) { 372 pr_debug("No device tree pointer\n"); 373 return; 374 } 375 376 pr_debug("Unflattening device tree:\n"); 377 pr_debug("magic: %08x\n", be32_to_cpu(blob->magic)); 378 pr_debug("size: %08x\n", be32_to_cpu(blob->totalsize)); 379 pr_debug("version: %08x\n", be32_to_cpu(blob->version)); 380 381 if (be32_to_cpu(blob->magic) != OF_DT_HEADER) { 382 pr_err("Invalid device tree blob header\n"); 383 return; 384 } 385 386 /* First pass, scan for size */ 387 start = ((void *)blob) + be32_to_cpu(blob->off_dt_struct); 388 size = (unsigned long)unflatten_dt_node(blob, 0, &start, NULL, NULL, 0); 389 size = ALIGN(size, 4); 390 391 pr_debug(" size is %lx, allocating...\n", size); 392 393 /* Allocate memory for the expanded device tree */ 394 mem = dt_alloc(size + 4, __alignof__(struct device_node)); 395 memset(mem, 0, size); 396 397 *(__be32 *)(mem + size) = cpu_to_be32(0xdeadbeef); 398 399 pr_debug(" unflattening %p...\n", mem); 400 401 /* Second pass, do actual unflattening */ 402 start = ((void *)blob) + be32_to_cpu(blob->off_dt_struct); 403 unflatten_dt_node(blob, mem, &start, NULL, &allnextp, 0); 404 if (be32_to_cpup(start) != OF_DT_END) 405 pr_warning("Weird tag at end of tree: %08x\n", be32_to_cpup(start)); 406 if (be32_to_cpup(mem + size) != 0xdeadbeef) 407 pr_warning("End of tree marker overwritten: %08x\n", 408 be32_to_cpup(mem + size)); 409 *allnextp = NULL; 410 411 pr_debug(" <- unflatten_device_tree()\n"); 412 } 413 414 static void *kernel_tree_alloc(u64 size, u64 align) 415 { 416 return kzalloc(size, GFP_KERNEL); 417 } 418 419 /** 420 * of_fdt_unflatten_tree - create tree of device_nodes from flat blob 421 * 422 * unflattens the device-tree passed by the firmware, creating the 423 * tree of struct device_node. It also fills the "name" and "type" 424 * pointers of the nodes so the normal device-tree walking functions 425 * can be used. 426 */ 427 void of_fdt_unflatten_tree(unsigned long *blob, 428 struct device_node **mynodes) 429 { 430 struct boot_param_header *device_tree = 431 (struct boot_param_header *)blob; 432 __unflatten_device_tree(device_tree, mynodes, &kernel_tree_alloc); 433 } 434 EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree); 435 436 /* Everything below here references initial_boot_params directly. */ 437 int __initdata dt_root_addr_cells; 438 int __initdata dt_root_size_cells; 439 440 struct boot_param_header *initial_boot_params; 441 442 #ifdef CONFIG_OF_EARLY_FLATTREE 443 444 /** 445 * res_mem_reserve_reg() - reserve all memory described in 'reg' property 446 */ 447 static int __init __reserved_mem_reserve_reg(unsigned long node, 448 const char *uname) 449 { 450 int t_len = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32); 451 phys_addr_t base, size; 452 unsigned long len; 453 __be32 *prop; 454 int nomap, first = 1; 455 456 prop = of_get_flat_dt_prop(node, "reg", &len); 457 if (!prop) 458 return -ENOENT; 459 460 if (len && len % t_len != 0) { 461 pr_err("Reserved memory: invalid reg property in '%s', skipping node.\n", 462 uname); 463 return -EINVAL; 464 } 465 466 nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; 467 468 while (len >= t_len) { 469 base = dt_mem_next_cell(dt_root_addr_cells, &prop); 470 size = dt_mem_next_cell(dt_root_size_cells, &prop); 471 472 if (base && size && 473 early_init_dt_reserve_memory_arch(base, size, nomap) == 0) 474 pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %ld MiB\n", 475 uname, &base, (unsigned long)size / SZ_1M); 476 else 477 pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %ld MiB\n", 478 uname, &base, (unsigned long)size / SZ_1M); 479 480 len -= t_len; 481 if (first) { 482 fdt_reserved_mem_save_node(node, uname, base, size); 483 first = 0; 484 } 485 } 486 return 0; 487 } 488 489 /** 490 * __reserved_mem_check_root() - check if #size-cells, #address-cells provided 491 * in /reserved-memory matches the values supported by the current implementation, 492 * also check if ranges property has been provided 493 */ 494 static int __init __reserved_mem_check_root(unsigned long node) 495 { 496 __be32 *prop; 497 498 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 499 if (!prop || be32_to_cpup(prop) != dt_root_size_cells) 500 return -EINVAL; 501 502 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 503 if (!prop || be32_to_cpup(prop) != dt_root_addr_cells) 504 return -EINVAL; 505 506 prop = of_get_flat_dt_prop(node, "ranges", NULL); 507 if (!prop) 508 return -EINVAL; 509 return 0; 510 } 511 512 /** 513 * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory 514 */ 515 static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname, 516 int depth, void *data) 517 { 518 static int found; 519 const char *status; 520 int err; 521 522 if (!found && depth == 1 && strcmp(uname, "reserved-memory") == 0) { 523 if (__reserved_mem_check_root(node) != 0) { 524 pr_err("Reserved memory: unsupported node format, ignoring\n"); 525 /* break scan */ 526 return 1; 527 } 528 found = 1; 529 /* scan next node */ 530 return 0; 531 } else if (!found) { 532 /* scan next node */ 533 return 0; 534 } else if (found && depth < 2) { 535 /* scanning of /reserved-memory has been finished */ 536 return 1; 537 } 538 539 status = of_get_flat_dt_prop(node, "status", NULL); 540 if (status && strcmp(status, "okay") != 0 && strcmp(status, "ok") != 0) 541 return 0; 542 543 err = __reserved_mem_reserve_reg(node, uname); 544 if (err == -ENOENT && of_get_flat_dt_prop(node, "size", NULL)) 545 fdt_reserved_mem_save_node(node, uname, 0, 0); 546 547 /* scan next node */ 548 return 0; 549 } 550 551 /** 552 * early_init_fdt_scan_reserved_mem() - create reserved memory regions 553 * 554 * This function grabs memory from early allocator for device exclusive use 555 * defined in device tree structures. It should be called by arch specific code 556 * once the early allocator (i.e. memblock) has been fully activated. 557 */ 558 void __init early_init_fdt_scan_reserved_mem(void) 559 { 560 if (!initial_boot_params) 561 return; 562 563 of_scan_flat_dt(__fdt_scan_reserved_mem, NULL); 564 fdt_init_reserved_mem(); 565 } 566 567 /** 568 * of_scan_flat_dt - scan flattened tree blob and call callback on each. 569 * @it: callback function 570 * @data: context data pointer 571 * 572 * This function is used to scan the flattened device-tree, it is 573 * used to extract the memory information at boot before we can 574 * unflatten the tree 575 */ 576 int __init of_scan_flat_dt(int (*it)(unsigned long node, 577 const char *uname, int depth, 578 void *data), 579 void *data) 580 { 581 unsigned long p = ((unsigned long)initial_boot_params) + 582 be32_to_cpu(initial_boot_params->off_dt_struct); 583 int rc = 0; 584 int depth = -1; 585 586 do { 587 u32 tag = be32_to_cpup((__be32 *)p); 588 const char *pathp; 589 590 p += 4; 591 if (tag == OF_DT_END_NODE) { 592 depth--; 593 continue; 594 } 595 if (tag == OF_DT_NOP) 596 continue; 597 if (tag == OF_DT_END) 598 break; 599 if (tag == OF_DT_PROP) { 600 u32 sz = be32_to_cpup((__be32 *)p); 601 p += 8; 602 if (be32_to_cpu(initial_boot_params->version) < 0x10) 603 p = ALIGN(p, sz >= 8 ? 8 : 4); 604 p += sz; 605 p = ALIGN(p, 4); 606 continue; 607 } 608 if (tag != OF_DT_BEGIN_NODE) { 609 pr_err("Invalid tag %x in flat device tree!\n", tag); 610 return -EINVAL; 611 } 612 depth++; 613 pathp = (char *)p; 614 p = ALIGN(p + strlen(pathp) + 1, 4); 615 if (*pathp == '/') 616 pathp = kbasename(pathp); 617 rc = it(p, pathp, depth, data); 618 if (rc != 0) 619 break; 620 } while (1); 621 622 return rc; 623 } 624 625 /** 626 * of_get_flat_dt_root - find the root node in the flat blob 627 */ 628 unsigned long __init of_get_flat_dt_root(void) 629 { 630 unsigned long p = ((unsigned long)initial_boot_params) + 631 be32_to_cpu(initial_boot_params->off_dt_struct); 632 633 while (be32_to_cpup((__be32 *)p) == OF_DT_NOP) 634 p += 4; 635 BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE); 636 p += 4; 637 return ALIGN(p + strlen((char *)p) + 1, 4); 638 } 639 640 /** 641 * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr 642 * 643 * This function can be used within scan_flattened_dt callback to get 644 * access to properties 645 */ 646 void *__init of_get_flat_dt_prop(unsigned long node, const char *name, 647 unsigned long *size) 648 { 649 return of_fdt_get_property(initial_boot_params, node, name, size); 650 } 651 652 /** 653 * of_flat_dt_is_compatible - Return true if given node has compat in compatible list 654 * @node: node to test 655 * @compat: compatible string to compare with compatible list. 656 */ 657 int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) 658 { 659 return of_fdt_is_compatible(initial_boot_params, node, compat); 660 } 661 662 /** 663 * of_flat_dt_match - Return true if node matches a list of compatible values 664 */ 665 int __init of_flat_dt_match(unsigned long node, const char *const *compat) 666 { 667 return of_fdt_match(initial_boot_params, node, compat); 668 } 669 670 struct fdt_scan_status { 671 const char *name; 672 int namelen; 673 int depth; 674 int found; 675 int (*iterator)(unsigned long node, const char *uname, int depth, void *data); 676 void *data; 677 }; 678 679 /** 680 * fdt_scan_node_by_path - iterator for of_scan_flat_dt_by_path function 681 */ 682 static int __init fdt_scan_node_by_path(unsigned long node, const char *uname, 683 int depth, void *data) 684 { 685 struct fdt_scan_status *st = data; 686 687 /* 688 * if scan at the requested fdt node has been completed, 689 * return -ENXIO to abort further scanning 690 */ 691 if (depth <= st->depth) 692 return -ENXIO; 693 694 /* requested fdt node has been found, so call iterator function */ 695 if (st->found) 696 return st->iterator(node, uname, depth, st->data); 697 698 /* check if scanning automata is entering next level of fdt nodes */ 699 if (depth == st->depth + 1 && 700 strncmp(st->name, uname, st->namelen) == 0 && 701 uname[st->namelen] == 0) { 702 st->depth += 1; 703 if (st->name[st->namelen] == 0) { 704 st->found = 1; 705 } else { 706 const char *next = st->name + st->namelen + 1; 707 st->name = next; 708 st->namelen = strcspn(next, "/"); 709 } 710 return 0; 711 } 712 713 /* scan next fdt node */ 714 return 0; 715 } 716 717 /** 718 * of_scan_flat_dt_by_path - scan flattened tree blob and call callback on each 719 * child of the given path. 720 * @path: path to start searching for children 721 * @it: callback function 722 * @data: context data pointer 723 * 724 * This function is used to scan the flattened device-tree starting from the 725 * node given by path. It is used to extract information (like reserved 726 * memory), which is required on ealy boot before we can unflatten the tree. 727 */ 728 int __init of_scan_flat_dt_by_path(const char *path, 729 int (*it)(unsigned long node, const char *name, int depth, void *data), 730 void *data) 731 { 732 struct fdt_scan_status st = {path, 0, -1, 0, it, data}; 733 int ret = 0; 734 735 if (initial_boot_params) 736 ret = of_scan_flat_dt(fdt_scan_node_by_path, &st); 737 738 if (!st.found) 739 return -ENOENT; 740 else if (ret == -ENXIO) /* scan has been completed */ 741 return 0; 742 else 743 return ret; 744 } 745 746 const char * __init of_flat_dt_get_machine_name(void) 747 { 748 const char *name; 749 unsigned long dt_root = of_get_flat_dt_root(); 750 751 name = of_get_flat_dt_prop(dt_root, "model", NULL); 752 if (!name) 753 name = of_get_flat_dt_prop(dt_root, "compatible", NULL); 754 return name; 755 } 756 757 /** 758 * of_flat_dt_match_machine - Iterate match tables to find matching machine. 759 * 760 * @default_match: A machine specific ptr to return in case of no match. 761 * @get_next_compat: callback function to return next compatible match table. 762 * 763 * Iterate through machine match tables to find the best match for the machine 764 * compatible string in the FDT. 765 */ 766 const void * __init of_flat_dt_match_machine(const void *default_match, 767 const void * (*get_next_compat)(const char * const**)) 768 { 769 const void *data = NULL; 770 const void *best_data = default_match; 771 const char *const *compat; 772 unsigned long dt_root; 773 unsigned int best_score = ~1, score = 0; 774 775 dt_root = of_get_flat_dt_root(); 776 while ((data = get_next_compat(&compat))) { 777 score = of_flat_dt_match(dt_root, compat); 778 if (score > 0 && score < best_score) { 779 best_data = data; 780 best_score = score; 781 } 782 } 783 if (!best_data) { 784 const char *prop; 785 long size; 786 787 pr_err("\n unrecognized device tree list:\n[ "); 788 789 prop = of_get_flat_dt_prop(dt_root, "compatible", &size); 790 if (prop) { 791 while (size > 0) { 792 printk("'%s' ", prop); 793 size -= strlen(prop) + 1; 794 prop += strlen(prop) + 1; 795 } 796 } 797 printk("]\n\n"); 798 return NULL; 799 } 800 801 pr_info("Machine model: %s\n", of_flat_dt_get_machine_name()); 802 803 return best_data; 804 } 805 806 #ifdef CONFIG_BLK_DEV_INITRD 807 /** 808 * early_init_dt_check_for_initrd - Decode initrd location from flat tree 809 * @node: reference to node containing initrd location ('chosen') 810 */ 811 static void __init early_init_dt_check_for_initrd(unsigned long node) 812 { 813 u64 start, end; 814 unsigned long len; 815 __be32 *prop; 816 817 pr_debug("Looking for initrd properties... "); 818 819 prop = of_get_flat_dt_prop(node, "linux,initrd-start", &len); 820 if (!prop) 821 return; 822 start = of_read_number(prop, len/4); 823 824 prop = of_get_flat_dt_prop(node, "linux,initrd-end", &len); 825 if (!prop) 826 return; 827 end = of_read_number(prop, len/4); 828 829 initrd_start = (unsigned long)__va(start); 830 initrd_end = (unsigned long)__va(end); 831 initrd_below_start_ok = 1; 832 833 pr_debug("initrd_start=0x%llx initrd_end=0x%llx\n", 834 (unsigned long long)start, (unsigned long long)end); 835 } 836 #else 837 static inline void early_init_dt_check_for_initrd(unsigned long node) 838 { 839 } 840 #endif /* CONFIG_BLK_DEV_INITRD */ 841 842 /** 843 * early_init_dt_scan_root - fetch the top level address and size cells 844 */ 845 int __init early_init_dt_scan_root(unsigned long node, const char *uname, 846 int depth, void *data) 847 { 848 __be32 *prop; 849 850 if (depth != 0) 851 return 0; 852 853 dt_root_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 854 dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 855 856 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 857 if (prop) 858 dt_root_size_cells = be32_to_cpup(prop); 859 pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells); 860 861 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 862 if (prop) 863 dt_root_addr_cells = be32_to_cpup(prop); 864 pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells); 865 866 /* break now */ 867 return 1; 868 } 869 870 u64 __init dt_mem_next_cell(int s, __be32 **cellp) 871 { 872 __be32 *p = *cellp; 873 874 *cellp = p + s; 875 return of_read_number(p, s); 876 } 877 878 /** 879 * early_init_dt_scan_memory - Look for an parse memory nodes 880 */ 881 int __init early_init_dt_scan_memory(unsigned long node, const char *uname, 882 int depth, void *data) 883 { 884 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 885 __be32 *reg, *endp; 886 unsigned long l; 887 888 /* We are scanning "memory" nodes only */ 889 if (type == NULL) { 890 /* 891 * The longtrail doesn't have a device_type on the 892 * /memory node, so look for the node called /memory@0. 893 */ 894 if (depth != 1 || strcmp(uname, "memory@0") != 0) 895 return 0; 896 } else if (strcmp(type, "memory") != 0) 897 return 0; 898 899 reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l); 900 if (reg == NULL) 901 reg = of_get_flat_dt_prop(node, "reg", &l); 902 if (reg == NULL) 903 return 0; 904 905 endp = reg + (l / sizeof(__be32)); 906 907 pr_debug("memory scan node %s, reg size %ld, data: %x %x %x %x,\n", 908 uname, l, reg[0], reg[1], reg[2], reg[3]); 909 910 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 911 u64 base, size; 912 913 base = dt_mem_next_cell(dt_root_addr_cells, ®); 914 size = dt_mem_next_cell(dt_root_size_cells, ®); 915 916 if (size == 0) 917 continue; 918 pr_debug(" - %llx , %llx\n", (unsigned long long)base, 919 (unsigned long long)size); 920 921 early_init_dt_add_memory_arch(base, size); 922 } 923 924 return 0; 925 } 926 927 int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, 928 int depth, void *data) 929 { 930 unsigned long l; 931 char *p; 932 933 pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 934 935 if (depth != 1 || !data || 936 (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) 937 return 0; 938 939 early_init_dt_check_for_initrd(node); 940 941 /* Retrieve command line */ 942 p = of_get_flat_dt_prop(node, "bootargs", &l); 943 if (p != NULL && l > 0) 944 strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); 945 946 /* 947 * CONFIG_CMDLINE is meant to be a default in case nothing else 948 * managed to set the command line, unless CONFIG_CMDLINE_FORCE 949 * is set in which case we override whatever was found earlier. 950 */ 951 #ifdef CONFIG_CMDLINE 952 #ifndef CONFIG_CMDLINE_FORCE 953 if (!((char *)data)[0]) 954 #endif 955 strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 956 #endif /* CONFIG_CMDLINE */ 957 958 pr_debug("Command line is: %s\n", (char*)data); 959 960 /* break now */ 961 return 1; 962 } 963 964 #ifdef CONFIG_HAVE_MEMBLOCK 965 void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) 966 { 967 const u64 phys_offset = __pa(PAGE_OFFSET); 968 base &= PAGE_MASK; 969 size &= PAGE_MASK; 970 if (base + size < phys_offset) { 971 pr_warning("Ignoring memory block 0x%llx - 0x%llx\n", 972 base, base + size); 973 return; 974 } 975 if (base < phys_offset) { 976 pr_warning("Ignoring memory range 0x%llx - 0x%llx\n", 977 base, phys_offset); 978 size -= phys_offset - base; 979 base = phys_offset; 980 } 981 memblock_add(base, size); 982 } 983 984 int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, 985 phys_addr_t size, bool nomap) 986 { 987 if (memblock_is_region_reserved(base, size)) 988 return -EBUSY; 989 if (nomap) 990 return memblock_remove(base, size); 991 return memblock_reserve(base, size); 992 } 993 994 /* 995 * called from unflatten_device_tree() to bootstrap devicetree itself 996 * Architectures can override this definition if memblock isn't used 997 */ 998 void * __init __weak early_init_dt_alloc_memory_arch(u64 size, u64 align) 999 { 1000 return __va(memblock_alloc(size, align)); 1001 } 1002 #else 1003 int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, 1004 phys_addr_t size, bool nomap) 1005 { 1006 pr_err("Reserved memory not supported, ignoring range 0x%llx - 0x%llx%s\n", 1007 base, size, nomap ? " (nomap)" : ""); 1008 return -ENOSYS; 1009 } 1010 #endif 1011 1012 bool __init early_init_dt_scan(void *params) 1013 { 1014 if (!params) 1015 return false; 1016 1017 /* Setup flat device-tree pointer */ 1018 initial_boot_params = params; 1019 1020 /* check device tree validity */ 1021 if (be32_to_cpu(initial_boot_params->magic) != OF_DT_HEADER) { 1022 initial_boot_params = NULL; 1023 return false; 1024 } 1025 1026 /* Retrieve various information from the /chosen node */ 1027 of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); 1028 1029 /* Initialize {size,address}-cells info */ 1030 of_scan_flat_dt(early_init_dt_scan_root, NULL); 1031 1032 /* Setup memory, calling early_init_dt_add_memory_arch */ 1033 of_scan_flat_dt(early_init_dt_scan_memory, NULL); 1034 1035 return true; 1036 } 1037 1038 /** 1039 * unflatten_device_tree - create tree of device_nodes from flat blob 1040 * 1041 * unflattens the device-tree passed by the firmware, creating the 1042 * tree of struct device_node. It also fills the "name" and "type" 1043 * pointers of the nodes so the normal device-tree walking functions 1044 * can be used. 1045 */ 1046 void __init unflatten_device_tree(void) 1047 { 1048 __unflatten_device_tree(initial_boot_params, &of_allnodes, 1049 early_init_dt_alloc_memory_arch); 1050 1051 /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */ 1052 of_alias_scan(early_init_dt_alloc_memory_arch); 1053 } 1054 1055 /** 1056 * unflatten_and_copy_device_tree - copy and create tree of device_nodes from flat blob 1057 * 1058 * Copies and unflattens the device-tree passed by the firmware, creating the 1059 * tree of struct device_node. It also fills the "name" and "type" 1060 * pointers of the nodes so the normal device-tree walking functions 1061 * can be used. This should only be used when the FDT memory has not been 1062 * reserved such is the case when the FDT is built-in to the kernel init 1063 * section. If the FDT memory is reserved already then unflatten_device_tree 1064 * should be used instead. 1065 */ 1066 void __init unflatten_and_copy_device_tree(void) 1067 { 1068 int size; 1069 void *dt; 1070 1071 if (!initial_boot_params) { 1072 pr_warn("No valid device tree found, continuing without\n"); 1073 return; 1074 } 1075 1076 size = __be32_to_cpu(initial_boot_params->totalsize); 1077 dt = early_init_dt_alloc_memory_arch(size, 1078 __alignof__(struct boot_param_header)); 1079 1080 if (dt) { 1081 memcpy(dt, initial_boot_params, size); 1082 initial_boot_params = dt; 1083 } 1084 unflatten_device_tree(); 1085 } 1086 1087 #endif /* CONFIG_OF_EARLY_FLATTREE */ 1088