]> git.karo-electronics.de Git - linux-beck.git/blob - arch/powerpc/kernel/prom.c
4869c937b6cf22949ef27ba965640fe84ed623fe
[linux-beck.git] / arch / powerpc / kernel / prom.c
1 /*
2  * Procedures for creating, accessing and interpreting the device tree.
3  *
4  * Paul Mackerras       August 1996.
5  * Copyright (C) 1996-2005 Paul Mackerras.
6  * 
7  *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
8  *    {engebret|bergner}@us.ibm.com 
9  *
10  *      This program is free software; you can redistribute it and/or
11  *      modify it under the terms of the GNU General Public License
12  *      as published by the Free Software Foundation; either version
13  *      2 of the License, or (at your option) any later version.
14  */
15
16 #undef DEBUG
17
18 #include <stdarg.h>
19 #include <linux/kernel.h>
20 #include <linux/string.h>
21 #include <linux/init.h>
22 #include <linux/threads.h>
23 #include <linux/spinlock.h>
24 #include <linux/types.h>
25 #include <linux/pci.h>
26 #include <linux/stringify.h>
27 #include <linux/delay.h>
28 #include <linux/initrd.h>
29 #include <linux/bitops.h>
30 #include <linux/module.h>
31 #include <linux/kexec.h>
32 #include <linux/debugfs.h>
33 #include <linux/irq.h>
34 #include <linux/lmb.h>
35
36 #include <asm/prom.h>
37 #include <asm/rtas.h>
38 #include <asm/page.h>
39 #include <asm/processor.h>
40 #include <asm/irq.h>
41 #include <asm/io.h>
42 #include <asm/kdump.h>
43 #include <asm/smp.h>
44 #include <asm/system.h>
45 #include <asm/mmu.h>
46 #include <asm/pgtable.h>
47 #include <asm/pci.h>
48 #include <asm/iommu.h>
49 #include <asm/btext.h>
50 #include <asm/sections.h>
51 #include <asm/machdep.h>
52 #include <asm/pSeries_reconfig.h>
53 #include <asm/pci-bridge.h>
54 #include <asm/phyp_dump.h>
55 #include <asm/kexec.h>
56 #include <mm/mmu_decl.h>
57
58 #ifdef DEBUG
59 #define DBG(fmt...) printk(KERN_ERR fmt)
60 #else
61 #define DBG(fmt...)
62 #endif
63
64 #ifdef CONFIG_PPC64
65 int __initdata iommu_is_off;
66 int __initdata iommu_force_on;
67 unsigned long tce_alloc_start, tce_alloc_end;
68 #endif
69
70 /* export that to outside world */
71 struct device_node *of_chosen;
72
73 static int __init early_parse_mem(char *p)
74 {
75         if (!p)
76                 return 1;
77
78         memory_limit = PAGE_ALIGN(memparse(p, &p));
79         DBG("memory limit = 0x%llx\n", (unsigned long long)memory_limit);
80
81         return 0;
82 }
83 early_param("mem", early_parse_mem);
84
85 /**
86  * move_device_tree - move tree to an unused area, if needed.
87  *
88  * The device tree may be allocated beyond our memory limit, or inside the
89  * crash kernel region for kdump. If so, move it out of the way.
90  */
91 static void __init move_device_tree(void)
92 {
93         unsigned long start, size;
94         void *p;
95
96         DBG("-> move_device_tree\n");
97
98         start = __pa(initial_boot_params);
99         size = be32_to_cpu(initial_boot_params->totalsize);
100
101         if ((memory_limit && (start + size) > memory_limit) ||
102                         overlaps_crashkernel(start, size)) {
103                 p = __va(lmb_alloc_base(size, PAGE_SIZE, lmb.rmo_size));
104                 memcpy(p, initial_boot_params, size);
105                 initial_boot_params = (struct boot_param_header *)p;
106                 DBG("Moved device tree to 0x%p\n", p);
107         }
108
109         DBG("<- move_device_tree\n");
110 }
111
112 /*
113  * ibm,pa-features is a per-cpu property that contains a string of
114  * attribute descriptors, each of which has a 2 byte header plus up
115  * to 254 bytes worth of processor attribute bits.  First header
116  * byte specifies the number of bytes following the header.
117  * Second header byte is an "attribute-specifier" type, of which
118  * zero is the only currently-defined value.
119  * Implementation:  Pass in the byte and bit offset for the feature
120  * that we are interested in.  The function will return -1 if the
121  * pa-features property is missing, or a 1/0 to indicate if the feature
122  * is supported/not supported.  Note that the bit numbers are
123  * big-endian to match the definition in PAPR.
124  */
125 static struct ibm_pa_feature {
126         unsigned long   cpu_features;   /* CPU_FTR_xxx bit */
127         unsigned int    cpu_user_ftrs;  /* PPC_FEATURE_xxx bit */
128         unsigned char   pabyte;         /* byte number in ibm,pa-features */
129         unsigned char   pabit;          /* bit number (big-endian) */
130         unsigned char   invert;         /* if 1, pa bit set => clear feature */
131 } ibm_pa_features[] __initdata = {
132         {0, PPC_FEATURE_HAS_MMU,        0, 0, 0},
133         {0, PPC_FEATURE_HAS_FPU,        0, 1, 0},
134         {CPU_FTR_SLB, 0,                0, 2, 0},
135         {CPU_FTR_CTRL, 0,               0, 3, 0},
136         {CPU_FTR_NOEXECUTE, 0,          0, 6, 0},
137         {CPU_FTR_NODSISRALIGN, 0,       1, 1, 1},
138         {CPU_FTR_CI_LARGE_PAGE, 0,      1, 2, 0},
139         {CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0},
140 };
141
142 static void __init scan_features(unsigned long node, unsigned char *ftrs,
143                                  unsigned long tablelen,
144                                  struct ibm_pa_feature *fp,
145                                  unsigned long ft_size)
146 {
147         unsigned long i, len, bit;
148
149         /* find descriptor with type == 0 */
150         for (;;) {
151                 if (tablelen < 3)
152                         return;
153                 len = 2 + ftrs[0];
154                 if (tablelen < len)
155                         return;         /* descriptor 0 not found */
156                 if (ftrs[1] == 0)
157                         break;
158                 tablelen -= len;
159                 ftrs += len;
160         }
161
162         /* loop over bits we know about */
163         for (i = 0; i < ft_size; ++i, ++fp) {
164                 if (fp->pabyte >= ftrs[0])
165                         continue;
166                 bit = (ftrs[2 + fp->pabyte] >> (7 - fp->pabit)) & 1;
167                 if (bit ^ fp->invert) {
168                         cur_cpu_spec->cpu_features |= fp->cpu_features;
169                         cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
170                 } else {
171                         cur_cpu_spec->cpu_features &= ~fp->cpu_features;
172                         cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
173                 }
174         }
175 }
176
177 static void __init check_cpu_pa_features(unsigned long node)
178 {
179         unsigned char *pa_ftrs;
180         unsigned long tablelen;
181
182         pa_ftrs = of_get_flat_dt_prop(node, "ibm,pa-features", &tablelen);
183         if (pa_ftrs == NULL)
184                 return;
185
186         scan_features(node, pa_ftrs, tablelen,
187                       ibm_pa_features, ARRAY_SIZE(ibm_pa_features));
188 }
189
190 #ifdef CONFIG_PPC_STD_MMU_64
191 static void __init check_cpu_slb_size(unsigned long node)
192 {
193         u32 *slb_size_ptr;
194
195         slb_size_ptr = of_get_flat_dt_prop(node, "slb-size", NULL);
196         if (slb_size_ptr != NULL) {
197                 mmu_slb_size = *slb_size_ptr;
198                 return;
199         }
200         slb_size_ptr = of_get_flat_dt_prop(node, "ibm,slb-size", NULL);
201         if (slb_size_ptr != NULL) {
202                 mmu_slb_size = *slb_size_ptr;
203         }
204 }
205 #else
206 #define check_cpu_slb_size(node) do { } while(0)
207 #endif
208
209 static struct feature_property {
210         const char *name;
211         u32 min_value;
212         unsigned long cpu_feature;
213         unsigned long cpu_user_ftr;
214 } feature_properties[] __initdata = {
215 #ifdef CONFIG_ALTIVEC
216         {"altivec", 0, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC},
217         {"ibm,vmx", 1, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC},
218 #endif /* CONFIG_ALTIVEC */
219 #ifdef CONFIG_VSX
220         /* Yes, this _really_ is ibm,vmx == 2 to enable VSX */
221         {"ibm,vmx", 2, CPU_FTR_VSX, PPC_FEATURE_HAS_VSX},
222 #endif /* CONFIG_VSX */
223 #ifdef CONFIG_PPC64
224         {"ibm,dfp", 1, 0, PPC_FEATURE_HAS_DFP},
225         {"ibm,purr", 1, CPU_FTR_PURR, 0},
226         {"ibm,spurr", 1, CPU_FTR_SPURR, 0},
227 #endif /* CONFIG_PPC64 */
228 };
229
230 #if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
231 static inline void identical_pvr_fixup(unsigned long node)
232 {
233         unsigned int pvr;
234         char *model = of_get_flat_dt_prop(node, "model", NULL);
235
236         /*
237          * Since 440GR(x)/440EP(x) processors have the same pvr,
238          * we check the node path and set bit 28 in the cur_cpu_spec
239          * pvr for EP(x) processor version. This bit is always 0 in
240          * the "real" pvr. Then we call identify_cpu again with
241          * the new logical pvr to enable FPU support.
242          */
243         if (model && strstr(model, "440EP")) {
244                 pvr = cur_cpu_spec->pvr_value | 0x8;
245                 identify_cpu(0, pvr);
246                 DBG("Using logical pvr %x for %s\n", pvr, model);
247         }
248 }
249 #else
250 #define identical_pvr_fixup(node) do { } while(0)
251 #endif
252
253 static void __init check_cpu_feature_properties(unsigned long node)
254 {
255         unsigned long i;
256         struct feature_property *fp = feature_properties;
257         const u32 *prop;
258
259         for (i = 0; i < ARRAY_SIZE(feature_properties); ++i, ++fp) {
260                 prop = of_get_flat_dt_prop(node, fp->name, NULL);
261                 if (prop && *prop >= fp->min_value) {
262                         cur_cpu_spec->cpu_features |= fp->cpu_feature;
263                         cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftr;
264                 }
265         }
266 }
267
268 static int __init early_init_dt_scan_cpus(unsigned long node,
269                                           const char *uname, int depth,
270                                           void *data)
271 {
272         static int logical_cpuid = 0;
273         char *type = of_get_flat_dt_prop(node, "device_type", NULL);
274         const u32 *prop;
275         const u32 *intserv;
276         int i, nthreads;
277         unsigned long len;
278         int found = 0;
279
280         /* We are scanning "cpu" nodes only */
281         if (type == NULL || strcmp(type, "cpu") != 0)
282                 return 0;
283
284         /* Get physical cpuid */
285         intserv = of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", &len);
286         if (intserv) {
287                 nthreads = len / sizeof(int);
288         } else {
289                 intserv = of_get_flat_dt_prop(node, "reg", NULL);
290                 nthreads = 1;
291         }
292
293         /*
294          * Now see if any of these threads match our boot cpu.
295          * NOTE: This must match the parsing done in smp_setup_cpu_maps.
296          */
297         for (i = 0; i < nthreads; i++) {
298                 /*
299                  * version 2 of the kexec param format adds the phys cpuid of
300                  * booted proc.
301                  */
302                 if (initial_boot_params && initial_boot_params->version >= 2) {
303                         if (intserv[i] ==
304                                         initial_boot_params->boot_cpuid_phys) {
305                                 found = 1;
306                                 break;
307                         }
308                 } else {
309                         /*
310                          * Check if it's the boot-cpu, set it's hw index now,
311                          * unfortunately this format did not support booting
312                          * off secondary threads.
313                          */
314                         if (of_get_flat_dt_prop(node,
315                                         "linux,boot-cpu", NULL) != NULL) {
316                                 found = 1;
317                                 break;
318                         }
319                 }
320
321 #ifdef CONFIG_SMP
322                 /* logical cpu id is always 0 on UP kernels */
323                 logical_cpuid++;
324 #endif
325         }
326
327         if (found) {
328                 DBG("boot cpu: logical %d physical %d\n", logical_cpuid,
329                         intserv[i]);
330                 boot_cpuid = logical_cpuid;
331                 set_hard_smp_processor_id(boot_cpuid, intserv[i]);
332
333                 /*
334                  * PAPR defines "logical" PVR values for cpus that
335                  * meet various levels of the architecture:
336                  * 0x0f000001   Architecture version 2.04
337                  * 0x0f000002   Architecture version 2.05
338                  * If the cpu-version property in the cpu node contains
339                  * such a value, we call identify_cpu again with the
340                  * logical PVR value in order to use the cpu feature
341                  * bits appropriate for the architecture level.
342                  *
343                  * A POWER6 partition in "POWER6 architected" mode
344                  * uses the 0x0f000002 PVR value; in POWER5+ mode
345                  * it uses 0x0f000001.
346                  */
347                 prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
348                 if (prop && (*prop & 0xff000000) == 0x0f000000)
349                         identify_cpu(0, *prop);
350
351                 identical_pvr_fixup(node);
352         }
353
354         check_cpu_feature_properties(node);
355         check_cpu_pa_features(node);
356         check_cpu_slb_size(node);
357
358 #ifdef CONFIG_PPC_PSERIES
359         if (nthreads > 1)
360                 cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
361         else
362                 cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
363 #endif
364
365         return 0;
366 }
367
368 void __init early_init_dt_scan_chosen_arch(unsigned long node)
369 {
370         unsigned long *lprop;
371
372 #ifdef CONFIG_PPC64
373         /* check if iommu is forced on or off */
374         if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
375                 iommu_is_off = 1;
376         if (of_get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL)
377                 iommu_force_on = 1;
378 #endif
379
380         /* mem=x on the command line is the preferred mechanism */
381         lprop = of_get_flat_dt_prop(node, "linux,memory-limit", NULL);
382         if (lprop)
383                 memory_limit = *lprop;
384
385 #ifdef CONFIG_PPC64
386         lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-start", NULL);
387         if (lprop)
388                 tce_alloc_start = *lprop;
389         lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-end", NULL);
390         if (lprop)
391                 tce_alloc_end = *lprop;
392 #endif
393
394 #ifdef CONFIG_KEXEC
395         lprop = of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL);
396         if (lprop)
397                 crashk_res.start = *lprop;
398
399         lprop = of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL);
400         if (lprop)
401                 crashk_res.end = crashk_res.start + *lprop - 1;
402 #endif
403 }
404
405 #ifdef CONFIG_PPC_PSERIES
406 /*
407  * Interpret the ibm,dynamic-memory property in the
408  * /ibm,dynamic-reconfiguration-memory node.
409  * This contains a list of memory blocks along with NUMA affinity
410  * information.
411  */
412 static int __init early_init_dt_scan_drconf_memory(unsigned long node)
413 {
414         __be32 *dm, *ls, *usm;
415         unsigned long l, n, flags;
416         u64 base, size, lmb_size;
417         unsigned int is_kexec_kdump = 0, rngs;
418
419         ls = of_get_flat_dt_prop(node, "ibm,lmb-size", &l);
420         if (ls == NULL || l < dt_root_size_cells * sizeof(__be32))
421                 return 0;
422         lmb_size = dt_mem_next_cell(dt_root_size_cells, &ls);
423
424         dm = of_get_flat_dt_prop(node, "ibm,dynamic-memory", &l);
425         if (dm == NULL || l < sizeof(__be32))
426                 return 0;
427
428         n = *dm++;      /* number of entries */
429         if (l < (n * (dt_root_addr_cells + 4) + 1) * sizeof(__be32))
430                 return 0;
431
432         /* check if this is a kexec/kdump kernel. */
433         usm = of_get_flat_dt_prop(node, "linux,drconf-usable-memory",
434                                                  &l);
435         if (usm != NULL)
436                 is_kexec_kdump = 1;
437
438         for (; n != 0; --n) {
439                 base = dt_mem_next_cell(dt_root_addr_cells, &dm);
440                 flags = dm[3];
441                 /* skip DRC index, pad, assoc. list index, flags */
442                 dm += 4;
443                 /* skip this block if the reserved bit is set in flags (0x80)
444                    or if the block is not assigned to this partition (0x8) */
445                 if ((flags & 0x80) || !(flags & 0x8))
446                         continue;
447                 size = lmb_size;
448                 rngs = 1;
449                 if (is_kexec_kdump) {
450                         /*
451                          * For each lmb in ibm,dynamic-memory, a corresponding
452                          * entry in linux,drconf-usable-memory property contains
453                          * a counter 'p' followed by 'p' (base, size) duple.
454                          * Now read the counter from
455                          * linux,drconf-usable-memory property
456                          */
457                         rngs = dt_mem_next_cell(dt_root_size_cells, &usm);
458                         if (!rngs) /* there are no (base, size) duple */
459                                 continue;
460                 }
461                 do {
462                         if (is_kexec_kdump) {
463                                 base = dt_mem_next_cell(dt_root_addr_cells,
464                                                          &usm);
465                                 size = dt_mem_next_cell(dt_root_size_cells,
466                                                          &usm);
467                         }
468                         if (iommu_is_off) {
469                                 if (base >= 0x80000000ul)
470                                         continue;
471                                 if ((base + size) > 0x80000000ul)
472                                         size = 0x80000000ul - base;
473                         }
474                         lmb_add(base, size);
475                 } while (--rngs);
476         }
477         lmb_dump_all();
478         return 0;
479 }
480 #else
481 #define early_init_dt_scan_drconf_memory(node)  0
482 #endif /* CONFIG_PPC_PSERIES */
483
484 static int __init early_init_dt_scan_memory_ppc(unsigned long node,
485                                                 const char *uname,
486                                                 int depth, void *data)
487 {
488         if (depth == 1 &&
489             strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0)
490                 return early_init_dt_scan_drconf_memory(node);
491         
492         return early_init_dt_scan_memory(node, uname, depth, data);
493 }
494
495 void __init early_init_dt_add_memory_arch(u64 base, u64 size)
496 {
497 #if defined(CONFIG_PPC64)
498         if (iommu_is_off) {
499                 if (base >= 0x80000000ul)
500                         return;
501                 if ((base + size) > 0x80000000ul)
502                         size = 0x80000000ul - base;
503         }
504 #endif
505
506         lmb_add(base, size);
507
508         memstart_addr = min((u64)memstart_addr, base);
509 }
510
511 u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
512 {
513         return lmb_alloc(size, align);
514 }
515
516 #ifdef CONFIG_BLK_DEV_INITRD
517 void __init early_init_dt_setup_initrd_arch(unsigned long start,
518                 unsigned long end)
519 {
520         initrd_start = (unsigned long)__va(start);
521         initrd_end = (unsigned long)__va(end);
522         initrd_below_start_ok = 1;
523 }
524 #endif
525
526 static void __init early_reserve_mem(void)
527 {
528         u64 base, size;
529         u64 *reserve_map;
530         unsigned long self_base;
531         unsigned long self_size;
532
533         reserve_map = (u64 *)(((unsigned long)initial_boot_params) +
534                                         initial_boot_params->off_mem_rsvmap);
535
536         /* before we do anything, lets reserve the dt blob */
537         self_base = __pa((unsigned long)initial_boot_params);
538         self_size = initial_boot_params->totalsize;
539         lmb_reserve(self_base, self_size);
540
541 #ifdef CONFIG_BLK_DEV_INITRD
542         /* then reserve the initrd, if any */
543         if (initrd_start && (initrd_end > initrd_start))
544                 lmb_reserve(__pa(initrd_start), initrd_end - initrd_start);
545 #endif /* CONFIG_BLK_DEV_INITRD */
546
547 #ifdef CONFIG_PPC32
548         /* 
549          * Handle the case where we might be booting from an old kexec
550          * image that setup the mem_rsvmap as pairs of 32-bit values
551          */
552         if (*reserve_map > 0xffffffffull) {
553                 u32 base_32, size_32;
554                 u32 *reserve_map_32 = (u32 *)reserve_map;
555
556                 while (1) {
557                         base_32 = *(reserve_map_32++);
558                         size_32 = *(reserve_map_32++);
559                         if (size_32 == 0)
560                                 break;
561                         /* skip if the reservation is for the blob */
562                         if (base_32 == self_base && size_32 == self_size)
563                                 continue;
564                         DBG("reserving: %x -> %x\n", base_32, size_32);
565                         lmb_reserve(base_32, size_32);
566                 }
567                 return;
568         }
569 #endif
570         while (1) {
571                 base = *(reserve_map++);
572                 size = *(reserve_map++);
573                 if (size == 0)
574                         break;
575                 DBG("reserving: %llx -> %llx\n", base, size);
576                 lmb_reserve(base, size);
577         }
578 }
579
580 #ifdef CONFIG_PHYP_DUMP
581 /**
582  * phyp_dump_calculate_reserve_size() - reserve variable boot area 5% or arg
583  *
584  * Function to find the largest size we need to reserve
585  * during early boot process.
586  *
587  * It either looks for boot param and returns that OR
588  * returns larger of 256 or 5% rounded down to multiples of 256MB.
589  *
590  */
591 static inline unsigned long phyp_dump_calculate_reserve_size(void)
592 {
593         unsigned long tmp;
594
595         if (phyp_dump_info->reserve_bootvar)
596                 return phyp_dump_info->reserve_bootvar;
597
598         /* divide by 20 to get 5% of value */
599         tmp = lmb_end_of_DRAM();
600         do_div(tmp, 20);
601
602         /* round it down in multiples of 256 */
603         tmp = tmp & ~0x0FFFFFFFUL;
604
605         return (tmp > PHYP_DUMP_RMR_END ? tmp : PHYP_DUMP_RMR_END);
606 }
607
608 /**
609  * phyp_dump_reserve_mem() - reserve all not-yet-dumped mmemory
610  *
611  * This routine may reserve memory regions in the kernel only
612  * if the system is supported and a dump was taken in last
613  * boot instance or if the hardware is supported and the
614  * scratch area needs to be setup. In other instances it returns
615  * without reserving anything. The memory in case of dump being
616  * active is freed when the dump is collected (by userland tools).
617  */
618 static void __init phyp_dump_reserve_mem(void)
619 {
620         unsigned long base, size;
621         unsigned long variable_reserve_size;
622
623         if (!phyp_dump_info->phyp_dump_configured) {
624                 printk(KERN_ERR "Phyp-dump not supported on this hardware\n");
625                 return;
626         }
627
628         if (!phyp_dump_info->phyp_dump_at_boot) {
629                 printk(KERN_INFO "Phyp-dump disabled at boot time\n");
630                 return;
631         }
632
633         variable_reserve_size = phyp_dump_calculate_reserve_size();
634
635         if (phyp_dump_info->phyp_dump_is_active) {
636                 /* Reserve *everything* above RMR.Area freed by userland tools*/
637                 base = variable_reserve_size;
638                 size = lmb_end_of_DRAM() - base;
639
640                 /* XXX crashed_ram_end is wrong, since it may be beyond
641                  * the memory_limit, it will need to be adjusted. */
642                 lmb_reserve(base, size);
643
644                 phyp_dump_info->init_reserve_start = base;
645                 phyp_dump_info->init_reserve_size = size;
646         } else {
647                 size = phyp_dump_info->cpu_state_size +
648                         phyp_dump_info->hpte_region_size +
649                         variable_reserve_size;
650                 base = lmb_end_of_DRAM() - size;
651                 lmb_reserve(base, size);
652                 phyp_dump_info->init_reserve_start = base;
653                 phyp_dump_info->init_reserve_size = size;
654         }
655 }
656 #else
657 static inline void __init phyp_dump_reserve_mem(void) {}
658 #endif /* CONFIG_PHYP_DUMP  && CONFIG_PPC_RTAS */
659
660
661 void __init early_init_devtree(void *params)
662 {
663         phys_addr_t limit;
664
665         DBG(" -> early_init_devtree(%p)\n", params);
666
667         /* Setup flat device-tree pointer */
668         initial_boot_params = params;
669
670 #ifdef CONFIG_PPC_RTAS
671         /* Some machines might need RTAS info for debugging, grab it now. */
672         of_scan_flat_dt(early_init_dt_scan_rtas, NULL);
673 #endif
674
675 #ifdef CONFIG_PHYP_DUMP
676         /* scan tree to see if dump occured during last boot */
677         of_scan_flat_dt(early_init_dt_scan_phyp_dump, NULL);
678 #endif
679
680         /* Retrieve various informations from the /chosen node of the
681          * device-tree, including the platform type, initrd location and
682          * size, TCE reserve, and more ...
683          */
684         of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
685
686         /* Scan memory nodes and rebuild LMBs */
687         lmb_init();
688         of_scan_flat_dt(early_init_dt_scan_root, NULL);
689         of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL);
690
691         /* Save command line for /proc/cmdline and then parse parameters */
692         strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE);
693         parse_early_param();
694
695         /* Reserve LMB regions used by kernel, initrd, dt, etc... */
696         lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START);
697         /* If relocatable, reserve first 32k for interrupt vectors etc. */
698         if (PHYSICAL_START > MEMORY_START)
699                 lmb_reserve(MEMORY_START, 0x8000);
700         reserve_kdump_trampoline();
701         reserve_crashkernel();
702         early_reserve_mem();
703         phyp_dump_reserve_mem();
704
705         limit = memory_limit;
706         if (! limit) {
707                 phys_addr_t memsize;
708
709                 /* Ensure that total memory size is page-aligned, because
710                  * otherwise mark_bootmem() gets upset. */
711                 lmb_analyze();
712                 memsize = lmb_phys_mem_size();
713                 if ((memsize & PAGE_MASK) != memsize)
714                         limit = memsize & PAGE_MASK;
715         }
716         lmb_enforce_memory_limit(limit);
717
718         lmb_analyze();
719         lmb_dump_all();
720
721         DBG("Phys. mem: %llx\n", lmb_phys_mem_size());
722
723         /* We may need to relocate the flat tree, do it now.
724          * FIXME .. and the initrd too? */
725         move_device_tree();
726
727         DBG("Scanning CPUs ...\n");
728
729         /* Retreive CPU related informations from the flat tree
730          * (altivec support, boot CPU ID, ...)
731          */
732         of_scan_flat_dt(early_init_dt_scan_cpus, NULL);
733
734         DBG(" <- early_init_devtree()\n");
735 }
736
737 /*******
738  *
739  * New implementation of the OF "find" APIs, return a refcounted
740  * object, call of_node_put() when done.  The device tree and list
741  * are protected by a rw_lock.
742  *
743  * Note that property management will need some locking as well,
744  * this isn't dealt with yet.
745  *
746  *******/
747
748 /**
749  *      of_find_next_cache_node - Find a node's subsidiary cache
750  *      @np:    node of type "cpu" or "cache"
751  *
752  *      Returns a node pointer with refcount incremented, use
753  *      of_node_put() on it when done.  Caller should hold a reference
754  *      to np.
755  */
756 struct device_node *of_find_next_cache_node(struct device_node *np)
757 {
758         struct device_node *child;
759         const phandle *handle;
760
761         handle = of_get_property(np, "l2-cache", NULL);
762         if (!handle)
763                 handle = of_get_property(np, "next-level-cache", NULL);
764
765         if (handle)
766                 return of_find_node_by_phandle(*handle);
767
768         /* OF on pmac has nodes instead of properties named "l2-cache"
769          * beneath CPU nodes.
770          */
771         if (!strcmp(np->type, "cpu"))
772                 for_each_child_of_node(np, child)
773                         if (!strcmp(child->type, "cache"))
774                                 return child;
775
776         return NULL;
777 }
778
779 #ifdef CONFIG_PPC_PSERIES
780 /*
781  * Fix up the uninitialized fields in a new device node:
782  * name, type and pci-specific fields
783  */
784
785 static int of_finish_dynamic_node(struct device_node *node)
786 {
787         struct device_node *parent = of_get_parent(node);
788         int err = 0;
789         const phandle *ibm_phandle;
790
791         node->name = of_get_property(node, "name", NULL);
792         node->type = of_get_property(node, "device_type", NULL);
793
794         if (!node->name)
795                 node->name = "<NULL>";
796         if (!node->type)
797                 node->type = "<NULL>";
798
799         if (!parent) {
800                 err = -ENODEV;
801                 goto out;
802         }
803
804         /* We don't support that function on PowerMac, at least
805          * not yet
806          */
807         if (machine_is(powermac))
808                 return -ENODEV;
809
810         /* fix up new node's phandle field */
811         if ((ibm_phandle = of_get_property(node, "ibm,phandle", NULL)))
812                 node->phandle = *ibm_phandle;
813
814 out:
815         of_node_put(parent);
816         return err;
817 }
818
819 static int prom_reconfig_notifier(struct notifier_block *nb,
820                                   unsigned long action, void *node)
821 {
822         int err;
823
824         switch (action) {
825         case PSERIES_RECONFIG_ADD:
826                 err = of_finish_dynamic_node(node);
827                 if (err < 0) {
828                         printk(KERN_ERR "finish_node returned %d\n", err);
829                         err = NOTIFY_BAD;
830                 }
831                 break;
832         default:
833                 err = NOTIFY_DONE;
834                 break;
835         }
836         return err;
837 }
838
839 static struct notifier_block prom_reconfig_nb = {
840         .notifier_call = prom_reconfig_notifier,
841         .priority = 10, /* This one needs to run first */
842 };
843
844 static int __init prom_reconfig_setup(void)
845 {
846         return pSeries_reconfig_notifier_register(&prom_reconfig_nb);
847 }
848 __initcall(prom_reconfig_setup);
849 #endif
850
851 /* Find the device node for a given logical cpu number, also returns the cpu
852  * local thread number (index in ibm,interrupt-server#s) if relevant and
853  * asked for (non NULL)
854  */
855 struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
856 {
857         int hardid;
858         struct device_node *np;
859
860         hardid = get_hard_smp_processor_id(cpu);
861
862         for_each_node_by_type(np, "cpu") {
863                 const u32 *intserv;
864                 unsigned int plen, t;
865
866                 /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist
867                  * fallback to "reg" property and assume no threads
868                  */
869                 intserv = of_get_property(np, "ibm,ppc-interrupt-server#s",
870                                 &plen);
871                 if (intserv == NULL) {
872                         const u32 *reg = of_get_property(np, "reg", NULL);
873                         if (reg == NULL)
874                                 continue;
875                         if (*reg == hardid) {
876                                 if (thread)
877                                         *thread = 0;
878                                 return np;
879                         }
880                 } else {
881                         plen /= sizeof(u32);
882                         for (t = 0; t < plen; t++) {
883                                 if (hardid == intserv[t]) {
884                                         if (thread)
885                                                 *thread = t;
886                                         return np;
887                                 }
888                         }
889                 }
890         }
891         return NULL;
892 }
893 EXPORT_SYMBOL(of_get_cpu_node);
894
895 #if defined(CONFIG_DEBUG_FS) && defined(DEBUG)
896 static struct debugfs_blob_wrapper flat_dt_blob;
897
898 static int __init export_flat_device_tree(void)
899 {
900         struct dentry *d;
901
902         flat_dt_blob.data = initial_boot_params;
903         flat_dt_blob.size = initial_boot_params->totalsize;
904
905         d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR,
906                                 powerpc_debugfs_root, &flat_dt_blob);
907         if (!d)
908                 return 1;
909
910         return 0;
911 }
912 __initcall(export_flat_device_tree);
913 #endif