1 /* 2 * Procedures for interfacing to Open Firmware. 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_PROM 17 18 #include <stdarg.h> 19 #include <linux/config.h> 20 #include <linux/kernel.h> 21 #include <linux/string.h> 22 #include <linux/init.h> 23 #include <linux/threads.h> 24 #include <linux/spinlock.h> 25 #include <linux/types.h> 26 #include <linux/pci.h> 27 #include <linux/proc_fs.h> 28 #include <linux/stringify.h> 29 #include <linux/delay.h> 30 #include <linux/initrd.h> 31 #include <linux/bitops.h> 32 #include <asm/prom.h> 33 #include <asm/rtas.h> 34 #include <asm/page.h> 35 #include <asm/processor.h> 36 #include <asm/irq.h> 37 #include <asm/io.h> 38 #include <asm/smp.h> 39 #include <asm/system.h> 40 #include <asm/mmu.h> 41 #include <asm/pgtable.h> 42 #include <asm/pci.h> 43 #include <asm/iommu.h> 44 #include <asm/btext.h> 45 #include <asm/sections.h> 46 #include <asm/machdep.h> 47 48 #ifdef CONFIG_LOGO_LINUX_CLUT224 49 #include <linux/linux_logo.h> 50 extern const struct linux_logo logo_linux_clut224; 51 #endif 52 53 /* 54 * Properties whose value is longer than this get excluded from our 55 * copy of the device tree. This value does need to be big enough to 56 * ensure that we don't lose things like the interrupt-map property 57 * on a PCI-PCI bridge. 58 */ 59 #define MAX_PROPERTY_LENGTH (1UL * 1024 * 1024) 60 61 /* 62 * Eventually bump that one up 63 */ 64 #define DEVTREE_CHUNK_SIZE 0x100000 65 66 /* 67 * This is the size of the local memory reserve map that gets copied 68 * into the boot params passed to the kernel. That size is totally 69 * flexible as the kernel just reads the list until it encounters an 70 * entry with size 0, so it can be changed without breaking binary 71 * compatibility 72 */ 73 #define MEM_RESERVE_MAP_SIZE 8 74 75 /* 76 * prom_init() is called very early on, before the kernel text 77 * and data have been mapped to KERNELBASE. At this point the code 78 * is running at whatever address it has been loaded at. 79 * On ppc32 we compile with -mrelocatable, which means that references 80 * to extern and static variables get relocated automatically. 81 * On ppc64 we have to relocate the references explicitly with 82 * RELOC. (Note that strings count as static variables.) 83 * 84 * Because OF may have mapped I/O devices into the area starting at 85 * KERNELBASE, particularly on CHRP machines, we can't safely call 86 * OF once the kernel has been mapped to KERNELBASE. Therefore all 87 * OF calls must be done within prom_init(). 88 * 89 * ADDR is used in calls to call_prom. The 4th and following 90 * arguments to call_prom should be 32-bit values. 91 * On ppc64, 64 bit values are truncated to 32 bits (and 92 * fortunately don't get interpreted as two arguments). 93 */ 94 #ifdef CONFIG_PPC64 95 #define RELOC(x) (*PTRRELOC(&(x))) 96 #define ADDR(x) (u32) add_reloc_offset((unsigned long)(x)) 97 #define OF_WORKAROUNDS 0 98 #else 99 #define RELOC(x) (x) 100 #define ADDR(x) (u32) (x) 101 #define OF_WORKAROUNDS of_workarounds 102 int of_workarounds; 103 #endif 104 105 #define OF_WA_CLAIM 1 /* do phys/virt claim separately, then map */ 106 #define OF_WA_LONGTRAIL 2 /* work around longtrail bugs */ 107 108 #define PROM_BUG() do { \ 109 prom_printf("kernel BUG at %s line 0x%x!\n", \ 110 RELOC(__FILE__), __LINE__); \ 111 __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); \ 112 } while (0) 113 114 #ifdef DEBUG_PROM 115 #define prom_debug(x...) prom_printf(x) 116 #else 117 #define prom_debug(x...) 118 #endif 119 120 121 typedef u32 prom_arg_t; 122 123 struct prom_args { 124 u32 service; 125 u32 nargs; 126 u32 nret; 127 prom_arg_t args[10]; 128 }; 129 130 struct prom_t { 131 ihandle root; 132 phandle chosen; 133 int cpu; 134 ihandle stdout; 135 ihandle mmumap; 136 ihandle memory; 137 }; 138 139 struct mem_map_entry { 140 unsigned long base; 141 unsigned long size; 142 }; 143 144 typedef u32 cell_t; 145 146 extern void __start(unsigned long r3, unsigned long r4, unsigned long r5); 147 148 #ifdef CONFIG_PPC64 149 extern int enter_prom(struct prom_args *args, unsigned long entry); 150 #else 151 static inline int enter_prom(struct prom_args *args, unsigned long entry) 152 { 153 return ((int (*)(struct prom_args *))entry)(args); 154 } 155 #endif 156 157 extern void copy_and_flush(unsigned long dest, unsigned long src, 158 unsigned long size, unsigned long offset); 159 160 /* prom structure */ 161 static struct prom_t __initdata prom; 162 163 static unsigned long prom_entry __initdata; 164 165 #define PROM_SCRATCH_SIZE 256 166 167 static char __initdata of_stdout_device[256]; 168 static char __initdata prom_scratch[PROM_SCRATCH_SIZE]; 169 170 static unsigned long __initdata dt_header_start; 171 static unsigned long __initdata dt_struct_start, dt_struct_end; 172 static unsigned long __initdata dt_string_start, dt_string_end; 173 174 static unsigned long __initdata prom_initrd_start, prom_initrd_end; 175 176 #ifdef CONFIG_PPC64 177 static int __initdata iommu_force_on; 178 static int __initdata ppc64_iommu_off; 179 static unsigned long __initdata prom_tce_alloc_start; 180 static unsigned long __initdata prom_tce_alloc_end; 181 #endif 182 183 static int __initdata of_platform; 184 185 static char __initdata prom_cmd_line[COMMAND_LINE_SIZE]; 186 187 static unsigned long __initdata prom_memory_limit; 188 189 static unsigned long __initdata alloc_top; 190 static unsigned long __initdata alloc_top_high; 191 static unsigned long __initdata alloc_bottom; 192 static unsigned long __initdata rmo_top; 193 static unsigned long __initdata ram_top; 194 195 static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE]; 196 static int __initdata mem_reserve_cnt; 197 198 static cell_t __initdata regbuf[1024]; 199 200 201 #define MAX_CPU_THREADS 2 202 203 /* TO GO */ 204 #ifdef CONFIG_HMT 205 struct { 206 unsigned int pir; 207 unsigned int threadid; 208 } hmt_thread_data[NR_CPUS]; 209 #endif /* CONFIG_HMT */ 210 211 /* 212 * Error results ... some OF calls will return "-1" on error, some 213 * will return 0, some will return either. To simplify, here are 214 * macros to use with any ihandle or phandle return value to check if 215 * it is valid 216 */ 217 218 #define PROM_ERROR (-1u) 219 #define PHANDLE_VALID(p) ((p) != 0 && (p) != PROM_ERROR) 220 #define IHANDLE_VALID(i) ((i) != 0 && (i) != PROM_ERROR) 221 222 223 /* This is the one and *ONLY* place where we actually call open 224 * firmware. 225 */ 226 227 static int __init call_prom(const char *service, int nargs, int nret, ...) 228 { 229 int i; 230 struct prom_args args; 231 va_list list; 232 233 args.service = ADDR(service); 234 args.nargs = nargs; 235 args.nret = nret; 236 237 va_start(list, nret); 238 for (i = 0; i < nargs; i++) 239 args.args[i] = va_arg(list, prom_arg_t); 240 va_end(list); 241 242 for (i = 0; i < nret; i++) 243 args.args[nargs+i] = 0; 244 245 if (enter_prom(&args, RELOC(prom_entry)) < 0) 246 return PROM_ERROR; 247 248 return (nret > 0) ? args.args[nargs] : 0; 249 } 250 251 static int __init call_prom_ret(const char *service, int nargs, int nret, 252 prom_arg_t *rets, ...) 253 { 254 int i; 255 struct prom_args args; 256 va_list list; 257 258 args.service = ADDR(service); 259 args.nargs = nargs; 260 args.nret = nret; 261 262 va_start(list, rets); 263 for (i = 0; i < nargs; i++) 264 args.args[i] = va_arg(list, prom_arg_t); 265 va_end(list); 266 267 for (i = 0; i < nret; i++) 268 args.args[nargs+i] = 0; 269 270 if (enter_prom(&args, RELOC(prom_entry)) < 0) 271 return PROM_ERROR; 272 273 if (rets != NULL) 274 for (i = 1; i < nret; ++i) 275 rets[i-1] = args.args[nargs+i]; 276 277 return (nret > 0) ? args.args[nargs] : 0; 278 } 279 280 281 static void __init prom_print(const char *msg) 282 { 283 const char *p, *q; 284 struct prom_t *_prom = &RELOC(prom); 285 286 if (_prom->stdout == 0) 287 return; 288 289 for (p = msg; *p != 0; p = q) { 290 for (q = p; *q != 0 && *q != '\n'; ++q) 291 ; 292 if (q > p) 293 call_prom("write", 3, 1, _prom->stdout, p, q - p); 294 if (*q == 0) 295 break; 296 ++q; 297 call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2); 298 } 299 } 300 301 302 static void __init prom_print_hex(unsigned long val) 303 { 304 int i, nibbles = sizeof(val)*2; 305 char buf[sizeof(val)*2+1]; 306 struct prom_t *_prom = &RELOC(prom); 307 308 for (i = nibbles-1; i >= 0; i--) { 309 buf[i] = (val & 0xf) + '0'; 310 if (buf[i] > '9') 311 buf[i] += ('a'-'0'-10); 312 val >>= 4; 313 } 314 buf[nibbles] = '\0'; 315 call_prom("write", 3, 1, _prom->stdout, buf, nibbles); 316 } 317 318 319 static void __init prom_printf(const char *format, ...) 320 { 321 const char *p, *q, *s; 322 va_list args; 323 unsigned long v; 324 struct prom_t *_prom = &RELOC(prom); 325 326 va_start(args, format); 327 #ifdef CONFIG_PPC64 328 format = PTRRELOC(format); 329 #endif 330 for (p = format; *p != 0; p = q) { 331 for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q) 332 ; 333 if (q > p) 334 call_prom("write", 3, 1, _prom->stdout, p, q - p); 335 if (*q == 0) 336 break; 337 if (*q == '\n') { 338 ++q; 339 call_prom("write", 3, 1, _prom->stdout, 340 ADDR("\r\n"), 2); 341 continue; 342 } 343 ++q; 344 if (*q == 0) 345 break; 346 switch (*q) { 347 case 's': 348 ++q; 349 s = va_arg(args, const char *); 350 prom_print(s); 351 break; 352 case 'x': 353 ++q; 354 v = va_arg(args, unsigned long); 355 prom_print_hex(v); 356 break; 357 } 358 } 359 } 360 361 362 static unsigned int __init prom_claim(unsigned long virt, unsigned long size, 363 unsigned long align) 364 { 365 struct prom_t *_prom = &RELOC(prom); 366 367 if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) { 368 /* 369 * Old OF requires we claim physical and virtual separately 370 * and then map explicitly (assuming virtual mode) 371 */ 372 int ret; 373 prom_arg_t result; 374 375 ret = call_prom_ret("call-method", 5, 2, &result, 376 ADDR("claim"), _prom->memory, 377 align, size, virt); 378 if (ret != 0 || result == -1) 379 return -1; 380 ret = call_prom_ret("call-method", 5, 2, &result, 381 ADDR("claim"), _prom->mmumap, 382 align, size, virt); 383 if (ret != 0) { 384 call_prom("call-method", 4, 1, ADDR("release"), 385 _prom->memory, size, virt); 386 return -1; 387 } 388 /* the 0x12 is M (coherence) + PP == read/write */ 389 call_prom("call-method", 6, 1, 390 ADDR("map"), _prom->mmumap, 0x12, size, virt, virt); 391 return virt; 392 } 393 return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size, 394 (prom_arg_t)align); 395 } 396 397 static void __init __attribute__((noreturn)) prom_panic(const char *reason) 398 { 399 #ifdef CONFIG_PPC64 400 reason = PTRRELOC(reason); 401 #endif 402 prom_print(reason); 403 /* ToDo: should put up an SRC here on p/iSeries */ 404 call_prom("exit", 0, 0); 405 406 for (;;) /* should never get here */ 407 ; 408 } 409 410 411 static int __init prom_next_node(phandle *nodep) 412 { 413 phandle node; 414 415 if ((node = *nodep) != 0 416 && (*nodep = call_prom("child", 1, 1, node)) != 0) 417 return 1; 418 if ((*nodep = call_prom("peer", 1, 1, node)) != 0) 419 return 1; 420 for (;;) { 421 if ((node = call_prom("parent", 1, 1, node)) == 0) 422 return 0; 423 if ((*nodep = call_prom("peer", 1, 1, node)) != 0) 424 return 1; 425 } 426 } 427 428 static int inline prom_getprop(phandle node, const char *pname, 429 void *value, size_t valuelen) 430 { 431 return call_prom("getprop", 4, 1, node, ADDR(pname), 432 (u32)(unsigned long) value, (u32) valuelen); 433 } 434 435 static int inline prom_getproplen(phandle node, const char *pname) 436 { 437 return call_prom("getproplen", 2, 1, node, ADDR(pname)); 438 } 439 440 static void add_string(char **str, const char *q) 441 { 442 char *p = *str; 443 444 while (*q) 445 *p++ = *q++; 446 *p++ = ' '; 447 *str = p; 448 } 449 450 static char *tohex(unsigned int x) 451 { 452 static char digits[] = "0123456789abcdef"; 453 static char result[9]; 454 int i; 455 456 result[8] = 0; 457 i = 8; 458 do { 459 --i; 460 result[i] = digits[x & 0xf]; 461 x >>= 4; 462 } while (x != 0 && i > 0); 463 return &result[i]; 464 } 465 466 static int __init prom_setprop(phandle node, const char *nodename, 467 const char *pname, void *value, size_t valuelen) 468 { 469 char cmd[256], *p; 470 471 if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL)) 472 return call_prom("setprop", 4, 1, node, ADDR(pname), 473 (u32)(unsigned long) value, (u32) valuelen); 474 475 /* gah... setprop doesn't work on longtrail, have to use interpret */ 476 p = cmd; 477 add_string(&p, "dev"); 478 add_string(&p, nodename); 479 add_string(&p, tohex((u32)(unsigned long) value)); 480 add_string(&p, tohex(valuelen)); 481 add_string(&p, tohex(ADDR(pname))); 482 add_string(&p, tohex(strlen(RELOC(pname)))); 483 add_string(&p, "property"); 484 *p = 0; 485 return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); 486 } 487 488 /* We can't use the standard versions because of RELOC headaches. */ 489 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \ 490 || ('a' <= (c) && (c) <= 'f') \ 491 || ('A' <= (c) && (c) <= 'F')) 492 493 #define isdigit(c) ('0' <= (c) && (c) <= '9') 494 #define islower(c) ('a' <= (c) && (c) <= 'z') 495 #define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c)) 496 497 unsigned long prom_strtoul(const char *cp, const char **endp) 498 { 499 unsigned long result = 0, base = 10, value; 500 501 if (*cp == '0') { 502 base = 8; 503 cp++; 504 if (toupper(*cp) == 'X') { 505 cp++; 506 base = 16; 507 } 508 } 509 510 while (isxdigit(*cp) && 511 (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) { 512 result = result * base + value; 513 cp++; 514 } 515 516 if (endp) 517 *endp = cp; 518 519 return result; 520 } 521 522 unsigned long prom_memparse(const char *ptr, const char **retptr) 523 { 524 unsigned long ret = prom_strtoul(ptr, retptr); 525 int shift = 0; 526 527 /* 528 * We can't use a switch here because GCC *may* generate a 529 * jump table which won't work, because we're not running at 530 * the address we're linked at. 531 */ 532 if ('G' == **retptr || 'g' == **retptr) 533 shift = 30; 534 535 if ('M' == **retptr || 'm' == **retptr) 536 shift = 20; 537 538 if ('K' == **retptr || 'k' == **retptr) 539 shift = 10; 540 541 if (shift) { 542 ret <<= shift; 543 (*retptr)++; 544 } 545 546 return ret; 547 } 548 549 /* 550 * Early parsing of the command line passed to the kernel, used for 551 * "mem=x" and the options that affect the iommu 552 */ 553 static void __init early_cmdline_parse(void) 554 { 555 struct prom_t *_prom = &RELOC(prom); 556 char *opt, *p; 557 int l = 0; 558 559 RELOC(prom_cmd_line[0]) = 0; 560 p = RELOC(prom_cmd_line); 561 if ((long)_prom->chosen > 0) 562 l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1); 563 #ifdef CONFIG_CMDLINE 564 if (l == 0) /* dbl check */ 565 strlcpy(RELOC(prom_cmd_line), 566 RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line)); 567 #endif /* CONFIG_CMDLINE */ 568 prom_printf("command line: %s\n", RELOC(prom_cmd_line)); 569 570 #ifdef CONFIG_PPC64 571 opt = strstr(RELOC(prom_cmd_line), RELOC("iommu=")); 572 if (opt) { 573 prom_printf("iommu opt is: %s\n", opt); 574 opt += 6; 575 while (*opt && *opt == ' ') 576 opt++; 577 if (!strncmp(opt, RELOC("off"), 3)) 578 RELOC(ppc64_iommu_off) = 1; 579 else if (!strncmp(opt, RELOC("force"), 5)) 580 RELOC(iommu_force_on) = 1; 581 } 582 #endif 583 584 opt = strstr(RELOC(prom_cmd_line), RELOC("mem=")); 585 if (opt) { 586 opt += 4; 587 RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt); 588 #ifdef CONFIG_PPC64 589 /* Align to 16 MB == size of ppc64 large page */ 590 RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000); 591 #endif 592 } 593 } 594 595 #ifdef CONFIG_PPC_PSERIES 596 /* 597 * To tell the firmware what our capabilities are, we have to pass 598 * it a fake 32-bit ELF header containing a couple of PT_NOTE sections 599 * that contain structures that contain the actual values. 600 */ 601 static struct fake_elf { 602 Elf32_Ehdr elfhdr; 603 Elf32_Phdr phdr[2]; 604 struct chrpnote { 605 u32 namesz; 606 u32 descsz; 607 u32 type; 608 char name[8]; /* "PowerPC" */ 609 struct chrpdesc { 610 u32 real_mode; 611 u32 real_base; 612 u32 real_size; 613 u32 virt_base; 614 u32 virt_size; 615 u32 load_base; 616 } chrpdesc; 617 } chrpnote; 618 struct rpanote { 619 u32 namesz; 620 u32 descsz; 621 u32 type; 622 char name[24]; /* "IBM,RPA-Client-Config" */ 623 struct rpadesc { 624 u32 lpar_affinity; 625 u32 min_rmo_size; 626 u32 min_rmo_percent; 627 u32 max_pft_size; 628 u32 splpar; 629 u32 min_load; 630 u32 new_mem_def; 631 u32 ignore_me; 632 } rpadesc; 633 } rpanote; 634 } fake_elf = { 635 .elfhdr = { 636 .e_ident = { 0x7f, 'E', 'L', 'F', 637 ELFCLASS32, ELFDATA2MSB, EV_CURRENT }, 638 .e_type = ET_EXEC, /* yeah right */ 639 .e_machine = EM_PPC, 640 .e_version = EV_CURRENT, 641 .e_phoff = offsetof(struct fake_elf, phdr), 642 .e_phentsize = sizeof(Elf32_Phdr), 643 .e_phnum = 2 644 }, 645 .phdr = { 646 [0] = { 647 .p_type = PT_NOTE, 648 .p_offset = offsetof(struct fake_elf, chrpnote), 649 .p_filesz = sizeof(struct chrpnote) 650 }, [1] = { 651 .p_type = PT_NOTE, 652 .p_offset = offsetof(struct fake_elf, rpanote), 653 .p_filesz = sizeof(struct rpanote) 654 } 655 }, 656 .chrpnote = { 657 .namesz = sizeof("PowerPC"), 658 .descsz = sizeof(struct chrpdesc), 659 .type = 0x1275, 660 .name = "PowerPC", 661 .chrpdesc = { 662 .real_mode = ~0U, /* ~0 means "don't care" */ 663 .real_base = ~0U, 664 .real_size = ~0U, 665 .virt_base = ~0U, 666 .virt_size = ~0U, 667 .load_base = ~0U 668 }, 669 }, 670 .rpanote = { 671 .namesz = sizeof("IBM,RPA-Client-Config"), 672 .descsz = sizeof(struct rpadesc), 673 .type = 0x12759999, 674 .name = "IBM,RPA-Client-Config", 675 .rpadesc = { 676 .lpar_affinity = 0, 677 .min_rmo_size = 64, /* in megabytes */ 678 .min_rmo_percent = 0, 679 .max_pft_size = 48, /* 2^48 bytes max PFT size */ 680 .splpar = 1, 681 .min_load = ~0U, 682 .new_mem_def = 0 683 } 684 } 685 }; 686 687 static void __init prom_send_capabilities(void) 688 { 689 ihandle elfloader; 690 691 elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader")); 692 if (elfloader == 0) { 693 prom_printf("couldn't open /packages/elf-loader\n"); 694 return; 695 } 696 call_prom("call-method", 3, 1, ADDR("process-elf-header"), 697 elfloader, ADDR(&fake_elf)); 698 call_prom("close", 1, 0, elfloader); 699 } 700 #endif 701 702 /* 703 * Memory allocation strategy... our layout is normally: 704 * 705 * at 14Mb or more we have vmlinux, then a gap and initrd. In some 706 * rare cases, initrd might end up being before the kernel though. 707 * We assume this won't override the final kernel at 0, we have no 708 * provision to handle that in this version, but it should hopefully 709 * never happen. 710 * 711 * alloc_top is set to the top of RMO, eventually shrink down if the 712 * TCEs overlap 713 * 714 * alloc_bottom is set to the top of kernel/initrd 715 * 716 * from there, allocations are done this way : rtas is allocated 717 * topmost, and the device-tree is allocated from the bottom. We try 718 * to grow the device-tree allocation as we progress. If we can't, 719 * then we fail, we don't currently have a facility to restart 720 * elsewhere, but that shouldn't be necessary. 721 * 722 * Note that calls to reserve_mem have to be done explicitly, memory 723 * allocated with either alloc_up or alloc_down isn't automatically 724 * reserved. 725 */ 726 727 728 /* 729 * Allocates memory in the RMO upward from the kernel/initrd 730 * 731 * When align is 0, this is a special case, it means to allocate in place 732 * at the current location of alloc_bottom or fail (that is basically 733 * extending the previous allocation). Used for the device-tree flattening 734 */ 735 static unsigned long __init alloc_up(unsigned long size, unsigned long align) 736 { 737 unsigned long base = RELOC(alloc_bottom); 738 unsigned long addr = 0; 739 740 if (align) 741 base = _ALIGN_UP(base, align); 742 prom_debug("alloc_up(%x, %x)\n", size, align); 743 if (RELOC(ram_top) == 0) 744 prom_panic("alloc_up() called with mem not initialized\n"); 745 746 if (align) 747 base = _ALIGN_UP(RELOC(alloc_bottom), align); 748 else 749 base = RELOC(alloc_bottom); 750 751 for(; (base + size) <= RELOC(alloc_top); 752 base = _ALIGN_UP(base + 0x100000, align)) { 753 prom_debug(" trying: 0x%x\n\r", base); 754 addr = (unsigned long)prom_claim(base, size, 0); 755 if (addr != PROM_ERROR && addr != 0) 756 break; 757 addr = 0; 758 if (align == 0) 759 break; 760 } 761 if (addr == 0) 762 return 0; 763 RELOC(alloc_bottom) = addr; 764 765 prom_debug(" -> %x\n", addr); 766 prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); 767 prom_debug(" alloc_top : %x\n", RELOC(alloc_top)); 768 prom_debug(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); 769 prom_debug(" rmo_top : %x\n", RELOC(rmo_top)); 770 prom_debug(" ram_top : %x\n", RELOC(ram_top)); 771 772 return addr; 773 } 774 775 /* 776 * Allocates memory downward, either from top of RMO, or if highmem 777 * is set, from the top of RAM. Note that this one doesn't handle 778 * failures. It does claim memory if highmem is not set. 779 */ 780 static unsigned long __init alloc_down(unsigned long size, unsigned long align, 781 int highmem) 782 { 783 unsigned long base, addr = 0; 784 785 prom_debug("alloc_down(%x, %x, %s)\n", size, align, 786 highmem ? RELOC("(high)") : RELOC("(low)")); 787 if (RELOC(ram_top) == 0) 788 prom_panic("alloc_down() called with mem not initialized\n"); 789 790 if (highmem) { 791 /* Carve out storage for the TCE table. */ 792 addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align); 793 if (addr <= RELOC(alloc_bottom)) 794 return 0; 795 /* Will we bump into the RMO ? If yes, check out that we 796 * didn't overlap existing allocations there, if we did, 797 * we are dead, we must be the first in town ! 798 */ 799 if (addr < RELOC(rmo_top)) { 800 /* Good, we are first */ 801 if (RELOC(alloc_top) == RELOC(rmo_top)) 802 RELOC(alloc_top) = RELOC(rmo_top) = addr; 803 else 804 return 0; 805 } 806 RELOC(alloc_top_high) = addr; 807 goto bail; 808 } 809 810 base = _ALIGN_DOWN(RELOC(alloc_top) - size, align); 811 for (; base > RELOC(alloc_bottom); 812 base = _ALIGN_DOWN(base - 0x100000, align)) { 813 prom_debug(" trying: 0x%x\n\r", base); 814 addr = (unsigned long)prom_claim(base, size, 0); 815 if (addr != PROM_ERROR && addr != 0) 816 break; 817 addr = 0; 818 } 819 if (addr == 0) 820 return 0; 821 RELOC(alloc_top) = addr; 822 823 bail: 824 prom_debug(" -> %x\n", addr); 825 prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); 826 prom_debug(" alloc_top : %x\n", RELOC(alloc_top)); 827 prom_debug(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); 828 prom_debug(" rmo_top : %x\n", RELOC(rmo_top)); 829 prom_debug(" ram_top : %x\n", RELOC(ram_top)); 830 831 return addr; 832 } 833 834 /* 835 * Parse a "reg" cell 836 */ 837 static unsigned long __init prom_next_cell(int s, cell_t **cellp) 838 { 839 cell_t *p = *cellp; 840 unsigned long r = 0; 841 842 /* Ignore more than 2 cells */ 843 while (s > sizeof(unsigned long) / 4) { 844 p++; 845 s--; 846 } 847 r = *p++; 848 #ifdef CONFIG_PPC64 849 if (s > 1) { 850 r <<= 32; 851 r |= *(p++); 852 } 853 #endif 854 *cellp = p; 855 return r; 856 } 857 858 /* 859 * Very dumb function for adding to the memory reserve list, but 860 * we don't need anything smarter at this point 861 * 862 * XXX Eventually check for collisions. They should NEVER happen. 863 * If problems seem to show up, it would be a good start to track 864 * them down. 865 */ 866 static void reserve_mem(unsigned long base, unsigned long size) 867 { 868 unsigned long top = base + size; 869 unsigned long cnt = RELOC(mem_reserve_cnt); 870 871 if (size == 0) 872 return; 873 874 /* We need to always keep one empty entry so that we 875 * have our terminator with "size" set to 0 since we are 876 * dumb and just copy this entire array to the boot params 877 */ 878 base = _ALIGN_DOWN(base, PAGE_SIZE); 879 top = _ALIGN_UP(top, PAGE_SIZE); 880 size = top - base; 881 882 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1)) 883 prom_panic("Memory reserve map exhausted !\n"); 884 RELOC(mem_reserve_map)[cnt].base = base; 885 RELOC(mem_reserve_map)[cnt].size = size; 886 RELOC(mem_reserve_cnt) = cnt + 1; 887 } 888 889 /* 890 * Initialize memory allocation mecanism, parse "memory" nodes and 891 * obtain that way the top of memory and RMO to setup out local allocator 892 */ 893 static void __init prom_init_mem(void) 894 { 895 phandle node; 896 char *path, type[64]; 897 unsigned int plen; 898 cell_t *p, *endp; 899 struct prom_t *_prom = &RELOC(prom); 900 u32 rac, rsc; 901 902 /* 903 * We iterate the memory nodes to find 904 * 1) top of RMO (first node) 905 * 2) top of memory 906 */ 907 rac = 2; 908 prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac)); 909 rsc = 1; 910 prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc)); 911 prom_debug("root_addr_cells: %x\n", (unsigned long) rac); 912 prom_debug("root_size_cells: %x\n", (unsigned long) rsc); 913 914 prom_debug("scanning memory:\n"); 915 path = RELOC(prom_scratch); 916 917 for (node = 0; prom_next_node(&node); ) { 918 type[0] = 0; 919 prom_getprop(node, "device_type", type, sizeof(type)); 920 921 if (type[0] == 0) { 922 /* 923 * CHRP Longtrail machines have no device_type 924 * on the memory node, so check the name instead... 925 */ 926 prom_getprop(node, "name", type, sizeof(type)); 927 } 928 if (strcmp(type, RELOC("memory"))) 929 continue; 930 931 plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf)); 932 if (plen > sizeof(regbuf)) { 933 prom_printf("memory node too large for buffer !\n"); 934 plen = sizeof(regbuf); 935 } 936 p = RELOC(regbuf); 937 endp = p + (plen / sizeof(cell_t)); 938 939 #ifdef DEBUG_PROM 940 memset(path, 0, PROM_SCRATCH_SIZE); 941 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1); 942 prom_debug(" node %s :\n", path); 943 #endif /* DEBUG_PROM */ 944 945 while ((endp - p) >= (rac + rsc)) { 946 unsigned long base, size; 947 948 base = prom_next_cell(rac, &p); 949 size = prom_next_cell(rsc, &p); 950 951 if (size == 0) 952 continue; 953 prom_debug(" %x %x\n", base, size); 954 if (base == 0) 955 RELOC(rmo_top) = size; 956 if ((base + size) > RELOC(ram_top)) 957 RELOC(ram_top) = base + size; 958 } 959 } 960 961 RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000); 962 963 /* Check if we have an initrd after the kernel, if we do move our bottom 964 * point to after it 965 */ 966 if (RELOC(prom_initrd_start)) { 967 if (RELOC(prom_initrd_end) > RELOC(alloc_bottom)) 968 RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end)); 969 } 970 971 /* 972 * If prom_memory_limit is set we reduce the upper limits *except* for 973 * alloc_top_high. This must be the real top of RAM so we can put 974 * TCE's up there. 975 */ 976 977 RELOC(alloc_top_high) = RELOC(ram_top); 978 979 if (RELOC(prom_memory_limit)) { 980 if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) { 981 prom_printf("Ignoring mem=%x <= alloc_bottom.\n", 982 RELOC(prom_memory_limit)); 983 RELOC(prom_memory_limit) = 0; 984 } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) { 985 prom_printf("Ignoring mem=%x >= ram_top.\n", 986 RELOC(prom_memory_limit)); 987 RELOC(prom_memory_limit) = 0; 988 } else { 989 RELOC(ram_top) = RELOC(prom_memory_limit); 990 RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit)); 991 } 992 } 993 994 /* 995 * Setup our top alloc point, that is top of RMO or top of 996 * segment 0 when running non-LPAR. 997 * Some RS64 machines have buggy firmware where claims up at 998 * 1GB fail. Cap at 768MB as a workaround. 999 * Since 768MB is plenty of room, and we need to cap to something 1000 * reasonable on 32-bit, cap at 768MB on all machines. 1001 */ 1002 if (!RELOC(rmo_top)) 1003 RELOC(rmo_top) = RELOC(ram_top); 1004 RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top)); 1005 RELOC(alloc_top) = RELOC(rmo_top); 1006 1007 prom_printf("memory layout at init:\n"); 1008 prom_printf(" memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit)); 1009 prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom)); 1010 prom_printf(" alloc_top : %x\n", RELOC(alloc_top)); 1011 prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); 1012 prom_printf(" rmo_top : %x\n", RELOC(rmo_top)); 1013 prom_printf(" ram_top : %x\n", RELOC(ram_top)); 1014 } 1015 1016 1017 /* 1018 * Allocate room for and instantiate RTAS 1019 */ 1020 static void __init prom_instantiate_rtas(void) 1021 { 1022 phandle rtas_node; 1023 ihandle rtas_inst; 1024 u32 base, entry = 0; 1025 u32 size = 0; 1026 1027 prom_debug("prom_instantiate_rtas: start...\n"); 1028 1029 rtas_node = call_prom("finddevice", 1, 1, ADDR("/rtas")); 1030 prom_debug("rtas_node: %x\n", rtas_node); 1031 if (!PHANDLE_VALID(rtas_node)) 1032 return; 1033 1034 prom_getprop(rtas_node, "rtas-size", &size, sizeof(size)); 1035 if (size == 0) 1036 return; 1037 1038 base = alloc_down(size, PAGE_SIZE, 0); 1039 if (base == 0) { 1040 prom_printf("RTAS allocation failed !\n"); 1041 return; 1042 } 1043 1044 rtas_inst = call_prom("open", 1, 1, ADDR("/rtas")); 1045 if (!IHANDLE_VALID(rtas_inst)) { 1046 prom_printf("opening rtas package failed (%x)\n", rtas_inst); 1047 return; 1048 } 1049 1050 prom_printf("instantiating rtas at 0x%x ...", base); 1051 1052 if (call_prom_ret("call-method", 3, 2, &entry, 1053 ADDR("instantiate-rtas"), 1054 rtas_inst, base) != 0 1055 || entry == 0) { 1056 prom_printf(" failed\n"); 1057 return; 1058 } 1059 prom_printf(" done\n"); 1060 1061 reserve_mem(base, size); 1062 1063 prom_setprop(rtas_node, "/rtas", "linux,rtas-base", 1064 &base, sizeof(base)); 1065 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry", 1066 &entry, sizeof(entry)); 1067 1068 prom_debug("rtas base = 0x%x\n", base); 1069 prom_debug("rtas entry = 0x%x\n", entry); 1070 prom_debug("rtas size = 0x%x\n", (long)size); 1071 1072 prom_debug("prom_instantiate_rtas: end...\n"); 1073 } 1074 1075 #ifdef CONFIG_PPC64 1076 /* 1077 * Allocate room for and initialize TCE tables 1078 */ 1079 static void __init prom_initialize_tce_table(void) 1080 { 1081 phandle node; 1082 ihandle phb_node; 1083 char compatible[64], type[64], model[64]; 1084 char *path = RELOC(prom_scratch); 1085 u64 base, align; 1086 u32 minalign, minsize; 1087 u64 tce_entry, *tce_entryp; 1088 u64 local_alloc_top, local_alloc_bottom; 1089 u64 i; 1090 1091 if (RELOC(ppc64_iommu_off)) 1092 return; 1093 1094 prom_debug("starting prom_initialize_tce_table\n"); 1095 1096 /* Cache current top of allocs so we reserve a single block */ 1097 local_alloc_top = RELOC(alloc_top_high); 1098 local_alloc_bottom = local_alloc_top; 1099 1100 /* Search all nodes looking for PHBs. */ 1101 for (node = 0; prom_next_node(&node); ) { 1102 compatible[0] = 0; 1103 type[0] = 0; 1104 model[0] = 0; 1105 prom_getprop(node, "compatible", 1106 compatible, sizeof(compatible)); 1107 prom_getprop(node, "device_type", type, sizeof(type)); 1108 prom_getprop(node, "model", model, sizeof(model)); 1109 1110 if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL)) 1111 continue; 1112 1113 /* Keep the old logic in tack to avoid regression. */ 1114 if (compatible[0] != 0) { 1115 if ((strstr(compatible, RELOC("python")) == NULL) && 1116 (strstr(compatible, RELOC("Speedwagon")) == NULL) && 1117 (strstr(compatible, RELOC("Winnipeg")) == NULL)) 1118 continue; 1119 } else if (model[0] != 0) { 1120 if ((strstr(model, RELOC("ython")) == NULL) && 1121 (strstr(model, RELOC("peedwagon")) == NULL) && 1122 (strstr(model, RELOC("innipeg")) == NULL)) 1123 continue; 1124 } 1125 1126 if (prom_getprop(node, "tce-table-minalign", &minalign, 1127 sizeof(minalign)) == PROM_ERROR) 1128 minalign = 0; 1129 if (prom_getprop(node, "tce-table-minsize", &minsize, 1130 sizeof(minsize)) == PROM_ERROR) 1131 minsize = 4UL << 20; 1132 1133 /* 1134 * Even though we read what OF wants, we just set the table 1135 * size to 4 MB. This is enough to map 2GB of PCI DMA space. 1136 * By doing this, we avoid the pitfalls of trying to DMA to 1137 * MMIO space and the DMA alias hole. 1138 * 1139 * On POWER4, firmware sets the TCE region by assuming 1140 * each TCE table is 8MB. Using this memory for anything 1141 * else will impact performance, so we always allocate 8MB. 1142 * Anton 1143 */ 1144 if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p)) 1145 minsize = 8UL << 20; 1146 else 1147 minsize = 4UL << 20; 1148 1149 /* Align to the greater of the align or size */ 1150 align = max(minalign, minsize); 1151 base = alloc_down(minsize, align, 1); 1152 if (base == 0) 1153 prom_panic("ERROR, cannot find space for TCE table.\n"); 1154 if (base < local_alloc_bottom) 1155 local_alloc_bottom = base; 1156 1157 /* It seems OF doesn't null-terminate the path :-( */ 1158 memset(path, 0, sizeof(path)); 1159 /* Call OF to setup the TCE hardware */ 1160 if (call_prom("package-to-path", 3, 1, node, 1161 path, PROM_SCRATCH_SIZE-1) == PROM_ERROR) { 1162 prom_printf("package-to-path failed\n"); 1163 } 1164 1165 /* Save away the TCE table attributes for later use. */ 1166 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base)); 1167 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize)); 1168 1169 prom_debug("TCE table: %s\n", path); 1170 prom_debug("\tnode = 0x%x\n", node); 1171 prom_debug("\tbase = 0x%x\n", base); 1172 prom_debug("\tsize = 0x%x\n", minsize); 1173 1174 /* Initialize the table to have a one-to-one mapping 1175 * over the allocated size. 1176 */ 1177 tce_entryp = (unsigned long *)base; 1178 for (i = 0; i < (minsize >> 3) ;tce_entryp++, i++) { 1179 tce_entry = (i << PAGE_SHIFT); 1180 tce_entry |= 0x3; 1181 *tce_entryp = tce_entry; 1182 } 1183 1184 prom_printf("opening PHB %s", path); 1185 phb_node = call_prom("open", 1, 1, path); 1186 if (phb_node == 0) 1187 prom_printf("... failed\n"); 1188 else 1189 prom_printf("... done\n"); 1190 1191 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"), 1192 phb_node, -1, minsize, 1193 (u32) base, (u32) (base >> 32)); 1194 call_prom("close", 1, 0, phb_node); 1195 } 1196 1197 reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom); 1198 1199 if (RELOC(prom_memory_limit)) { 1200 /* 1201 * We align the start to a 16MB boundary so we can map 1202 * the TCE area using large pages if possible. 1203 * The end should be the top of RAM so no need to align it. 1204 */ 1205 RELOC(prom_tce_alloc_start) = _ALIGN_DOWN(local_alloc_bottom, 1206 0x1000000); 1207 RELOC(prom_tce_alloc_end) = local_alloc_top; 1208 } 1209 1210 /* Flag the first invalid entry */ 1211 prom_debug("ending prom_initialize_tce_table\n"); 1212 } 1213 #endif 1214 1215 /* 1216 * With CHRP SMP we need to use the OF to start the other processors. 1217 * We can't wait until smp_boot_cpus (the OF is trashed by then) 1218 * so we have to put the processors into a holding pattern controlled 1219 * by the kernel (not OF) before we destroy the OF. 1220 * 1221 * This uses a chunk of low memory, puts some holding pattern 1222 * code there and sends the other processors off to there until 1223 * smp_boot_cpus tells them to do something. The holding pattern 1224 * checks that address until its cpu # is there, when it is that 1225 * cpu jumps to __secondary_start(). smp_boot_cpus() takes care 1226 * of setting those values. 1227 * 1228 * We also use physical address 0x4 here to tell when a cpu 1229 * is in its holding pattern code. 1230 * 1231 * -- Cort 1232 */ 1233 extern void __secondary_hold(void); 1234 extern unsigned long __secondary_hold_spinloop; 1235 extern unsigned long __secondary_hold_acknowledge; 1236 1237 /* 1238 * We want to reference the copy of __secondary_hold_* in the 1239 * 0 - 0x100 address range 1240 */ 1241 #define LOW_ADDR(x) (((unsigned long) &(x)) & 0xff) 1242 1243 static void __init prom_hold_cpus(void) 1244 { 1245 unsigned long i; 1246 unsigned int reg; 1247 phandle node; 1248 char type[64]; 1249 int cpuid = 0; 1250 unsigned int interrupt_server[MAX_CPU_THREADS]; 1251 unsigned int cpu_threads, hw_cpu_num; 1252 int propsize; 1253 struct prom_t *_prom = &RELOC(prom); 1254 unsigned long *spinloop 1255 = (void *) LOW_ADDR(__secondary_hold_spinloop); 1256 unsigned long *acknowledge 1257 = (void *) LOW_ADDR(__secondary_hold_acknowledge); 1258 #ifdef CONFIG_PPC64 1259 /* __secondary_hold is actually a descriptor, not the text address */ 1260 unsigned long secondary_hold 1261 = __pa(*PTRRELOC((unsigned long *)__secondary_hold)); 1262 #else 1263 unsigned long secondary_hold = LOW_ADDR(__secondary_hold); 1264 #endif 1265 1266 prom_debug("prom_hold_cpus: start...\n"); 1267 prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop); 1268 prom_debug(" 1) *spinloop = 0x%x\n", *spinloop); 1269 prom_debug(" 1) acknowledge = 0x%x\n", 1270 (unsigned long)acknowledge); 1271 prom_debug(" 1) *acknowledge = 0x%x\n", *acknowledge); 1272 prom_debug(" 1) secondary_hold = 0x%x\n", secondary_hold); 1273 1274 /* Set the common spinloop variable, so all of the secondary cpus 1275 * will block when they are awakened from their OF spinloop. 1276 * This must occur for both SMP and non SMP kernels, since OF will 1277 * be trashed when we move the kernel. 1278 */ 1279 *spinloop = 0; 1280 1281 #ifdef CONFIG_HMT 1282 for (i = 0; i < NR_CPUS; i++) 1283 RELOC(hmt_thread_data)[i].pir = 0xdeadbeef; 1284 #endif 1285 /* look for cpus */ 1286 for (node = 0; prom_next_node(&node); ) { 1287 type[0] = 0; 1288 prom_getprop(node, "device_type", type, sizeof(type)); 1289 if (strcmp(type, RELOC("cpu")) != 0) 1290 continue; 1291 1292 /* Skip non-configured cpus. */ 1293 if (prom_getprop(node, "status", type, sizeof(type)) > 0) 1294 if (strcmp(type, RELOC("okay")) != 0) 1295 continue; 1296 1297 reg = -1; 1298 prom_getprop(node, "reg", ®, sizeof(reg)); 1299 1300 prom_debug("\ncpuid = 0x%x\n", cpuid); 1301 prom_debug("cpu hw idx = 0x%x\n", reg); 1302 1303 /* Init the acknowledge var which will be reset by 1304 * the secondary cpu when it awakens from its OF 1305 * spinloop. 1306 */ 1307 *acknowledge = (unsigned long)-1; 1308 1309 propsize = prom_getprop(node, "ibm,ppc-interrupt-server#s", 1310 &interrupt_server, 1311 sizeof(interrupt_server)); 1312 if (propsize < 0) { 1313 /* no property. old hardware has no SMT */ 1314 cpu_threads = 1; 1315 interrupt_server[0] = reg; /* fake it with phys id */ 1316 } else { 1317 /* We have a threaded processor */ 1318 cpu_threads = propsize / sizeof(u32); 1319 if (cpu_threads > MAX_CPU_THREADS) { 1320 prom_printf("SMT: too many threads!\n" 1321 "SMT: found %x, max is %x\n", 1322 cpu_threads, MAX_CPU_THREADS); 1323 cpu_threads = 1; /* ToDo: panic? */ 1324 } 1325 } 1326 1327 hw_cpu_num = interrupt_server[0]; 1328 if (hw_cpu_num != _prom->cpu) { 1329 /* Primary Thread of non-boot cpu */ 1330 prom_printf("%x : starting cpu hw idx %x... ", cpuid, reg); 1331 call_prom("start-cpu", 3, 0, node, 1332 secondary_hold, reg); 1333 1334 for (i = 0; (i < 100000000) && 1335 (*acknowledge == ((unsigned long)-1)); i++ ) 1336 mb(); 1337 1338 if (*acknowledge == reg) 1339 prom_printf("done\n"); 1340 else 1341 prom_printf("failed: %x\n", *acknowledge); 1342 } 1343 #ifdef CONFIG_SMP 1344 else 1345 prom_printf("%x : boot cpu %x\n", cpuid, reg); 1346 #endif /* CONFIG_SMP */ 1347 1348 /* Reserve cpu #s for secondary threads. They start later. */ 1349 cpuid += cpu_threads; 1350 } 1351 #ifdef CONFIG_HMT 1352 /* Only enable HMT on processors that provide support. */ 1353 if (__is_processor(PV_PULSAR) || 1354 __is_processor(PV_ICESTAR) || 1355 __is_processor(PV_SSTAR)) { 1356 prom_printf(" starting secondary threads\n"); 1357 1358 for (i = 0; i < NR_CPUS; i += 2) { 1359 if (!cpu_online(i)) 1360 continue; 1361 1362 if (i == 0) { 1363 unsigned long pir = mfspr(SPRN_PIR); 1364 if (__is_processor(PV_PULSAR)) { 1365 RELOC(hmt_thread_data)[i].pir = 1366 pir & 0x1f; 1367 } else { 1368 RELOC(hmt_thread_data)[i].pir = 1369 pir & 0x3ff; 1370 } 1371 } 1372 } 1373 } else { 1374 prom_printf("Processor is not HMT capable\n"); 1375 } 1376 #endif 1377 1378 if (cpuid > NR_CPUS) 1379 prom_printf("WARNING: maximum CPUs (" __stringify(NR_CPUS) 1380 ") exceeded: ignoring extras\n"); 1381 1382 prom_debug("prom_hold_cpus: end...\n"); 1383 } 1384 1385 1386 static void __init prom_init_client_services(unsigned long pp) 1387 { 1388 struct prom_t *_prom = &RELOC(prom); 1389 1390 /* Get a handle to the prom entry point before anything else */ 1391 RELOC(prom_entry) = pp; 1392 1393 /* get a handle for the stdout device */ 1394 _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen")); 1395 if (!PHANDLE_VALID(_prom->chosen)) 1396 prom_panic("cannot find chosen"); /* msg won't be printed :( */ 1397 1398 /* get device tree root */ 1399 _prom->root = call_prom("finddevice", 1, 1, ADDR("/")); 1400 if (!PHANDLE_VALID(_prom->root)) 1401 prom_panic("cannot find device tree root"); /* msg won't be printed :( */ 1402 1403 _prom->mmumap = 0; 1404 } 1405 1406 #ifdef CONFIG_PPC32 1407 /* 1408 * For really old powermacs, we need to map things we claim. 1409 * For that, we need the ihandle of the mmu. 1410 * Also, on the longtrail, we need to work around other bugs. 1411 */ 1412 static void __init prom_find_mmu(void) 1413 { 1414 struct prom_t *_prom = &RELOC(prom); 1415 phandle oprom; 1416 char version[64]; 1417 1418 oprom = call_prom("finddevice", 1, 1, ADDR("/openprom")); 1419 if (!PHANDLE_VALID(oprom)) 1420 return; 1421 if (prom_getprop(oprom, "model", version, sizeof(version)) <= 0) 1422 return; 1423 version[sizeof(version) - 1] = 0; 1424 /* XXX might need to add other versions here */ 1425 if (strcmp(version, "Open Firmware, 1.0.5") == 0) 1426 of_workarounds = OF_WA_CLAIM; 1427 else if (strncmp(version, "FirmWorks,3.", 12) == 0) { 1428 of_workarounds = OF_WA_CLAIM | OF_WA_LONGTRAIL; 1429 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim"); 1430 } else 1431 return; 1432 _prom->memory = call_prom("open", 1, 1, ADDR("/memory")); 1433 prom_getprop(_prom->chosen, "mmu", &_prom->mmumap, 1434 sizeof(_prom->mmumap)); 1435 if (!IHANDLE_VALID(_prom->memory) || !IHANDLE_VALID(_prom->mmumap)) 1436 of_workarounds &= ~OF_WA_CLAIM; /* hmmm */ 1437 } 1438 #else 1439 #define prom_find_mmu() 1440 #endif 1441 1442 static void __init prom_init_stdout(void) 1443 { 1444 struct prom_t *_prom = &RELOC(prom); 1445 char *path = RELOC(of_stdout_device); 1446 char type[16]; 1447 u32 val; 1448 1449 if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0) 1450 prom_panic("cannot find stdout"); 1451 1452 _prom->stdout = val; 1453 1454 /* Get the full OF pathname of the stdout device */ 1455 memset(path, 0, 256); 1456 call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255); 1457 val = call_prom("instance-to-package", 1, 1, _prom->stdout); 1458 prom_setprop(_prom->chosen, "/chosen", "linux,stdout-package", 1459 &val, sizeof(val)); 1460 prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device)); 1461 prom_setprop(_prom->chosen, "/chosen", "linux,stdout-path", 1462 path, strlen(path) + 1); 1463 1464 /* If it's a display, note it */ 1465 memset(type, 0, sizeof(type)); 1466 prom_getprop(val, "device_type", type, sizeof(type)); 1467 if (strcmp(type, RELOC("display")) == 0) 1468 prom_setprop(val, path, "linux,boot-display", NULL, 0); 1469 } 1470 1471 static void __init prom_close_stdin(void) 1472 { 1473 struct prom_t *_prom = &RELOC(prom); 1474 ihandle val; 1475 1476 if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0) 1477 call_prom("close", 1, 0, val); 1478 } 1479 1480 static int __init prom_find_machine_type(void) 1481 { 1482 struct prom_t *_prom = &RELOC(prom); 1483 char compat[256]; 1484 int len, i = 0; 1485 #ifdef CONFIG_PPC64 1486 phandle rtas; 1487 #endif 1488 len = prom_getprop(_prom->root, "compatible", 1489 compat, sizeof(compat)-1); 1490 if (len > 0) { 1491 compat[len] = 0; 1492 while (i < len) { 1493 char *p = &compat[i]; 1494 int sl = strlen(p); 1495 if (sl == 0) 1496 break; 1497 if (strstr(p, RELOC("Power Macintosh")) || 1498 strstr(p, RELOC("MacRISC"))) 1499 return PLATFORM_POWERMAC; 1500 #ifdef CONFIG_PPC64 1501 if (strstr(p, RELOC("Momentum,Maple"))) 1502 return PLATFORM_MAPLE; 1503 #endif 1504 i += sl + 1; 1505 } 1506 } 1507 #ifdef CONFIG_PPC64 1508 /* Default to pSeries. We need to know if we are running LPAR */ 1509 rtas = call_prom("finddevice", 1, 1, ADDR("/rtas")); 1510 if (PHANDLE_VALID(rtas)) { 1511 int x = prom_getproplen(rtas, "ibm,hypertas-functions"); 1512 if (x != PROM_ERROR) { 1513 prom_printf("Hypertas detected, assuming LPAR !\n"); 1514 return PLATFORM_PSERIES_LPAR; 1515 } 1516 } 1517 return PLATFORM_PSERIES; 1518 #else 1519 return PLATFORM_CHRP; 1520 #endif 1521 } 1522 1523 static int __init prom_set_color(ihandle ih, int i, int r, int g, int b) 1524 { 1525 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r); 1526 } 1527 1528 /* 1529 * If we have a display that we don't know how to drive, 1530 * we will want to try to execute OF's open method for it 1531 * later. However, OF will probably fall over if we do that 1532 * we've taken over the MMU. 1533 * So we check whether we will need to open the display, 1534 * and if so, open it now. 1535 */ 1536 static void __init prom_check_displays(void) 1537 { 1538 char type[16], *path; 1539 phandle node; 1540 ihandle ih; 1541 int i; 1542 1543 static unsigned char default_colors[] = { 1544 0x00, 0x00, 0x00, 1545 0x00, 0x00, 0xaa, 1546 0x00, 0xaa, 0x00, 1547 0x00, 0xaa, 0xaa, 1548 0xaa, 0x00, 0x00, 1549 0xaa, 0x00, 0xaa, 1550 0xaa, 0xaa, 0x00, 1551 0xaa, 0xaa, 0xaa, 1552 0x55, 0x55, 0x55, 1553 0x55, 0x55, 0xff, 1554 0x55, 0xff, 0x55, 1555 0x55, 0xff, 0xff, 1556 0xff, 0x55, 0x55, 1557 0xff, 0x55, 0xff, 1558 0xff, 0xff, 0x55, 1559 0xff, 0xff, 0xff 1560 }; 1561 const unsigned char *clut; 1562 1563 prom_printf("Looking for displays\n"); 1564 for (node = 0; prom_next_node(&node); ) { 1565 memset(type, 0, sizeof(type)); 1566 prom_getprop(node, "device_type", type, sizeof(type)); 1567 if (strcmp(type, RELOC("display")) != 0) 1568 continue; 1569 1570 /* It seems OF doesn't null-terminate the path :-( */ 1571 path = RELOC(prom_scratch); 1572 memset(path, 0, PROM_SCRATCH_SIZE); 1573 1574 /* 1575 * leave some room at the end of the path for appending extra 1576 * arguments 1577 */ 1578 if (call_prom("package-to-path", 3, 1, node, path, 1579 PROM_SCRATCH_SIZE-10) == PROM_ERROR) 1580 continue; 1581 prom_printf("found display : %s, opening ... ", path); 1582 1583 ih = call_prom("open", 1, 1, path); 1584 if (ih == 0) { 1585 prom_printf("failed\n"); 1586 continue; 1587 } 1588 1589 /* Success */ 1590 prom_printf("done\n"); 1591 prom_setprop(node, path, "linux,opened", NULL, 0); 1592 1593 /* Setup a usable color table when the appropriate 1594 * method is available. Should update this to set-colors */ 1595 clut = RELOC(default_colors); 1596 for (i = 0; i < 32; i++, clut += 3) 1597 if (prom_set_color(ih, i, clut[0], clut[1], 1598 clut[2]) != 0) 1599 break; 1600 1601 #ifdef CONFIG_LOGO_LINUX_CLUT224 1602 clut = PTRRELOC(RELOC(logo_linux_clut224.clut)); 1603 for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3) 1604 if (prom_set_color(ih, i + 32, clut[0], clut[1], 1605 clut[2]) != 0) 1606 break; 1607 #endif /* CONFIG_LOGO_LINUX_CLUT224 */ 1608 } 1609 } 1610 1611 1612 /* Return (relocated) pointer to this much memory: moves initrd if reqd. */ 1613 static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end, 1614 unsigned long needed, unsigned long align) 1615 { 1616 void *ret; 1617 1618 *mem_start = _ALIGN(*mem_start, align); 1619 while ((*mem_start + needed) > *mem_end) { 1620 unsigned long room, chunk; 1621 1622 prom_debug("Chunk exhausted, claiming more at %x...\n", 1623 RELOC(alloc_bottom)); 1624 room = RELOC(alloc_top) - RELOC(alloc_bottom); 1625 if (room > DEVTREE_CHUNK_SIZE) 1626 room = DEVTREE_CHUNK_SIZE; 1627 if (room < PAGE_SIZE) 1628 prom_panic("No memory for flatten_device_tree (no room)"); 1629 chunk = alloc_up(room, 0); 1630 if (chunk == 0) 1631 prom_panic("No memory for flatten_device_tree (claim failed)"); 1632 *mem_end = RELOC(alloc_top); 1633 } 1634 1635 ret = (void *)*mem_start; 1636 *mem_start += needed; 1637 1638 return ret; 1639 } 1640 1641 #define dt_push_token(token, mem_start, mem_end) \ 1642 do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0) 1643 1644 static unsigned long __init dt_find_string(char *str) 1645 { 1646 char *s, *os; 1647 1648 s = os = (char *)RELOC(dt_string_start); 1649 s += 4; 1650 while (s < (char *)RELOC(dt_string_end)) { 1651 if (strcmp(s, str) == 0) 1652 return s - os; 1653 s += strlen(s) + 1; 1654 } 1655 return 0; 1656 } 1657 1658 /* 1659 * The Open Firmware 1275 specification states properties must be 31 bytes or 1660 * less, however not all firmwares obey this. Make it 64 bytes to be safe. 1661 */ 1662 #define MAX_PROPERTY_NAME 64 1663 1664 static void __init scan_dt_build_strings(phandle node, 1665 unsigned long *mem_start, 1666 unsigned long *mem_end) 1667 { 1668 char *prev_name, *namep, *sstart; 1669 unsigned long soff; 1670 phandle child; 1671 1672 sstart = (char *)RELOC(dt_string_start); 1673 1674 /* get and store all property names */ 1675 prev_name = RELOC(""); 1676 for (;;) { 1677 /* 64 is max len of name including nul. */ 1678 namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1); 1679 if (call_prom("nextprop", 3, 1, node, prev_name, namep) != 1) { 1680 /* No more nodes: unwind alloc */ 1681 *mem_start = (unsigned long)namep; 1682 break; 1683 } 1684 1685 /* skip "name" */ 1686 if (strcmp(namep, RELOC("name")) == 0) { 1687 *mem_start = (unsigned long)namep; 1688 prev_name = RELOC("name"); 1689 continue; 1690 } 1691 /* get/create string entry */ 1692 soff = dt_find_string(namep); 1693 if (soff != 0) { 1694 *mem_start = (unsigned long)namep; 1695 namep = sstart + soff; 1696 } else { 1697 /* Trim off some if we can */ 1698 *mem_start = (unsigned long)namep + strlen(namep) + 1; 1699 RELOC(dt_string_end) = *mem_start; 1700 } 1701 prev_name = namep; 1702 } 1703 1704 /* do all our children */ 1705 child = call_prom("child", 1, 1, node); 1706 while (child != 0) { 1707 scan_dt_build_strings(child, mem_start, mem_end); 1708 child = call_prom("peer", 1, 1, child); 1709 } 1710 } 1711 1712 static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start, 1713 unsigned long *mem_end) 1714 { 1715 phandle child; 1716 char *namep, *prev_name, *sstart, *p, *ep, *lp, *path; 1717 unsigned long soff; 1718 unsigned char *valp; 1719 static char pname[MAX_PROPERTY_NAME]; 1720 int l, room; 1721 1722 dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end); 1723 1724 /* get the node's full name */ 1725 namep = (char *)*mem_start; 1726 room = *mem_end - *mem_start; 1727 if (room > 255) 1728 room = 255; 1729 l = call_prom("package-to-path", 3, 1, node, namep, room); 1730 if (l >= 0) { 1731 /* Didn't fit? Get more room. */ 1732 if (l >= room) { 1733 if (l >= *mem_end - *mem_start) 1734 namep = make_room(mem_start, mem_end, l+1, 1); 1735 call_prom("package-to-path", 3, 1, node, namep, l); 1736 } 1737 namep[l] = '\0'; 1738 1739 /* Fixup an Apple bug where they have bogus \0 chars in the 1740 * middle of the path in some properties, and extract 1741 * the unit name (everything after the last '/'). 1742 */ 1743 for (lp = p = namep, ep = namep + l; p < ep; p++) { 1744 if (*p == '/') 1745 lp = namep; 1746 else if (*p != 0) 1747 *lp++ = *p; 1748 } 1749 *lp = 0; 1750 *mem_start = _ALIGN((unsigned long)lp + 1, 4); 1751 } 1752 1753 /* get it again for debugging */ 1754 path = RELOC(prom_scratch); 1755 memset(path, 0, PROM_SCRATCH_SIZE); 1756 call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1); 1757 1758 /* get and store all properties */ 1759 prev_name = RELOC(""); 1760 sstart = (char *)RELOC(dt_string_start); 1761 for (;;) { 1762 if (call_prom("nextprop", 3, 1, node, prev_name, 1763 RELOC(pname)) != 1) 1764 break; 1765 1766 /* skip "name" */ 1767 if (strcmp(RELOC(pname), RELOC("name")) == 0) { 1768 prev_name = RELOC("name"); 1769 continue; 1770 } 1771 1772 /* find string offset */ 1773 soff = dt_find_string(RELOC(pname)); 1774 if (soff == 0) { 1775 prom_printf("WARNING: Can't find string index for" 1776 " <%s>, node %s\n", RELOC(pname), path); 1777 break; 1778 } 1779 prev_name = sstart + soff; 1780 1781 /* get length */ 1782 l = call_prom("getproplen", 2, 1, node, RELOC(pname)); 1783 1784 /* sanity checks */ 1785 if (l == PROM_ERROR) 1786 continue; 1787 if (l > MAX_PROPERTY_LENGTH) { 1788 prom_printf("WARNING: ignoring large property "); 1789 /* It seems OF doesn't null-terminate the path :-( */ 1790 prom_printf("[%s] ", path); 1791 prom_printf("%s length 0x%x\n", RELOC(pname), l); 1792 continue; 1793 } 1794 1795 /* push property head */ 1796 dt_push_token(OF_DT_PROP, mem_start, mem_end); 1797 dt_push_token(l, mem_start, mem_end); 1798 dt_push_token(soff, mem_start, mem_end); 1799 1800 /* push property content */ 1801 valp = make_room(mem_start, mem_end, l, 4); 1802 call_prom("getprop", 4, 1, node, RELOC(pname), valp, l); 1803 *mem_start = _ALIGN(*mem_start, 4); 1804 } 1805 1806 /* Add a "linux,phandle" property. */ 1807 soff = dt_find_string(RELOC("linux,phandle")); 1808 if (soff == 0) 1809 prom_printf("WARNING: Can't find string index for" 1810 " <linux-phandle> node %s\n", path); 1811 else { 1812 dt_push_token(OF_DT_PROP, mem_start, mem_end); 1813 dt_push_token(4, mem_start, mem_end); 1814 dt_push_token(soff, mem_start, mem_end); 1815 valp = make_room(mem_start, mem_end, 4, 4); 1816 *(u32 *)valp = node; 1817 } 1818 1819 /* do all our children */ 1820 child = call_prom("child", 1, 1, node); 1821 while (child != 0) { 1822 scan_dt_build_struct(child, mem_start, mem_end); 1823 child = call_prom("peer", 1, 1, child); 1824 } 1825 1826 dt_push_token(OF_DT_END_NODE, mem_start, mem_end); 1827 } 1828 1829 static void __init flatten_device_tree(void) 1830 { 1831 phandle root; 1832 unsigned long mem_start, mem_end, room; 1833 struct boot_param_header *hdr; 1834 struct prom_t *_prom = &RELOC(prom); 1835 char *namep; 1836 u64 *rsvmap; 1837 1838 /* 1839 * Check how much room we have between alloc top & bottom (+/- a 1840 * few pages), crop to 4Mb, as this is our "chuck" size 1841 */ 1842 room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000; 1843 if (room > DEVTREE_CHUNK_SIZE) 1844 room = DEVTREE_CHUNK_SIZE; 1845 prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom)); 1846 1847 /* Now try to claim that */ 1848 mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); 1849 if (mem_start == 0) 1850 prom_panic("Can't allocate initial device-tree chunk\n"); 1851 mem_end = RELOC(alloc_top); 1852 1853 /* Get root of tree */ 1854 root = call_prom("peer", 1, 1, (phandle)0); 1855 if (root == (phandle)0) 1856 prom_panic ("couldn't get device tree root\n"); 1857 1858 /* Build header and make room for mem rsv map */ 1859 mem_start = _ALIGN(mem_start, 4); 1860 hdr = make_room(&mem_start, &mem_end, 1861 sizeof(struct boot_param_header), 4); 1862 RELOC(dt_header_start) = (unsigned long)hdr; 1863 rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8); 1864 1865 /* Start of strings */ 1866 mem_start = PAGE_ALIGN(mem_start); 1867 RELOC(dt_string_start) = mem_start; 1868 mem_start += 4; /* hole */ 1869 1870 /* Add "linux,phandle" in there, we'll need it */ 1871 namep = make_room(&mem_start, &mem_end, 16, 1); 1872 strcpy(namep, RELOC("linux,phandle")); 1873 mem_start = (unsigned long)namep + strlen(namep) + 1; 1874 1875 /* Build string array */ 1876 prom_printf("Building dt strings...\n"); 1877 scan_dt_build_strings(root, &mem_start, &mem_end); 1878 RELOC(dt_string_end) = mem_start; 1879 1880 /* Build structure */ 1881 mem_start = PAGE_ALIGN(mem_start); 1882 RELOC(dt_struct_start) = mem_start; 1883 prom_printf("Building dt structure...\n"); 1884 scan_dt_build_struct(root, &mem_start, &mem_end); 1885 dt_push_token(OF_DT_END, &mem_start, &mem_end); 1886 RELOC(dt_struct_end) = PAGE_ALIGN(mem_start); 1887 1888 /* Finish header */ 1889 hdr->boot_cpuid_phys = _prom->cpu; 1890 hdr->magic = OF_DT_HEADER; 1891 hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start); 1892 hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start); 1893 hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start); 1894 hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start); 1895 hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start); 1896 hdr->version = OF_DT_VERSION; 1897 /* Version 16 is not backward compatible */ 1898 hdr->last_comp_version = 0x10; 1899 1900 /* Reserve the whole thing and copy the reserve map in, we 1901 * also bump mem_reserve_cnt to cause further reservations to 1902 * fail since it's too late. 1903 */ 1904 reserve_mem(RELOC(dt_header_start), hdr->totalsize); 1905 memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map)); 1906 1907 #ifdef DEBUG_PROM 1908 { 1909 int i; 1910 prom_printf("reserved memory map:\n"); 1911 for (i = 0; i < RELOC(mem_reserve_cnt); i++) 1912 prom_printf(" %x - %x\n", 1913 RELOC(mem_reserve_map)[i].base, 1914 RELOC(mem_reserve_map)[i].size); 1915 } 1916 #endif 1917 RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE; 1918 1919 prom_printf("Device tree strings 0x%x -> 0x%x\n", 1920 RELOC(dt_string_start), RELOC(dt_string_end)); 1921 prom_printf("Device tree struct 0x%x -> 0x%x\n", 1922 RELOC(dt_struct_start), RELOC(dt_struct_end)); 1923 1924 } 1925 1926 1927 static void __init fixup_device_tree(void) 1928 { 1929 #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC) 1930 phandle u3, i2c, mpic; 1931 u32 u3_rev; 1932 u32 interrupts[2]; 1933 u32 parent; 1934 1935 /* Some G5s have a missing interrupt definition, fix it up here */ 1936 u3 = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000")); 1937 if (!PHANDLE_VALID(u3)) 1938 return; 1939 i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000")); 1940 if (!PHANDLE_VALID(i2c)) 1941 return; 1942 mpic = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/mpic@f8040000")); 1943 if (!PHANDLE_VALID(mpic)) 1944 return; 1945 1946 /* check if proper rev of u3 */ 1947 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev)) 1948 == PROM_ERROR) 1949 return; 1950 if (u3_rev < 0x35 || u3_rev > 0x39) 1951 return; 1952 /* does it need fixup ? */ 1953 if (prom_getproplen(i2c, "interrupts") > 0) 1954 return; 1955 1956 prom_printf("fixing up bogus interrupts for u3 i2c...\n"); 1957 1958 /* interrupt on this revision of u3 is number 0 and level */ 1959 interrupts[0] = 0; 1960 interrupts[1] = 1; 1961 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts", 1962 &interrupts, sizeof(interrupts)); 1963 parent = (u32)mpic; 1964 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent", 1965 &parent, sizeof(parent)); 1966 #endif 1967 } 1968 1969 1970 static void __init prom_find_boot_cpu(void) 1971 { 1972 struct prom_t *_prom = &RELOC(prom); 1973 u32 getprop_rval; 1974 ihandle prom_cpu; 1975 phandle cpu_pkg; 1976 1977 _prom->cpu = 0; 1978 if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0) 1979 return; 1980 1981 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); 1982 1983 prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval)); 1984 _prom->cpu = getprop_rval; 1985 1986 prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu); 1987 } 1988 1989 static void __init prom_check_initrd(unsigned long r3, unsigned long r4) 1990 { 1991 #ifdef CONFIG_BLK_DEV_INITRD 1992 struct prom_t *_prom = &RELOC(prom); 1993 1994 if (r3 && r4 && r4 != 0xdeadbeef) { 1995 unsigned long val; 1996 1997 RELOC(prom_initrd_start) = (r3 >= KERNELBASE) ? __pa(r3) : r3; 1998 RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4; 1999 2000 val = RELOC(prom_initrd_start); 2001 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start", 2002 &val, sizeof(val)); 2003 val = RELOC(prom_initrd_end); 2004 prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end", 2005 &val, sizeof(val)); 2006 2007 reserve_mem(RELOC(prom_initrd_start), 2008 RELOC(prom_initrd_end) - RELOC(prom_initrd_start)); 2009 2010 prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start)); 2011 prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end)); 2012 } 2013 #endif /* CONFIG_BLK_DEV_INITRD */ 2014 } 2015 2016 /* 2017 * We enter here early on, when the Open Firmware prom is still 2018 * handling exceptions and the MMU hash table for us. 2019 */ 2020 2021 unsigned long __init prom_init(unsigned long r3, unsigned long r4, 2022 unsigned long pp, 2023 unsigned long r6, unsigned long r7) 2024 { 2025 struct prom_t *_prom; 2026 unsigned long hdr; 2027 u32 getprop_rval; 2028 unsigned long offset = reloc_offset(); 2029 2030 #ifdef CONFIG_PPC32 2031 reloc_got2(offset); 2032 #endif 2033 2034 _prom = &RELOC(prom); 2035 2036 /* 2037 * First zero the BSS 2038 */ 2039 memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start); 2040 2041 /* 2042 * Init interface to Open Firmware, get some node references, 2043 * like /chosen 2044 */ 2045 prom_init_client_services(pp); 2046 2047 /* 2048 * See if this OF is old enough that we need to do explicit maps 2049 * and other workarounds 2050 */ 2051 prom_find_mmu(); 2052 2053 /* 2054 * Init prom stdout device 2055 */ 2056 prom_init_stdout(); 2057 2058 /* 2059 * Check for an initrd 2060 */ 2061 prom_check_initrd(r3, r4); 2062 2063 /* 2064 * Get default machine type. At this point, we do not differentiate 2065 * between pSeries SMP and pSeries LPAR 2066 */ 2067 RELOC(of_platform) = prom_find_machine_type(); 2068 getprop_rval = RELOC(of_platform); 2069 prom_setprop(_prom->chosen, "/chosen", "linux,platform", 2070 &getprop_rval, sizeof(getprop_rval)); 2071 2072 #ifdef CONFIG_PPC_PSERIES 2073 /* 2074 * On pSeries, inform the firmware about our capabilities 2075 */ 2076 if (RELOC(of_platform) == PLATFORM_PSERIES || 2077 RELOC(of_platform) == PLATFORM_PSERIES_LPAR) 2078 prom_send_capabilities(); 2079 #endif 2080 2081 /* 2082 * Copy the CPU hold code 2083 */ 2084 if (RELOC(of_platform) != PLATFORM_POWERMAC) 2085 copy_and_flush(0, KERNELBASE + offset, 0x100, 0); 2086 2087 /* 2088 * Do early parsing of command line 2089 */ 2090 early_cmdline_parse(); 2091 2092 /* 2093 * Initialize memory management within prom_init 2094 */ 2095 prom_init_mem(); 2096 2097 /* 2098 * Determine which cpu is actually running right _now_ 2099 */ 2100 prom_find_boot_cpu(); 2101 2102 /* 2103 * Initialize display devices 2104 */ 2105 prom_check_displays(); 2106 2107 #ifdef CONFIG_PPC64 2108 /* 2109 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else 2110 * that uses the allocator, we need to make sure we get the top of memory 2111 * available for us here... 2112 */ 2113 if (RELOC(of_platform) == PLATFORM_PSERIES) 2114 prom_initialize_tce_table(); 2115 #endif 2116 2117 /* 2118 * On non-powermacs, try to instantiate RTAS and puts all CPUs 2119 * in spin-loops. PowerMacs don't have a working RTAS and use 2120 * a different way to spin CPUs 2121 */ 2122 if (RELOC(of_platform) != PLATFORM_POWERMAC) { 2123 prom_instantiate_rtas(); 2124 prom_hold_cpus(); 2125 } 2126 2127 /* 2128 * Fill in some infos for use by the kernel later on 2129 */ 2130 if (RELOC(prom_memory_limit)) 2131 prom_setprop(_prom->chosen, "/chosen", "linux,memory-limit", 2132 &RELOC(prom_memory_limit), 2133 sizeof(prom_memory_limit)); 2134 #ifdef CONFIG_PPC64 2135 if (RELOC(ppc64_iommu_off)) 2136 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off", 2137 NULL, 0); 2138 2139 if (RELOC(iommu_force_on)) 2140 prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on", 2141 NULL, 0); 2142 2143 if (RELOC(prom_tce_alloc_start)) { 2144 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start", 2145 &RELOC(prom_tce_alloc_start), 2146 sizeof(prom_tce_alloc_start)); 2147 prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end", 2148 &RELOC(prom_tce_alloc_end), 2149 sizeof(prom_tce_alloc_end)); 2150 } 2151 #endif 2152 2153 /* 2154 * Fixup any known bugs in the device-tree 2155 */ 2156 fixup_device_tree(); 2157 2158 /* 2159 * Now finally create the flattened device-tree 2160 */ 2161 prom_printf("copying OF device tree ...\n"); 2162 flatten_device_tree(); 2163 2164 /* 2165 * in case stdin is USB and still active on IBM machines... 2166 * Unfortunately quiesce crashes on some powermacs if we have 2167 * closed stdin already (in particular the powerbook 101). 2168 */ 2169 if (RELOC(of_platform) != PLATFORM_POWERMAC) 2170 prom_close_stdin(); 2171 2172 /* 2173 * Call OF "quiesce" method to shut down pending DMA's from 2174 * devices etc... 2175 */ 2176 prom_printf("Calling quiesce ...\n"); 2177 call_prom("quiesce", 0, 0); 2178 2179 /* 2180 * And finally, call the kernel passing it the flattened device 2181 * tree and NULL as r5, thus triggering the new entry point which 2182 * is common to us and kexec 2183 */ 2184 hdr = RELOC(dt_header_start); 2185 prom_printf("returning from prom_init\n"); 2186 prom_debug("->dt_header_start=0x%x\n", hdr); 2187 2188 #ifdef CONFIG_PPC32 2189 reloc_got2(-offset); 2190 #endif 2191 2192 __start(hdr, KERNELBASE + offset, 0); 2193 2194 return 0; 2195 } 2196