prom.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:55k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.prom.c 1.48 12/19/01 10:50:58 paulus
  3.  */
  4. /*
  5.  * Procedures for interfacing to the Open Firmware PROM on
  6.  * Power Macintosh computers.
  7.  *
  8.  * In particular, we are interested in the device tree
  9.  * and in using some of its services (exit, write to stdout).
  10.  *
  11.  * Paul Mackerras August 1996.
  12.  * Copyright (C) 1996 Paul Mackerras.
  13.  */
  14. #include <stdarg.h>
  15. #include <linux/config.h>
  16. #include <linux/kernel.h>
  17. #include <linux/string.h>
  18. #include <linux/init.h>
  19. #include <linux/version.h>
  20. #include <linux/threads.h>
  21. #include <linux/spinlock.h>
  22. #include <linux/ioport.h>
  23. #include <linux/pci.h>
  24. #include <linux/slab.h>
  25. #include <asm/sections.h>
  26. #include <asm/prom.h>
  27. #include <asm/page.h>
  28. #include <asm/processor.h>
  29. #include <asm/irq.h>
  30. #include <asm/io.h>
  31. #include <asm/smp.h>
  32. #include <asm/bootx.h>
  33. #include <asm/system.h>
  34. #include <asm/mmu.h>
  35. #include <asm/pgtable.h>
  36. #include <asm/bitops.h>
  37. #include <asm/bootinfo.h>
  38. #include <asm/btext.h>
  39. #include <asm/pci-bridge.h>
  40. #include "open_pic.h"
  41. #ifdef CONFIG_FB
  42. #include <asm/linux_logo.h>
  43. #endif
  44. /*
  45.  * Properties whose value is longer than this get excluded from our
  46.  * copy of the device tree.  This way we don't waste space storing
  47.  * things like "driver,AAPL,MacOS,PowerPC" properties.  But this value
  48.  * does need to be big enough to ensure that we don't lose things
  49.  * like the interrupt-map property on a PCI-PCI bridge.
  50.  */
  51. #define MAX_PROPERTY_LENGTH 4096
  52. struct prom_args {
  53. const char *service;
  54. int nargs;
  55. int nret;
  56. void *args[10];
  57. };
  58. struct pci_address {
  59. unsigned a_hi;
  60. unsigned a_mid;
  61. unsigned a_lo;
  62. };
  63. struct pci_reg_property {
  64. struct pci_address addr;
  65. unsigned size_hi;
  66. unsigned size_lo;
  67. };
  68. struct pci_range {
  69. struct pci_address addr;
  70. unsigned phys;
  71. unsigned size_hi;
  72. unsigned size_lo;
  73. };
  74. struct isa_reg_property {
  75. unsigned space;
  76. unsigned address;
  77. unsigned size;
  78. };
  79. struct pci_intr_map {
  80. struct pci_address addr;
  81. unsigned dunno;
  82. phandle int_ctrler;
  83. unsigned intr;
  84. };
  85. typedef unsigned long interpret_func(struct device_node *, unsigned long,
  86.      int, int);
  87. static interpret_func interpret_pci_props;
  88. static interpret_func interpret_dbdma_props;
  89. static interpret_func interpret_isa_props;
  90. static interpret_func interpret_macio_props;
  91. static interpret_func interpret_root_props;
  92. #ifndef FB_MAX /* avoid pulling in all of the fb stuff */
  93. #define FB_MAX 8
  94. #endif
  95. char *prom_display_paths[FB_MAX] __initdata = { 0, };
  96. phandle prom_display_nodes[FB_MAX] __initdata;
  97. unsigned int prom_num_displays __initdata = 0;
  98. char *of_stdout_device __initdata = 0;
  99. ihandle prom_disp_node __initdata = 0;
  100. prom_entry prom __initdata = 0;
  101. ihandle prom_chosen __initdata = 0;
  102. ihandle prom_stdout __initdata = 0;
  103. extern char *klimit;
  104. char *bootpath;
  105. char *bootdevice;
  106. unsigned int rtas_data;   /* physical pointer */
  107. unsigned int rtas_entry;  /* physical pointer */
  108. unsigned int rtas_size;
  109. unsigned int old_rtas;
  110. /* Set for a newworld or CHRP machine */
  111. int use_of_interrupt_tree;
  112. struct device_node *dflt_interrupt_controller;
  113. int num_interrupt_controllers;
  114. int pmac_newworld;
  115. static struct device_node *allnodes;
  116. static void *call_prom(const char *service, int nargs, int nret, ...);
  117. static void prom_exit(void);
  118. static unsigned long copy_device_tree(unsigned long, unsigned long);
  119. static unsigned long inspect_node(phandle, struct device_node *, unsigned long,
  120.   unsigned long, struct device_node ***);
  121. static unsigned long finish_node(struct device_node *, unsigned long,
  122.  interpret_func *, int, int);
  123. static unsigned long finish_node_interrupts(struct device_node *, unsigned long);
  124. static unsigned long check_display(unsigned long);
  125. static int prom_next_node(phandle *);
  126. static void *early_get_property(unsigned long, unsigned long, char *);
  127. static struct device_node *find_phandle(phandle);
  128. #ifdef CONFIG_BOOTX_TEXT
  129. static void setup_disp_fake_bi(ihandle dp);
  130. #endif
  131. extern void enter_rtas(void *);
  132. void phys_call_rtas(int, int, int, ...);
  133. extern char cmd_line[512]; /* XXX */
  134. boot_infos_t *boot_infos;
  135. unsigned long dev_tree_size;
  136. #define ALIGN(x) (((x) + sizeof(unsigned long)-1) & -sizeof(unsigned long))
  137. /* Is boot-info compatible ? */
  138. #define BOOT_INFO_IS_COMPATIBLE(bi) ((bi)->compatible_version <= BOOT_INFO_VERSION)
  139. #define BOOT_INFO_IS_V2_COMPATIBLE(bi) ((bi)->version >= 2)
  140. #define BOOT_INFO_IS_V4_COMPATIBLE(bi) ((bi)->version >= 4)
  141. /*
  142.  * Note that prom_init() and anything called from prom_init() must
  143.  * use the RELOC/PTRRELOC macros to access any static data in
  144.  * memory, since the kernel may be running at an address that is
  145.  * different from the address that it was linked at.
  146.  * (Note that strings count as static variables.)
  147.  */
  148. static void __init
  149. prom_exit()
  150. {
  151. struct prom_args args;
  152. unsigned long offset = reloc_offset();
  153. args.service = "exit";
  154. args.nargs = 0;
  155. args.nret = 0;
  156. RELOC(prom)(&args);
  157. for (;;) /* should never get here */
  158. ;
  159. }
  160. void __init
  161. prom_enter(void)
  162. {
  163. struct prom_args args;
  164. unsigned long offset = reloc_offset();
  165. args.service = RELOC("enter");
  166. args.nargs = 0;
  167. args.nret = 0;
  168. RELOC(prom)(&args);
  169. }
  170. static void * __init
  171. call_prom(const char *service, int nargs, int nret, ...)
  172. {
  173. va_list list;
  174. int i;
  175. unsigned long offset = reloc_offset();
  176. struct prom_args prom_args;
  177. prom_args.service = service;
  178. prom_args.nargs = nargs;
  179. prom_args.nret = nret;
  180. va_start(list, nret);
  181. for (i = 0; i < nargs; ++i)
  182. prom_args.args[i] = va_arg(list, void *);
  183. va_end(list);
  184. for (i = 0; i < nret; ++i)
  185. prom_args.args[i + nargs] = 0;
  186. RELOC(prom)(&prom_args);
  187. return prom_args.args[nargs];
  188. }
  189. void __init
  190. prom_print(const char *msg)
  191. {
  192. const char *p, *q;
  193. unsigned long offset = reloc_offset();
  194. if (RELOC(prom_stdout) == 0)
  195. return;
  196. for (p = msg; *p != 0; p = q) {
  197. for (q = p; *q != 0 && *q != 'n'; ++q)
  198. ;
  199. if (q > p)
  200. call_prom(RELOC("write"), 3, 1, RELOC(prom_stdout),
  201.   p, q - p);
  202. if (*q != 0) {
  203. ++q;
  204. call_prom(RELOC("write"), 3, 1, RELOC(prom_stdout),
  205.   RELOC("rn"), 2);
  206. }
  207. }
  208. }
  209. static void __init
  210. prom_print_hex(unsigned int v)
  211. {
  212. char buf[16];
  213. int i, c;
  214. for (i = 0; i < 8; ++i) {
  215. c = (v >> ((7-i)*4)) & 0xf;
  216. c += (c >= 10)? ('a' - 10): '0';
  217. buf[i] = c;
  218. }
  219. buf[i] = ' ';
  220. buf[i+1] = 0;
  221. prom_print(buf);
  222. }
  223. unsigned long smp_chrp_cpu_nr __initdata = 0;
  224. #ifdef CONFIG_SMP
  225. /*
  226.  * With CHRP SMP we need to use the OF to start the other
  227.  * processors so we can't wait until smp_boot_cpus (the OF is
  228.  * trashed by then) so we have to put the processors into
  229.  * a holding pattern controlled by the kernel (not OF) before
  230.  * we destroy the OF.
  231.  *
  232.  * This uses a chunk of high memory, puts some holding pattern
  233.  * code there and sends the other processors off to there until
  234.  * smp_boot_cpus tells them to do something.  We do that by using
  235.  * physical address 0x0.  The holding pattern checks that address
  236.  * until its cpu # is there, when it is that cpu jumps to
  237.  * __secondary_start().  smp_boot_cpus() takes care of setting those
  238.  * values.
  239.  *
  240.  * We also use physical address 0x4 here to tell when a cpu
  241.  * is in its holding pattern code.
  242.  *
  243.  * -- Cort
  244.  */
  245. static void __init
  246. prom_hold_cpus(unsigned long mem)
  247. {
  248. extern void __secondary_hold(void);
  249. unsigned long i;
  250. int cpu;
  251. phandle node;
  252. unsigned long offset = reloc_offset();
  253. char type[16], *path;
  254. unsigned int reg;
  255. /*
  256.  * XXX: hack to make sure we're chrp, assume that if we're
  257.  *      chrp we have a device_type property -- Cort
  258.  */
  259. node = call_prom(RELOC("finddevice"), 1, 1, RELOC("/"));
  260. if ( (int)call_prom(RELOC("getprop"), 4, 1, node,
  261.     RELOC("device_type"),type, sizeof(type)) <= 0)
  262. return;
  263. /* copy the holding pattern code to someplace safe (0) */
  264. /* the holding pattern is now within the first 0x100
  265.    bytes of the kernel image -- paulus */
  266. memcpy((void *)0, (void *)(KERNELBASE + offset), 0x100);
  267. flush_icache_range(0, 0x100);
  268. /* look for cpus */
  269. *(unsigned long *)(0x0) = 0;
  270. asm volatile("dcbf 0,%0": : "r" (0) : "memory");
  271. for (node = 0; prom_next_node(&node); ) {
  272. type[0] = 0;
  273. call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"),
  274.   type, sizeof(type));
  275. if (strcmp(type, RELOC("cpu")) != 0)
  276. continue;
  277. path = (char *) mem;
  278. memset(path, 0, 256);
  279. if ((int) call_prom(RELOC("package-to-path"), 3, 1,
  280.     node, path, 255) < 0)
  281. continue;
  282. reg = -1;
  283. call_prom(RELOC("getprop"), 4, 1, node, RELOC("reg"),
  284.   &reg, sizeof(reg));
  285. cpu = RELOC(smp_chrp_cpu_nr)++;
  286. RELOC(smp_hw_index)[cpu] = reg;
  287. /* XXX: hack - don't start cpu 0, this cpu -- Cort */
  288. if (cpu == 0)
  289. continue;
  290. prom_print(RELOC("starting cpu "));
  291. prom_print(path);
  292. *(ulong *)(0x4) = 0;
  293. call_prom(RELOC("start-cpu"), 3, 0, node,
  294.   __pa(__secondary_hold), cpu);
  295. prom_print(RELOC("..."));
  296. for ( i = 0 ; (i < 10000) && (*(ulong *)(0x4) == 0); i++ )
  297. ;
  298. if (*(ulong *)(0x4) == cpu)
  299. prom_print(RELOC("okn"));
  300. else {
  301. prom_print(RELOC("failed: "));
  302. prom_print_hex(*(ulong *)0x4);
  303. prom_print(RELOC("n"));
  304. }
  305. }
  306. }
  307. #endif /* CONFIG_SMP */
  308. void __init
  309. bootx_init(unsigned long r4, unsigned long phys)
  310. {
  311. boot_infos_t *bi = (boot_infos_t *) r4;
  312. unsigned long space;
  313. unsigned long ptr, x;
  314. char *model;
  315. unsigned long offset = reloc_offset();
  316. RELOC(boot_infos) = PTRUNRELOC(bi);
  317. if (!BOOT_INFO_IS_V2_COMPATIBLE(bi))
  318. bi->logicalDisplayBase = 0;
  319. #ifdef CONFIG_BOOTX_TEXT
  320. btext_init(bi);
  321. /*
  322.  * Test if boot-info is compatible.  Done only in config
  323.  * CONFIG_BOOTX_TEXT since there is nothing much we can do
  324.  * with an incompatible version, except display a message
  325.  * and eventually hang the processor...
  326.  *
  327.  * I'll try to keep enough of boot-info compatible in the
  328.  * future to always allow display of this message;
  329.  */
  330. if (!BOOT_INFO_IS_COMPATIBLE(bi)) {
  331. btext_drawstring(RELOC(" !!! WARNING - Incompatible version of BootX !!!nnn"));
  332. btext_flushscreen();
  333. }
  334. #endif /* CONFIG_BOOTX_TEXT */
  335. /* New BootX enters kernel with MMU off, i/os are not allowed
  336.    here. This hack will have been done by the boostrap anyway.
  337. */
  338. if (bi->version < 4) {
  339. /*
  340.  * XXX If this is an iMac, turn off the USB controller.
  341.  */
  342. model = (char *) early_get_property
  343. (r4 + bi->deviceTreeOffset, 4, RELOC("model"));
  344. if (model
  345.     && (strcmp(model, RELOC("iMac,1")) == 0
  346. || strcmp(model, RELOC("PowerMac1,1")) == 0)) {
  347. out_le32((unsigned *)0x80880008, 1); /* XXX */
  348. }
  349. }
  350. /* Move klimit to enclose device tree, args, ramdisk, etc... */
  351. if (bi->version < 5) {
  352. space = bi->deviceTreeOffset + bi->deviceTreeSize;
  353. if (bi->ramDisk)
  354. space = bi->ramDisk + bi->ramDiskSize;
  355. } else
  356. space = bi->totalParamsSize;
  357. RELOC(klimit) = PTRUNRELOC((char *) bi + space);
  358. /* New BootX will have flushed all TLBs and enters kernel with
  359.    MMU switched OFF, so this should not be useful anymore.
  360. */
  361. if (bi->version < 4) {
  362. /*
  363.  * Touch each page to make sure the PTEs for them
  364.  * are in the hash table - the aim is to try to avoid
  365.  * getting DSI exceptions while copying the kernel image.
  366.  */
  367. for (ptr = (KERNELBASE + offset) & PAGE_MASK;
  368.      ptr < (unsigned long)bi + space; ptr += PAGE_SIZE)
  369. x = *(volatile unsigned long *)ptr;
  370. }
  371. #ifdef CONFIG_BOOTX_TEXT
  372. /*
  373.  * Note that after we call prepare_disp_BAT, we can't do
  374.  * prom_draw*, flushscreen or clearscreen until we turn the MMU
  375.  * on, since prepare_disp_BAT sets disp_bi->logicalDisplayBase
  376.  * to a virtual address.
  377.  */
  378. btext_prepare_BAT();
  379. #endif
  380. }
  381. #ifdef CONFIG_PPC64BRIDGE
  382. /*
  383.  * Set up a hash table with a set of entries in it to map the
  384.  * first 64MB of RAM.  This is used on 64-bit machines since
  385.  * some of them don't have BATs.
  386.  * We assume the PTE will fit in the primary PTEG.
  387.  */
  388. static inline void make_pte(unsigned long htab, unsigned int hsize,
  389.     unsigned int va, unsigned int pa, int mode)
  390. {
  391. unsigned int *pteg;
  392. unsigned int hash, i, vsid;
  393. vsid = ((va >> 28) * 0x111) << 12;
  394. hash = ((va ^ vsid) >> 5) & 0x7fff80;
  395. pteg = (unsigned int *)(htab + (hash & (hsize - 1)));
  396. for (i = 0; i < 8; ++i, pteg += 4) {
  397. if ((pteg[1] & 1) == 0) {
  398. pteg[1] = vsid | ((va >> 16) & 0xf80) | 1;
  399. pteg[3] = pa | mode;
  400. break;
  401. }
  402. }
  403. }
  404. extern unsigned long _SDR1;
  405. extern PTE *Hash;
  406. extern unsigned long Hash_size;
  407. static void __init
  408. prom_alloc_htab(void)
  409. {
  410. unsigned int hsize;
  411. unsigned long htab;
  412. unsigned int addr;
  413. unsigned long offset = reloc_offset();
  414. /*
  415.  * Because of OF bugs we can't use the "claim" client
  416.  * interface to allocate memory for the hash table.
  417.  * This code is only used on 64-bit PPCs, and the only
  418.  * 64-bit PPCs at the moment are RS/6000s, and their
  419.  * OF is based at 0xc00000 (the 12M point), so we just
  420.  * arbitrarily use the 0x800000 - 0xc00000 region for the
  421.  * hash table.
  422.  *  -- paulus.
  423.  */
  424. #ifdef CONFIG_POWER4
  425. hsize = 4 << 20; /* POWER4 has no BATs */
  426. #else
  427. hsize = 2 << 20;
  428. #endif /* CONFIG_POWER4 */
  429. htab = (8 << 20);
  430. RELOC(Hash) = (void *)(htab + KERNELBASE);
  431. RELOC(Hash_size) = hsize;
  432. RELOC(_SDR1) = htab + __ilog2(hsize) - 18;
  433. /*
  434.  * Put in PTEs for the first 64MB of RAM
  435.  */
  436. cacheable_memzero((void *)htab, hsize);
  437. for (addr = 0; addr < 0x4000000; addr += 0x1000)
  438. make_pte(htab, hsize, addr + KERNELBASE, addr,
  439.  _PAGE_ACCESSED | _PAGE_COHERENT | PP_RWXX);
  440. }
  441. #endif /* CONFIG_PPC64BRIDGE */
  442. static void __init
  443. prom_instantiate_rtas(void)
  444. {
  445. ihandle prom_rtas;
  446. unsigned int i;
  447. struct prom_args prom_args;
  448. unsigned long offset = reloc_offset();
  449. prom_rtas = call_prom(RELOC("finddevice"), 1, 1, RELOC("/rtas"));
  450. if (prom_rtas == (void *) -1)
  451. return;
  452. RELOC(rtas_size) = 0;
  453. call_prom(RELOC("getprop"), 4, 1, prom_rtas,
  454.   RELOC("rtas-size"), &RELOC(rtas_size), sizeof(rtas_size));
  455. prom_print(RELOC("instantiating rtas"));
  456. if (RELOC(rtas_size) == 0) {
  457. RELOC(rtas_data) = 0;
  458. } else {
  459. /*
  460.  * Ask OF for some space for RTAS.
  461.  * Actually OF has bugs so we just arbitrarily
  462.  * use memory at the 6MB point.
  463.  */
  464. RELOC(rtas_data) = 6 << 20;
  465. prom_print(RELOC(" at "));
  466. prom_print_hex(RELOC(rtas_data));
  467. }
  468. prom_rtas = call_prom(RELOC("open"), 1, 1, RELOC("/rtas"));
  469. prom_print(RELOC("..."));
  470. prom_args.service = RELOC("call-method");
  471. prom_args.nargs = 3;
  472. prom_args.nret = 2;
  473. prom_args.args[0] = RELOC("instantiate-rtas");
  474. prom_args.args[1] = prom_rtas;
  475. prom_args.args[2] = (void *) RELOC(rtas_data);
  476. RELOC(prom)(&prom_args);
  477. i = 0;
  478. if (prom_args.args[3] == 0)
  479. i = (unsigned int)prom_args.args[4];
  480. RELOC(rtas_entry) = i;
  481. if ((RELOC(rtas_entry) == -1) || (RELOC(rtas_entry) == 0))
  482. prom_print(RELOC(" failedn"));
  483. else
  484. prom_print(RELOC(" donen"));
  485. }
  486. /*
  487.  * We enter here early on, when the Open Firmware prom is still
  488.  * handling exceptions and the MMU hash table for us.
  489.  */
  490. unsigned long __init
  491. prom_init(int r3, int r4, prom_entry pp)
  492. {
  493. unsigned long mem;
  494. ihandle prom_mmu;
  495. unsigned long offset = reloc_offset();
  496. int l;
  497. char *p, *d;
  498.   unsigned long phys;
  499.   /* Default */
  500.   phys = offset + KERNELBASE;
  501. /* First get a handle for the stdout device */
  502. RELOC(prom) = pp;
  503. RELOC(prom_chosen) = call_prom(RELOC("finddevice"), 1, 1,
  504.        RELOC("/chosen"));
  505. if (RELOC(prom_chosen) == (void *)-1)
  506. prom_exit();
  507. if ((int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
  508.     RELOC("stdout"), &RELOC(prom_stdout),
  509.     sizeof(prom_stdout)) <= 0)
  510. prom_exit();
  511. /* Get the full OF pathname of the stdout device */
  512. mem = (unsigned long) RELOC(klimit) + offset;
  513. p = (char *) mem;
  514. memset(p, 0, 256);
  515. call_prom(RELOC("instance-to-path"), 3, 1, RELOC(prom_stdout), p, 255);
  516. RELOC(of_stdout_device) = PTRUNRELOC(p);
  517. mem += strlen(p) + 1;
  518. /* Get the boot device and translate it to a full OF pathname. */
  519. p = (char *) mem;
  520. l = (int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
  521.     RELOC("bootpath"), p, 1<<20);
  522. if (l > 0) {
  523. p[l] = 0; /* should already be null-terminated */
  524. RELOC(bootpath) = PTRUNRELOC(p);
  525. mem += l + 1;
  526. d = (char *) mem;
  527. *d = 0;
  528. call_prom(RELOC("canon"), 3, 1, p, d, 1<<20);
  529. RELOC(bootdevice) = PTRUNRELOC(d);
  530. mem = ALIGN(mem + strlen(d) + 1);
  531. }
  532. prom_instantiate_rtas();
  533. #ifdef CONFIG_PPC64BRIDGE
  534. /*
  535.  * Find out how much memory we have and allocate a
  536.  * suitably-sized hash table.
  537.  */
  538. prom_alloc_htab();
  539. #endif
  540. mem = check_display(mem);
  541. prom_print(RELOC("copying OF device tree..."));
  542. mem = copy_device_tree(mem, mem + (1<<20));
  543. prom_print(RELOC("donen"));
  544. #ifdef CONFIG_SMP
  545. prom_hold_cpus(mem);
  546. #endif
  547. RELOC(klimit) = (char *) (mem - offset);
  548. /* If we are already running at 0xc0000000, we assume we were loaded by
  549.  * an OF bootloader which did set a BAT for us. This breaks OF translate
  550.  * so we force phys to be 0
  551.  */
  552. if (offset == 0)
  553. phys = 0;
  554. else {
  555.       if ((int) call_prom(RELOC("getprop"), 4, 1, RELOC(prom_chosen),
  556.     RELOC("mmu"), &prom_mmu, sizeof(prom_mmu)) <= 0) {
  557. prom_print(RELOC(" no MMU foundn"));
  558.     } else {
  559. int nargs;
  560. struct prom_args prom_args;
  561. nargs = 4;
  562. prom_args.service = RELOC("call-method");
  563. prom_args.nargs = nargs;
  564. prom_args.nret = 4;
  565. prom_args.args[0] = RELOC("translate");
  566. prom_args.args[1] = prom_mmu;
  567. prom_args.args[2] = (void *)(offset + KERNELBASE);
  568. prom_args.args[3] = (void *)1;
  569. RELOC(prom)(&prom_args);
  570. /* We assume the phys. address size is 3 cells */
  571. if (prom_args.args[nargs] != 0)
  572. prom_print(RELOC(" (translate failed)n"));
  573. else
  574. phys = (unsigned long)prom_args.args[nargs+3];
  575.     }
  576. }
  577. #ifdef CONFIG_BOOTX_TEXT
  578. if (RELOC(prom_disp_node) != 0)
  579. setup_disp_fake_bi(RELOC(prom_disp_node));
  580. #endif
  581. /* Use quiesce call to get OF to shut down any devices it's using */
  582. prom_print(RELOC("Calling quiesce ...n"));
  583. call_prom(RELOC("quiesce"), 0, 0);
  584. #ifdef CONFIG_BOOTX_TEXT
  585. if (RELOC(prom_disp_node) != 0)
  586. btext_prepare_BAT();
  587. #endif
  588. prom_print(RELOC("returning "));
  589. prom_print_hex(phys);
  590. prom_print(RELOC(" from prom_initn"));
  591. RELOC(prom_stdout) = 0;
  592. return phys;
  593. }
  594. void phys_call_rtas(int service, int nargs, int nret, ...)
  595. {
  596. va_list list;
  597. union {
  598. unsigned long words[16];
  599. double align;
  600. } u;
  601. unsigned long offset = reloc_offset();
  602. void (*rtas)(void *, unsigned long);
  603. int i;
  604. u.words[0] = service;
  605. u.words[1] = nargs;
  606. u.words[2] = nret;
  607. va_start(list, nret);
  608. for (i = 0; i < nargs; ++i)
  609. u.words[i+3] = va_arg(list, unsigned long);
  610. va_end(list);
  611. rtas = (void (*)(void *, unsigned long)) RELOC(rtas_entry);
  612. rtas(&u, RELOC(rtas_data));
  613. }
  614. static int __init
  615. prom_set_color(ihandle ih, int i, int r, int g, int b)
  616. {
  617. struct prom_args prom_args;
  618. unsigned long offset = reloc_offset();
  619. prom_args.service = RELOC("call-method");
  620. prom_args.nargs = 6;
  621. prom_args.nret = 1;
  622. prom_args.args[0] = RELOC("color!");
  623. prom_args.args[1] = ih;
  624. prom_args.args[2] = (void *) i;
  625. prom_args.args[3] = (void *) b;
  626. prom_args.args[4] = (void *) g;
  627. prom_args.args[5] = (void *) r;
  628. RELOC(prom)(&prom_args);
  629. return (int) prom_args.args[6];
  630. }
  631. /*
  632.  * If we have a display that we don't know how to drive,
  633.  * we will want to try to execute OF's open method for it
  634.  * later.  However, OF will probably fall over if we do that
  635.  * we've taken over the MMU.
  636.  * So we check whether we will need to open the display,
  637.  * and if so, open it now.
  638.  */
  639. static unsigned long __init
  640. check_display(unsigned long mem)
  641. {
  642. phandle node;
  643. ihandle ih;
  644. int i;
  645. unsigned long offset = reloc_offset();
  646. char type[16], *path;
  647. static unsigned char default_colors[] = {
  648. 0x00, 0x00, 0x00,
  649. 0x00, 0x00, 0xaa,
  650. 0x00, 0xaa, 0x00,
  651. 0x00, 0xaa, 0xaa,
  652. 0xaa, 0x00, 0x00,
  653. 0xaa, 0x00, 0xaa,
  654. 0xaa, 0xaa, 0x00,
  655. 0xaa, 0xaa, 0xaa,
  656. 0x55, 0x55, 0x55,
  657. 0x55, 0x55, 0xff,
  658. 0x55, 0xff, 0x55,
  659. 0x55, 0xff, 0xff,
  660. 0xff, 0x55, 0x55,
  661. 0xff, 0x55, 0xff,
  662. 0xff, 0xff, 0x55,
  663. 0xff, 0xff, 0xff
  664. };
  665. RELOC(prom_disp_node) = 0;
  666. for (node = 0; prom_next_node(&node); ) {
  667. type[0] = 0;
  668. call_prom(RELOC("getprop"), 4, 1, node, RELOC("device_type"),
  669.   type, sizeof(type));
  670. if (strcmp(type, RELOC("display")) != 0)
  671. continue;
  672. /* It seems OF doesn't null-terminate the path :-( */
  673. path = (char *) mem;
  674. memset(path, 0, 256);
  675. if ((int) call_prom(RELOC("package-to-path"), 3, 1,
  676.     node, path, 255) < 0)
  677. continue;
  678. /*
  679.  * If this display is the device that OF is using for stdout,
  680.  * move it to the front of the list.
  681.  */
  682. mem += strlen(path) + 1;
  683. i = RELOC(prom_num_displays)++;
  684. if (RELOC(of_stdout_device) != 0 && i > 0
  685.     && strcmp(PTRRELOC(RELOC(of_stdout_device)), path) == 0) {
  686. for (; i > 0; --i) {
  687. RELOC(prom_display_paths[i])
  688. = RELOC(prom_display_paths[i-1]);
  689. RELOC(prom_display_nodes[i])
  690. = RELOC(prom_display_nodes[i-1]);
  691. }
  692. }
  693. RELOC(prom_display_paths[i]) = PTRUNRELOC(path);
  694. RELOC(prom_display_nodes[i]) = node;
  695. if (i == 0)
  696. RELOC(prom_disp_node) = node;
  697. if (RELOC(prom_num_displays) >= FB_MAX)
  698. break;
  699. }
  700. try_again:
  701. /*
  702.  * Open the first display and set its colormap.
  703.  */
  704. if (RELOC(prom_num_displays) > 0) {
  705. path = PTRRELOC(RELOC(prom_display_paths[0]));
  706. prom_print(RELOC("opening display "));
  707. prom_print(path);
  708. ih = call_prom(RELOC("open"), 1, 1, path);
  709. if (ih == 0 || ih == (ihandle) -1) {
  710. prom_print(RELOC("... failedn"));
  711. for (i=1; i<RELOC(prom_num_displays); i++) {
  712. RELOC(prom_display_paths[i-1]) = RELOC(prom_display_paths[i]);
  713. RELOC(prom_display_nodes[i-1]) = RELOC(prom_display_nodes[i]);
  714. }
  715. if (--RELOC(prom_num_displays) > 0)
  716. RELOC(prom_disp_node) = RELOC(prom_display_nodes[0]);
  717. else
  718. RELOC(prom_disp_node) = NULL;
  719. goto try_again;
  720. } else {
  721. prom_print(RELOC("... okn"));
  722. /*
  723.  * Setup a usable color table when the appropriate
  724.  * method is available.
  725.  * Should update this to use set-colors.
  726.  */
  727. for (i = 0; i < 32; i++)
  728. if (prom_set_color(ih, i, RELOC(default_colors)[i*3],
  729.    RELOC(default_colors)[i*3+1],
  730.    RELOC(default_colors)[i*3+2]) != 0)
  731. break;
  732. #ifdef CONFIG_FB
  733. for (i = 0; i < LINUX_LOGO_COLORS; i++)
  734. if (prom_set_color(ih, i + 32,
  735.    RELOC(linux_logo_red)[i],
  736.    RELOC(linux_logo_green)[i],
  737.    RELOC(linux_logo_blue)[i]) != 0)
  738. break;
  739. #endif /* CONFIG_FB */
  740. }
  741. }
  742. return ALIGN(mem);
  743. }
  744. /* This function will enable the early boot text when doing OF booting. This
  745.  * way, xmon output should work too
  746.  */
  747. #ifdef CONFIG_BOOTX_TEXT
  748. static void __init
  749. setup_disp_fake_bi(ihandle dp)
  750. {
  751. int width = 640, height = 480, depth = 8, pitch;
  752. unsigned address;
  753. unsigned long offset = reloc_offset();
  754. struct pci_reg_property addrs[8];
  755. int i, naddrs;
  756. char name[32];
  757. char *getprop = RELOC("getprop");
  758. prom_print(RELOC("Initializing fake screen: "));
  759. memset(name, 0, sizeof(name));
  760. call_prom(getprop, 4, 1, dp, RELOC("name"), name, sizeof(name));
  761. name[sizeof(name)-1] = 0;
  762. prom_print(name);
  763. prom_print(RELOC("n"));
  764. call_prom(getprop, 4, 1, dp, RELOC("width"), &width, sizeof(width));
  765. call_prom(getprop, 4, 1, dp, RELOC("height"), &height, sizeof(height));
  766. call_prom(getprop, 4, 1, dp, RELOC("depth"), &depth, sizeof(depth));
  767. pitch = width * ((depth + 7) / 8);
  768. call_prom(getprop, 4, 1, dp, RELOC("linebytes"),
  769.   &pitch, sizeof(pitch));
  770. if (pitch == 1)
  771. pitch = 0x1000; /* for strange IBM display */
  772. address = 0;
  773. call_prom(getprop, 4, 1, dp, RELOC("address"),
  774.   &address, sizeof(address));
  775. if (address == 0) {
  776. /* look for an assigned address with a size of >= 1MB */
  777. naddrs = (int) call_prom(getprop, 4, 1, dp,
  778. RELOC("assigned-addresses"),
  779. addrs, sizeof(addrs));
  780. naddrs /= sizeof(struct pci_reg_property);
  781. for (i = 0; i < naddrs; ++i) {
  782. if (addrs[i].size_lo >= (1 << 20)) {
  783. address = addrs[i].addr.a_lo;
  784. /* use the BE aperture if possible */
  785. if (addrs[i].size_lo >= (16 << 20))
  786. address += (8 << 20);
  787. break;
  788. }
  789. }
  790. if (address == 0) {
  791. prom_print(RELOC("Failed to get addressn"));
  792. return;
  793. }
  794. }
  795. /* kludge for valkyrie */
  796. if (strcmp(name, RELOC("valkyrie")) == 0)
  797. address += 0x1000;
  798. btext_setup_display(width, height, depth, pitch, address);
  799. }
  800. #endif
  801. static int __init
  802. prom_next_node(phandle *nodep)
  803. {
  804. phandle node;
  805. unsigned long offset = reloc_offset();
  806. if ((node = *nodep) != 0
  807.     && (*nodep = call_prom(RELOC("child"), 1, 1, node)) != 0)
  808. return 1;
  809. if ((*nodep = call_prom(RELOC("peer"), 1, 1, node)) != 0)
  810. return 1;
  811. for (;;) {
  812. if ((node = call_prom(RELOC("parent"), 1, 1, node)) == 0)
  813. return 0;
  814. if ((*nodep = call_prom(RELOC("peer"), 1, 1, node)) != 0)
  815. return 1;
  816. }
  817. }
  818. /*
  819.  * Make a copy of the device tree from the PROM.
  820.  */
  821. static unsigned long __init
  822. copy_device_tree(unsigned long mem_start, unsigned long mem_end)
  823. {
  824. phandle root;
  825. unsigned long new_start;
  826. struct device_node **allnextp;
  827. unsigned long offset = reloc_offset();
  828. root = call_prom(RELOC("peer"), 1, 1, (phandle)0);
  829. if (root == (phandle)0) {
  830. prom_print(RELOC("couldn't get device tree rootn"));
  831. prom_exit();
  832. }
  833. allnextp = &RELOC(allnodes);
  834. mem_start = ALIGN(mem_start);
  835. new_start = inspect_node(root, 0, mem_start, mem_end, &allnextp);
  836. *allnextp = 0;
  837. return new_start;
  838. }
  839. static unsigned long __init
  840. inspect_node(phandle node, struct device_node *dad,
  841.      unsigned long mem_start, unsigned long mem_end,
  842.      struct device_node ***allnextpp)
  843. {
  844. int l;
  845. phandle child;
  846. struct device_node *np;
  847. struct property *pp, **prev_propp;
  848. char *prev_name, *namep;
  849. unsigned char *valp;
  850. unsigned long offset = reloc_offset();
  851. np = (struct device_node *) mem_start;
  852. mem_start += sizeof(struct device_node);
  853. memset(np, 0, sizeof(*np));
  854. np->node = node;
  855. **allnextpp = PTRUNRELOC(np);
  856. *allnextpp = &np->allnext;
  857. if (dad != 0) {
  858. np->parent = PTRUNRELOC(dad);
  859. /* we temporarily use the `next' field as `last_child'. */
  860. if (dad->next == 0)
  861. dad->child = PTRUNRELOC(np);
  862. else
  863. dad->next->sibling = PTRUNRELOC(np);
  864. dad->next = np;
  865. }
  866. /* get and store all properties */
  867. prev_propp = &np->properties;
  868. prev_name = RELOC("");
  869. for (;;) {
  870. pp = (struct property *) mem_start;
  871. namep = (char *) (pp + 1);
  872. pp->name = PTRUNRELOC(namep);
  873. if ((int) call_prom(RELOC("nextprop"), 3, 1, node, prev_name,
  874.     namep) <= 0)
  875. break;
  876. mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1);
  877. prev_name = namep;
  878. valp = (unsigned char *) mem_start;
  879. pp->value = PTRUNRELOC(valp);
  880. pp->length = (int)
  881. call_prom(RELOC("getprop"), 4, 1, node, namep,
  882.   valp, mem_end - mem_start);
  883. if (pp->length < 0)
  884. continue;
  885. #ifdef MAX_PROPERTY_LENGTH
  886. if (pp->length > MAX_PROPERTY_LENGTH)
  887. continue; /* ignore this property */
  888. #endif
  889. mem_start = ALIGN(mem_start + pp->length);
  890. *prev_propp = PTRUNRELOC(pp);
  891. prev_propp = &pp->next;
  892. }
  893. if (np->node != NULL) {
  894. /* Add a "linux,phandle" property" */
  895. pp = (struct property *) mem_start;
  896. *prev_propp = PTRUNRELOC(pp);
  897. prev_propp = &pp->next;
  898. namep = (char *) (pp + 1);
  899. pp->name = PTRUNRELOC(namep);
  900. strcpy(namep, RELOC("linux,phandle"));
  901. mem_start = ALIGN((unsigned long)namep + strlen(namep) + 1);
  902. pp->value = (unsigned char *) PTRUNRELOC(&np->node);
  903. pp->length = sizeof(np->node);
  904. }
  905. *prev_propp = NULL;
  906. /* get the node's full name */
  907. l = (int) call_prom(RELOC("package-to-path"), 3, 1, node,
  908.     (char *) mem_start, mem_end - mem_start);
  909. if (l >= 0) {
  910. np->full_name = PTRUNRELOC((char *) mem_start);
  911. *(char *)(mem_start + l) = 0;
  912. mem_start = ALIGN(mem_start + l + 1);
  913. }
  914. /* do all our children */
  915. child = call_prom(RELOC("child"), 1, 1, node);
  916. while (child != (void *)0) {
  917. mem_start = inspect_node(child, np, mem_start, mem_end,
  918.  allnextpp);
  919. child = call_prom(RELOC("peer"), 1, 1, child);
  920. }
  921. return mem_start;
  922. }
  923. /*
  924.  * finish_device_tree is called once things are running normally
  925.  * (i.e. with text and data mapped to the address they were linked at).
  926.  * It traverses the device tree and fills in the name, type,
  927.  * {n_}addrs and {n_}intrs fields of each node.
  928.  */
  929. void __init
  930. finish_device_tree(void)
  931. {
  932. unsigned long mem = (unsigned long) klimit;
  933. struct device_node *np;
  934. /* All newworld pmac machines and CHRPs now use the interrupt tree */
  935. for (np = allnodes; np != NULL; np = np->allnext) {
  936. if (get_property(np, "interrupt-parent", 0)) {
  937. use_of_interrupt_tree = 1;
  938. break;
  939. }
  940. }
  941. if (_machine == _MACH_Pmac && use_of_interrupt_tree)
  942. pmac_newworld = 1;
  943. #ifdef CONFIG_BOOTX_TEXT
  944. if (boot_infos && pmac_newworld) {
  945. prom_print("WARNING ! BootX/miBoot booting is not supported on this machinen");
  946. prom_print("          You should use an Open Firmware bootloadern");
  947. }
  948. #endif /* CONFIG_BOOTX_TEXT */
  949. if (use_of_interrupt_tree) {
  950. /*
  951.  * We want to find out here how many interrupt-controller
  952.  * nodes there are, and if we are booted from BootX,
  953.  * we need a pointer to the first (and hopefully only)
  954.  * such node.  But we can't use find_devices here since
  955.  * np->name has not been set yet.  -- paulus
  956.  */
  957. int n = 0;
  958. char *name, *ic;
  959. int iclen;
  960. for (np = allnodes; np != NULL; np = np->allnext) {
  961. ic = get_property(np, "interrupt-controller", &iclen);
  962. name = get_property(np, "name", NULL);
  963. /* checking iclen makes sure we don't get a false
  964.    match on /chosen.interrupt_controller */
  965. if ((name != NULL
  966.      && strcmp(name, "interrupt-controller") == 0)
  967.     || (ic != NULL && iclen == 0)) {
  968. if (n == 0)
  969. dflt_interrupt_controller = np;
  970. ++n;
  971. }
  972. }
  973. num_interrupt_controllers = n;
  974. }
  975. mem = finish_node(allnodes, mem, NULL, 1, 1);
  976. dev_tree_size = mem - (unsigned long) allnodes;
  977. klimit = (char *) mem;
  978. }
  979. /*
  980.  * early_get_property is used to access the device tree image prepared
  981.  * by BootX very early on, before the pointers in it have been relocated.
  982.  */
  983. static void * __init
  984. early_get_property(unsigned long base, unsigned long node, char *prop)
  985. {
  986. struct device_node *np = (struct device_node *)(base + node);
  987. struct property *pp;
  988. for (pp = np->properties; pp != 0; pp = pp->next) {
  989. pp = (struct property *) (base + (unsigned long)pp);
  990. if (strcmp((char *)((unsigned long)pp->name + base),
  991.    prop) == 0) {
  992. return (void *)((unsigned long)pp->value + base);
  993. }
  994. }
  995. return 0;
  996. }
  997. static unsigned long __init
  998. finish_node(struct device_node *np, unsigned long mem_start,
  999.     interpret_func *ifunc, int naddrc, int nsizec)
  1000. {
  1001. struct device_node *child;
  1002. int *ip;
  1003. np->name = get_property(np, "name", 0);
  1004. np->type = get_property(np, "device_type", 0);
  1005. if (!np->name)
  1006. np->name = "<NULL>";
  1007. if (!np->type)
  1008. np->type = "<NULL>";
  1009. /* get the device addresses and interrupts */
  1010. if (ifunc != NULL)
  1011. mem_start = ifunc(np, mem_start, naddrc, nsizec);
  1012. if (use_of_interrupt_tree)
  1013. mem_start = finish_node_interrupts(np, mem_start);
  1014. /* Look for #address-cells and #size-cells properties. */
  1015. ip = (int *) get_property(np, "#address-cells", 0);
  1016. if (ip != NULL)
  1017. naddrc = *ip;
  1018. ip = (int *) get_property(np, "#size-cells", 0);
  1019. if (ip != NULL)
  1020. nsizec = *ip;
  1021. /* 
  1022.  * The F50 sets the name to 'display' and 'compatible' to what we
  1023.  * expect for the name. -- Cort
  1024.  *
  1025.  * But sometimes you get a 'display' name for non-OF cards, and thus
  1026.  * no compatible property.  And very rarely we won't have a name
  1027.  * property either. -- Tom
  1028.  */
  1029. if (!strcmp(np->name, "display"))
  1030. np->name = get_property(np, "compatible", 0);
  1031. if (!np->name)
  1032. np->name = get_property(np, "name", 0);
  1033. if (np->parent == NULL)
  1034. ifunc = interpret_root_props;
  1035. else if (np->type == 0)
  1036. ifunc = NULL;
  1037. else if (!strcmp(np->type, "pci") || !strcmp(np->type, "vci"))
  1038. ifunc = interpret_pci_props;
  1039. else if (!strcmp(np->type, "dbdma"))
  1040. ifunc = interpret_dbdma_props;
  1041. else if (!strcmp(np->type, "mac-io")
  1042.  || ifunc == interpret_macio_props)
  1043. ifunc = interpret_macio_props;
  1044. else if (!strcmp(np->type, "isa"))
  1045. ifunc = interpret_isa_props;
  1046. else if (!strcmp(np->name, "uni-n"))
  1047. ifunc = interpret_root_props;
  1048. else if (!((ifunc == interpret_dbdma_props
  1049.     || ifunc == interpret_macio_props)
  1050.    && (!strcmp(np->type, "escc")
  1051.        || !strcmp(np->type, "media-bay"))))
  1052. ifunc = NULL;
  1053. /* if we were booted from BootX, convert the full name */
  1054. if (boot_infos
  1055.     && strncmp(np->full_name, "Devices:device-tree", 19) == 0) {
  1056. if (np->full_name[19] == 0) {
  1057. strcpy(np->full_name, "/");
  1058. } else if (np->full_name[19] == ':') {
  1059. char *p = np->full_name + 19;
  1060. np->full_name = p;
  1061. for (; *p; ++p)
  1062. if (*p == ':')
  1063. *p = '/';
  1064. }
  1065. }
  1066. for (child = np->child; child != NULL; child = child->sibling)
  1067. mem_start = finish_node(child, mem_start, ifunc,
  1068. naddrc, nsizec);
  1069. return mem_start;
  1070. }
  1071. /*
  1072.  * Find the interrupt parent of a node.
  1073.  */
  1074. static struct device_node * __init
  1075. intr_parent(struct device_node *p)
  1076. {
  1077. phandle *parp;
  1078. parp = (phandle *) get_property(p, "interrupt-parent", NULL);
  1079. if (parp == NULL)
  1080. return p->parent;
  1081. p = find_phandle(*parp);
  1082. if (p != NULL)
  1083. return p;
  1084. /*
  1085.  * On a powermac booted with BootX, we don't get to know the
  1086.  * phandles for any nodes, so find_phandle will return NULL.
  1087.  * Fortunately these machines only have one interrupt controller
  1088.  * so there isn't in fact any ambiguity.  -- paulus
  1089.  */
  1090. if (num_interrupt_controllers == 1)
  1091. p = dflt_interrupt_controller;
  1092. return p;
  1093. }
  1094. /*
  1095.  * Find out the size of each entry of the interrupts property
  1096.  * for a node.
  1097.  */
  1098. static int __init
  1099. prom_n_intr_cells(struct device_node *np)
  1100. {
  1101. struct device_node *p;
  1102. unsigned int *icp;
  1103. for (p = np; (p = intr_parent(p)) != NULL; ) {
  1104. icp = (unsigned int *)
  1105. get_property(p, "#interrupt-cells", NULL);
  1106. if (icp != NULL)
  1107. return *icp;
  1108. if (get_property(p, "interrupt-controller", NULL) != NULL
  1109.     || get_property(p, "interrupt-map", NULL) != NULL) {
  1110. printk("oops, node %s doesn't have #interrupt-cellsn",
  1111.        p->full_name);
  1112. return 1;
  1113. }
  1114. }
  1115. printk("prom_n_intr_cells failed for %sn", np->full_name);
  1116. return 1;
  1117. }
  1118. /*
  1119.  * Map an interrupt from a device up to the platform interrupt
  1120.  * descriptor.
  1121.  */
  1122. static int __init
  1123. map_interrupt(unsigned int **irq, struct device_node **ictrler,
  1124.       struct device_node *np, unsigned int *ints, int nintrc)
  1125. {
  1126. struct device_node *p, *ipar;
  1127. unsigned int *imap, *imask, *ip;
  1128. int i, imaplen, match;
  1129. int newintrc, newaddrc;
  1130. unsigned int *reg;
  1131. int naddrc;
  1132. reg = (unsigned int *) get_property(np, "reg", NULL);
  1133. naddrc = prom_n_addr_cells(np);
  1134. p = intr_parent(np);
  1135. while (p != NULL) {
  1136. if (get_property(p, "interrupt-controller", NULL) != NULL)
  1137. /* this node is an interrupt controller, stop here */
  1138. break;
  1139. imap = (unsigned int *)
  1140. get_property(p, "interrupt-map", &imaplen);
  1141. if (imap == NULL) {
  1142. p = intr_parent(p);
  1143. continue;
  1144. }
  1145. imask = (unsigned int *)
  1146. get_property(p, "interrupt-map-mask", NULL);
  1147. if (imask == NULL) {
  1148. printk("oops, %s has interrupt-map but no maskn",
  1149.        p->full_name);
  1150. return 0;
  1151. }
  1152. imaplen /= sizeof(unsigned int);
  1153. match = 0;
  1154. ipar = NULL;
  1155. while (imaplen > 0 && !match) {
  1156. /* check the child-interrupt field */
  1157. match = 1;
  1158. for (i = 0; i < naddrc && match; ++i)
  1159. match = ((reg[i] ^ imap[i]) & imask[i]) == 0;
  1160. for (; i < naddrc + nintrc && match; ++i)
  1161. match = ((ints[i-naddrc] ^ imap[i]) & imask[i]) == 0;
  1162. imap += naddrc + nintrc;
  1163. imaplen -= naddrc + nintrc;
  1164. /* grab the interrupt parent */
  1165. ipar = find_phandle((phandle) *imap++);
  1166. --imaplen;
  1167. if (ipar == NULL && num_interrupt_controllers == 1)
  1168. /* cope with BootX not giving us phandles */
  1169. ipar = dflt_interrupt_controller;
  1170. if (ipar == NULL) {
  1171. printk("oops, no int parent %x in map of %sn",
  1172.        imap[-1], p->full_name);
  1173. return 0;
  1174. }
  1175. /* find the parent's # addr and intr cells */
  1176. ip = (unsigned int *)
  1177. get_property(ipar, "#interrupt-cells", NULL);
  1178. if (ip == NULL) {
  1179. printk("oops, no #interrupt-cells on %sn",
  1180.        ipar->full_name);
  1181. return 0;
  1182. }
  1183. newintrc = *ip;
  1184. ip = (unsigned int *)
  1185. get_property(ipar, "#address-cells", NULL);
  1186. newaddrc = (ip == NULL)? 0: *ip;
  1187. imap += newaddrc + newintrc;
  1188. imaplen -= newaddrc + newintrc;
  1189. }
  1190. if (imaplen < 0) {
  1191. printk("oops, error decoding int-map on %s, len=%dn",
  1192.        p->full_name, imaplen);
  1193. return 0;
  1194. }
  1195. if (!match) {
  1196. printk("oops, no match in %s int-map for %sn",
  1197.        p->full_name, np->full_name);
  1198. return 0;
  1199. }
  1200. p = ipar;
  1201. naddrc = newaddrc;
  1202. nintrc = newintrc;
  1203. ints = imap - nintrc;
  1204. reg = ints - naddrc;
  1205. }
  1206. if (p == NULL)
  1207. printk("hmmm, int tree for %s doesn't have ctrlern",
  1208.        np->full_name);
  1209. *irq = ints;
  1210. *ictrler = p;
  1211. return nintrc;
  1212. }
  1213. /*
  1214.  * New version of finish_node_interrupts.
  1215.  */
  1216. static unsigned long __init
  1217. finish_node_interrupts(struct device_node *np, unsigned long mem_start)
  1218. {
  1219. unsigned int *ints;
  1220. int intlen, intrcells;
  1221. int i, j, n, offset;
  1222. unsigned int *irq;
  1223. struct device_node *ic;
  1224. ints = (unsigned int *) get_property(np, "interrupts", &intlen);
  1225. if (ints == NULL)
  1226. return mem_start;
  1227. intrcells = prom_n_intr_cells(np);
  1228. intlen /= intrcells * sizeof(unsigned int);
  1229. np->n_intrs = intlen;
  1230. np->intrs = (struct interrupt_info *) mem_start;
  1231. mem_start += intlen * sizeof(struct interrupt_info);
  1232. for (i = 0; i < intlen; ++i) {
  1233. np->intrs[i].line = 0;
  1234. np->intrs[i].sense = 1;
  1235. n = map_interrupt(&irq, &ic, np, ints, intrcells);
  1236. if (n <= 0)
  1237. continue;
  1238. offset = 0;
  1239. /*
  1240.  * On a CHRP we have an 8259 which is subordinate to
  1241.  * the openpic in the interrupt tree, but we want the
  1242.  * openpic's interrupt numbers offsetted, not the 8259's.
  1243.  * So we apply the offset if the controller is at the
  1244.  * root of the interrupt tree, i.e. has no interrupt-parent.
  1245.  * This doesn't cope with the general case of multiple
  1246.  * cascaded interrupt controllers, but then neither will
  1247.  * irq.c at the moment either.  -- paulus
  1248.  */
  1249. if (num_interrupt_controllers > 1 && ic != NULL
  1250.     && get_property(ic, "interrupt-parent", NULL) == NULL)
  1251. offset = 16;
  1252. np->intrs[i].line = irq[0] + offset;
  1253. if (n > 1)
  1254. np->intrs[i].sense = irq[1];
  1255. if (n > 2) {
  1256. printk("hmmm, got %d intr cells for %s:", n,
  1257.        np->full_name);
  1258. for (j = 0; j < n; ++j)
  1259. printk(" %d", irq[j]);
  1260. printk("n");
  1261. }
  1262. ints += intrcells;
  1263. }
  1264. return mem_start;
  1265. }
  1266. /*
  1267.  * When BootX makes a copy of the device tree from the MacOS
  1268.  * Name Registry, it is in the format we use but all of the pointers
  1269.  * are offsets from the start of the tree.
  1270.  * This procedure updates the pointers.
  1271.  */
  1272. void __init
  1273. relocate_nodes(void)
  1274. {
  1275. unsigned long base;
  1276. struct device_node *np;
  1277. struct property *pp;
  1278. #define ADDBASE(x) (x = (x)? ((typeof (x))((unsigned long)(x) + base)): 0)
  1279. base = (unsigned long) boot_infos + boot_infos->deviceTreeOffset;
  1280. allnodes = (struct device_node *)(base + 4);
  1281. for (np = allnodes; np != 0; np = np->allnext) {
  1282. ADDBASE(np->full_name);
  1283. ADDBASE(np->properties);
  1284. ADDBASE(np->parent);
  1285. ADDBASE(np->child);
  1286. ADDBASE(np->sibling);
  1287. ADDBASE(np->allnext);
  1288. for (pp = np->properties; pp != 0; pp = pp->next) {
  1289. ADDBASE(pp->name);
  1290. ADDBASE(pp->value);
  1291. ADDBASE(pp->next);
  1292. }
  1293. }
  1294. }
  1295. int
  1296. prom_n_addr_cells(struct device_node* np)
  1297. {
  1298. int* ip;
  1299. do {
  1300. if (np->parent)
  1301. np = np->parent;
  1302. ip = (int *) get_property(np, "#address-cells", 0);
  1303. if (ip != NULL)
  1304. return *ip;
  1305. } while (np->parent);
  1306. /* No #address-cells property for the root node, default to 1 */
  1307. return 1;
  1308. }
  1309. int
  1310. prom_n_size_cells(struct device_node* np)
  1311. {
  1312. int* ip;
  1313. do {
  1314. if (np->parent)
  1315. np = np->parent;
  1316. ip = (int *) get_property(np, "#size-cells", 0);
  1317. if (ip != NULL)
  1318. return *ip;
  1319. } while (np->parent);
  1320. /* No #size-cells property for the root node, default to 1 */
  1321. return 1;
  1322. }
  1323. static unsigned long __init
  1324. interpret_pci_props(struct device_node *np, unsigned long mem_start,
  1325.     int naddrc, int nsizec)
  1326. {
  1327. struct address_range *adr;
  1328. struct pci_reg_property *pci_addrs;
  1329. int i, l, *ip;
  1330. pci_addrs = (struct pci_reg_property *)
  1331. get_property(np, "assigned-addresses", &l);
  1332. if (pci_addrs != 0 && l >= sizeof(struct pci_reg_property)) {
  1333. i = 0;
  1334. adr = (struct address_range *) mem_start;
  1335. while ((l -= sizeof(struct pci_reg_property)) >= 0) {
  1336. /* XXX assumes PCI addresses mapped 1-1 to physical */
  1337. adr[i].space = pci_addrs[i].addr.a_hi;
  1338. adr[i].address = pci_addrs[i].addr.a_lo;
  1339. adr[i].size = pci_addrs[i].size_lo;
  1340. ++i;
  1341. }
  1342. np->addrs = adr;
  1343. np->n_addrs = i;
  1344. mem_start += i * sizeof(struct address_range);
  1345. }
  1346. if (use_of_interrupt_tree)
  1347. return mem_start;
  1348. ip = (int *) get_property(np, "AAPL,interrupts", &l);
  1349. if (ip == 0 && np->parent)
  1350. ip = (int *) get_property(np->parent, "AAPL,interrupts", &l);
  1351. if (ip == 0)
  1352. ip = (int *) get_property(np, "interrupts", &l);
  1353. if (ip != 0) {
  1354. np->intrs = (struct interrupt_info *) mem_start;
  1355. np->n_intrs = l / sizeof(int);
  1356. mem_start += np->n_intrs * sizeof(struct interrupt_info);
  1357. for (i = 0; i < np->n_intrs; ++i) {
  1358. np->intrs[i].line = *ip++;
  1359. np->intrs[i].sense = 1;
  1360. }
  1361. }
  1362. return mem_start;
  1363. }
  1364. static unsigned long __init
  1365. interpret_dbdma_props(struct device_node *np, unsigned long mem_start,
  1366.       int naddrc, int nsizec)
  1367. {
  1368. struct reg_property *rp;
  1369. struct address_range *adr;
  1370. unsigned long base_address;
  1371. int i, l, *ip;
  1372. struct device_node *db;
  1373. base_address = 0;
  1374. for (db = np->parent; db != NULL; db = db->parent) {
  1375. if (!strcmp(db->type, "dbdma") && db->n_addrs != 0) {
  1376. base_address = db->addrs[0].address;
  1377. break;
  1378. }
  1379. }
  1380. rp = (struct reg_property *) get_property(np, "reg", &l);
  1381. if (rp != 0 && l >= sizeof(struct reg_property)) {
  1382. i = 0;
  1383. adr = (struct address_range *) mem_start;
  1384. while ((l -= sizeof(struct reg_property)) >= 0) {
  1385. adr[i].space = 2;
  1386. adr[i].address = rp[i].address + base_address;
  1387. adr[i].size = rp[i].size;
  1388. ++i;
  1389. }
  1390. np->addrs = adr;
  1391. np->n_addrs = i;
  1392. mem_start += i * sizeof(struct address_range);
  1393. }
  1394. if (use_of_interrupt_tree)
  1395. return mem_start;
  1396. ip = (int *) get_property(np, "AAPL,interrupts", &l);
  1397. if (ip == 0)
  1398. ip = (int *) get_property(np, "interrupts", &l);
  1399. if (ip != 0) {
  1400. np->intrs = (struct interrupt_info *) mem_start;
  1401. np->n_intrs = l / sizeof(int);
  1402. mem_start += np->n_intrs * sizeof(struct interrupt_info);
  1403. for (i = 0; i < np->n_intrs; ++i) {
  1404. np->intrs[i].line = *ip++;
  1405. np->intrs[i].sense = 1;
  1406. }
  1407. }
  1408. return mem_start;
  1409. }
  1410. static unsigned long __init
  1411. interpret_macio_props(struct device_node *np, unsigned long mem_start,
  1412.       int naddrc, int nsizec)
  1413. {
  1414. struct reg_property *rp;
  1415. struct address_range *adr;
  1416. unsigned long base_address;
  1417. int i, l, *ip;
  1418. struct device_node *db;
  1419. base_address = 0;
  1420. for (db = np->parent; db != NULL; db = db->parent) {
  1421. if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) {
  1422. base_address = db->addrs[0].address;
  1423. break;
  1424. }
  1425. }
  1426. rp = (struct reg_property *) get_property(np, "reg", &l);
  1427. if (rp != 0 && l >= sizeof(struct reg_property)) {
  1428. i = 0;
  1429. adr = (struct address_range *) mem_start;
  1430. while ((l -= sizeof(struct reg_property)) >= 0) {
  1431. adr[i].space = 2;
  1432. adr[i].address = rp[i].address + base_address;
  1433. adr[i].size = rp[i].size;
  1434. ++i;
  1435. }
  1436. np->addrs = adr;
  1437. np->n_addrs = i;
  1438. mem_start += i * sizeof(struct address_range);
  1439. }
  1440. if (use_of_interrupt_tree)
  1441. return mem_start;
  1442. ip = (int *) get_property(np, "interrupts", &l);
  1443. if (ip == 0)
  1444. ip = (int *) get_property(np, "AAPL,interrupts", &l);
  1445. if (ip != 0) {
  1446. np->intrs = (struct interrupt_info *) mem_start;
  1447. np->n_intrs = l / sizeof(int);
  1448. for (i = 0; i < np->n_intrs; ++i) {
  1449. np->intrs[i].line = *ip++;
  1450. np->intrs[i].sense = 1;
  1451. }
  1452. mem_start += np->n_intrs * sizeof(struct interrupt_info);
  1453. }
  1454. return mem_start;
  1455. }
  1456. static unsigned long __init
  1457. interpret_isa_props(struct device_node *np, unsigned long mem_start,
  1458.     int naddrc, int nsizec)
  1459. {
  1460. struct isa_reg_property *rp;
  1461. struct address_range *adr;
  1462. int i, l, *ip;
  1463. rp = (struct isa_reg_property *) get_property(np, "reg", &l);
  1464. if (rp != 0 && l >= sizeof(struct isa_reg_property)) {
  1465. i = 0;
  1466. adr = (struct address_range *) mem_start;
  1467. while ((l -= sizeof(struct reg_property)) >= 0) {
  1468. adr[i].space = rp[i].space;
  1469. adr[i].address = rp[i].address
  1470. + (adr[i].space? 0: _ISA_MEM_BASE);
  1471. adr[i].size = rp[i].size;
  1472. ++i;
  1473. }
  1474. np->addrs = adr;
  1475. np->n_addrs = i;
  1476. mem_start += i * sizeof(struct address_range);
  1477. }
  1478. if (use_of_interrupt_tree)
  1479. return mem_start;
  1480. ip = (int *) get_property(np, "interrupts", &l);
  1481. if (ip != 0) {
  1482. np->intrs = (struct interrupt_info *) mem_start;
  1483. np->n_intrs = l / (2 * sizeof(int));
  1484. mem_start += np->n_intrs * sizeof(struct interrupt_info);
  1485. for (i = 0; i < np->n_intrs; ++i) {
  1486. np->intrs[i].line = *ip++;
  1487. np->intrs[i].sense = *ip++;
  1488. }
  1489. }
  1490. return mem_start;
  1491. }
  1492. static unsigned long __init
  1493. interpret_root_props(struct device_node *np, unsigned long mem_start,
  1494.      int naddrc, int nsizec)
  1495. {
  1496. struct address_range *adr;
  1497. int i, l, *ip;
  1498. unsigned int *rp;
  1499. int rpsize = (naddrc + nsizec) * sizeof(unsigned int);
  1500. rp = (unsigned int *) get_property(np, "reg", &l);
  1501. if (rp != 0 && l >= rpsize) {
  1502. i = 0;
  1503. adr = (struct address_range *) mem_start;
  1504. while ((l -= rpsize) >= 0) {
  1505. adr[i].space = (naddrc >= 2? rp[naddrc-2]: 2);
  1506. adr[i].address = rp[naddrc - 1];
  1507. adr[i].size = rp[naddrc + nsizec - 1];
  1508. ++i;
  1509. rp += naddrc + nsizec;
  1510. }
  1511. np->addrs = adr;
  1512. np->n_addrs = i;
  1513. mem_start += i * sizeof(struct address_range);
  1514. }
  1515. if (use_of_interrupt_tree)
  1516. return mem_start;
  1517. ip = (int *) get_property(np, "AAPL,interrupts", &l);
  1518. if (ip == 0)
  1519. ip = (int *) get_property(np, "interrupts", &l);
  1520. if (ip != 0) {
  1521. np->intrs = (struct interrupt_info *) mem_start;
  1522. np->n_intrs = l / sizeof(int);
  1523. mem_start += np->n_intrs * sizeof(struct interrupt_info);
  1524. for (i = 0; i < np->n_intrs; ++i) {
  1525. np->intrs[i].line = *ip++;
  1526. np->intrs[i].sense = 1;
  1527. }
  1528. }
  1529. return mem_start;
  1530. }
  1531. /*
  1532.  * Work out the sense (active-low level / active-high edge)
  1533.  * of each interrupt from the device tree.
  1534.  */
  1535. void __init
  1536. prom_get_irq_senses(unsigned char *senses, int off, int max)
  1537. {
  1538. struct device_node *np;
  1539. int i, j;
  1540. /* default to level-triggered */
  1541. memset(senses, 1, max - off);
  1542. if (!use_of_interrupt_tree)
  1543. return;
  1544. for (np = allnodes; np != 0; np = np->allnext) {
  1545. for (j = 0; j < np->n_intrs; j++) {
  1546. i = np->intrs[j].line;
  1547. if (i >= off && i < max)
  1548. senses[i-off] = np->intrs[j].sense;
  1549. }
  1550. }
  1551. }
  1552. /*
  1553.  * Construct and return a list of the device_nodes with a given name.
  1554.  */
  1555. struct device_node *
  1556. find_devices(const char *name)
  1557. {
  1558. struct device_node *head, **prevp, *np;
  1559. prevp = &head;
  1560. for (np = allnodes; np != 0; np = np->allnext) {
  1561. if (np->name != 0 && strcasecmp(np->name, name) == 0) {
  1562. *prevp = np;
  1563. prevp = &np->next;
  1564. }
  1565. }
  1566. *prevp = 0;
  1567. return head;
  1568. }
  1569. /*
  1570.  * Construct and return a list of the device_nodes with a given type.
  1571.  */
  1572. struct device_node *
  1573. find_type_devices(const char *type)
  1574. {
  1575. struct device_node *head, **prevp, *np;
  1576. prevp = &head;
  1577. for (np = allnodes; np != 0; np = np->allnext) {
  1578. if (np->type != 0 && strcasecmp(np->type, type) == 0) {
  1579. *prevp = np;
  1580. prevp = &np->next;
  1581. }
  1582. }
  1583. *prevp = 0;
  1584. return head;
  1585. }
  1586. /*
  1587.  * Returns all nodes linked together
  1588.  */
  1589. struct device_node * __openfirmware
  1590. find_all_nodes(void)
  1591. {
  1592. struct device_node *head, **prevp, *np;
  1593. prevp = &head;
  1594. for (np = allnodes; np != 0; np = np->allnext) {
  1595. *prevp = np;
  1596. prevp = &np->next;
  1597. }
  1598. *prevp = 0;
  1599. return head;
  1600. }
  1601. /* Checks if the given "compat" string matches one of the strings in
  1602.  * the device's "compatible" property
  1603.  */
  1604. int
  1605. device_is_compatible(struct device_node *device, const char *compat)
  1606. {
  1607. const char* cp;
  1608. int cplen, l;
  1609. cp = (char *) get_property(device, "compatible", &cplen);
  1610. if (cp == NULL)
  1611. return 0;
  1612. while (cplen > 0) {
  1613. if (strncasecmp(cp, compat, strlen(compat)) == 0)
  1614. return 1;
  1615. l = strlen(cp) + 1;
  1616. cp += l;
  1617. cplen -= l;
  1618. }
  1619. return 0;
  1620. }
  1621. /*
  1622.  * Indicates whether the root node has a given value in its
  1623.  * compatible property.
  1624.  */
  1625. int
  1626. machine_is_compatible(const char *compat)
  1627. {
  1628. struct device_node *root;
  1629. root = find_path_device("/");
  1630. if (root == 0)
  1631. return 0;
  1632. return device_is_compatible(root, compat);
  1633. }
  1634. /*
  1635.  * Construct and return a list of the device_nodes with a given type
  1636.  * and compatible property.
  1637.  */
  1638. struct device_node *
  1639. find_compatible_devices(const char *type, const char *compat)
  1640. {
  1641. struct device_node *head, **prevp, *np;
  1642. prevp = &head;
  1643. for (np = allnodes; np != 0; np = np->allnext) {
  1644. if (type != NULL
  1645.     && !(np->type != 0 && strcasecmp(np->type, type) == 0))
  1646. continue;
  1647. if (device_is_compatible(np, compat)) {
  1648. *prevp = np;
  1649. prevp = &np->next;
  1650. }
  1651. }
  1652. *prevp = 0;
  1653. return head;
  1654. }
  1655. /*
  1656.  * Find the device_node with a given full_name.
  1657.  */
  1658. struct device_node *
  1659. find_path_device(const char *path)
  1660. {
  1661. struct device_node *np;
  1662. for (np = allnodes; np != 0; np = np->allnext)
  1663. if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0)
  1664. return np;
  1665. return NULL;
  1666. }
  1667. /*
  1668.  * Find the device_node with a given phandle.
  1669.  */
  1670. static struct device_node * __init
  1671. find_phandle(phandle ph)
  1672. {
  1673. struct device_node *np;
  1674. for (np = allnodes; np != 0; np = np->allnext)
  1675. if (np->node == ph)
  1676. return np;
  1677. return NULL;
  1678. }
  1679. /*
  1680.  * Find a property with a given name for a given node
  1681.  * and return the value.
  1682.  */
  1683. unsigned char *
  1684. get_property(struct device_node *np, const char *name, int *lenp)
  1685. {
  1686. struct property *pp;
  1687. for (pp = np->properties; pp != 0; pp = pp->next)
  1688. if (pp->name != NULL && strcmp(pp->name, name) == 0) {
  1689. if (lenp != 0)
  1690. *lenp = pp->length;
  1691. return pp->value;
  1692. }
  1693. return 0;
  1694. }
  1695. /*
  1696.  * Add a property to a node
  1697.  */
  1698. void __openfirmware
  1699. prom_add_property(struct device_node* np, struct property* prop)
  1700. {
  1701. struct property **next = &np->properties;
  1702. prop->next = NULL;
  1703. while (*next)
  1704. next = &(*next)->next;
  1705. *next = prop;
  1706. }
  1707. /* I quickly hacked that one, check against spec ! */
  1708. static inline unsigned long __openfirmware
  1709. bus_space_to_resource_flags(unsigned int bus_space)
  1710. {
  1711. u8 space = (bus_space >> 24) & 0xf;
  1712. if (space == 0)
  1713. space = 0x02;
  1714. if (space == 0x02)
  1715. return IORESOURCE_MEM;
  1716. else if (space == 0x01)
  1717. return IORESOURCE_IO;
  1718. else {
  1719. printk(KERN_WARNING "prom.c: bus_space_to_resource_flags(), space: %xn",
  1720.      bus_space);
  1721. return 0;
  1722. }
  1723. }
  1724. static struct resource* __openfirmware
  1725. find_parent_pci_resource(struct pci_dev* pdev, struct address_range *range)
  1726. {
  1727. unsigned long mask;
  1728. int i;
  1729. /* Check this one */ 
  1730. mask = bus_space_to_resource_flags(range->space);
  1731. for (i=0; i<DEVICE_COUNT_RESOURCE; i++) {
  1732. if ((pdev->resource[i].flags & mask) == mask &&
  1733. pdev->resource[i].start <= range->address &&
  1734. pdev->resource[i].end > range->address) {
  1735. if ((range->address + range->size - 1) > pdev->resource[i].end) {
  1736. /* Add better message */
  1737. printk(KERN_WARNING "PCI/OF resource overlap !n");
  1738. return NULL;
  1739. }
  1740. break;
  1741. }
  1742. }
  1743. if (i == DEVICE_COUNT_RESOURCE)
  1744. return NULL;
  1745. return &pdev->resource[i];
  1746. }
  1747. /*
  1748.  * Request an OF device resource. Currently handles child of PCI devices,
  1749.  * or other nodes attached to the root node. Ultimately, put some
  1750.  * link to resources in the OF node.
  1751.  * WARNING: out_resource->name should be initialized before calling this
  1752.  * function.
  1753.  */
  1754. struct resource* __openfirmware
  1755. request_OF_resource(struct device_node* node, int index, const char* name_postfix)
  1756. {
  1757. struct pci_dev* pcidev;
  1758. u8 pci_bus, pci_devfn;
  1759. unsigned long iomask;
  1760. struct device_node* nd;
  1761. struct resource* parent;
  1762. struct resource *res = NULL;
  1763. int nlen, plen;
  1764. if (index >= node->n_addrs)
  1765. goto fail;
  1766. /* Sanity check on bus space */
  1767. iomask = bus_space_to_resource_flags(node->addrs[index].space);
  1768. if (iomask & IORESOURCE_MEM)
  1769. parent = &iomem_resource;
  1770. else if (iomask & IORESOURCE_IO)
  1771. parent = &ioport_resource;
  1772. else
  1773. goto fail;
  1774. /* Find a PCI parent if any */
  1775. nd = node;
  1776. pcidev = NULL;
  1777. while(nd) {
  1778. if (!pci_device_from_OF_node(nd, &pci_bus, &pci_devfn))
  1779. pcidev = pci_find_slot(pci_bus, pci_devfn);
  1780. if (pcidev) break;
  1781. nd = nd->parent;
  1782. }
  1783. if (pcidev)
  1784. parent = find_parent_pci_resource(pcidev, &node->addrs[index]);
  1785. if (!parent) {
  1786. printk(KERN_WARNING "request_OF_resource(%s), parent not foundn",
  1787. node->name);
  1788. goto fail;
  1789. }
  1790. res = __request_region(parent, node->addrs[index].address, node->addrs[index].size, NULL);
  1791. if (!res)
  1792. goto fail;
  1793. nlen = strlen(node->name);
  1794. plen = name_postfix ? strlen(name_postfix) : 0;
  1795. res->name = (const char *)kmalloc(nlen+plen+1, GFP_KERNEL);
  1796. if (res->name) {
  1797. strcpy((char *)res->name, node->name);
  1798. if (plen)
  1799. strcpy((char *)res->name+nlen, name_postfix);
  1800. }
  1801. return res;
  1802. fail:
  1803. return NULL;
  1804. }
  1805. int __openfirmware
  1806. release_OF_resource(struct device_node* node, int index)
  1807. {
  1808. struct pci_dev* pcidev;
  1809. u8 pci_bus, pci_devfn;
  1810. unsigned long iomask;
  1811. struct device_node* nd;
  1812. struct resource* parent;
  1813. struct resource *res = NULL;
  1814. if (index >= node->n_addrs)
  1815. return -EINVAL;
  1816. /* Sanity check on bus space */
  1817. iomask = bus_space_to_resource_flags(node->addrs[index].space);
  1818. if (iomask & IORESOURCE_MEM)
  1819. parent = &iomem_resource;
  1820. else if (iomask & IORESOURCE_IO)
  1821. parent = &ioport_resource;
  1822. else
  1823. return -EINVAL;
  1824. /* Find a PCI parent if any */
  1825. nd = node;
  1826. pcidev = NULL;
  1827. while(nd) {
  1828. if (!pci_device_from_OF_node(nd, &pci_bus, &pci_devfn))
  1829. pcidev = pci_find_slot(pci_bus, pci_devfn);
  1830. if (pcidev) break;
  1831. nd = nd->parent;
  1832. }
  1833. if (pcidev)
  1834. parent = find_parent_pci_resource(pcidev, &node->addrs[index]);
  1835. if (!parent) {
  1836. printk(KERN_WARNING "request_OF_resource(%s), parent not foundn",
  1837. node->name);
  1838. return -ENODEV;
  1839. }
  1840. /* Find us in the parent */
  1841. res = parent->child;
  1842. while (res) {
  1843. if (res->start == node->addrs[index].address &&
  1844.     res->end == (res->start + node->addrs[index].size - 1))
  1845.      break;
  1846. res = res->sibling;
  1847. }
  1848. if (!res)
  1849. return -ENODEV;
  1850. if (res->name) {
  1851. kfree(res->name);
  1852. res->name = NULL;
  1853. }
  1854. release_resource(res);
  1855. kfree(res);
  1856. return 0;
  1857. }
  1858. #if 0
  1859. void __openfirmware
  1860. print_properties(struct device_node *np)
  1861. {
  1862. struct property *pp;
  1863. char *cp;
  1864. int i, n;
  1865. for (pp = np->properties; pp != 0; pp = pp->next) {
  1866. printk(KERN_INFO "%s", pp->name);
  1867. for (i = strlen(pp->name); i < 16; ++i)
  1868. printk(" ");
  1869. cp = (char *) pp->value;
  1870. for (i = pp->length; i > 0; --i, ++cp)
  1871. if ((i > 1 && (*cp < 0x20 || *cp > 0x7e))
  1872.     || (i == 1 && *cp != 0))
  1873. break;
  1874. if (i == 0 && pp->length > 1) {
  1875. /* looks like a string */
  1876. printk(" %sn", (char *) pp->value);
  1877. } else {
  1878. /* dump it in hex */
  1879. n = pp->length;
  1880. if (n > 64)
  1881. n = 64;
  1882. if (pp->length % 4 == 0) {
  1883. unsigned int *p = (unsigned int *) pp->value;
  1884. n /= 4;
  1885. for (i = 0; i < n; ++i) {
  1886. if (i != 0 && (i % 4) == 0)
  1887. printk("n                ");
  1888. printk(" %08x", *p++);
  1889. }
  1890. } else {
  1891. unsigned char *bp = pp->value;
  1892. for (i = 0; i < n; ++i) {
  1893. if (i != 0 && (i % 16) == 0)
  1894. printk("n                ");
  1895. printk(" %02x", *bp++);
  1896. }
  1897. }
  1898. printk("n");
  1899. if (pp->length > 64)
  1900. printk("                 ... (length = %d)n",
  1901.        pp->length);
  1902. }
  1903. }
  1904. }
  1905. #endif
  1906. static spinlock_t rtas_lock = SPIN_LOCK_UNLOCKED;
  1907. /* this can be called after setup -- Cort */
  1908. int __openfirmware
  1909. call_rtas(const char *service, int nargs, int nret,
  1910.   unsigned long *outputs, ...)
  1911. {
  1912. va_list list;
  1913. int i;
  1914. unsigned long s;
  1915. struct device_node *rtas;
  1916. int *tokp;
  1917. union {
  1918. unsigned long words[16];
  1919. double align;
  1920. } u;
  1921. rtas = find_devices("rtas");
  1922. if (rtas == NULL)
  1923. return -1;
  1924. tokp = (int *) get_property(rtas, service, NULL);
  1925. if (tokp == NULL) {
  1926. printk(KERN_ERR "No RTAS service called %sn", service);
  1927. return -1;
  1928. }
  1929. u.words[0] = *tokp;
  1930. u.words[1] = nargs;
  1931. u.words[2] = nret;
  1932. va_start(list, outputs);
  1933. for (i = 0; i < nargs; ++i)
  1934. u.words[i+3] = va_arg(list, unsigned long);
  1935. va_end(list);
  1936. /* Shouldn't we enable kernel FP here ? enter_rtas will play
  1937.  * with MSR_FE0|MSR_FE1|MSR_FP so I assume rtas might use
  1938.  * floating points. If that's the case, then we need to make
  1939.  * sure any lazy FP context is backed up
  1940.  * --BenH
  1941.  */
  1942. spin_lock_irqsave(&rtas_lock, s);
  1943. enter_rtas((void *)__pa(&u));
  1944. spin_unlock_irqrestore(&rtas_lock, s);
  1945. if (nret > 1 && outputs != NULL)
  1946. for (i = 0; i < nret-1; ++i)
  1947. outputs[i] = u.words[i+nargs+4];
  1948. return u.words[nargs+3];
  1949. }
  1950. void __init
  1951. abort()
  1952. {
  1953. #ifdef CONFIG_XMON
  1954. xmon(NULL);
  1955. #endif
  1956. for (;;)
  1957. prom_exit();
  1958. }