1 /* 2 * Procedures for creating, accessing and interpreting the device tree. 3 * 4 * Paul Mackerras August 1996. 5 * Copyright (C) 1996-2005 Paul Mackerras. 6 * 7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. 8 * {engebret|bergner}@us.ibm.com 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 13 * 2 of the License, or (at your option) any later version. 14 */ 15 16 #include <stdarg.h> 17 #include <linux/kernel.h> 18 #include <linux/string.h> 19 #include <linux/init.h> 20 #include <linux/threads.h> 21 #include <linux/spinlock.h> 22 #include <linux/types.h> 23 #include <linux/pci.h> 24 #include <linux/stringify.h> 25 #include <linux/delay.h> 26 #include <linux/initrd.h> 27 #include <linux/bitops.h> 28 #include <linux/module.h> 29 #include <linux/kexec.h> 30 #include <linux/debugfs.h> 31 #include <linux/irq.h> 32 #include <linux/lmb.h> 33 34 #include <asm/prom.h> 35 #include <asm/page.h> 36 #include <asm/processor.h> 37 #include <asm/irq.h> 38 #include <linux/io.h> 39 #include <asm/system.h> 40 #include <asm/mmu.h> 41 #include <asm/pgtable.h> 42 #include <asm/sections.h> 43 #include <asm/pci-bridge.h> 44 45 static int __initdata dt_root_addr_cells; 46 static int __initdata dt_root_size_cells; 47 48 typedef u32 cell_t; 49 50 static struct boot_param_header *initial_boot_params; 51 52 /* export that to outside world */ 53 struct device_node *of_chosen; 54 55 static inline char *find_flat_dt_string(u32 offset) 56 { 57 return ((char *)initial_boot_params) + 58 initial_boot_params->off_dt_strings + offset; 59 } 60 61 /** 62 * This function is used to scan the flattened device-tree, it is 63 * used to extract the memory informations at boot before we can 64 * unflatten the tree 65 */ 66 int __init of_scan_flat_dt(int (*it)(unsigned long node, 67 const char *uname, int depth, 68 void *data), 69 void *data) 70 { 71 unsigned long p = ((unsigned long)initial_boot_params) + 72 initial_boot_params->off_dt_struct; 73 int rc = 0; 74 int depth = -1; 75 76 do { 77 u32 tag = *((u32 *)p); 78 char *pathp; 79 80 p += 4; 81 if (tag == OF_DT_END_NODE) { 82 depth--; 83 continue; 84 } 85 if (tag == OF_DT_NOP) 86 continue; 87 if (tag == OF_DT_END) 88 break; 89 if (tag == OF_DT_PROP) { 90 u32 sz = *((u32 *)p); 91 p += 8; 92 if (initial_boot_params->version < 0x10) 93 p = _ALIGN(p, sz >= 8 ? 8 : 4); 94 p += sz; 95 p = _ALIGN(p, 4); 96 continue; 97 } 98 if (tag != OF_DT_BEGIN_NODE) { 99 printk(KERN_WARNING "Invalid tag %x scanning flattened" 100 " device tree !\n", tag); 101 return -EINVAL; 102 } 103 depth++; 104 pathp = (char *)p; 105 p = _ALIGN(p + strlen(pathp) + 1, 4); 106 if ((*pathp) == '/') { 107 char *lp, *np; 108 for (lp = NULL, np = pathp; *np; np++) 109 if ((*np) == '/') 110 lp = np+1; 111 if (lp != NULL) 112 pathp = lp; 113 } 114 rc = it(p, pathp, depth, data); 115 if (rc != 0) 116 break; 117 } while (1); 118 119 return rc; 120 } 121 122 unsigned long __init of_get_flat_dt_root(void) 123 { 124 unsigned long p = ((unsigned long)initial_boot_params) + 125 initial_boot_params->off_dt_struct; 126 127 while (*((u32 *)p) == OF_DT_NOP) 128 p += 4; 129 BUG_ON(*((u32 *)p) != OF_DT_BEGIN_NODE); 130 p += 4; 131 return _ALIGN(p + strlen((char *)p) + 1, 4); 132 } 133 134 /** 135 * This function can be used within scan_flattened_dt callback to get 136 * access to properties 137 */ 138 void *__init of_get_flat_dt_prop(unsigned long node, const char *name, 139 unsigned long *size) 140 { 141 unsigned long p = node; 142 143 do { 144 u32 tag = *((u32 *)p); 145 u32 sz, noff; 146 const char *nstr; 147 148 p += 4; 149 if (tag == OF_DT_NOP) 150 continue; 151 if (tag != OF_DT_PROP) 152 return NULL; 153 154 sz = *((u32 *)p); 155 noff = *((u32 *)(p + 4)); 156 p += 8; 157 if (initial_boot_params->version < 0x10) 158 p = _ALIGN(p, sz >= 8 ? 8 : 4); 159 160 nstr = find_flat_dt_string(noff); 161 if (nstr == NULL) { 162 printk(KERN_WARNING "Can't find property index" 163 " name !\n"); 164 return NULL; 165 } 166 if (strcmp(name, nstr) == 0) { 167 if (size) 168 *size = sz; 169 return (void *)p; 170 } 171 p += sz; 172 p = _ALIGN(p, 4); 173 } while (1); 174 } 175 176 int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) 177 { 178 const char *cp; 179 unsigned long cplen, l; 180 181 cp = of_get_flat_dt_prop(node, "compatible", &cplen); 182 if (cp == NULL) 183 return 0; 184 while (cplen > 0) { 185 if (strncasecmp(cp, compat, strlen(compat)) == 0) 186 return 1; 187 l = strlen(cp) + 1; 188 cp += l; 189 cplen -= l; 190 } 191 192 return 0; 193 } 194 195 static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, 196 unsigned long align) 197 { 198 void *res; 199 200 *mem = _ALIGN(*mem, align); 201 res = (void *)*mem; 202 *mem += size; 203 204 return res; 205 } 206 207 static unsigned long __init unflatten_dt_node(unsigned long mem, 208 unsigned long *p, 209 struct device_node *dad, 210 struct device_node ***allnextpp, 211 unsigned long fpsize) 212 { 213 struct device_node *np; 214 struct property *pp, **prev_pp = NULL; 215 char *pathp; 216 u32 tag; 217 unsigned int l, allocl; 218 int has_name = 0; 219 int new_format = 0; 220 221 tag = *((u32 *)(*p)); 222 if (tag != OF_DT_BEGIN_NODE) { 223 printk("Weird tag at start of node: %x\n", tag); 224 return mem; 225 } 226 *p += 4; 227 pathp = (char *)*p; 228 l = allocl = strlen(pathp) + 1; 229 *p = _ALIGN(*p + l, 4); 230 231 /* version 0x10 has a more compact unit name here instead of the full 232 * path. we accumulate the full path size using "fpsize", we'll rebuild 233 * it later. We detect this because the first character of the name is 234 * not '/'. 235 */ 236 if ((*pathp) != '/') { 237 new_format = 1; 238 if (fpsize == 0) { 239 /* root node: special case. fpsize accounts for path 240 * plus terminating zero. root node only has '/', so 241 * fpsize should be 2, but we want to avoid the first 242 * level nodes to have two '/' so we use fpsize 1 here 243 */ 244 fpsize = 1; 245 allocl = 2; 246 } else { 247 /* account for '/' and path size minus terminal 0 248 * already in 'l' 249 */ 250 fpsize += l; 251 allocl = fpsize; 252 } 253 } 254 255 np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl, 256 __alignof__(struct device_node)); 257 if (allnextpp) { 258 memset(np, 0, sizeof(*np)); 259 np->full_name = ((char *)np) + sizeof(struct device_node); 260 if (new_format) { 261 char *p2 = np->full_name; 262 /* rebuild full path for new format */ 263 if (dad && dad->parent) { 264 strcpy(p2, dad->full_name); 265 #ifdef DEBUG 266 if ((strlen(p2) + l + 1) != allocl) { 267 pr_debug("%s: p: %d, l: %d, a: %d\n", 268 pathp, (int)strlen(p2), 269 l, allocl); 270 } 271 #endif 272 p2 += strlen(p2); 273 } 274 *(p2++) = '/'; 275 memcpy(p2, pathp, l); 276 } else 277 memcpy(np->full_name, pathp, l); 278 prev_pp = &np->properties; 279 **allnextpp = np; 280 *allnextpp = &np->allnext; 281 if (dad != NULL) { 282 np->parent = dad; 283 /* we temporarily use the next field as `last_child'*/ 284 if (dad->next == NULL) 285 dad->child = np; 286 else 287 dad->next->sibling = np; 288 dad->next = np; 289 } 290 kref_init(&np->kref); 291 } 292 while (1) { 293 u32 sz, noff; 294 char *pname; 295 296 tag = *((u32 *)(*p)); 297 if (tag == OF_DT_NOP) { 298 *p += 4; 299 continue; 300 } 301 if (tag != OF_DT_PROP) 302 break; 303 *p += 4; 304 sz = *((u32 *)(*p)); 305 noff = *((u32 *)((*p) + 4)); 306 *p += 8; 307 if (initial_boot_params->version < 0x10) 308 *p = _ALIGN(*p, sz >= 8 ? 8 : 4); 309 310 pname = find_flat_dt_string(noff); 311 if (pname == NULL) { 312 printk(KERN_INFO 313 "Can't find property name in list !\n"); 314 break; 315 } 316 if (strcmp(pname, "name") == 0) 317 has_name = 1; 318 l = strlen(pname) + 1; 319 pp = unflatten_dt_alloc(&mem, sizeof(struct property), 320 __alignof__(struct property)); 321 if (allnextpp) { 322 if (strcmp(pname, "linux,phandle") == 0) { 323 np->node = *((u32 *)*p); 324 if (np->linux_phandle == 0) 325 np->linux_phandle = np->node; 326 } 327 if (strcmp(pname, "ibm,phandle") == 0) 328 np->linux_phandle = *((u32 *)*p); 329 pp->name = pname; 330 pp->length = sz; 331 pp->value = (void *)*p; 332 *prev_pp = pp; 333 prev_pp = &pp->next; 334 } 335 *p = _ALIGN((*p) + sz, 4); 336 } 337 /* with version 0x10 we may not have the name property, recreate 338 * it here from the unit name if absent 339 */ 340 if (!has_name) { 341 char *p1 = pathp, *ps = pathp, *pa = NULL; 342 int sz; 343 344 while (*p1) { 345 if ((*p1) == '@') 346 pa = p1; 347 if ((*p1) == '/') 348 ps = p1 + 1; 349 p1++; 350 } 351 if (pa < ps) 352 pa = p1; 353 sz = (pa - ps) + 1; 354 pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz, 355 __alignof__(struct property)); 356 if (allnextpp) { 357 pp->name = "name"; 358 pp->length = sz; 359 pp->value = pp + 1; 360 *prev_pp = pp; 361 prev_pp = &pp->next; 362 memcpy(pp->value, ps, sz - 1); 363 ((char *)pp->value)[sz - 1] = 0; 364 pr_debug("fixed up name for %s -> %s\n", pathp, 365 (char *)pp->value); 366 } 367 } 368 if (allnextpp) { 369 *prev_pp = NULL; 370 np->name = of_get_property(np, "name", NULL); 371 np->type = of_get_property(np, "device_type", NULL); 372 373 if (!np->name) 374 np->name = "<NULL>"; 375 if (!np->type) 376 np->type = "<NULL>"; 377 } 378 while (tag == OF_DT_BEGIN_NODE) { 379 mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); 380 tag = *((u32 *)(*p)); 381 } 382 if (tag != OF_DT_END_NODE) { 383 printk(KERN_INFO "Weird tag at end of node: %x\n", tag); 384 return mem; 385 } 386 *p += 4; 387 return mem; 388 } 389 390 /** 391 * unflattens the device-tree passed by the firmware, creating the 392 * tree of struct device_node. It also fills the "name" and "type" 393 * pointers of the nodes so the normal device-tree walking functions 394 * can be used (this used to be done by finish_device_tree) 395 */ 396 void __init unflatten_device_tree(void) 397 { 398 unsigned long start, mem, size; 399 struct device_node **allnextp = &allnodes; 400 401 pr_debug(" -> unflatten_device_tree()\n"); 402 403 /* First pass, scan for size */ 404 start = ((unsigned long)initial_boot_params) + 405 initial_boot_params->off_dt_struct; 406 size = unflatten_dt_node(0, &start, NULL, NULL, 0); 407 size = (size | 3) + 1; 408 409 pr_debug(" size is %lx, allocating...\n", size); 410 411 /* Allocate memory for the expanded device tree */ 412 mem = lmb_alloc(size + 4, __alignof__(struct device_node)); 413 mem = (unsigned long) __va(mem); 414 415 ((u32 *)mem)[size / 4] = 0xdeadbeef; 416 417 pr_debug(" unflattening %lx...\n", mem); 418 419 /* Second pass, do actual unflattening */ 420 start = ((unsigned long)initial_boot_params) + 421 initial_boot_params->off_dt_struct; 422 unflatten_dt_node(mem, &start, NULL, &allnextp, 0); 423 if (*((u32 *)start) != OF_DT_END) 424 printk(KERN_WARNING "Weird tag at end of tree: %08x\n", 425 *((u32 *)start)); 426 if (((u32 *)mem)[size / 4] != 0xdeadbeef) 427 printk(KERN_WARNING "End of tree marker overwritten: %08x\n", 428 ((u32 *)mem)[size / 4]); 429 *allnextp = NULL; 430 431 /* Get pointer to OF "/chosen" node for use everywhere */ 432 of_chosen = of_find_node_by_path("/chosen"); 433 if (of_chosen == NULL) 434 of_chosen = of_find_node_by_path("/chosen@0"); 435 436 pr_debug(" <- unflatten_device_tree()\n"); 437 } 438 439 #define early_init_dt_scan_drconf_memory(node) 0 440 441 static int __init early_init_dt_scan_cpus(unsigned long node, 442 const char *uname, int depth, 443 void *data) 444 { 445 static int logical_cpuid; 446 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 447 const u32 *intserv; 448 int i, nthreads; 449 int found = 0; 450 451 /* We are scanning "cpu" nodes only */ 452 if (type == NULL || strcmp(type, "cpu") != 0) 453 return 0; 454 455 /* Get physical cpuid */ 456 intserv = of_get_flat_dt_prop(node, "reg", NULL); 457 nthreads = 1; 458 459 /* 460 * Now see if any of these threads match our boot cpu. 461 * NOTE: This must match the parsing done in smp_setup_cpu_maps. 462 */ 463 for (i = 0; i < nthreads; i++) { 464 /* 465 * version 2 of the kexec param format adds the phys cpuid of 466 * booted proc. 467 */ 468 if (initial_boot_params && initial_boot_params->version >= 2) { 469 if (intserv[i] == 470 initial_boot_params->boot_cpuid_phys) { 471 found = 1; 472 break; 473 } 474 } else { 475 /* 476 * Check if it's the boot-cpu, set it's hw index now, 477 * unfortunately this format did not support booting 478 * off secondary threads. 479 */ 480 if (of_get_flat_dt_prop(node, 481 "linux,boot-cpu", NULL) != NULL) { 482 found = 1; 483 break; 484 } 485 } 486 487 #ifdef CONFIG_SMP 488 /* logical cpu id is always 0 on UP kernels */ 489 logical_cpuid++; 490 #endif 491 } 492 493 if (found) { 494 pr_debug("boot cpu: logical %d physical %d\n", logical_cpuid, 495 intserv[i]); 496 boot_cpuid = logical_cpuid; 497 } 498 499 return 0; 500 } 501 502 #ifdef CONFIG_BLK_DEV_INITRD 503 static void __init early_init_dt_check_for_initrd(unsigned long node) 504 { 505 unsigned long l; 506 u32 *prop; 507 508 pr_debug("Looking for initrd properties... "); 509 510 prop = of_get_flat_dt_prop(node, "linux,initrd-start", &l); 511 if (prop) { 512 initrd_start = (unsigned long)__va(of_read_ulong(prop, l/4)); 513 514 prop = of_get_flat_dt_prop(node, "linux,initrd-end", &l); 515 if (prop) { 516 initrd_end = (unsigned long) 517 __va(of_read_ulong(prop, l/4)); 518 initrd_below_start_ok = 1; 519 } else { 520 initrd_start = 0; 521 } 522 } 523 524 pr_debug("initrd_start=0x%lx initrd_end=0x%lx\n", 525 initrd_start, initrd_end); 526 } 527 #else 528 static inline void early_init_dt_check_for_initrd(unsigned long node) 529 { 530 } 531 #endif /* CONFIG_BLK_DEV_INITRD */ 532 533 static int __init early_init_dt_scan_chosen(unsigned long node, 534 const char *uname, int depth, void *data) 535 { 536 unsigned long l; 537 char *p; 538 539 pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 540 541 if (depth != 1 || 542 (strcmp(uname, "chosen") != 0 && 543 strcmp(uname, "chosen@0") != 0)) 544 return 0; 545 546 #ifdef CONFIG_KEXEC 547 lprop = (u64 *)of_get_flat_dt_prop(node, 548 "linux,crashkernel-base", NULL); 549 if (lprop) 550 crashk_res.start = *lprop; 551 552 lprop = (u64 *)of_get_flat_dt_prop(node, 553 "linux,crashkernel-size", NULL); 554 if (lprop) 555 crashk_res.end = crashk_res.start + *lprop - 1; 556 #endif 557 558 early_init_dt_check_for_initrd(node); 559 560 /* Retreive command line */ 561 p = of_get_flat_dt_prop(node, "bootargs", &l); 562 if (p != NULL && l > 0) 563 strlcpy(cmd_line, p, min((int)l, COMMAND_LINE_SIZE)); 564 565 #ifdef CONFIG_CMDLINE 566 if (p == NULL || l == 0 || (l == 1 && (*p) == 0)) 567 strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 568 #endif /* CONFIG_CMDLINE */ 569 570 pr_debug("Command line is: %s\n", cmd_line); 571 572 /* break now */ 573 return 1; 574 } 575 576 static int __init early_init_dt_scan_root(unsigned long node, 577 const char *uname, int depth, void *data) 578 { 579 u32 *prop; 580 581 if (depth != 0) 582 return 0; 583 584 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 585 dt_root_size_cells = (prop == NULL) ? 1 : *prop; 586 pr_debug("dt_root_size_cells = %x\n", dt_root_size_cells); 587 588 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 589 dt_root_addr_cells = (prop == NULL) ? 2 : *prop; 590 pr_debug("dt_root_addr_cells = %x\n", dt_root_addr_cells); 591 592 /* break now */ 593 return 1; 594 } 595 596 static u64 __init dt_mem_next_cell(int s, cell_t **cellp) 597 { 598 cell_t *p = *cellp; 599 600 *cellp = p + s; 601 return of_read_number(p, s); 602 } 603 604 static int __init early_init_dt_scan_memory(unsigned long node, 605 const char *uname, int depth, void *data) 606 { 607 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 608 cell_t *reg, *endp; 609 unsigned long l; 610 611 /* Look for the ibm,dynamic-reconfiguration-memory node */ 612 /* if (depth == 1 && 613 strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0) 614 return early_init_dt_scan_drconf_memory(node); 615 */ 616 /* We are scanning "memory" nodes only */ 617 if (type == NULL) { 618 /* 619 * The longtrail doesn't have a device_type on the 620 * /memory node, so look for the node called /memory@0. 621 */ 622 if (depth != 1 || strcmp(uname, "memory@0") != 0) 623 return 0; 624 } else if (strcmp(type, "memory") != 0) 625 return 0; 626 627 reg = (cell_t *)of_get_flat_dt_prop(node, "linux,usable-memory", &l); 628 if (reg == NULL) 629 reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l); 630 if (reg == NULL) 631 return 0; 632 633 endp = reg + (l / sizeof(cell_t)); 634 635 pr_debug("memory scan node %s, reg size %ld, data: %x %x %x %x,\n", 636 uname, l, reg[0], reg[1], reg[2], reg[3]); 637 638 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 639 u64 base, size; 640 641 base = dt_mem_next_cell(dt_root_addr_cells, ®); 642 size = dt_mem_next_cell(dt_root_size_cells, ®); 643 644 if (size == 0) 645 continue; 646 pr_debug(" - %llx , %llx\n", (unsigned long long)base, 647 (unsigned long long)size); 648 649 lmb_add(base, size); 650 } 651 return 0; 652 } 653 654 #ifdef CONFIG_PHYP_DUMP 655 /** 656 * phyp_dump_calculate_reserve_size() - reserve variable boot area 5% or arg 657 * 658 * Function to find the largest size we need to reserve 659 * during early boot process. 660 * 661 * It either looks for boot param and returns that OR 662 * returns larger of 256 or 5% rounded down to multiples of 256MB. 663 * 664 */ 665 static inline unsigned long phyp_dump_calculate_reserve_size(void) 666 { 667 unsigned long tmp; 668 669 if (phyp_dump_info->reserve_bootvar) 670 return phyp_dump_info->reserve_bootvar; 671 672 /* divide by 20 to get 5% of value */ 673 tmp = lmb_end_of_DRAM(); 674 do_div(tmp, 20); 675 676 /* round it down in multiples of 256 */ 677 tmp = tmp & ~0x0FFFFFFFUL; 678 679 return (tmp > PHYP_DUMP_RMR_END ? tmp : PHYP_DUMP_RMR_END); 680 } 681 682 /** 683 * phyp_dump_reserve_mem() - reserve all not-yet-dumped mmemory 684 * 685 * This routine may reserve memory regions in the kernel only 686 * if the system is supported and a dump was taken in last 687 * boot instance or if the hardware is supported and the 688 * scratch area needs to be setup. In other instances it returns 689 * without reserving anything. The memory in case of dump being 690 * active is freed when the dump is collected (by userland tools). 691 */ 692 static void __init phyp_dump_reserve_mem(void) 693 { 694 unsigned long base, size; 695 unsigned long variable_reserve_size; 696 697 if (!phyp_dump_info->phyp_dump_configured) { 698 printk(KERN_ERR "Phyp-dump not supported on this hardware\n"); 699 return; 700 } 701 702 if (!phyp_dump_info->phyp_dump_at_boot) { 703 printk(KERN_INFO "Phyp-dump disabled at boot time\n"); 704 return; 705 } 706 707 variable_reserve_size = phyp_dump_calculate_reserve_size(); 708 709 if (phyp_dump_info->phyp_dump_is_active) { 710 /* Reserve *everything* above RMR.Area freed by userland tools*/ 711 base = variable_reserve_size; 712 size = lmb_end_of_DRAM() - base; 713 714 /* XXX crashed_ram_end is wrong, since it may be beyond 715 * the memory_limit, it will need to be adjusted. */ 716 lmb_reserve(base, size); 717 718 phyp_dump_info->init_reserve_start = base; 719 phyp_dump_info->init_reserve_size = size; 720 } else { 721 size = phyp_dump_info->cpu_state_size + 722 phyp_dump_info->hpte_region_size + 723 variable_reserve_size; 724 base = lmb_end_of_DRAM() - size; 725 lmb_reserve(base, size); 726 phyp_dump_info->init_reserve_start = base; 727 phyp_dump_info->init_reserve_size = size; 728 } 729 } 730 #else 731 static inline void __init phyp_dump_reserve_mem(void) {} 732 #endif /* CONFIG_PHYP_DUMP && CONFIG_PPC_RTAS */ 733 734 #ifdef CONFIG_EARLY_PRINTK 735 /* MS this is Microblaze specifig function */ 736 static int __init early_init_dt_scan_serial(unsigned long node, 737 const char *uname, int depth, void *data) 738 { 739 unsigned long l; 740 char *p; 741 int *addr; 742 743 pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 744 745 /* find all serial nodes */ 746 if (strncmp(uname, "serial", 6) != 0) 747 return 0; 748 749 early_init_dt_check_for_initrd(node); 750 751 /* find compatible node with uartlite */ 752 p = of_get_flat_dt_prop(node, "compatible", &l); 753 if ((strncmp(p, "xlnx,xps-uartlite", 17) != 0) && 754 (strncmp(p, "xlnx,opb-uartlite", 17) != 0)) 755 return 0; 756 757 addr = of_get_flat_dt_prop(node, "reg", &l); 758 return *addr; /* return address */ 759 } 760 761 /* this function is looking for early uartlite console - Microblaze specific */ 762 int __init early_uartlite_console(void) 763 { 764 return of_scan_flat_dt(early_init_dt_scan_serial, NULL); 765 } 766 #endif 767 768 void __init early_init_devtree(void *params) 769 { 770 pr_debug(" -> early_init_devtree(%p)\n", params); 771 772 /* Setup flat device-tree pointer */ 773 initial_boot_params = params; 774 775 #ifdef CONFIG_PHYP_DUMP 776 /* scan tree to see if dump occured during last boot */ 777 of_scan_flat_dt(early_init_dt_scan_phyp_dump, NULL); 778 #endif 779 780 /* Retrieve various informations from the /chosen node of the 781 * device-tree, including the platform type, initrd location and 782 * size, TCE reserve, and more ... 783 */ 784 of_scan_flat_dt(early_init_dt_scan_chosen, NULL); 785 786 /* Scan memory nodes and rebuild LMBs */ 787 lmb_init(); 788 of_scan_flat_dt(early_init_dt_scan_root, NULL); 789 of_scan_flat_dt(early_init_dt_scan_memory, NULL); 790 791 /* Save command line for /proc/cmdline and then parse parameters */ 792 strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE); 793 parse_early_param(); 794 795 lmb_analyze(); 796 797 pr_debug("Phys. mem: %lx\n", (unsigned long) lmb_phys_mem_size()); 798 799 pr_debug("Scanning CPUs ...\n"); 800 801 /* Retreive CPU related informations from the flat tree 802 * (altivec support, boot CPU ID, ...) 803 */ 804 of_scan_flat_dt(early_init_dt_scan_cpus, NULL); 805 806 pr_debug(" <- early_init_devtree()\n"); 807 } 808 809 /** 810 * Indicates whether the root node has a given value in its 811 * compatible property. 812 */ 813 int machine_is_compatible(const char *compat) 814 { 815 struct device_node *root; 816 int rc = 0; 817 818 root = of_find_node_by_path("/"); 819 if (root) { 820 rc = of_device_is_compatible(root, compat); 821 of_node_put(root); 822 } 823 return rc; 824 } 825 EXPORT_SYMBOL(machine_is_compatible); 826 827 /******* 828 * 829 * New implementation of the OF "find" APIs, return a refcounted 830 * object, call of_node_put() when done. The device tree and list 831 * are protected by a rw_lock. 832 * 833 * Note that property management will need some locking as well, 834 * this isn't dealt with yet. 835 * 836 *******/ 837 838 /** 839 * of_find_node_by_phandle - Find a node given a phandle 840 * @handle: phandle of the node to find 841 * 842 * Returns a node pointer with refcount incremented, use 843 * of_node_put() on it when done. 844 */ 845 struct device_node *of_find_node_by_phandle(phandle handle) 846 { 847 struct device_node *np; 848 849 read_lock(&devtree_lock); 850 for (np = allnodes; np != NULL; np = np->allnext) 851 if (np->linux_phandle == handle) 852 break; 853 of_node_get(np); 854 read_unlock(&devtree_lock); 855 return np; 856 } 857 EXPORT_SYMBOL(of_find_node_by_phandle); 858 859 /** 860 * of_find_all_nodes - Get next node in global list 861 * @prev: Previous node or NULL to start iteration 862 * of_node_put() will be called on it 863 * 864 * Returns a node pointer with refcount incremented, use 865 * of_node_put() on it when done. 866 */ 867 struct device_node *of_find_all_nodes(struct device_node *prev) 868 { 869 struct device_node *np; 870 871 read_lock(&devtree_lock); 872 np = prev ? prev->allnext : allnodes; 873 for (; np != NULL; np = np->allnext) 874 if (of_node_get(np)) 875 break; 876 of_node_put(prev); 877 read_unlock(&devtree_lock); 878 return np; 879 } 880 EXPORT_SYMBOL(of_find_all_nodes); 881 882 /** 883 * of_node_get - Increment refcount of a node 884 * @node: Node to inc refcount, NULL is supported to 885 * simplify writing of callers 886 * 887 * Returns node. 888 */ 889 struct device_node *of_node_get(struct device_node *node) 890 { 891 if (node) 892 kref_get(&node->kref); 893 return node; 894 } 895 EXPORT_SYMBOL(of_node_get); 896 897 static inline struct device_node *kref_to_device_node(struct kref *kref) 898 { 899 return container_of(kref, struct device_node, kref); 900 } 901 902 /** 903 * of_node_release - release a dynamically allocated node 904 * @kref: kref element of the node to be released 905 * 906 * In of_node_put() this function is passed to kref_put() 907 * as the destructor. 908 */ 909 static void of_node_release(struct kref *kref) 910 { 911 struct device_node *node = kref_to_device_node(kref); 912 struct property *prop = node->properties; 913 914 /* We should never be releasing nodes that haven't been detached. */ 915 if (!of_node_check_flag(node, OF_DETACHED)) { 916 printk(KERN_INFO "WARNING: Bad of_node_put() on %s\n", 917 node->full_name); 918 dump_stack(); 919 kref_init(&node->kref); 920 return; 921 } 922 923 if (!of_node_check_flag(node, OF_DYNAMIC)) 924 return; 925 926 while (prop) { 927 struct property *next = prop->next; 928 kfree(prop->name); 929 kfree(prop->value); 930 kfree(prop); 931 prop = next; 932 933 if (!prop) { 934 prop = node->deadprops; 935 node->deadprops = NULL; 936 } 937 } 938 kfree(node->full_name); 939 kfree(node->data); 940 kfree(node); 941 } 942 943 /** 944 * of_node_put - Decrement refcount of a node 945 * @node: Node to dec refcount, NULL is supported to 946 * simplify writing of callers 947 * 948 */ 949 void of_node_put(struct device_node *node) 950 { 951 if (node) 952 kref_put(&node->kref, of_node_release); 953 } 954 EXPORT_SYMBOL(of_node_put); 955 956 /* 957 * Plug a device node into the tree and global list. 958 */ 959 void of_attach_node(struct device_node *np) 960 { 961 unsigned long flags; 962 963 write_lock_irqsave(&devtree_lock, flags); 964 np->sibling = np->parent->child; 965 np->allnext = allnodes; 966 np->parent->child = np; 967 allnodes = np; 968 write_unlock_irqrestore(&devtree_lock, flags); 969 } 970 971 /* 972 * "Unplug" a node from the device tree. The caller must hold 973 * a reference to the node. The memory associated with the node 974 * is not freed until its refcount goes to zero. 975 */ 976 void of_detach_node(struct device_node *np) 977 { 978 struct device_node *parent; 979 unsigned long flags; 980 981 write_lock_irqsave(&devtree_lock, flags); 982 983 parent = np->parent; 984 if (!parent) 985 goto out_unlock; 986 987 if (allnodes == np) 988 allnodes = np->allnext; 989 else { 990 struct device_node *prev; 991 for (prev = allnodes; 992 prev->allnext != np; 993 prev = prev->allnext) 994 ; 995 prev->allnext = np->allnext; 996 } 997 998 if (parent->child == np) 999 parent->child = np->sibling; 1000 else { 1001 struct device_node *prevsib; 1002 for (prevsib = np->parent->child; 1003 prevsib->sibling != np; 1004 prevsib = prevsib->sibling) 1005 ; 1006 prevsib->sibling = np->sibling; 1007 } 1008 1009 of_node_set_flag(np, OF_DETACHED); 1010 1011 out_unlock: 1012 write_unlock_irqrestore(&devtree_lock, flags); 1013 } 1014 1015 /* 1016 * Add a property to a node 1017 */ 1018 int prom_add_property(struct device_node *np, struct property *prop) 1019 { 1020 struct property **next; 1021 unsigned long flags; 1022 1023 prop->next = NULL; 1024 write_lock_irqsave(&devtree_lock, flags); 1025 next = &np->properties; 1026 while (*next) { 1027 if (strcmp(prop->name, (*next)->name) == 0) { 1028 /* duplicate ! don't insert it */ 1029 write_unlock_irqrestore(&devtree_lock, flags); 1030 return -1; 1031 } 1032 next = &(*next)->next; 1033 } 1034 *next = prop; 1035 write_unlock_irqrestore(&devtree_lock, flags); 1036 1037 #ifdef CONFIG_PROC_DEVICETREE 1038 /* try to add to proc as well if it was initialized */ 1039 if (np->pde) 1040 proc_device_tree_add_prop(np->pde, prop); 1041 #endif /* CONFIG_PROC_DEVICETREE */ 1042 1043 return 0; 1044 } 1045 1046 /* 1047 * Remove a property from a node. Note that we don't actually 1048 * remove it, since we have given out who-knows-how-many pointers 1049 * to the data using get-property. Instead we just move the property 1050 * to the "dead properties" list, so it won't be found any more. 1051 */ 1052 int prom_remove_property(struct device_node *np, struct property *prop) 1053 { 1054 struct property **next; 1055 unsigned long flags; 1056 int found = 0; 1057 1058 write_lock_irqsave(&devtree_lock, flags); 1059 next = &np->properties; 1060 while (*next) { 1061 if (*next == prop) { 1062 /* found the node */ 1063 *next = prop->next; 1064 prop->next = np->deadprops; 1065 np->deadprops = prop; 1066 found = 1; 1067 break; 1068 } 1069 next = &(*next)->next; 1070 } 1071 write_unlock_irqrestore(&devtree_lock, flags); 1072 1073 if (!found) 1074 return -ENODEV; 1075 1076 #ifdef CONFIG_PROC_DEVICETREE 1077 /* try to remove the proc node as well */ 1078 if (np->pde) 1079 proc_device_tree_remove_prop(np->pde, prop); 1080 #endif /* CONFIG_PROC_DEVICETREE */ 1081 1082 return 0; 1083 } 1084 1085 /* 1086 * Update a property in a node. Note that we don't actually 1087 * remove it, since we have given out who-knows-how-many pointers 1088 * to the data using get-property. Instead we just move the property 1089 * to the "dead properties" list, and add the new property to the 1090 * property list 1091 */ 1092 int prom_update_property(struct device_node *np, 1093 struct property *newprop, 1094 struct property *oldprop) 1095 { 1096 struct property **next; 1097 unsigned long flags; 1098 int found = 0; 1099 1100 write_lock_irqsave(&devtree_lock, flags); 1101 next = &np->properties; 1102 while (*next) { 1103 if (*next == oldprop) { 1104 /* found the node */ 1105 newprop->next = oldprop->next; 1106 *next = newprop; 1107 oldprop->next = np->deadprops; 1108 np->deadprops = oldprop; 1109 found = 1; 1110 break; 1111 } 1112 next = &(*next)->next; 1113 } 1114 write_unlock_irqrestore(&devtree_lock, flags); 1115 1116 if (!found) 1117 return -ENODEV; 1118 1119 #ifdef CONFIG_PROC_DEVICETREE 1120 /* try to add to proc as well if it was initialized */ 1121 if (np->pde) 1122 proc_device_tree_update_prop(np->pde, newprop, oldprop); 1123 #endif /* CONFIG_PROC_DEVICETREE */ 1124 1125 return 0; 1126 } 1127 1128 #if defined(CONFIG_DEBUG_FS) && defined(DEBUG) 1129 static struct debugfs_blob_wrapper flat_dt_blob; 1130 1131 static int __init export_flat_device_tree(void) 1132 { 1133 struct dentry *d; 1134 1135 flat_dt_blob.data = initial_boot_params; 1136 flat_dt_blob.size = initial_boot_params->totalsize; 1137 1138 d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, 1139 of_debugfs_root, &flat_dt_blob); 1140 if (!d) 1141 return 1; 1142 1143 return 0; 1144 } 1145 device_initcall(export_flat_device_tree); 1146 #endif 1147