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/module.h> 15 #include <linux/of.h> 16 #include <linux/of_fdt.h> 17 #include <linux/string.h> 18 #include <linux/errno.h> 19 #include <linux/slab.h> 20 21 #include <asm/setup.h> /* for COMMAND_LINE_SIZE */ 22 #ifdef CONFIG_PPC 23 #include <asm/machdep.h> 24 #endif /* CONFIG_PPC */ 25 26 #include <asm/setup.h> 27 #include <asm/page.h> 28 29 char *of_fdt_get_string(struct boot_param_header *blob, u32 offset) 30 { 31 return ((char *)blob) + 32 be32_to_cpu(blob->off_dt_strings) + offset; 33 } 34 35 /** 36 * of_fdt_get_property - Given a node in the given flat blob, return 37 * the property ptr 38 */ 39 void *of_fdt_get_property(struct boot_param_header *blob, 40 unsigned long node, const char *name, 41 unsigned long *size) 42 { 43 unsigned long p = node; 44 45 do { 46 u32 tag = be32_to_cpup((__be32 *)p); 47 u32 sz, noff; 48 const char *nstr; 49 50 p += 4; 51 if (tag == OF_DT_NOP) 52 continue; 53 if (tag != OF_DT_PROP) 54 return NULL; 55 56 sz = be32_to_cpup((__be32 *)p); 57 noff = be32_to_cpup((__be32 *)(p + 4)); 58 p += 8; 59 if (be32_to_cpu(blob->version) < 0x10) 60 p = ALIGN(p, sz >= 8 ? 8 : 4); 61 62 nstr = of_fdt_get_string(blob, noff); 63 if (nstr == NULL) { 64 pr_warning("Can't find property index name !\n"); 65 return NULL; 66 } 67 if (strcmp(name, nstr) == 0) { 68 if (size) 69 *size = sz; 70 return (void *)p; 71 } 72 p += sz; 73 p = ALIGN(p, 4); 74 } while (1); 75 } 76 77 /** 78 * of_fdt_is_compatible - Return true if given node from the given blob has 79 * compat in its compatible list 80 * @blob: A device tree blob 81 * @node: node to test 82 * @compat: compatible string to compare with compatible list. 83 * 84 * On match, returns a non-zero value with smaller values returned for more 85 * specific compatible values. 86 */ 87 int of_fdt_is_compatible(struct boot_param_header *blob, 88 unsigned long node, const char *compat) 89 { 90 const char *cp; 91 unsigned long cplen, l, score = 0; 92 93 cp = of_fdt_get_property(blob, node, "compatible", &cplen); 94 if (cp == NULL) 95 return 0; 96 while (cplen > 0) { 97 score++; 98 if (of_compat_cmp(cp, compat, strlen(compat)) == 0) 99 return score; 100 l = strlen(cp) + 1; 101 cp += l; 102 cplen -= l; 103 } 104 105 return 0; 106 } 107 108 /** 109 * of_fdt_match - Return true if node matches a list of compatible values 110 */ 111 int of_fdt_match(struct boot_param_header *blob, unsigned long node, 112 const char *const *compat) 113 { 114 unsigned int tmp, score = 0; 115 116 if (!compat) 117 return 0; 118 119 while (*compat) { 120 tmp = of_fdt_is_compatible(blob, node, *compat); 121 if (tmp && (score == 0 || (tmp < score))) 122 score = tmp; 123 compat++; 124 } 125 126 return score; 127 } 128 129 static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size, 130 unsigned long align) 131 { 132 void *res; 133 134 *mem = ALIGN(*mem, align); 135 res = (void *)*mem; 136 *mem += size; 137 138 return res; 139 } 140 141 /** 142 * unflatten_dt_node - Alloc and populate a device_node from the flat tree 143 * @blob: The parent device tree blob 144 * @mem: Memory chunk to use for allocating device nodes and properties 145 * @p: pointer to node in flat tree 146 * @dad: Parent struct device_node 147 * @allnextpp: pointer to ->allnext from last allocated device_node 148 * @fpsize: Size of the node path up at the current depth. 149 */ 150 static unsigned long unflatten_dt_node(struct boot_param_header *blob, 151 unsigned long mem, 152 unsigned long *p, 153 struct device_node *dad, 154 struct device_node ***allnextpp, 155 unsigned long fpsize) 156 { 157 struct device_node *np; 158 struct property *pp, **prev_pp = NULL; 159 char *pathp; 160 u32 tag; 161 unsigned int l, allocl; 162 int has_name = 0; 163 int new_format = 0; 164 165 tag = be32_to_cpup((__be32 *)(*p)); 166 if (tag != OF_DT_BEGIN_NODE) { 167 pr_err("Weird tag at start of node: %x\n", tag); 168 return mem; 169 } 170 *p += 4; 171 pathp = (char *)*p; 172 l = allocl = strlen(pathp) + 1; 173 *p = ALIGN(*p + l, 4); 174 175 /* version 0x10 has a more compact unit name here instead of the full 176 * path. we accumulate the full path size using "fpsize", we'll rebuild 177 * it later. We detect this because the first character of the name is 178 * not '/'. 179 */ 180 if ((*pathp) != '/') { 181 new_format = 1; 182 if (fpsize == 0) { 183 /* root node: special case. fpsize accounts for path 184 * plus terminating zero. root node only has '/', so 185 * fpsize should be 2, but we want to avoid the first 186 * level nodes to have two '/' so we use fpsize 1 here 187 */ 188 fpsize = 1; 189 allocl = 2; 190 } else { 191 /* account for '/' and path size minus terminal 0 192 * already in 'l' 193 */ 194 fpsize += l; 195 allocl = fpsize; 196 } 197 } 198 199 np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl, 200 __alignof__(struct device_node)); 201 if (allnextpp) { 202 memset(np, 0, sizeof(*np)); 203 np->full_name = ((char *)np) + sizeof(struct device_node); 204 if (new_format) { 205 char *fn = np->full_name; 206 /* rebuild full path for new format */ 207 if (dad && dad->parent) { 208 strcpy(fn, dad->full_name); 209 #ifdef DEBUG 210 if ((strlen(fn) + l + 1) != allocl) { 211 pr_debug("%s: p: %d, l: %d, a: %d\n", 212 pathp, (int)strlen(fn), 213 l, allocl); 214 } 215 #endif 216 fn += strlen(fn); 217 } 218 *(fn++) = '/'; 219 memcpy(fn, pathp, l); 220 } else 221 memcpy(np->full_name, pathp, l); 222 prev_pp = &np->properties; 223 **allnextpp = np; 224 *allnextpp = &np->allnext; 225 if (dad != NULL) { 226 np->parent = dad; 227 /* we temporarily use the next field as `last_child'*/ 228 if (dad->next == NULL) 229 dad->child = np; 230 else 231 dad->next->sibling = np; 232 dad->next = np; 233 } 234 kref_init(&np->kref); 235 } 236 /* process properties */ 237 while (1) { 238 u32 sz, noff; 239 char *pname; 240 241 tag = be32_to_cpup((__be32 *)(*p)); 242 if (tag == OF_DT_NOP) { 243 *p += 4; 244 continue; 245 } 246 if (tag != OF_DT_PROP) 247 break; 248 *p += 4; 249 sz = be32_to_cpup((__be32 *)(*p)); 250 noff = be32_to_cpup((__be32 *)((*p) + 4)); 251 *p += 8; 252 if (be32_to_cpu(blob->version) < 0x10) 253 *p = ALIGN(*p, sz >= 8 ? 8 : 4); 254 255 pname = of_fdt_get_string(blob, noff); 256 if (pname == NULL) { 257 pr_info("Can't find property name in list !\n"); 258 break; 259 } 260 if (strcmp(pname, "name") == 0) 261 has_name = 1; 262 l = strlen(pname) + 1; 263 pp = unflatten_dt_alloc(&mem, sizeof(struct property), 264 __alignof__(struct property)); 265 if (allnextpp) { 266 /* We accept flattened tree phandles either in 267 * ePAPR-style "phandle" properties, or the 268 * legacy "linux,phandle" properties. If both 269 * appear and have different values, things 270 * will get weird. Don't do that. */ 271 if ((strcmp(pname, "phandle") == 0) || 272 (strcmp(pname, "linux,phandle") == 0)) { 273 if (np->phandle == 0) 274 np->phandle = be32_to_cpup((__be32*)*p); 275 } 276 /* And we process the "ibm,phandle" property 277 * used in pSeries dynamic device tree 278 * stuff */ 279 if (strcmp(pname, "ibm,phandle") == 0) 280 np->phandle = be32_to_cpup((__be32 *)*p); 281 pp->name = pname; 282 pp->length = sz; 283 pp->value = (void *)*p; 284 *prev_pp = pp; 285 prev_pp = &pp->next; 286 } 287 *p = ALIGN((*p) + sz, 4); 288 } 289 /* with version 0x10 we may not have the name property, recreate 290 * it here from the unit name if absent 291 */ 292 if (!has_name) { 293 char *p1 = pathp, *ps = pathp, *pa = NULL; 294 int sz; 295 296 while (*p1) { 297 if ((*p1) == '@') 298 pa = p1; 299 if ((*p1) == '/') 300 ps = p1 + 1; 301 p1++; 302 } 303 if (pa < ps) 304 pa = p1; 305 sz = (pa - ps) + 1; 306 pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz, 307 __alignof__(struct property)); 308 if (allnextpp) { 309 pp->name = "name"; 310 pp->length = sz; 311 pp->value = pp + 1; 312 *prev_pp = pp; 313 prev_pp = &pp->next; 314 memcpy(pp->value, ps, sz - 1); 315 ((char *)pp->value)[sz - 1] = 0; 316 pr_debug("fixed up name for %s -> %s\n", pathp, 317 (char *)pp->value); 318 } 319 } 320 if (allnextpp) { 321 *prev_pp = NULL; 322 np->name = of_get_property(np, "name", NULL); 323 np->type = of_get_property(np, "device_type", NULL); 324 325 if (!np->name) 326 np->name = "<NULL>"; 327 if (!np->type) 328 np->type = "<NULL>"; 329 } 330 while (tag == OF_DT_BEGIN_NODE || tag == OF_DT_NOP) { 331 if (tag == OF_DT_NOP) 332 *p += 4; 333 else 334 mem = unflatten_dt_node(blob, mem, p, np, allnextpp, 335 fpsize); 336 tag = be32_to_cpup((__be32 *)(*p)); 337 } 338 if (tag != OF_DT_END_NODE) { 339 pr_err("Weird tag at end of node: %x\n", tag); 340 return mem; 341 } 342 *p += 4; 343 return mem; 344 } 345 346 /** 347 * __unflatten_device_tree - create tree of device_nodes from flat blob 348 * 349 * unflattens a device-tree, creating the 350 * tree of struct device_node. It also fills the "name" and "type" 351 * pointers of the nodes so the normal device-tree walking functions 352 * can be used. 353 * @blob: The blob to expand 354 * @mynodes: The device_node tree created by the call 355 * @dt_alloc: An allocator that provides a virtual address to memory 356 * for the resulting tree 357 */ 358 static void __unflatten_device_tree(struct boot_param_header *blob, 359 struct device_node **mynodes, 360 void * (*dt_alloc)(u64 size, u64 align)) 361 { 362 unsigned long start, mem, size; 363 struct device_node **allnextp = mynodes; 364 365 pr_debug(" -> unflatten_device_tree()\n"); 366 367 if (!blob) { 368 pr_debug("No device tree pointer\n"); 369 return; 370 } 371 372 pr_debug("Unflattening device tree:\n"); 373 pr_debug("magic: %08x\n", be32_to_cpu(blob->magic)); 374 pr_debug("size: %08x\n", be32_to_cpu(blob->totalsize)); 375 pr_debug("version: %08x\n", be32_to_cpu(blob->version)); 376 377 if (be32_to_cpu(blob->magic) != OF_DT_HEADER) { 378 pr_err("Invalid device tree blob header\n"); 379 return; 380 } 381 382 /* First pass, scan for size */ 383 start = ((unsigned long)blob) + 384 be32_to_cpu(blob->off_dt_struct); 385 size = unflatten_dt_node(blob, 0, &start, NULL, NULL, 0); 386 size = (size | 3) + 1; 387 388 pr_debug(" size is %lx, allocating...\n", size); 389 390 /* Allocate memory for the expanded device tree */ 391 mem = (unsigned long) 392 dt_alloc(size + 4, __alignof__(struct device_node)); 393 394 ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); 395 396 pr_debug(" unflattening %lx...\n", mem); 397 398 /* Second pass, do actual unflattening */ 399 start = ((unsigned long)blob) + 400 be32_to_cpu(blob->off_dt_struct); 401 unflatten_dt_node(blob, mem, &start, NULL, &allnextp, 0); 402 if (be32_to_cpup((__be32 *)start) != OF_DT_END) 403 pr_warning("Weird tag at end of tree: %08x\n", *((u32 *)start)); 404 if (be32_to_cpu(((__be32 *)mem)[size / 4]) != 0xdeadbeef) 405 pr_warning("End of tree marker overwritten: %08x\n", 406 be32_to_cpu(((__be32 *)mem)[size / 4])); 407 *allnextp = NULL; 408 409 pr_debug(" <- unflatten_device_tree()\n"); 410 } 411 412 static void *kernel_tree_alloc(u64 size, u64 align) 413 { 414 return kzalloc(size, GFP_KERNEL); 415 } 416 417 /** 418 * of_fdt_unflatten_tree - create tree of device_nodes from flat blob 419 * 420 * unflattens the device-tree passed by the firmware, creating the 421 * tree of struct device_node. It also fills the "name" and "type" 422 * pointers of the nodes so the normal device-tree walking functions 423 * can be used. 424 */ 425 void of_fdt_unflatten_tree(unsigned long *blob, 426 struct device_node **mynodes) 427 { 428 struct boot_param_header *device_tree = 429 (struct boot_param_header *)blob; 430 __unflatten_device_tree(device_tree, mynodes, &kernel_tree_alloc); 431 } 432 EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree); 433 434 /* Everything below here references initial_boot_params directly. */ 435 int __initdata dt_root_addr_cells; 436 int __initdata dt_root_size_cells; 437 438 struct boot_param_header *initial_boot_params; 439 440 #ifdef CONFIG_OF_EARLY_FLATTREE 441 442 /** 443 * of_scan_flat_dt - scan flattened tree blob and call callback on each. 444 * @it: callback function 445 * @data: context data pointer 446 * 447 * This function is used to scan the flattened device-tree, it is 448 * used to extract the memory information at boot before we can 449 * unflatten the tree 450 */ 451 int __init of_scan_flat_dt(int (*it)(unsigned long node, 452 const char *uname, int depth, 453 void *data), 454 void *data) 455 { 456 unsigned long p = ((unsigned long)initial_boot_params) + 457 be32_to_cpu(initial_boot_params->off_dt_struct); 458 int rc = 0; 459 int depth = -1; 460 461 do { 462 u32 tag = be32_to_cpup((__be32 *)p); 463 char *pathp; 464 465 p += 4; 466 if (tag == OF_DT_END_NODE) { 467 depth--; 468 continue; 469 } 470 if (tag == OF_DT_NOP) 471 continue; 472 if (tag == OF_DT_END) 473 break; 474 if (tag == OF_DT_PROP) { 475 u32 sz = be32_to_cpup((__be32 *)p); 476 p += 8; 477 if (be32_to_cpu(initial_boot_params->version) < 0x10) 478 p = ALIGN(p, sz >= 8 ? 8 : 4); 479 p += sz; 480 p = ALIGN(p, 4); 481 continue; 482 } 483 if (tag != OF_DT_BEGIN_NODE) { 484 pr_err("Invalid tag %x in flat device tree!\n", tag); 485 return -EINVAL; 486 } 487 depth++; 488 pathp = (char *)p; 489 p = ALIGN(p + strlen(pathp) + 1, 4); 490 if ((*pathp) == '/') { 491 char *lp, *np; 492 for (lp = NULL, np = pathp; *np; np++) 493 if ((*np) == '/') 494 lp = np+1; 495 if (lp != NULL) 496 pathp = lp; 497 } 498 rc = it(p, pathp, depth, data); 499 if (rc != 0) 500 break; 501 } while (1); 502 503 return rc; 504 } 505 506 /** 507 * of_get_flat_dt_root - find the root node in the flat blob 508 */ 509 unsigned long __init of_get_flat_dt_root(void) 510 { 511 unsigned long p = ((unsigned long)initial_boot_params) + 512 be32_to_cpu(initial_boot_params->off_dt_struct); 513 514 while (be32_to_cpup((__be32 *)p) == OF_DT_NOP) 515 p += 4; 516 BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE); 517 p += 4; 518 return ALIGN(p + strlen((char *)p) + 1, 4); 519 } 520 521 /** 522 * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr 523 * 524 * This function can be used within scan_flattened_dt callback to get 525 * access to properties 526 */ 527 void *__init of_get_flat_dt_prop(unsigned long node, const char *name, 528 unsigned long *size) 529 { 530 return of_fdt_get_property(initial_boot_params, node, name, size); 531 } 532 533 /** 534 * of_flat_dt_is_compatible - Return true if given node has compat in compatible list 535 * @node: node to test 536 * @compat: compatible string to compare with compatible list. 537 */ 538 int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) 539 { 540 return of_fdt_is_compatible(initial_boot_params, node, compat); 541 } 542 543 /** 544 * of_flat_dt_match - Return true if node matches a list of compatible values 545 */ 546 int __init of_flat_dt_match(unsigned long node, const char *const *compat) 547 { 548 return of_fdt_match(initial_boot_params, node, compat); 549 } 550 551 #ifdef CONFIG_BLK_DEV_INITRD 552 /** 553 * early_init_dt_check_for_initrd - Decode initrd location from flat tree 554 * @node: reference to node containing initrd location ('chosen') 555 */ 556 void __init early_init_dt_check_for_initrd(unsigned long node) 557 { 558 unsigned long start, end, len; 559 __be32 *prop; 560 561 pr_debug("Looking for initrd properties... "); 562 563 prop = of_get_flat_dt_prop(node, "linux,initrd-start", &len); 564 if (!prop) 565 return; 566 start = of_read_ulong(prop, len/4); 567 568 prop = of_get_flat_dt_prop(node, "linux,initrd-end", &len); 569 if (!prop) 570 return; 571 end = of_read_ulong(prop, len/4); 572 573 early_init_dt_setup_initrd_arch(start, end); 574 pr_debug("initrd_start=0x%lx initrd_end=0x%lx\n", start, end); 575 } 576 #else 577 inline void early_init_dt_check_for_initrd(unsigned long node) 578 { 579 } 580 #endif /* CONFIG_BLK_DEV_INITRD */ 581 582 /** 583 * early_init_dt_scan_root - fetch the top level address and size cells 584 */ 585 int __init early_init_dt_scan_root(unsigned long node, const char *uname, 586 int depth, void *data) 587 { 588 __be32 *prop; 589 590 if (depth != 0) 591 return 0; 592 593 dt_root_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 594 dt_root_addr_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 595 596 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 597 if (prop) 598 dt_root_size_cells = be32_to_cpup(prop); 599 pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells); 600 601 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 602 if (prop) 603 dt_root_addr_cells = be32_to_cpup(prop); 604 pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells); 605 606 /* break now */ 607 return 1; 608 } 609 610 u64 __init dt_mem_next_cell(int s, __be32 **cellp) 611 { 612 __be32 *p = *cellp; 613 614 *cellp = p + s; 615 return of_read_number(p, s); 616 } 617 618 /** 619 * early_init_dt_scan_memory - Look for an parse memory nodes 620 */ 621 int __init early_init_dt_scan_memory(unsigned long node, const char *uname, 622 int depth, void *data) 623 { 624 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 625 __be32 *reg, *endp; 626 unsigned long l; 627 628 /* We are scanning "memory" nodes only */ 629 if (type == NULL) { 630 /* 631 * The longtrail doesn't have a device_type on the 632 * /memory node, so look for the node called /memory@0. 633 */ 634 if (depth != 1 || strcmp(uname, "memory@0") != 0) 635 return 0; 636 } else if (strcmp(type, "memory") != 0) 637 return 0; 638 639 reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l); 640 if (reg == NULL) 641 reg = of_get_flat_dt_prop(node, "reg", &l); 642 if (reg == NULL) 643 return 0; 644 645 endp = reg + (l / sizeof(__be32)); 646 647 pr_debug("memory scan node %s, reg size %ld, data: %x %x %x %x,\n", 648 uname, l, reg[0], reg[1], reg[2], reg[3]); 649 650 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 651 u64 base, size; 652 653 base = dt_mem_next_cell(dt_root_addr_cells, ®); 654 size = dt_mem_next_cell(dt_root_size_cells, ®); 655 656 if (size == 0) 657 continue; 658 pr_debug(" - %llx , %llx\n", (unsigned long long)base, 659 (unsigned long long)size); 660 661 early_init_dt_add_memory_arch(base, size); 662 } 663 664 return 0; 665 } 666 667 int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, 668 int depth, void *data) 669 { 670 unsigned long l; 671 char *p; 672 673 pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 674 675 if (depth != 1 || !data || 676 (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) 677 return 0; 678 679 early_init_dt_check_for_initrd(node); 680 681 /* Retrieve command line */ 682 p = of_get_flat_dt_prop(node, "bootargs", &l); 683 if (p != NULL && l > 0) 684 strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); 685 686 /* 687 * CONFIG_CMDLINE is meant to be a default in case nothing else 688 * managed to set the command line, unless CONFIG_CMDLINE_FORCE 689 * is set in which case we override whatever was found earlier. 690 */ 691 #ifdef CONFIG_CMDLINE 692 #ifndef CONFIG_CMDLINE_FORCE 693 if (!((char *)data)[0]) 694 #endif 695 strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 696 #endif /* CONFIG_CMDLINE */ 697 698 pr_debug("Command line is: %s\n", (char*)data); 699 700 /* break now */ 701 return 1; 702 } 703 704 /** 705 * unflatten_device_tree - create tree of device_nodes from flat blob 706 * 707 * unflattens the device-tree passed by the firmware, creating the 708 * tree of struct device_node. It also fills the "name" and "type" 709 * pointers of the nodes so the normal device-tree walking functions 710 * can be used. 711 */ 712 void __init unflatten_device_tree(void) 713 { 714 __unflatten_device_tree(initial_boot_params, &allnodes, 715 early_init_dt_alloc_memory_arch); 716 717 /* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */ 718 of_alias_scan(early_init_dt_alloc_memory_arch); 719 } 720 721 #endif /* CONFIG_OF_EARLY_FLATTREE */ 722