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 check_cpu_pa_features(unsigned long node) 542 { 543 unsigned char *pa_ftrs; 544 unsigned long len, tablelen, i, bit; 545 546 pa_ftrs = of_get_flat_dt_prop(node, "ibm,pa-features", &tablelen); 547 if (pa_ftrs == NULL) 548 return; 549 550 /* find descriptor with type == 0 */ 551 for (;;) { 552 if (tablelen < 3) 553 return; 554 len = 2 + pa_ftrs[0]; 555 if (tablelen < len) 556 return; /* descriptor 0 not found */ 557 if (pa_ftrs[1] == 0) 558 break; 559 tablelen -= len; 560 pa_ftrs += len; 561 } 562 563 /* loop over bits we know about */ 564 for (i = 0; i < ARRAY_SIZE(ibm_pa_features); ++i) { 565 struct ibm_pa_feature *fp = &ibm_pa_features[i]; 566 567 if (fp->pabyte >= pa_ftrs[0]) 568 continue; 569 bit = (pa_ftrs[2 + fp->pabyte] >> (7 - fp->pabit)) & 1; 570 if (bit ^ fp->invert) { 571 cur_cpu_spec->cpu_features |= fp->cpu_features; 572 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs; 573 } else { 574 cur_cpu_spec->cpu_features &= ~fp->cpu_features; 575 cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs; 576 } 577 } 578 } 579 580 static int __init early_init_dt_scan_cpus(unsigned long node, 581 const char *uname, int depth, 582 void *data) 583 { 584 static int logical_cpuid = 0; 585 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 586 #ifdef CONFIG_ALTIVEC 587 u32 *prop; 588 #endif 589 u32 *intserv; 590 int i, nthreads; 591 unsigned long len; 592 int found = 0; 593 594 /* We are scanning "cpu" nodes only */ 595 if (type == NULL || strcmp(type, "cpu") != 0) 596 return 0; 597 598 /* Get physical cpuid */ 599 intserv = of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", &len); 600 if (intserv) { 601 nthreads = len / sizeof(int); 602 } else { 603 intserv = of_get_flat_dt_prop(node, "reg", NULL); 604 nthreads = 1; 605 } 606 607 /* 608 * Now see if any of these threads match our boot cpu. 609 * NOTE: This must match the parsing done in smp_setup_cpu_maps. 610 */ 611 for (i = 0; i < nthreads; i++) { 612 /* 613 * version 2 of the kexec param format adds the phys cpuid of 614 * booted proc. 615 */ 616 if (initial_boot_params && initial_boot_params->version >= 2) { 617 if (intserv[i] == 618 initial_boot_params->boot_cpuid_phys) { 619 found = 1; 620 break; 621 } 622 } else { 623 /* 624 * Check if it's the boot-cpu, set it's hw index now, 625 * unfortunately this format did not support booting 626 * off secondary threads. 627 */ 628 if (of_get_flat_dt_prop(node, 629 "linux,boot-cpu", NULL) != NULL) { 630 found = 1; 631 break; 632 } 633 } 634 635 #ifdef CONFIG_SMP 636 /* logical cpu id is always 0 on UP kernels */ 637 logical_cpuid++; 638 #endif 639 } 640 641 if (found) { 642 DBG("boot cpu: logical %d physical %d\n", logical_cpuid, 643 intserv[i]); 644 boot_cpuid = logical_cpuid; 645 set_hard_smp_processor_id(boot_cpuid, intserv[i]); 646 } 647 648 #ifdef CONFIG_ALTIVEC 649 /* Check if we have a VMX and eventually update CPU features */ 650 prop = (u32 *)of_get_flat_dt_prop(node, "ibm,vmx", NULL); 651 if (prop && (*prop) > 0) { 652 cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC; 653 cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC; 654 } 655 656 /* Same goes for Apple's "altivec" property */ 657 prop = (u32 *)of_get_flat_dt_prop(node, "altivec", NULL); 658 if (prop) { 659 cur_cpu_spec->cpu_features |= CPU_FTR_ALTIVEC; 660 cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_ALTIVEC; 661 } 662 #endif /* CONFIG_ALTIVEC */ 663 664 check_cpu_pa_features(node); 665 666 #ifdef CONFIG_PPC_PSERIES 667 if (nthreads > 1) 668 cur_cpu_spec->cpu_features |= CPU_FTR_SMT; 669 else 670 cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT; 671 #endif 672 673 return 0; 674 } 675 676 static int __init early_init_dt_scan_chosen(unsigned long node, 677 const char *uname, int depth, void *data) 678 { 679 unsigned long *lprop; 680 unsigned long l; 681 char *p; 682 683 DBG("search \"chosen\", depth: %d, uname: %s\n", depth, uname); 684 685 if (depth != 1 || 686 (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) 687 return 0; 688 689 #ifdef CONFIG_PPC64 690 /* check if iommu is forced on or off */ 691 if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) 692 iommu_is_off = 1; 693 if (of_get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL) 694 iommu_force_on = 1; 695 #endif 696 697 /* mem=x on the command line is the preferred mechanism */ 698 lprop = of_get_flat_dt_prop(node, "linux,memory-limit", NULL); 699 if (lprop) 700 memory_limit = *lprop; 701 702 #ifdef CONFIG_PPC64 703 lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-start", NULL); 704 if (lprop) 705 tce_alloc_start = *lprop; 706 lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-end", NULL); 707 if (lprop) 708 tce_alloc_end = *lprop; 709 #endif 710 711 #ifdef CONFIG_KEXEC 712 lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL); 713 if (lprop) 714 crashk_res.start = *lprop; 715 716 lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL); 717 if (lprop) 718 crashk_res.end = crashk_res.start + *lprop - 1; 719 #endif 720 721 /* Retreive command line */ 722 p = of_get_flat_dt_prop(node, "bootargs", &l); 723 if (p != NULL && l > 0) 724 strlcpy(cmd_line, p, min((int)l, COMMAND_LINE_SIZE)); 725 726 #ifdef CONFIG_CMDLINE 727 if (l == 0 || (l == 1 && (*p) == 0)) 728 strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); 729 #endif /* CONFIG_CMDLINE */ 730 731 DBG("Command line is: %s\n", cmd_line); 732 733 /* break now */ 734 return 1; 735 } 736 737 static int __init early_init_dt_scan_root(unsigned long node, 738 const char *uname, int depth, void *data) 739 { 740 u32 *prop; 741 742 if (depth != 0) 743 return 0; 744 745 prop = of_get_flat_dt_prop(node, "#size-cells", NULL); 746 dt_root_size_cells = (prop == NULL) ? 1 : *prop; 747 DBG("dt_root_size_cells = %x\n", dt_root_size_cells); 748 749 prop = of_get_flat_dt_prop(node, "#address-cells", NULL); 750 dt_root_addr_cells = (prop == NULL) ? 2 : *prop; 751 DBG("dt_root_addr_cells = %x\n", dt_root_addr_cells); 752 753 /* break now */ 754 return 1; 755 } 756 757 static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) 758 { 759 cell_t *p = *cellp; 760 unsigned long r; 761 762 /* Ignore more than 2 cells */ 763 while (s > sizeof(unsigned long) / 4) { 764 p++; 765 s--; 766 } 767 r = *p++; 768 #ifdef CONFIG_PPC64 769 if (s > 1) { 770 r <<= 32; 771 r |= *(p++); 772 s--; 773 } 774 #endif 775 776 *cellp = p; 777 return r; 778 } 779 780 781 static int __init early_init_dt_scan_memory(unsigned long node, 782 const char *uname, int depth, void *data) 783 { 784 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 785 cell_t *reg, *endp; 786 unsigned long l; 787 788 /* We are scanning "memory" nodes only */ 789 if (type == NULL) { 790 /* 791 * The longtrail doesn't have a device_type on the 792 * /memory node, so look for the node called /memory@0. 793 */ 794 if (depth != 1 || strcmp(uname, "memory@0") != 0) 795 return 0; 796 } else if (strcmp(type, "memory") != 0) 797 return 0; 798 799 reg = (cell_t *)of_get_flat_dt_prop(node, "linux,usable-memory", &l); 800 if (reg == NULL) 801 reg = (cell_t *)of_get_flat_dt_prop(node, "reg", &l); 802 if (reg == NULL) 803 return 0; 804 805 endp = reg + (l / sizeof(cell_t)); 806 807 DBG("memory scan node %s, reg size %ld, data: %x %x %x %x,\n", 808 uname, l, reg[0], reg[1], reg[2], reg[3]); 809 810 while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { 811 unsigned long base, size; 812 813 base = dt_mem_next_cell(dt_root_addr_cells, ®); 814 size = dt_mem_next_cell(dt_root_size_cells, ®); 815 816 if (size == 0) 817 continue; 818 DBG(" - %lx , %lx\n", base, size); 819 #ifdef CONFIG_PPC64 820 if (iommu_is_off) { 821 if (base >= 0x80000000ul) 822 continue; 823 if ((base + size) > 0x80000000ul) 824 size = 0x80000000ul - base; 825 } 826 #endif 827 lmb_add(base, size); 828 } 829 return 0; 830 } 831 832 static void __init early_reserve_mem(void) 833 { 834 u64 base, size; 835 u64 *reserve_map; 836 unsigned long self_base; 837 unsigned long self_size; 838 839 reserve_map = (u64 *)(((unsigned long)initial_boot_params) + 840 initial_boot_params->off_mem_rsvmap); 841 842 /* before we do anything, lets reserve the dt blob */ 843 self_base = __pa((unsigned long)initial_boot_params); 844 self_size = initial_boot_params->totalsize; 845 lmb_reserve(self_base, self_size); 846 847 #ifdef CONFIG_PPC32 848 /* 849 * Handle the case where we might be booting from an old kexec 850 * image that setup the mem_rsvmap as pairs of 32-bit values 851 */ 852 if (*reserve_map > 0xffffffffull) { 853 u32 base_32, size_32; 854 u32 *reserve_map_32 = (u32 *)reserve_map; 855 856 while (1) { 857 base_32 = *(reserve_map_32++); 858 size_32 = *(reserve_map_32++); 859 if (size_32 == 0) 860 break; 861 /* skip if the reservation is for the blob */ 862 if (base_32 == self_base && size_32 == self_size) 863 continue; 864 DBG("reserving: %x -> %x\n", base_32, size_32); 865 lmb_reserve(base_32, size_32); 866 } 867 return; 868 } 869 #endif 870 while (1) { 871 base = *(reserve_map++); 872 size = *(reserve_map++); 873 if (size == 0) 874 break; 875 /* skip if the reservation is for the blob */ 876 if (base == self_base && size == self_size) 877 continue; 878 DBG("reserving: %llx -> %llx\n", base, size); 879 lmb_reserve(base, size); 880 } 881 882 #if 0 883 DBG("memory reserved, lmbs :\n"); 884 lmb_dump_all(); 885 #endif 886 } 887 888 void __init early_init_devtree(void *params) 889 { 890 DBG(" -> early_init_devtree()\n"); 891 892 /* Setup flat device-tree pointer */ 893 initial_boot_params = params; 894 895 #ifdef CONFIG_PPC_RTAS 896 /* Some machines might need RTAS info for debugging, grab it now. */ 897 of_scan_flat_dt(early_init_dt_scan_rtas, NULL); 898 #endif 899 900 /* Retrieve various informations from the /chosen node of the 901 * device-tree, including the platform type, initrd location and 902 * size, TCE reserve, and more ... 903 */ 904 of_scan_flat_dt(early_init_dt_scan_chosen, NULL); 905 906 /* Scan memory nodes and rebuild LMBs */ 907 lmb_init(); 908 of_scan_flat_dt(early_init_dt_scan_root, NULL); 909 of_scan_flat_dt(early_init_dt_scan_memory, NULL); 910 911 /* Save command line for /proc/cmdline and then parse parameters */ 912 strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); 913 parse_early_param(); 914 915 /* Reserve LMB regions used by kernel, initrd, dt, etc... */ 916 lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); 917 reserve_kdump_trampoline(); 918 reserve_crashkernel(); 919 early_reserve_mem(); 920 921 lmb_enforce_memory_limit(memory_limit); 922 lmb_analyze(); 923 924 DBG("Phys. mem: %lx\n", lmb_phys_mem_size()); 925 926 /* We may need to relocate the flat tree, do it now. 927 * FIXME .. and the initrd too? */ 928 move_device_tree(); 929 930 DBG("Scanning CPUs ...\n"); 931 932 /* Retreive CPU related informations from the flat tree 933 * (altivec support, boot CPU ID, ...) 934 */ 935 of_scan_flat_dt(early_init_dt_scan_cpus, NULL); 936 937 DBG(" <- early_init_devtree()\n"); 938 } 939 940 #undef printk 941 942 int 943 prom_n_addr_cells(struct device_node* np) 944 { 945 int* ip; 946 do { 947 if (np->parent) 948 np = np->parent; 949 ip = (int *) get_property(np, "#address-cells", NULL); 950 if (ip != NULL) 951 return *ip; 952 } while (np->parent); 953 /* No #address-cells property for the root node, default to 1 */ 954 return 1; 955 } 956 EXPORT_SYMBOL(prom_n_addr_cells); 957 958 int 959 prom_n_size_cells(struct device_node* np) 960 { 961 int* ip; 962 do { 963 if (np->parent) 964 np = np->parent; 965 ip = (int *) get_property(np, "#size-cells", NULL); 966 if (ip != NULL) 967 return *ip; 968 } while (np->parent); 969 /* No #size-cells property for the root node, default to 1 */ 970 return 1; 971 } 972 EXPORT_SYMBOL(prom_n_size_cells); 973 974 /** 975 * Construct and return a list of the device_nodes with a given name. 976 */ 977 struct device_node *find_devices(const char *name) 978 { 979 struct device_node *head, **prevp, *np; 980 981 prevp = &head; 982 for (np = allnodes; np != 0; np = np->allnext) { 983 if (np->name != 0 && strcasecmp(np->name, name) == 0) { 984 *prevp = np; 985 prevp = &np->next; 986 } 987 } 988 *prevp = NULL; 989 return head; 990 } 991 EXPORT_SYMBOL(find_devices); 992 993 /** 994 * Construct and return a list of the device_nodes with a given type. 995 */ 996 struct device_node *find_type_devices(const char *type) 997 { 998 struct device_node *head, **prevp, *np; 999 1000 prevp = &head; 1001 for (np = allnodes; np != 0; np = np->allnext) { 1002 if (np->type != 0 && strcasecmp(np->type, type) == 0) { 1003 *prevp = np; 1004 prevp = &np->next; 1005 } 1006 } 1007 *prevp = NULL; 1008 return head; 1009 } 1010 EXPORT_SYMBOL(find_type_devices); 1011 1012 /** 1013 * Returns all nodes linked together 1014 */ 1015 struct device_node *find_all_nodes(void) 1016 { 1017 struct device_node *head, **prevp, *np; 1018 1019 prevp = &head; 1020 for (np = allnodes; np != 0; np = np->allnext) { 1021 *prevp = np; 1022 prevp = &np->next; 1023 } 1024 *prevp = NULL; 1025 return head; 1026 } 1027 EXPORT_SYMBOL(find_all_nodes); 1028 1029 /** Checks if the given "compat" string matches one of the strings in 1030 * the device's "compatible" property 1031 */ 1032 int device_is_compatible(struct device_node *device, const char *compat) 1033 { 1034 const char* cp; 1035 int cplen, l; 1036 1037 cp = (char *) get_property(device, "compatible", &cplen); 1038 if (cp == NULL) 1039 return 0; 1040 while (cplen > 0) { 1041 if (strncasecmp(cp, compat, strlen(compat)) == 0) 1042 return 1; 1043 l = strlen(cp) + 1; 1044 cp += l; 1045 cplen -= l; 1046 } 1047 1048 return 0; 1049 } 1050 EXPORT_SYMBOL(device_is_compatible); 1051 1052 1053 /** 1054 * Indicates whether the root node has a given value in its 1055 * compatible property. 1056 */ 1057 int machine_is_compatible(const char *compat) 1058 { 1059 struct device_node *root; 1060 int rc = 0; 1061 1062 root = of_find_node_by_path("/"); 1063 if (root) { 1064 rc = device_is_compatible(root, compat); 1065 of_node_put(root); 1066 } 1067 return rc; 1068 } 1069 EXPORT_SYMBOL(machine_is_compatible); 1070 1071 /** 1072 * Construct and return a list of the device_nodes with a given type 1073 * and compatible property. 1074 */ 1075 struct device_node *find_compatible_devices(const char *type, 1076 const char *compat) 1077 { 1078 struct device_node *head, **prevp, *np; 1079 1080 prevp = &head; 1081 for (np = allnodes; np != 0; np = np->allnext) { 1082 if (type != NULL 1083 && !(np->type != 0 && strcasecmp(np->type, type) == 0)) 1084 continue; 1085 if (device_is_compatible(np, compat)) { 1086 *prevp = np; 1087 prevp = &np->next; 1088 } 1089 } 1090 *prevp = NULL; 1091 return head; 1092 } 1093 EXPORT_SYMBOL(find_compatible_devices); 1094 1095 /** 1096 * Find the device_node with a given full_name. 1097 */ 1098 struct device_node *find_path_device(const char *path) 1099 { 1100 struct device_node *np; 1101 1102 for (np = allnodes; np != 0; np = np->allnext) 1103 if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0) 1104 return np; 1105 return NULL; 1106 } 1107 EXPORT_SYMBOL(find_path_device); 1108 1109 /******* 1110 * 1111 * New implementation of the OF "find" APIs, return a refcounted 1112 * object, call of_node_put() when done. The device tree and list 1113 * are protected by a rw_lock. 1114 * 1115 * Note that property management will need some locking as well, 1116 * this isn't dealt with yet. 1117 * 1118 *******/ 1119 1120 /** 1121 * of_find_node_by_name - Find a node by its "name" property 1122 * @from: The node to start searching from or NULL, the node 1123 * you pass will not be searched, only the next one 1124 * will; typically, you pass what the previous call 1125 * returned. of_node_put() will be called on it 1126 * @name: The name string to match against 1127 * 1128 * Returns a node pointer with refcount incremented, use 1129 * of_node_put() on it when done. 1130 */ 1131 struct device_node *of_find_node_by_name(struct device_node *from, 1132 const char *name) 1133 { 1134 struct device_node *np; 1135 1136 read_lock(&devtree_lock); 1137 np = from ? from->allnext : allnodes; 1138 for (; np != NULL; np = np->allnext) 1139 if (np->name != NULL && strcasecmp(np->name, name) == 0 1140 && of_node_get(np)) 1141 break; 1142 if (from) 1143 of_node_put(from); 1144 read_unlock(&devtree_lock); 1145 return np; 1146 } 1147 EXPORT_SYMBOL(of_find_node_by_name); 1148 1149 /** 1150 * of_find_node_by_type - Find a node by its "device_type" property 1151 * @from: The node to start searching from or NULL, the node 1152 * you pass will not be searched, only the next one 1153 * will; typically, you pass what the previous call 1154 * returned. of_node_put() will be called on it 1155 * @name: The type string to match against 1156 * 1157 * Returns a node pointer with refcount incremented, use 1158 * of_node_put() on it when done. 1159 */ 1160 struct device_node *of_find_node_by_type(struct device_node *from, 1161 const char *type) 1162 { 1163 struct device_node *np; 1164 1165 read_lock(&devtree_lock); 1166 np = from ? from->allnext : allnodes; 1167 for (; np != 0; np = np->allnext) 1168 if (np->type != 0 && strcasecmp(np->type, type) == 0 1169 && of_node_get(np)) 1170 break; 1171 if (from) 1172 of_node_put(from); 1173 read_unlock(&devtree_lock); 1174 return np; 1175 } 1176 EXPORT_SYMBOL(of_find_node_by_type); 1177 1178 /** 1179 * of_find_compatible_node - Find a node based on type and one of the 1180 * tokens in its "compatible" property 1181 * @from: The node to start searching from or NULL, the node 1182 * you pass will not be searched, only the next one 1183 * will; typically, you pass what the previous call 1184 * returned. of_node_put() will be called on it 1185 * @type: The type string to match "device_type" or NULL to ignore 1186 * @compatible: The string to match to one of the tokens in the device 1187 * "compatible" list. 1188 * 1189 * Returns a node pointer with refcount incremented, use 1190 * of_node_put() on it when done. 1191 */ 1192 struct device_node *of_find_compatible_node(struct device_node *from, 1193 const char *type, const char *compatible) 1194 { 1195 struct device_node *np; 1196 1197 read_lock(&devtree_lock); 1198 np = from ? from->allnext : allnodes; 1199 for (; np != 0; np = np->allnext) { 1200 if (type != NULL 1201 && !(np->type != 0 && strcasecmp(np->type, type) == 0)) 1202 continue; 1203 if (device_is_compatible(np, compatible) && of_node_get(np)) 1204 break; 1205 } 1206 if (from) 1207 of_node_put(from); 1208 read_unlock(&devtree_lock); 1209 return np; 1210 } 1211 EXPORT_SYMBOL(of_find_compatible_node); 1212 1213 /** 1214 * of_find_node_by_path - Find a node matching a full OF path 1215 * @path: The full path to match 1216 * 1217 * Returns a node pointer with refcount incremented, use 1218 * of_node_put() on it when done. 1219 */ 1220 struct device_node *of_find_node_by_path(const char *path) 1221 { 1222 struct device_node *np = allnodes; 1223 1224 read_lock(&devtree_lock); 1225 for (; np != 0; np = np->allnext) { 1226 if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0 1227 && of_node_get(np)) 1228 break; 1229 } 1230 read_unlock(&devtree_lock); 1231 return np; 1232 } 1233 EXPORT_SYMBOL(of_find_node_by_path); 1234 1235 /** 1236 * of_find_node_by_phandle - Find a node given a phandle 1237 * @handle: phandle of the node to find 1238 * 1239 * Returns a node pointer with refcount incremented, use 1240 * of_node_put() on it when done. 1241 */ 1242 struct device_node *of_find_node_by_phandle(phandle handle) 1243 { 1244 struct device_node *np; 1245 1246 read_lock(&devtree_lock); 1247 for (np = allnodes; np != 0; np = np->allnext) 1248 if (np->linux_phandle == handle) 1249 break; 1250 if (np) 1251 of_node_get(np); 1252 read_unlock(&devtree_lock); 1253 return np; 1254 } 1255 EXPORT_SYMBOL(of_find_node_by_phandle); 1256 1257 /** 1258 * of_find_all_nodes - Get next node in global list 1259 * @prev: Previous node or NULL to start iteration 1260 * of_node_put() will be called on it 1261 * 1262 * Returns a node pointer with refcount incremented, use 1263 * of_node_put() on it when done. 1264 */ 1265 struct device_node *of_find_all_nodes(struct device_node *prev) 1266 { 1267 struct device_node *np; 1268 1269 read_lock(&devtree_lock); 1270 np = prev ? prev->allnext : allnodes; 1271 for (; np != 0; np = np->allnext) 1272 if (of_node_get(np)) 1273 break; 1274 if (prev) 1275 of_node_put(prev); 1276 read_unlock(&devtree_lock); 1277 return np; 1278 } 1279 EXPORT_SYMBOL(of_find_all_nodes); 1280 1281 /** 1282 * of_get_parent - Get a node's parent if any 1283 * @node: Node to get parent 1284 * 1285 * Returns a node pointer with refcount incremented, use 1286 * of_node_put() on it when done. 1287 */ 1288 struct device_node *of_get_parent(const struct device_node *node) 1289 { 1290 struct device_node *np; 1291 1292 if (!node) 1293 return NULL; 1294 1295 read_lock(&devtree_lock); 1296 np = of_node_get(node->parent); 1297 read_unlock(&devtree_lock); 1298 return np; 1299 } 1300 EXPORT_SYMBOL(of_get_parent); 1301 1302 /** 1303 * of_get_next_child - Iterate a node childs 1304 * @node: parent node 1305 * @prev: previous child of the parent node, or NULL to get first 1306 * 1307 * Returns a node pointer with refcount incremented, use 1308 * of_node_put() on it when done. 1309 */ 1310 struct device_node *of_get_next_child(const struct device_node *node, 1311 struct device_node *prev) 1312 { 1313 struct device_node *next; 1314 1315 read_lock(&devtree_lock); 1316 next = prev ? prev->sibling : node->child; 1317 for (; next != 0; next = next->sibling) 1318 if (of_node_get(next)) 1319 break; 1320 if (prev) 1321 of_node_put(prev); 1322 read_unlock(&devtree_lock); 1323 return next; 1324 } 1325 EXPORT_SYMBOL(of_get_next_child); 1326 1327 /** 1328 * of_node_get - Increment refcount of a node 1329 * @node: Node to inc refcount, NULL is supported to 1330 * simplify writing of callers 1331 * 1332 * Returns node. 1333 */ 1334 struct device_node *of_node_get(struct device_node *node) 1335 { 1336 if (node) 1337 kref_get(&node->kref); 1338 return node; 1339 } 1340 EXPORT_SYMBOL(of_node_get); 1341 1342 static inline struct device_node * kref_to_device_node(struct kref *kref) 1343 { 1344 return container_of(kref, struct device_node, kref); 1345 } 1346 1347 /** 1348 * of_node_release - release a dynamically allocated node 1349 * @kref: kref element of the node to be released 1350 * 1351 * In of_node_put() this function is passed to kref_put() 1352 * as the destructor. 1353 */ 1354 static void of_node_release(struct kref *kref) 1355 { 1356 struct device_node *node = kref_to_device_node(kref); 1357 struct property *prop = node->properties; 1358 1359 if (!OF_IS_DYNAMIC(node)) 1360 return; 1361 while (prop) { 1362 struct property *next = prop->next; 1363 kfree(prop->name); 1364 kfree(prop->value); 1365 kfree(prop); 1366 prop = next; 1367 1368 if (!prop) { 1369 prop = node->deadprops; 1370 node->deadprops = NULL; 1371 } 1372 } 1373 kfree(node->full_name); 1374 kfree(node->data); 1375 kfree(node); 1376 } 1377 1378 /** 1379 * of_node_put - Decrement refcount of a node 1380 * @node: Node to dec refcount, NULL is supported to 1381 * simplify writing of callers 1382 * 1383 */ 1384 void of_node_put(struct device_node *node) 1385 { 1386 if (node) 1387 kref_put(&node->kref, of_node_release); 1388 } 1389 EXPORT_SYMBOL(of_node_put); 1390 1391 /* 1392 * Plug a device node into the tree and global list. 1393 */ 1394 void of_attach_node(struct device_node *np) 1395 { 1396 write_lock(&devtree_lock); 1397 np->sibling = np->parent->child; 1398 np->allnext = allnodes; 1399 np->parent->child = np; 1400 allnodes = np; 1401 write_unlock(&devtree_lock); 1402 } 1403 1404 /* 1405 * "Unplug" a node from the device tree. The caller must hold 1406 * a reference to the node. The memory associated with the node 1407 * is not freed until its refcount goes to zero. 1408 */ 1409 void of_detach_node(const struct device_node *np) 1410 { 1411 struct device_node *parent; 1412 1413 write_lock(&devtree_lock); 1414 1415 parent = np->parent; 1416 1417 if (allnodes == np) 1418 allnodes = np->allnext; 1419 else { 1420 struct device_node *prev; 1421 for (prev = allnodes; 1422 prev->allnext != np; 1423 prev = prev->allnext) 1424 ; 1425 prev->allnext = np->allnext; 1426 } 1427 1428 if (parent->child == np) 1429 parent->child = np->sibling; 1430 else { 1431 struct device_node *prevsib; 1432 for (prevsib = np->parent->child; 1433 prevsib->sibling != np; 1434 prevsib = prevsib->sibling) 1435 ; 1436 prevsib->sibling = np->sibling; 1437 } 1438 1439 write_unlock(&devtree_lock); 1440 } 1441 1442 #ifdef CONFIG_PPC_PSERIES 1443 /* 1444 * Fix up the uninitialized fields in a new device node: 1445 * name, type and pci-specific fields 1446 */ 1447 1448 static int of_finish_dynamic_node(struct device_node *node) 1449 { 1450 struct device_node *parent = of_get_parent(node); 1451 int err = 0; 1452 phandle *ibm_phandle; 1453 1454 node->name = get_property(node, "name", NULL); 1455 node->type = get_property(node, "device_type", NULL); 1456 1457 if (!parent) { 1458 err = -ENODEV; 1459 goto out; 1460 } 1461 1462 /* We don't support that function on PowerMac, at least 1463 * not yet 1464 */ 1465 if (machine_is(powermac)) 1466 return -ENODEV; 1467 1468 /* fix up new node's linux_phandle field */ 1469 if ((ibm_phandle = (unsigned int *)get_property(node, 1470 "ibm,phandle", NULL))) 1471 node->linux_phandle = *ibm_phandle; 1472 1473 out: 1474 of_node_put(parent); 1475 return err; 1476 } 1477 1478 static int prom_reconfig_notifier(struct notifier_block *nb, 1479 unsigned long action, void *node) 1480 { 1481 int err; 1482 1483 switch (action) { 1484 case PSERIES_RECONFIG_ADD: 1485 err = of_finish_dynamic_node(node); 1486 if (err < 0) { 1487 printk(KERN_ERR "finish_node returned %d\n", err); 1488 err = NOTIFY_BAD; 1489 } 1490 break; 1491 default: 1492 err = NOTIFY_DONE; 1493 break; 1494 } 1495 return err; 1496 } 1497 1498 static struct notifier_block prom_reconfig_nb = { 1499 .notifier_call = prom_reconfig_notifier, 1500 .priority = 10, /* This one needs to run first */ 1501 }; 1502 1503 static int __init prom_reconfig_setup(void) 1504 { 1505 return pSeries_reconfig_notifier_register(&prom_reconfig_nb); 1506 } 1507 __initcall(prom_reconfig_setup); 1508 #endif 1509 1510 struct property *of_find_property(struct device_node *np, const char *name, 1511 int *lenp) 1512 { 1513 struct property *pp; 1514 1515 read_lock(&devtree_lock); 1516 for (pp = np->properties; pp != 0; pp = pp->next) 1517 if (strcmp(pp->name, name) == 0) { 1518 if (lenp != 0) 1519 *lenp = pp->length; 1520 break; 1521 } 1522 read_unlock(&devtree_lock); 1523 1524 return pp; 1525 } 1526 1527 /* 1528 * Find a property with a given name for a given node 1529 * and return the value. 1530 */ 1531 void *get_property(struct device_node *np, const char *name, int *lenp) 1532 { 1533 struct property *pp = of_find_property(np,name,lenp); 1534 return pp ? pp->value : NULL; 1535 } 1536 EXPORT_SYMBOL(get_property); 1537 1538 /* 1539 * Add a property to a node 1540 */ 1541 int prom_add_property(struct device_node* np, struct property* prop) 1542 { 1543 struct property **next; 1544 1545 prop->next = NULL; 1546 write_lock(&devtree_lock); 1547 next = &np->properties; 1548 while (*next) { 1549 if (strcmp(prop->name, (*next)->name) == 0) { 1550 /* duplicate ! don't insert it */ 1551 write_unlock(&devtree_lock); 1552 return -1; 1553 } 1554 next = &(*next)->next; 1555 } 1556 *next = prop; 1557 write_unlock(&devtree_lock); 1558 1559 #ifdef CONFIG_PROC_DEVICETREE 1560 /* try to add to proc as well if it was initialized */ 1561 if (np->pde) 1562 proc_device_tree_add_prop(np->pde, prop); 1563 #endif /* CONFIG_PROC_DEVICETREE */ 1564 1565 return 0; 1566 } 1567 1568 /* 1569 * Remove a property from a node. Note that we don't actually 1570 * remove it, since we have given out who-knows-how-many pointers 1571 * to the data using get-property. Instead we just move the property 1572 * to the "dead properties" list, so it won't be found any more. 1573 */ 1574 int prom_remove_property(struct device_node *np, struct property *prop) 1575 { 1576 struct property **next; 1577 int found = 0; 1578 1579 write_lock(&devtree_lock); 1580 next = &np->properties; 1581 while (*next) { 1582 if (*next == prop) { 1583 /* found the node */ 1584 *next = prop->next; 1585 prop->next = np->deadprops; 1586 np->deadprops = prop; 1587 found = 1; 1588 break; 1589 } 1590 next = &(*next)->next; 1591 } 1592 write_unlock(&devtree_lock); 1593 1594 if (!found) 1595 return -ENODEV; 1596 1597 #ifdef CONFIG_PROC_DEVICETREE 1598 /* try to remove the proc node as well */ 1599 if (np->pde) 1600 proc_device_tree_remove_prop(np->pde, prop); 1601 #endif /* CONFIG_PROC_DEVICETREE */ 1602 1603 return 0; 1604 } 1605 1606 /* 1607 * Update a property in a node. Note that we don't actually 1608 * remove it, since we have given out who-knows-how-many pointers 1609 * to the data using get-property. Instead we just move the property 1610 * to the "dead properties" list, and add the new property to the 1611 * property list 1612 */ 1613 int prom_update_property(struct device_node *np, 1614 struct property *newprop, 1615 struct property *oldprop) 1616 { 1617 struct property **next; 1618 int found = 0; 1619 1620 write_lock(&devtree_lock); 1621 next = &np->properties; 1622 while (*next) { 1623 if (*next == oldprop) { 1624 /* found the node */ 1625 newprop->next = oldprop->next; 1626 *next = newprop; 1627 oldprop->next = np->deadprops; 1628 np->deadprops = oldprop; 1629 found = 1; 1630 break; 1631 } 1632 next = &(*next)->next; 1633 } 1634 write_unlock(&devtree_lock); 1635 1636 if (!found) 1637 return -ENODEV; 1638 1639 #ifdef CONFIG_PROC_DEVICETREE 1640 /* try to add to proc as well if it was initialized */ 1641 if (np->pde) 1642 proc_device_tree_update_prop(np->pde, newprop, oldprop); 1643 #endif /* CONFIG_PROC_DEVICETREE */ 1644 1645 return 0; 1646 } 1647 1648 1649 /* Find the device node for a given logical cpu number, also returns the cpu 1650 * local thread number (index in ibm,interrupt-server#s) if relevant and 1651 * asked for (non NULL) 1652 */ 1653 struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) 1654 { 1655 int hardid; 1656 struct device_node *np; 1657 1658 hardid = get_hard_smp_processor_id(cpu); 1659 1660 for_each_node_by_type(np, "cpu") { 1661 u32 *intserv; 1662 unsigned int plen, t; 1663 1664 /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist 1665 * fallback to "reg" property and assume no threads 1666 */ 1667 intserv = (u32 *)get_property(np, "ibm,ppc-interrupt-server#s", 1668 &plen); 1669 if (intserv == NULL) { 1670 u32 *reg = (u32 *)get_property(np, "reg", NULL); 1671 if (reg == NULL) 1672 continue; 1673 if (*reg == hardid) { 1674 if (thread) 1675 *thread = 0; 1676 return np; 1677 } 1678 } else { 1679 plen /= sizeof(u32); 1680 for (t = 0; t < plen; t++) { 1681 if (hardid == intserv[t]) { 1682 if (thread) 1683 *thread = t; 1684 return np; 1685 } 1686 } 1687 } 1688 } 1689 return NULL; 1690 } 1691 1692 #ifdef DEBUG 1693 static struct debugfs_blob_wrapper flat_dt_blob; 1694 1695 static int __init export_flat_device_tree(void) 1696 { 1697 struct dentry *d; 1698 1699 d = debugfs_create_dir("powerpc", NULL); 1700 if (!d) 1701 return 1; 1702 1703 flat_dt_blob.data = initial_boot_params; 1704 flat_dt_blob.size = initial_boot_params->totalsize; 1705 1706 d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, 1707 d, &flat_dt_blob); 1708 if (!d) 1709 return 1; 1710 1711 return 0; 1712 } 1713 __initcall(export_flat_device_tree); 1714 #endif 1715