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 #undef DEBUG 17 18 #include <stdarg.h> 19 #include <linux/kernel.h> 20 #include <linux/string.h> 21 #include <linux/init.h> 22 #include <linux/threads.h> 23 #include <linux/spinlock.h> 24 #include <linux/types.h> 25 #include <linux/pci.h> 26 #include <linux/stringify.h> 27 #include <linux/delay.h> 28 #include <linux/initrd.h> 29 #include <linux/bitops.h> 30 #include <linux/module.h> 31 #include <linux/kexec.h> 32 #include <linux/debugfs.h> 33 #include <linux/irq.h> 34 35 #include <asm/prom.h> 36 #include <asm/rtas.h> 37 #include <asm/lmb.h> 38 #include <asm/page.h> 39 #include <asm/processor.h> 40 #include <asm/irq.h> 41 #include <asm/io.h> 42 #include <asm/kdump.h> 43 #include <asm/smp.h> 44 #include <asm/system.h> 45 #include <asm/mmu.h> 46 #include <asm/pgtable.h> 47 #include <asm/pci.h> 48 #include <asm/iommu.h> 49 #include <asm/btext.h> 50 #include <asm/sections.h> 51 #include <asm/machdep.h> 52 #include <asm/pSeries_reconfig.h> 53 #include <asm/pci-bridge.h> 54 #include <asm/kexec.h> 55 56 #ifdef DEBUG 57 #define DBG(fmt...) printk(KERN_ERR fmt) 58 #else 59 #define DBG(fmt...) 60 #endif 61 62 63 static int __initdata dt_root_addr_cells; 64 static int __initdata dt_root_size_cells; 65 66 #ifdef CONFIG_PPC64 67 int __initdata iommu_is_off; 68 int __initdata iommu_force_on; 69 unsigned long tce_alloc_start, tce_alloc_end; 70 #endif 71 72 typedef u32 cell_t; 73 74 #if 0 75 static struct boot_param_header *initial_boot_params __initdata; 76 #else 77 struct boot_param_header *initial_boot_params; 78 #endif 79 80 static struct device_node *allnodes = NULL; 81 82 /* use when traversing tree through the allnext, child, sibling, 83 * or parent members of struct device_node. 84 */ 85 static DEFINE_RWLOCK(devtree_lock); 86 87 /* export that to outside world */ 88 struct device_node *of_chosen; 89 90 static inline char *find_flat_dt_string(u32 offset) 91 { 92 return ((char *)initial_boot_params) + 93 initial_boot_params->off_dt_strings + offset; 94 } 95 96 /** 97 * This function is used to scan the flattened device-tree, it is 98 * used to extract the memory informations at boot before we can 99 * unflatten the tree 100 */ 101 int __init of_scan_flat_dt(int (*it)(unsigned long node, 102 const char *uname, int depth, 103 void *data), 104 void *data) 105 { 106 unsigned long p = ((unsigned long)initial_boot_params) + 107 initial_boot_params->off_dt_struct; 108 int rc = 0; 109 int depth = -1; 110 111 do { 112 u32 tag = *((u32 *)p); 113 char *pathp; 114 115 p += 4; 116 if (tag == OF_DT_END_NODE) { 117 depth --; 118 continue; 119 } 120 if (tag == OF_DT_NOP) 121 continue; 122 if (tag == OF_DT_END) 123 break; 124 if (tag == OF_DT_PROP) { 125 u32 sz = *((u32 *)p); 126 p += 8; 127 if (initial_boot_params->version < 0x10) 128 p = _ALIGN(p, sz >= 8 ? 8 : 4); 129 p += sz; 130 p = _ALIGN(p, 4); 131 continue; 132 } 133 if (tag != OF_DT_BEGIN_NODE) { 134 printk(KERN_WARNING "Invalid tag %x scanning flattened" 135 " device tree !\n", tag); 136 return -EINVAL; 137 } 138 depth++; 139 pathp = (char *)p; 140 p = _ALIGN(p + strlen(pathp) + 1, 4); 141 if ((*pathp) == '/') { 142 char *lp, *np; 143 for (lp = NULL, np = pathp; *np; np++) 144 if ((*np) == '/') 145 lp = np+1; 146 if (lp != NULL) 147 pathp = lp; 148 } 149 rc = it(p, pathp, depth, data); 150 if (rc != 0) 151 break; 152 } while(1); 153 154 return rc; 155 } 156 157 unsigned long __init of_get_flat_dt_root(void) 158 { 159 unsigned long p = ((unsigned long)initial_boot_params) + 160 initial_boot_params->off_dt_struct; 161 162 while(*((u32 *)p) == OF_DT_NOP) 163 p += 4; 164 BUG_ON (*((u32 *)p) != OF_DT_BEGIN_NODE); 165 p += 4; 166 return _ALIGN(p + strlen((char *)p) + 1, 4); 167 } 168 169 /** 170 * This function can be used within scan_flattened_dt callback to get 171 * access to properties 172 */ 173 void* __init of_get_flat_dt_prop(unsigned long node, const char *name, 174 unsigned long *size) 175 { 176 unsigned long p = node; 177 178 do { 179 u32 tag = *((u32 *)p); 180 u32 sz, noff; 181 const char *nstr; 182 183 p += 4; 184 if (tag == OF_DT_NOP) 185 continue; 186 if (tag != OF_DT_PROP) 187 return NULL; 188 189 sz = *((u32 *)p); 190 noff = *((u32 *)(p + 4)); 191 p += 8; 192 if (initial_boot_params->version < 0x10) 193 p = _ALIGN(p, sz >= 8 ? 8 : 4); 194 195 nstr = find_flat_dt_string(noff); 196 if (nstr == NULL) { 197 printk(KERN_WARNING "Can't find property index" 198 " name !\n"); 199 return NULL; 200 } 201 if (strcmp(name, nstr) == 0) { 202 if (size) 203 *size = sz; 204 return (void *)p; 205 } 206 p += sz; 207 p = _ALIGN(p, 4); 208 } while(1); 209 } 210 211 int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) 212 { 213 const char* cp; 214 unsigned long cplen, l; 215 216 cp = of_get_flat_dt_prop(node, "compatible", &cplen); 217 if (cp == NULL) 218 return 0; 219 while (cplen > 0) { 220 if (strncasecmp(cp, compat, strlen(compat)) == 0) 221 return 1; 222 l = strlen(cp) + 1; 223 cp += l; 224 cplen -= l; 225 } 226 227 return 0; 228 } 229 230 static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, 231 unsigned long align) 232 { 233 void *res; 234 235 *mem = _ALIGN(*mem, align); 236 res = (void *)*mem; 237 *mem += size; 238 239 return res; 240 } 241 242 static unsigned long __init unflatten_dt_node(unsigned long mem, 243 unsigned long *p, 244 struct device_node *dad, 245 struct device_node ***allnextpp, 246 unsigned long fpsize) 247 { 248 struct device_node *np; 249 struct property *pp, **prev_pp = NULL; 250 char *pathp; 251 u32 tag; 252 unsigned int l, allocl; 253 int has_name = 0; 254 int new_format = 0; 255 256 tag = *((u32 *)(*p)); 257 if (tag != OF_DT_BEGIN_NODE) { 258 printk("Weird tag at start of node: %x\n", tag); 259 return mem; 260 } 261 *p += 4; 262 pathp = (char *)*p; 263 l = allocl = strlen(pathp) + 1; 264 *p = _ALIGN(*p + l, 4); 265 266 /* version 0x10 has a more compact unit name here instead of the full 267 * path. we accumulate the full path size using "fpsize", we'll rebuild 268 * it later. We detect this because the first character of the name is 269 * not '/'. 270 */ 271 if ((*pathp) != '/') { 272 new_format = 1; 273 if (fpsize == 0) { 274 /* root node: special case. fpsize accounts for path 275 * plus terminating zero. root node only has '/', so 276 * fpsize should be 2, but we want to avoid the first 277 * level nodes to have two '/' so we use fpsize 1 here 278 */ 279 fpsize = 1; 280 allocl = 2; 281 } else { 282 /* account for '/' and path size minus terminal 0 283 * already in 'l' 284 */ 285 fpsize += l; 286 allocl = fpsize; 287 } 288 } 289 290 291 np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl, 292 __alignof__(struct device_node)); 293 if (allnextpp) { 294 memset(np, 0, sizeof(*np)); 295 np->full_name = ((char*)np) + sizeof(struct device_node); 296 if (new_format) { 297 char *p = np->full_name; 298 /* rebuild full path for new format */ 299 if (dad && dad->parent) { 300 strcpy(p, dad->full_name); 301 #ifdef DEBUG 302 if ((strlen(p) + l + 1) != allocl) { 303 DBG("%s: p: %d, l: %d, a: %d\n", 304 pathp, (int)strlen(p), l, allocl); 305 } 306 #endif 307 p += strlen(p); 308 } 309 *(p++) = '/'; 310 memcpy(p, pathp, l); 311 } else 312 memcpy(np->full_name, pathp, l); 313 prev_pp = &np->properties; 314 **allnextpp = np; 315 *allnextpp = &np->allnext; 316 if (dad != NULL) { 317 np->parent = dad; 318 /* we temporarily use the next field as `last_child'*/ 319 if (dad->next == 0) 320 dad->child = np; 321 else 322 dad->next->sibling = np; 323 dad->next = np; 324 } 325 kref_init(&np->kref); 326 } 327 while(1) { 328 u32 sz, noff; 329 char *pname; 330 331 tag = *((u32 *)(*p)); 332 if (tag == OF_DT_NOP) { 333 *p += 4; 334 continue; 335 } 336 if (tag != OF_DT_PROP) 337 break; 338 *p += 4; 339 sz = *((u32 *)(*p)); 340 noff = *((u32 *)((*p) + 4)); 341 *p += 8; 342 if (initial_boot_params->version < 0x10) 343 *p = _ALIGN(*p, sz >= 8 ? 8 : 4); 344 345 pname = find_flat_dt_string(noff); 346 if (pname == NULL) { 347 printk("Can't find property name in list !\n"); 348 break; 349 } 350 if (strcmp(pname, "name") == 0) 351 has_name = 1; 352 l = strlen(pname) + 1; 353 pp = unflatten_dt_alloc(&mem, sizeof(struct property), 354 __alignof__(struct property)); 355 if (allnextpp) { 356 if (strcmp(pname, "linux,phandle") == 0) { 357 np->node = *((u32 *)*p); 358 if (np->linux_phandle == 0) 359 np->linux_phandle = np->node; 360 } 361 if (strcmp(pname, "ibm,phandle") == 0) 362 np->linux_phandle = *((u32 *)*p); 363 pp->name = pname; 364 pp->length = sz; 365 pp->value = (void *)*p; 366 *prev_pp = pp; 367 prev_pp = &pp->next; 368 } 369 *p = _ALIGN((*p) + sz, 4); 370 } 371 /* with version 0x10 we may not have the name property, recreate 372 * it here from the unit name if absent 373 */ 374 if (!has_name) { 375 char *p = pathp, *ps = pathp, *pa = NULL; 376 int sz; 377 378 while (*p) { 379 if ((*p) == '@') 380 pa = p; 381 if ((*p) == '/') 382 ps = p + 1; 383 p++; 384 } 385 if (pa < ps) 386 pa = p; 387 sz = (pa - ps) + 1; 388 pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz, 389 __alignof__(struct property)); 390 if (allnextpp) { 391 pp->name = "name"; 392 pp->length = sz; 393 pp->value = (unsigned char *)(pp + 1); 394 *prev_pp = pp; 395 prev_pp = &pp->next; 396 memcpy(pp->value, ps, sz - 1); 397 ((char *)pp->value)[sz - 1] = 0; 398 DBG("fixed up name for %s -> %s\n", pathp, pp->value); 399 } 400 } 401 if (allnextpp) { 402 *prev_pp = NULL; 403 np->name = get_property(np, "name", NULL); 404 np->type = get_property(np, "device_type", NULL); 405 406 if (!np->name) 407 np->name = "<NULL>"; 408 if (!np->type) 409 np->type = "<NULL>"; 410 } 411 while (tag == OF_DT_BEGIN_NODE) { 412 mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); 413 tag = *((u32 *)(*p)); 414 } 415 if (tag != OF_DT_END_NODE) { 416 printk("Weird tag at end of node: %x\n", tag); 417 return mem; 418 } 419 *p += 4; 420 return mem; 421 } 422 423 static int __init early_parse_mem(char *p) 424 { 425 if (!p) 426 return 1; 427 428 memory_limit = PAGE_ALIGN(memparse(p, &p)); 429 DBG("memory limit = 0x%lx\n", memory_limit); 430 431 return 0; 432 } 433 early_param("mem", early_parse_mem); 434 435 /* 436 * The device tree may be allocated below our memory limit, or inside the 437 * crash kernel region for kdump. If so, move it out now. 438 */ 439 static void move_device_tree(void) 440 { 441 unsigned long start, size; 442 void *p; 443 444 DBG("-> move_device_tree\n"); 445 446 start = __pa(initial_boot_params); 447 size = initial_boot_params->totalsize; 448 449 if ((memory_limit && (start + size) > memory_limit) || 450 overlaps_crashkernel(start, size)) { 451 p = __va(lmb_alloc_base(size, PAGE_SIZE, lmb.rmo_size)); 452 memcpy(p, initial_boot_params, size); 453 initial_boot_params = (struct boot_param_header *)p; 454 DBG("Moved device tree to 0x%p\n", p); 455 } 456 457 DBG("<- move_device_tree\n"); 458 } 459 460 /** 461 * unflattens the device-tree passed by the firmware, creating the 462 * tree of struct device_node. It also fills the "name" and "type" 463 * pointers of the nodes so the normal device-tree walking functions 464 * can be used (this used to be done by finish_device_tree) 465 */ 466 void __init unflatten_device_tree(void) 467 { 468 unsigned long start, mem, size; 469 struct device_node **allnextp = &allnodes; 470 471 DBG(" -> unflatten_device_tree()\n"); 472 473 /* First pass, scan for size */ 474 start = ((unsigned long)initial_boot_params) + 475 initial_boot_params->off_dt_struct; 476 size = unflatten_dt_node(0, &start, NULL, NULL, 0); 477 size = (size | 3) + 1; 478 479 DBG(" size is %lx, allocating...\n", size); 480 481 /* Allocate memory for the expanded device tree */ 482 mem = lmb_alloc(size + 4, __alignof__(struct device_node)); 483 mem = (unsigned long) __va(mem); 484 485 ((u32 *)mem)[size / 4] = 0xdeadbeef; 486 487 DBG(" unflattening %lx...\n", mem); 488 489 /* Second pass, do actual unflattening */ 490 start = ((unsigned long)initial_boot_params) + 491 initial_boot_params->off_dt_struct; 492 unflatten_dt_node(mem, &start, NULL, &allnextp, 0); 493 if (*((u32 *)start) != OF_DT_END) 494 printk(KERN_WARNING "Weird tag at end of tree: %08x\n", *((u32 *)start)); 495 if (((u32 *)mem)[size / 4] != 0xdeadbeef) 496 printk(KERN_WARNING "End of tree marker overwritten: %08x\n", 497 ((u32 *)mem)[size / 4] ); 498 *allnextp = NULL; 499 500 /* Get pointer to OF "/chosen" node for use everywhere */ 501 of_chosen = of_find_node_by_path("/chosen"); 502 if (of_chosen == NULL) 503 of_chosen = of_find_node_by_path("/chosen@0"); 504 505 DBG(" <- unflatten_device_tree()\n"); 506 } 507 508 /* 509 * ibm,pa-features is a per-cpu property that contains a string of 510 * attribute descriptors, each of which has a 2 byte header plus up 511 * to 254 bytes worth of processor attribute bits. First header 512 * byte specifies the number of bytes following the header. 513 * Second header byte is an "attribute-specifier" type, of which 514 * zero is the only currently-defined value. 515 * Implementation: Pass in the byte and bit offset for the feature 516 * that we are interested in. The function will return -1 if the 517 * pa-features property is missing, or a 1/0 to indicate if the feature 518 * is supported/not supported. Note that the bit numbers are 519 * big-endian to match the definition in PAPR. 520 */ 521 static struct ibm_pa_feature { 522 unsigned long cpu_features; /* CPU_FTR_xxx bit */ 523 unsigned int cpu_user_ftrs; /* PPC_FEATURE_xxx bit */ 524 unsigned char pabyte; /* byte number in ibm,pa-features */ 525 unsigned char pabit; /* bit number (big-endian) */ 526 unsigned char invert; /* if 1, pa bit set => clear feature */ 527 } ibm_pa_features[] __initdata = { 528 {0, PPC_FEATURE_HAS_MMU, 0, 0, 0}, 529 {0, PPC_FEATURE_HAS_FPU, 0, 1, 0}, 530 {CPU_FTR_SLB, 0, 0, 2, 0}, 531 {CPU_FTR_CTRL, 0, 0, 3, 0}, 532 {CPU_FTR_NOEXECUTE, 0, 0, 6, 0}, 533 {CPU_FTR_NODSISRALIGN, 0, 1, 1, 1}, 534 #if 0 535 /* put this back once we know how to test if firmware does 64k IO */ 536 {CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0}, 537 #endif 538 {CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0}, 539 }; 540 541 static void __init scan_features(unsigned long node, unsigned char *ftrs, 542 unsigned long tablelen, 543 struct ibm_pa_feature *fp, 544 unsigned long ft_size) 545 { 546 unsigned long i, len, bit; 547 548 /* find descriptor with type == 0 */ 549 for (;;) { 550 if (tablelen < 3) 551 return; 552 len = 2 + ftrs[0]; 553 if (tablelen < len) 554 return; /* descriptor 0 not found */ 555 if (ftrs[1] == 0) 556 break; 557 tablelen -= len; 558 ftrs += len; 559 } 560 561 /* loop over bits we know about */ 562 for (i = 0; i < ft_size; ++i, ++fp) { 563 if (fp->pabyte >= ftrs[0]) 564 continue; 565 bit = (ftrs[2 + fp->pabyte] >> (7 - fp->pabit)) & 1; 566 if (bit ^ fp->invert) { 567 cur_cpu_spec->cpu_features |= fp->cpu_features; 568 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs; 569 } else { 570 cur_cpu_spec->cpu_features &= ~fp->cpu_features; 571 cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs; 572 } 573 } 574 } 575 576 static void __init check_cpu_pa_features(unsigned long node) 577 { 578 unsigned char *pa_ftrs; 579 unsigned long tablelen; 580 581 pa_ftrs = of_get_flat_dt_prop(node, "ibm,pa-features", &tablelen); 582 if (pa_ftrs == NULL) 583 return; 584 585 scan_features(node, pa_ftrs, tablelen, 586 ibm_pa_features, ARRAY_SIZE(ibm_pa_features)); 587 } 588 589 static struct feature_property { 590 const char *name; 591 u32 min_value; 592 unsigned long cpu_feature; 593 unsigned long cpu_user_ftr; 594 } feature_properties[] __initdata = { 595 #ifdef CONFIG_ALTIVEC 596 {"altivec", 0, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC}, 597 {"ibm,vmx", 1, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC}, 598 #endif /* CONFIG_ALTIVEC */ 599 #ifdef CONFIG_PPC64 600 {"ibm,dfp", 1, 0, PPC_FEATURE_HAS_DFP}, 601 {"ibm,purr", 1, CPU_FTR_PURR, 0}, 602 {"ibm,spurr", 1, CPU_FTR_SPURR, 0}, 603 #endif /* CONFIG_PPC64 */ 604 }; 605 606 static void __init check_cpu_feature_properties(unsigned long node) 607 { 608 unsigned long i; 609 struct feature_property *fp = feature_properties; 610 const u32 *prop; 611 612 for (i = 0; i < ARRAY_SIZE(feature_properties); ++i, ++fp) { 613 prop = of_get_flat_dt_prop(node, fp->name, NULL); 614 if (prop && *prop >= fp->min_value) { 615 cur_cpu_spec->cpu_features |= fp->cpu_feature; 616 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftr; 617 } 618 } 619 } 620 621 static int __init early_init_dt_scan_cpus(unsigned long node, 622 const char *uname, int depth, 623 void *data) 624 { 625 static int logical_cpuid = 0; 626 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 627 const u32 *prop; 628 const u32 *intserv; 629 int i, nthreads; 630 unsigned long len; 631 int found = 0; 632 633 /* We are scanning "cpu" nodes only */ 634 if (type == NULL || strcmp(type, "cpu") != 0) 635 return 0; 636 637 /* Get physical cpuid */ 638 intserv = of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", &len); 639 if (intserv) { 640 nthreads = len / sizeof(int); 641 } else { 642 intserv = of_get_flat_dt_prop(node, "reg", NULL); 643 nthreads = 1; 644 } 645 646 /* 647 * Now see if any of these threads match our boot cpu. 648 * NOTE: This must match the parsing done in smp_setup_cpu_maps. 649 */ 650 for (i = 0; i < nthreads; i++) { 651 /* 652 * version 2 of the kexec param format adds the phys cpuid of 653 * booted proc. 654 */ 655 if (initial_boot_params && initial_boot_params->version >= 2) { 656 if (intserv[i] == 657 initial_boot_params->boot_cpuid_phys) { 658 found = 1; 659 break; 660 } 661 } else { 662 /* 663 * Check if it's the boot-cpu, set it's hw index now, 664 * unfortunately this format did not support booting 665 * off secondary threads. 666 */ 667 if (of_get_flat_dt_prop(node, 668 "linux,boot-cpu", NULL) != NULL) { 669 found = 1; 670 break; 671 } 672 } 673 674 #ifdef CONFIG_SMP 675 /* logical cpu id is always 0 on UP kernels */ 676 logical_cpuid++; 677 #endif 678 } 679 680 if (found) { 681 DBG("boot cpu: logical %d physical %d\n", logical_cpuid, 682 intserv[i]); 683 boot_cpuid = logical_cpuid; 684 set_hard_smp_processor_id(boot_cpuid, intserv[i]); 685 686 /* 687 * PAPR defines "logical" PVR values for cpus that 688 * meet various levels of the architecture: 689 * 0x0f000001 Architecture version 2.04 690 * 0x0f000002 Architecture version 2.05 691 * If the cpu-version property in the cpu node contains 692 * such a value, we call identify_cpu again with the 693 * logical PVR value in order to use the cpu feature 694 * bits appropriate for the architecture level. 695 * 696 * A POWER6 partition in "POWER6 architected" mode 697 * uses the 0x0f000002 PVR value; in POWER5+ mode 698 * it uses 0x0f000001. 699 */ 700 prop = of_get_flat_dt_prop(node, "cpu-version", NULL); 701 if (prop && (*prop & 0xff000000) == 0x0f000000) 702 identify_cpu(0, *prop); 703 } 704 705 check_cpu_feature_properties(node); 706 check_cpu_pa_features(node); 707 708 #ifdef CONFIG_PPC_PSERIES 709 if (nthreads > 1) 710 cur_cpu_spec->cpu_features |= CPU_FTR_SMT; 711 else 712 cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT; 713 #endif 714 715 return 0; 716 } 717 718 static int __init early_init_dt_scan_chosen(unsigned long node, 719 const char *uname, int depth, void *data) 720 { 721 unsigned long *lprop; 722 unsigned long l; 723 char *p; 724 725 DBG("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 726 727 if (depth != 1 || 728 (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) 729 return 0; 730 731 #ifdef CONFIG_PPC64 732 /* check if iommu is forced on or off */ 733 if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) 734 iommu_is_off = 1; 735 if (of_get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL) 736 iommu_force_on = 1; 737 #endif 738 739 /* mem=x on the command line is the preferred mechanism */ 740 lprop = of_get_flat_dt_prop(node, "linux,memory-limit", NULL); 741 if (lprop) 742 memory_limit = *lprop; 743 744 #ifdef CONFIG_PPC64 745 lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-start", NULL); 746 if (lprop) 747 tce_alloc_start = *lprop; 748 lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-end", NULL); 749 if (lprop) 750 tce_alloc_end = *lprop; 751 #endif 752 753 #ifdef CONFIG_KEXEC 754 lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL); 755 if (lprop) 756 crashk_res.start = *lprop; 757 758 lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL); 759 if (lprop) 760 crashk_res.end = crashk_res.start + *lprop - 1; 761 #endif 762 763 /* Retreive command line */ 764 p = of_get_flat_dt_prop(node, "bootargs", &l); 765 if (p != NULL && l > 0) 766 strlcpy(cmd_line, p, min((int)l, COMMAND_LINE_SIZE)); 767 768 #ifdef CONFIG_CMDLINE 769 if (p == NULL || l == 0 || (l == 1 && (*p) == 0)) 770 strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 771 #endif /* CONFIG_CMDLINE */ 772 773 DBG("Command line is: %s\n", cmd_line); 774 775 /* break now */ 776 return 1; 777 } 778 779 static int __init early_init_dt_scan_root(unsigned long node, 780 const char *uname, int depth, void *data) 781 { 782 u32 *prop; 783 784 if (depth != 0) 785 return 0; 786 787 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 788 dt_root_size_cells = (prop == NULL) ? 1 : *prop; 789 DBG("dt_root_size_cells = %x\n", dt_root_size_cells); 790 791 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 792 dt_root_addr_cells = (prop == NULL) ? 2 : *prop; 793 DBG("dt_root_addr_cells = %x\n", dt_root_addr_cells); 794 795 /* break now */ 796 return 1; 797 } 798 799 static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) 800 { 801 cell_t *p = *cellp; 802 803 *cellp = p + s; 804 return of_read_ulong(p, s); 805 } 806 807 #ifdef CONFIG_PPC_PSERIES 808 /* 809 * Interpret the ibm,dynamic-memory property in the 810 * /ibm,dynamic-reconfiguration-memory node. 811 * This contains a list of memory blocks along with NUMA affinity 812 * information. 813 */ 814 static int __init early_init_dt_scan_drconf_memory(unsigned long node) 815 { 816 cell_t *dm, *ls; 817 unsigned long l, n; 818 unsigned long base, size, lmb_size, flags; 819 820 ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l); 821 if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t)) 822 return 0; 823 lmb_size = dt_mem_next_cell(dt_root_size_cells, &ls); 824 825 dm = (cell_t *)of_get_flat_dt_prop(node, "ibm,dynamic-memory", &l); 826 if (dm == NULL || l < sizeof(cell_t)) 827 return 0; 828 829 n = *dm++; /* number of entries */ 830 if (l < (n * (dt_root_addr_cells + 4) + 1) * sizeof(cell_t)) 831 return 0; 832 833 for (; n != 0; --n) { 834 base = dt_mem_next_cell(dt_root_addr_cells, &dm); 835 flags = dm[3]; 836 /* skip DRC index, pad, assoc. list index, flags */ 837 dm += 4; 838 /* skip this block if the reserved bit is set in flags (0x80) 839 or if the block is not assigned to this partition (0x8) */ 840 if ((flags & 0x80) || !(flags & 0x8)) 841 continue; 842 size = lmb_size; 843 if (iommu_is_off) { 844 if (base >= 0x80000000ul) 845 continue; 846 if ((base + size) > 0x80000000ul) 847 size = 0x80000000ul - base; 848 } 849 lmb_add(base, size); 850 } 851 lmb_dump_all(); 852 return 0; 853 } 854 #else 855 #define early_init_dt_scan_drconf_memory(node) 0 856 #endif /* CONFIG_PPC_PSERIES */ 857 858 static int __init early_init_dt_scan_memory(unsigned long node, 859 const char *uname, int depth, void *data) 860 { 861 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 862 cell_t *reg, *endp; 863 unsigned long l; 864 865 /* Look for the ibm,dynamic-reconfiguration-memory node */ 866 if (depth == 1 && 867 strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0) 868 return early_init_dt_scan_drconf_memory(node); 869 870 /* We are scanning "memory" nodes only */ 871 if (type == NULL) { 872 /* 873 * The longtrail doesn't have a device_type on the 874 * /memory node, so look for the node called /memory@0. 875 */ 876 if (depth != 1 || strcmp(uname, "memory@0") != 0) 877 return 0; 878 } else if (strcmp(type, "memory") != 0) 879 return 0; 880 881 reg = (cell_t *)of_get_flat_dt_prop(node, "linux,usable-memory", &l); 882 if (reg == NULL) 883 reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l); 884 if (reg == NULL) 885 return 0; 886 887 endp = reg + (l / sizeof(cell_t)); 888 889 DBG("memory scan node %s, reg size %ld, data: %x %x %x %x,\n", 890 uname, l, reg[0], reg[1], reg[2], reg[3]); 891 892 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 893 unsigned long base, size; 894 895 base = dt_mem_next_cell(dt_root_addr_cells, ®); 896 size = dt_mem_next_cell(dt_root_size_cells, ®); 897 898 if (size == 0) 899 continue; 900 DBG(" - %lx , %lx\n", base, size); 901 #ifdef CONFIG_PPC64 902 if (iommu_is_off) { 903 if (base >= 0x80000000ul) 904 continue; 905 if ((base + size) > 0x80000000ul) 906 size = 0x80000000ul - base; 907 } 908 #endif 909 lmb_add(base, size); 910 } 911 return 0; 912 } 913 914 static void __init early_reserve_mem(void) 915 { 916 u64 base, size; 917 u64 *reserve_map; 918 unsigned long self_base; 919 unsigned long self_size; 920 921 reserve_map = (u64 *)(((unsigned long)initial_boot_params) + 922 initial_boot_params->off_mem_rsvmap); 923 924 /* before we do anything, lets reserve the dt blob */ 925 self_base = __pa((unsigned long)initial_boot_params); 926 self_size = initial_boot_params->totalsize; 927 lmb_reserve(self_base, self_size); 928 929 #ifdef CONFIG_PPC32 930 /* 931 * Handle the case where we might be booting from an old kexec 932 * image that setup the mem_rsvmap as pairs of 32-bit values 933 */ 934 if (*reserve_map > 0xffffffffull) { 935 u32 base_32, size_32; 936 u32 *reserve_map_32 = (u32 *)reserve_map; 937 938 while (1) { 939 base_32 = *(reserve_map_32++); 940 size_32 = *(reserve_map_32++); 941 if (size_32 == 0) 942 break; 943 /* skip if the reservation is for the blob */ 944 if (base_32 == self_base && size_32 == self_size) 945 continue; 946 DBG("reserving: %x -> %x\n", base_32, size_32); 947 lmb_reserve(base_32, size_32); 948 } 949 return; 950 } 951 #endif 952 while (1) { 953 base = *(reserve_map++); 954 size = *(reserve_map++); 955 if (size == 0) 956 break; 957 /* skip if the reservation is for the blob */ 958 if (base == self_base && size == self_size) 959 continue; 960 DBG("reserving: %llx -> %llx\n", base, size); 961 lmb_reserve(base, size); 962 } 963 964 #if 0 965 DBG("memory reserved, lmbs :\n"); 966 lmb_dump_all(); 967 #endif 968 } 969 970 void __init early_init_devtree(void *params) 971 { 972 DBG(" -> early_init_devtree()\n"); 973 974 /* Setup flat device-tree pointer */ 975 initial_boot_params = params; 976 977 #ifdef CONFIG_PPC_RTAS 978 /* Some machines might need RTAS info for debugging, grab it now. */ 979 of_scan_flat_dt(early_init_dt_scan_rtas, NULL); 980 #endif 981 982 /* Retrieve various informations from the /chosen node of the 983 * device-tree, including the platform type, initrd location and 984 * size, TCE reserve, and more ... 985 */ 986 of_scan_flat_dt(early_init_dt_scan_chosen, NULL); 987 988 /* Scan memory nodes and rebuild LMBs */ 989 lmb_init(); 990 of_scan_flat_dt(early_init_dt_scan_root, NULL); 991 of_scan_flat_dt(early_init_dt_scan_memory, NULL); 992 993 /* Save command line for /proc/cmdline and then parse parameters */ 994 strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); 995 parse_early_param(); 996 997 /* Reserve LMB regions used by kernel, initrd, dt, etc... */ 998 lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); 999 reserve_kdump_trampoline(); 1000 reserve_crashkernel(); 1001 early_reserve_mem(); 1002 1003 lmb_enforce_memory_limit(memory_limit); 1004 lmb_analyze(); 1005 1006 DBG("Phys. mem: %lx\n", lmb_phys_mem_size()); 1007 1008 /* We may need to relocate the flat tree, do it now. 1009 * FIXME .. and the initrd too? */ 1010 move_device_tree(); 1011 1012 DBG("Scanning CPUs ...\n"); 1013 1014 /* Retreive CPU related informations from the flat tree 1015 * (altivec support, boot CPU ID, ...) 1016 */ 1017 of_scan_flat_dt(early_init_dt_scan_cpus, NULL); 1018 1019 DBG(" <- early_init_devtree()\n"); 1020 } 1021 1022 #undef printk 1023 1024 int 1025 prom_n_addr_cells(struct device_node* np) 1026 { 1027 const int *ip; 1028 do { 1029 if (np->parent) 1030 np = np->parent; 1031 ip = get_property(np, "#address-cells", NULL); 1032 if (ip != NULL) 1033 return *ip; 1034 } while (np->parent); 1035 /* No #address-cells property for the root node, default to 1 */ 1036 return 1; 1037 } 1038 EXPORT_SYMBOL(prom_n_addr_cells); 1039 1040 int 1041 prom_n_size_cells(struct device_node* np) 1042 { 1043 const int* ip; 1044 do { 1045 if (np->parent) 1046 np = np->parent; 1047 ip = get_property(np, "#size-cells", NULL); 1048 if (ip != NULL) 1049 return *ip; 1050 } while (np->parent); 1051 /* No #size-cells property for the root node, default to 1 */ 1052 return 1; 1053 } 1054 EXPORT_SYMBOL(prom_n_size_cells); 1055 1056 /** 1057 * Construct and return a list of the device_nodes with a given name. 1058 */ 1059 struct device_node *find_devices(const char *name) 1060 { 1061 struct device_node *head, **prevp, *np; 1062 1063 prevp = &head; 1064 for (np = allnodes; np != 0; np = np->allnext) { 1065 if (np->name != 0 && strcasecmp(np->name, name) == 0) { 1066 *prevp = np; 1067 prevp = &np->next; 1068 } 1069 } 1070 *prevp = NULL; 1071 return head; 1072 } 1073 EXPORT_SYMBOL(find_devices); 1074 1075 /** 1076 * Construct and return a list of the device_nodes with a given type. 1077 */ 1078 struct device_node *find_type_devices(const char *type) 1079 { 1080 struct device_node *head, **prevp, *np; 1081 1082 prevp = &head; 1083 for (np = allnodes; np != 0; np = np->allnext) { 1084 if (np->type != 0 && strcasecmp(np->type, type) == 0) { 1085 *prevp = np; 1086 prevp = &np->next; 1087 } 1088 } 1089 *prevp = NULL; 1090 return head; 1091 } 1092 EXPORT_SYMBOL(find_type_devices); 1093 1094 /** 1095 * Returns all nodes linked together 1096 */ 1097 struct device_node *find_all_nodes(void) 1098 { 1099 struct device_node *head, **prevp, *np; 1100 1101 prevp = &head; 1102 for (np = allnodes; np != 0; np = np->allnext) { 1103 *prevp = np; 1104 prevp = &np->next; 1105 } 1106 *prevp = NULL; 1107 return head; 1108 } 1109 EXPORT_SYMBOL(find_all_nodes); 1110 1111 /** Checks if the given "compat" string matches one of the strings in 1112 * the device's "compatible" property 1113 */ 1114 int device_is_compatible(const struct device_node *device, const char *compat) 1115 { 1116 const char* cp; 1117 int cplen, l; 1118 1119 cp = get_property(device, "compatible", &cplen); 1120 if (cp == NULL) 1121 return 0; 1122 while (cplen > 0) { 1123 if (strncasecmp(cp, compat, strlen(compat)) == 0) 1124 return 1; 1125 l = strlen(cp) + 1; 1126 cp += l; 1127 cplen -= l; 1128 } 1129 1130 return 0; 1131 } 1132 EXPORT_SYMBOL(device_is_compatible); 1133 1134 1135 /** 1136 * Indicates whether the root node has a given value in its 1137 * compatible property. 1138 */ 1139 int machine_is_compatible(const char *compat) 1140 { 1141 struct device_node *root; 1142 int rc = 0; 1143 1144 root = of_find_node_by_path("/"); 1145 if (root) { 1146 rc = device_is_compatible(root, compat); 1147 of_node_put(root); 1148 } 1149 return rc; 1150 } 1151 EXPORT_SYMBOL(machine_is_compatible); 1152 1153 /** 1154 * Construct and return a list of the device_nodes with a given type 1155 * and compatible property. 1156 */ 1157 struct device_node *find_compatible_devices(const char *type, 1158 const char *compat) 1159 { 1160 struct device_node *head, **prevp, *np; 1161 1162 prevp = &head; 1163 for (np = allnodes; np != 0; np = np->allnext) { 1164 if (type != NULL 1165 && !(np->type != 0 && strcasecmp(np->type, type) == 0)) 1166 continue; 1167 if (device_is_compatible(np, compat)) { 1168 *prevp = np; 1169 prevp = &np->next; 1170 } 1171 } 1172 *prevp = NULL; 1173 return head; 1174 } 1175 EXPORT_SYMBOL(find_compatible_devices); 1176 1177 /** 1178 * Find the device_node with a given full_name. 1179 */ 1180 struct device_node *find_path_device(const char *path) 1181 { 1182 struct device_node *np; 1183 1184 for (np = allnodes; np != 0; np = np->allnext) 1185 if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0) 1186 return np; 1187 return NULL; 1188 } 1189 EXPORT_SYMBOL(find_path_device); 1190 1191 /******* 1192 * 1193 * New implementation of the OF "find" APIs, return a refcounted 1194 * object, call of_node_put() when done. The device tree and list 1195 * are protected by a rw_lock. 1196 * 1197 * Note that property management will need some locking as well, 1198 * this isn't dealt with yet. 1199 * 1200 *******/ 1201 1202 /** 1203 * of_find_node_by_name - Find a node by its "name" property 1204 * @from: The node to start searching from or NULL, the node 1205 * you pass will not be searched, only the next one 1206 * will; typically, you pass what the previous call 1207 * returned. of_node_put() will be called on it 1208 * @name: The name string to match against 1209 * 1210 * Returns a node pointer with refcount incremented, use 1211 * of_node_put() on it when done. 1212 */ 1213 struct device_node *of_find_node_by_name(struct device_node *from, 1214 const char *name) 1215 { 1216 struct device_node *np; 1217 1218 read_lock(&devtree_lock); 1219 np = from ? from->allnext : allnodes; 1220 for (; np != NULL; np = np->allnext) 1221 if (np->name != NULL && strcasecmp(np->name, name) == 0 1222 && of_node_get(np)) 1223 break; 1224 of_node_put(from); 1225 read_unlock(&devtree_lock); 1226 return np; 1227 } 1228 EXPORT_SYMBOL(of_find_node_by_name); 1229 1230 /** 1231 * of_find_node_by_type - Find a node by its "device_type" property 1232 * @from: The node to start searching from or NULL, the node 1233 * you pass will not be searched, only the next one 1234 * will; typically, you pass what the previous call 1235 * returned. of_node_put() will be called on it 1236 * @name: The type string to match against 1237 * 1238 * Returns a node pointer with refcount incremented, use 1239 * of_node_put() on it when done. 1240 */ 1241 struct device_node *of_find_node_by_type(struct device_node *from, 1242 const char *type) 1243 { 1244 struct device_node *np; 1245 1246 read_lock(&devtree_lock); 1247 np = from ? from->allnext : allnodes; 1248 for (; np != 0; np = np->allnext) 1249 if (np->type != 0 && strcasecmp(np->type, type) == 0 1250 && of_node_get(np)) 1251 break; 1252 of_node_put(from); 1253 read_unlock(&devtree_lock); 1254 return np; 1255 } 1256 EXPORT_SYMBOL(of_find_node_by_type); 1257 1258 /** 1259 * of_find_compatible_node - Find a node based on type and one of the 1260 * tokens in its "compatible" property 1261 * @from: The node to start searching from or NULL, the node 1262 * you pass will not be searched, only the next one 1263 * will; typically, you pass what the previous call 1264 * returned. of_node_put() will be called on it 1265 * @type: The type string to match "device_type" or NULL to ignore 1266 * @compatible: The string to match to one of the tokens in the device 1267 * "compatible" list. 1268 * 1269 * Returns a node pointer with refcount incremented, use 1270 * of_node_put() on it when done. 1271 */ 1272 struct device_node *of_find_compatible_node(struct device_node *from, 1273 const char *type, const char *compatible) 1274 { 1275 struct device_node *np; 1276 1277 read_lock(&devtree_lock); 1278 np = from ? from->allnext : allnodes; 1279 for (; np != 0; np = np->allnext) { 1280 if (type != NULL 1281 && !(np->type != 0 && strcasecmp(np->type, type) == 0)) 1282 continue; 1283 if (device_is_compatible(np, compatible) && of_node_get(np)) 1284 break; 1285 } 1286 of_node_put(from); 1287 read_unlock(&devtree_lock); 1288 return np; 1289 } 1290 EXPORT_SYMBOL(of_find_compatible_node); 1291 1292 /** 1293 * of_find_node_by_path - Find a node matching a full OF path 1294 * @path: The full path to match 1295 * 1296 * Returns a node pointer with refcount incremented, use 1297 * of_node_put() on it when done. 1298 */ 1299 struct device_node *of_find_node_by_path(const char *path) 1300 { 1301 struct device_node *np = allnodes; 1302 1303 read_lock(&devtree_lock); 1304 for (; np != 0; np = np->allnext) { 1305 if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0 1306 && of_node_get(np)) 1307 break; 1308 } 1309 read_unlock(&devtree_lock); 1310 return np; 1311 } 1312 EXPORT_SYMBOL(of_find_node_by_path); 1313 1314 /** 1315 * of_find_node_by_phandle - Find a node given a phandle 1316 * @handle: phandle of the node to find 1317 * 1318 * Returns a node pointer with refcount incremented, use 1319 * of_node_put() on it when done. 1320 */ 1321 struct device_node *of_find_node_by_phandle(phandle handle) 1322 { 1323 struct device_node *np; 1324 1325 read_lock(&devtree_lock); 1326 for (np = allnodes; np != 0; np = np->allnext) 1327 if (np->linux_phandle == handle) 1328 break; 1329 of_node_get(np); 1330 read_unlock(&devtree_lock); 1331 return np; 1332 } 1333 EXPORT_SYMBOL(of_find_node_by_phandle); 1334 1335 /** 1336 * of_find_all_nodes - Get next node in global list 1337 * @prev: Previous node or NULL to start iteration 1338 * of_node_put() will be called on it 1339 * 1340 * Returns a node pointer with refcount incremented, use 1341 * of_node_put() on it when done. 1342 */ 1343 struct device_node *of_find_all_nodes(struct device_node *prev) 1344 { 1345 struct device_node *np; 1346 1347 read_lock(&devtree_lock); 1348 np = prev ? prev->allnext : allnodes; 1349 for (; np != 0; np = np->allnext) 1350 if (of_node_get(np)) 1351 break; 1352 of_node_put(prev); 1353 read_unlock(&devtree_lock); 1354 return np; 1355 } 1356 EXPORT_SYMBOL(of_find_all_nodes); 1357 1358 /** 1359 * of_get_parent - Get a node's parent if any 1360 * @node: Node to get parent 1361 * 1362 * Returns a node pointer with refcount incremented, use 1363 * of_node_put() on it when done. 1364 */ 1365 struct device_node *of_get_parent(const struct device_node *node) 1366 { 1367 struct device_node *np; 1368 1369 if (!node) 1370 return NULL; 1371 1372 read_lock(&devtree_lock); 1373 np = of_node_get(node->parent); 1374 read_unlock(&devtree_lock); 1375 return np; 1376 } 1377 EXPORT_SYMBOL(of_get_parent); 1378 1379 /** 1380 * of_get_next_child - Iterate a node childs 1381 * @node: parent node 1382 * @prev: previous child of the parent node, or NULL to get first 1383 * 1384 * Returns a node pointer with refcount incremented, use 1385 * of_node_put() on it when done. 1386 */ 1387 struct device_node *of_get_next_child(const struct device_node *node, 1388 struct device_node *prev) 1389 { 1390 struct device_node *next; 1391 1392 read_lock(&devtree_lock); 1393 next = prev ? prev->sibling : node->child; 1394 for (; next != 0; next = next->sibling) 1395 if (of_node_get(next)) 1396 break; 1397 of_node_put(prev); 1398 read_unlock(&devtree_lock); 1399 return next; 1400 } 1401 EXPORT_SYMBOL(of_get_next_child); 1402 1403 /** 1404 * of_node_get - Increment refcount of a node 1405 * @node: Node to inc refcount, NULL is supported to 1406 * simplify writing of callers 1407 * 1408 * Returns node. 1409 */ 1410 struct device_node *of_node_get(struct device_node *node) 1411 { 1412 if (node) 1413 kref_get(&node->kref); 1414 return node; 1415 } 1416 EXPORT_SYMBOL(of_node_get); 1417 1418 static inline struct device_node * kref_to_device_node(struct kref *kref) 1419 { 1420 return container_of(kref, struct device_node, kref); 1421 } 1422 1423 /** 1424 * of_node_release - release a dynamically allocated node 1425 * @kref: kref element of the node to be released 1426 * 1427 * In of_node_put() this function is passed to kref_put() 1428 * as the destructor. 1429 */ 1430 static void of_node_release(struct kref *kref) 1431 { 1432 struct device_node *node = kref_to_device_node(kref); 1433 struct property *prop = node->properties; 1434 1435 if (!OF_IS_DYNAMIC(node)) 1436 return; 1437 while (prop) { 1438 struct property *next = prop->next; 1439 kfree(prop->name); 1440 kfree(prop->value); 1441 kfree(prop); 1442 prop = next; 1443 1444 if (!prop) { 1445 prop = node->deadprops; 1446 node->deadprops = NULL; 1447 } 1448 } 1449 kfree(node->full_name); 1450 kfree(node->data); 1451 kfree(node); 1452 } 1453 1454 /** 1455 * of_node_put - Decrement refcount of a node 1456 * @node: Node to dec refcount, NULL is supported to 1457 * simplify writing of callers 1458 * 1459 */ 1460 void of_node_put(struct device_node *node) 1461 { 1462 if (node) 1463 kref_put(&node->kref, of_node_release); 1464 } 1465 EXPORT_SYMBOL(of_node_put); 1466 1467 /* 1468 * Plug a device node into the tree and global list. 1469 */ 1470 void of_attach_node(struct device_node *np) 1471 { 1472 write_lock(&devtree_lock); 1473 np->sibling = np->parent->child; 1474 np->allnext = allnodes; 1475 np->parent->child = np; 1476 allnodes = np; 1477 write_unlock(&devtree_lock); 1478 } 1479 1480 /* 1481 * "Unplug" a node from the device tree. The caller must hold 1482 * a reference to the node. The memory associated with the node 1483 * is not freed until its refcount goes to zero. 1484 */ 1485 void of_detach_node(const struct device_node *np) 1486 { 1487 struct device_node *parent; 1488 1489 write_lock(&devtree_lock); 1490 1491 parent = np->parent; 1492 1493 if (allnodes == np) 1494 allnodes = np->allnext; 1495 else { 1496 struct device_node *prev; 1497 for (prev = allnodes; 1498 prev->allnext != np; 1499 prev = prev->allnext) 1500 ; 1501 prev->allnext = np->allnext; 1502 } 1503 1504 if (parent->child == np) 1505 parent->child = np->sibling; 1506 else { 1507 struct device_node *prevsib; 1508 for (prevsib = np->parent->child; 1509 prevsib->sibling != np; 1510 prevsib = prevsib->sibling) 1511 ; 1512 prevsib->sibling = np->sibling; 1513 } 1514 1515 write_unlock(&devtree_lock); 1516 } 1517 1518 #ifdef CONFIG_PPC_PSERIES 1519 /* 1520 * Fix up the uninitialized fields in a new device node: 1521 * name, type and pci-specific fields 1522 */ 1523 1524 static int of_finish_dynamic_node(struct device_node *node) 1525 { 1526 struct device_node *parent = of_get_parent(node); 1527 int err = 0; 1528 const phandle *ibm_phandle; 1529 1530 node->name = get_property(node, "name", NULL); 1531 node->type = get_property(node, "device_type", NULL); 1532 1533 if (!parent) { 1534 err = -ENODEV; 1535 goto out; 1536 } 1537 1538 /* We don't support that function on PowerMac, at least 1539 * not yet 1540 */ 1541 if (machine_is(powermac)) 1542 return -ENODEV; 1543 1544 /* fix up new node's linux_phandle field */ 1545 if ((ibm_phandle = get_property(node, "ibm,phandle", NULL))) 1546 node->linux_phandle = *ibm_phandle; 1547 1548 out: 1549 of_node_put(parent); 1550 return err; 1551 } 1552 1553 static int prom_reconfig_notifier(struct notifier_block *nb, 1554 unsigned long action, void *node) 1555 { 1556 int err; 1557 1558 switch (action) { 1559 case PSERIES_RECONFIG_ADD: 1560 err = of_finish_dynamic_node(node); 1561 if (err < 0) { 1562 printk(KERN_ERR "finish_node returned %d\n", err); 1563 err = NOTIFY_BAD; 1564 } 1565 break; 1566 default: 1567 err = NOTIFY_DONE; 1568 break; 1569 } 1570 return err; 1571 } 1572 1573 static struct notifier_block prom_reconfig_nb = { 1574 .notifier_call = prom_reconfig_notifier, 1575 .priority = 10, /* This one needs to run first */ 1576 }; 1577 1578 static int __init prom_reconfig_setup(void) 1579 { 1580 return pSeries_reconfig_notifier_register(&prom_reconfig_nb); 1581 } 1582 __initcall(prom_reconfig_setup); 1583 #endif 1584 1585 struct property *of_find_property(const struct device_node *np, 1586 const char *name, 1587 int *lenp) 1588 { 1589 struct property *pp; 1590 1591 read_lock(&devtree_lock); 1592 for (pp = np->properties; pp != 0; pp = pp->next) 1593 if (strcmp(pp->name, name) == 0) { 1594 if (lenp != 0) 1595 *lenp = pp->length; 1596 break; 1597 } 1598 read_unlock(&devtree_lock); 1599 1600 return pp; 1601 } 1602 1603 /* 1604 * Find a property with a given name for a given node 1605 * and return the value. 1606 */ 1607 const void *get_property(const struct device_node *np, const char *name, 1608 int *lenp) 1609 { 1610 struct property *pp = of_find_property(np,name,lenp); 1611 return pp ? pp->value : NULL; 1612 } 1613 EXPORT_SYMBOL(get_property); 1614 1615 /* 1616 * Add a property to a node 1617 */ 1618 int prom_add_property(struct device_node* np, struct property* prop) 1619 { 1620 struct property **next; 1621 1622 prop->next = NULL; 1623 write_lock(&devtree_lock); 1624 next = &np->properties; 1625 while (*next) { 1626 if (strcmp(prop->name, (*next)->name) == 0) { 1627 /* duplicate ! don't insert it */ 1628 write_unlock(&devtree_lock); 1629 return -1; 1630 } 1631 next = &(*next)->next; 1632 } 1633 *next = prop; 1634 write_unlock(&devtree_lock); 1635 1636 #ifdef CONFIG_PROC_DEVICETREE 1637 /* try to add to proc as well if it was initialized */ 1638 if (np->pde) 1639 proc_device_tree_add_prop(np->pde, prop); 1640 #endif /* CONFIG_PROC_DEVICETREE */ 1641 1642 return 0; 1643 } 1644 1645 /* 1646 * Remove a property from a node. Note that we don't actually 1647 * remove it, since we have given out who-knows-how-many pointers 1648 * to the data using get-property. Instead we just move the property 1649 * to the "dead properties" list, so it won't be found any more. 1650 */ 1651 int prom_remove_property(struct device_node *np, struct property *prop) 1652 { 1653 struct property **next; 1654 int found = 0; 1655 1656 write_lock(&devtree_lock); 1657 next = &np->properties; 1658 while (*next) { 1659 if (*next == prop) { 1660 /* found the node */ 1661 *next = prop->next; 1662 prop->next = np->deadprops; 1663 np->deadprops = prop; 1664 found = 1; 1665 break; 1666 } 1667 next = &(*next)->next; 1668 } 1669 write_unlock(&devtree_lock); 1670 1671 if (!found) 1672 return -ENODEV; 1673 1674 #ifdef CONFIG_PROC_DEVICETREE 1675 /* try to remove the proc node as well */ 1676 if (np->pde) 1677 proc_device_tree_remove_prop(np->pde, prop); 1678 #endif /* CONFIG_PROC_DEVICETREE */ 1679 1680 return 0; 1681 } 1682 1683 /* 1684 * Update a property in a node. Note that we don't actually 1685 * remove it, since we have given out who-knows-how-many pointers 1686 * to the data using get-property. Instead we just move the property 1687 * to the "dead properties" list, and add the new property to the 1688 * property list 1689 */ 1690 int prom_update_property(struct device_node *np, 1691 struct property *newprop, 1692 struct property *oldprop) 1693 { 1694 struct property **next; 1695 int found = 0; 1696 1697 write_lock(&devtree_lock); 1698 next = &np->properties; 1699 while (*next) { 1700 if (*next == oldprop) { 1701 /* found the node */ 1702 newprop->next = oldprop->next; 1703 *next = newprop; 1704 oldprop->next = np->deadprops; 1705 np->deadprops = oldprop; 1706 found = 1; 1707 break; 1708 } 1709 next = &(*next)->next; 1710 } 1711 write_unlock(&devtree_lock); 1712 1713 if (!found) 1714 return -ENODEV; 1715 1716 #ifdef CONFIG_PROC_DEVICETREE 1717 /* try to add to proc as well if it was initialized */ 1718 if (np->pde) 1719 proc_device_tree_update_prop(np->pde, newprop, oldprop); 1720 #endif /* CONFIG_PROC_DEVICETREE */ 1721 1722 return 0; 1723 } 1724 1725 1726 /* Find the device node for a given logical cpu number, also returns the cpu 1727 * local thread number (index in ibm,interrupt-server#s) if relevant and 1728 * asked for (non NULL) 1729 */ 1730 struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) 1731 { 1732 int hardid; 1733 struct device_node *np; 1734 1735 hardid = get_hard_smp_processor_id(cpu); 1736 1737 for_each_node_by_type(np, "cpu") { 1738 const u32 *intserv; 1739 unsigned int plen, t; 1740 1741 /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist 1742 * fallback to "reg" property and assume no threads 1743 */ 1744 intserv = get_property(np, "ibm,ppc-interrupt-server#s", 1745 &plen); 1746 if (intserv == NULL) { 1747 const u32 *reg = get_property(np, "reg", NULL); 1748 if (reg == NULL) 1749 continue; 1750 if (*reg == hardid) { 1751 if (thread) 1752 *thread = 0; 1753 return np; 1754 } 1755 } else { 1756 plen /= sizeof(u32); 1757 for (t = 0; t < plen; t++) { 1758 if (hardid == intserv[t]) { 1759 if (thread) 1760 *thread = t; 1761 return np; 1762 } 1763 } 1764 } 1765 } 1766 return NULL; 1767 } 1768 EXPORT_SYMBOL(of_get_cpu_node); 1769 1770 #ifdef DEBUG 1771 static struct debugfs_blob_wrapper flat_dt_blob; 1772 1773 static int __init export_flat_device_tree(void) 1774 { 1775 struct dentry *d; 1776 1777 d = debugfs_create_dir("powerpc", NULL); 1778 if (!d) 1779 return 1; 1780 1781 flat_dt_blob.data = initial_boot_params; 1782 flat_dt_blob.size = initial_boot_params->totalsize; 1783 1784 d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, 1785 d, &flat_dt_blob); 1786 if (!d) 1787 return 1; 1788 1789 return 0; 1790 } 1791 __initcall(export_flat_device_tree); 1792 #endif 1793