Merge tag 'csky-for-linus-4.20-fixup-dtb' of https://github.com/c-sky/csky-linux
[linux-block.git] / arch / powerpc / kernel / prom.c
CommitLineData
9b6b563c
PM
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>
9b6b563c
PM
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>
9b6b563c
PM
26#include <linux/delay.h>
27#include <linux/initrd.h>
28#include <linux/bitops.h>
4b16f8e2 29#include <linux/export.h>
dcee3036 30#include <linux/kexec.h>
0ebfff14 31#include <linux/irq.h>
95f72d1e 32#include <linux/memblock.h>
1cf3d8b3 33#include <linux/of.h>
708b7eef 34#include <linux/of_fdt.h>
060f78c2 35#include <linux/libfdt.h>
7f92bc56 36#include <linux/cpu.h>
9b6b563c
PM
37
38#include <asm/prom.h>
39#include <asm/rtas.h>
9b6b563c
PM
40#include <asm/page.h>
41#include <asm/processor.h>
42#include <asm/irq.h>
43#include <asm/io.h>
0cc4746c 44#include <asm/kdump.h>
9b6b563c 45#include <asm/smp.h>
9b6b563c 46#include <asm/mmu.h>
1426d5a3 47#include <asm/paca.h>
9b6b563c 48#include <asm/pgtable.h>
54820530 49#include <asm/powernv.h>
9b6b563c
PM
50#include <asm/iommu.h>
51#include <asm/btext.h>
52#include <asm/sections.h>
53#include <asm/machdep.h>
40ef8cbc 54#include <asm/pci-bridge.h>
2babf5c2 55#include <asm/kexec.h>
14a43e69 56#include <asm/opal.h>
eb39c880 57#include <asm/fadump.h>
da6a97bf 58#include <asm/epapr_hcalls.h>
3808a889 59#include <asm/firmware.h>
5a61ef74 60#include <asm/dt_cpu_ftrs.h>
6c6ea537 61#include <asm/drmem.h>
14a43e69 62
37dd2bad 63#include <mm/mmu_decl.h>
9b6b563c
PM
64
65#ifdef DEBUG
66#define DBG(fmt...) printk(KERN_ERR fmt)
67#else
68#define DBG(fmt...)
69#endif
70
9b6b563c 71#ifdef CONFIG_PPC64
28897731 72int __initdata iommu_is_off;
9b6b563c 73int __initdata iommu_force_on;
cf00a8d1 74unsigned long tce_alloc_start, tce_alloc_end;
cd3db0c4 75u64 ppc64_rma_size;
9b6b563c 76#endif
03bf469a 77static phys_addr_t first_memblock_size;
7ac87abb 78static int __initdata boot_cpu_count;
9b6b563c 79
2babf5c2
ME
80static int __init early_parse_mem(char *p)
81{
82 if (!p)
83 return 1;
84
85 memory_limit = PAGE_ALIGN(memparse(p, &p));
a84fcd46 86 DBG("memory limit = 0x%llx\n", memory_limit);
2babf5c2
ME
87
88 return 0;
89}
90early_param("mem", early_parse_mem);
91
307cfe71
BH
92/*
93 * overlaps_initrd - check for overlap with page aligned extension of
94 * initrd.
95 */
96static inline int overlaps_initrd(unsigned long start, unsigned long size)
97{
98#ifdef CONFIG_BLK_DEV_INITRD
99 if (!initrd_start)
100 return 0;
101
102 return (start + size) > _ALIGN_DOWN(initrd_start, PAGE_SIZE) &&
103 start <= _ALIGN_UP(initrd_end, PAGE_SIZE);
104#else
105 return 0;
106#endif
107}
108
3c607ce2
LV
109/**
110 * move_device_tree - move tree to an unused area, if needed.
111 *
112 * The device tree may be allocated beyond our memory limit, or inside the
307cfe71
BH
113 * crash kernel region for kdump, or within the page aligned range of initrd.
114 * If so, move it out of the way.
2babf5c2 115 */
18f032cb 116static void __init move_device_tree(void)
2babf5c2
ME
117{
118 unsigned long start, size;
119 void *p;
120
121 DBG("-> move_device_tree\n");
122
123 start = __pa(initial_boot_params);
060f78c2 124 size = fdt_totalsize(initial_boot_params);
2babf5c2 125
6dd22700 126 if ((memory_limit && (start + size) > PHYSICAL_START + memory_limit) ||
307cfe71
BH
127 overlaps_crashkernel(start, size) ||
128 overlaps_initrd(start, size)) {
9a8dd708 129 p = __va(memblock_phys_alloc(size, PAGE_SIZE));
2babf5c2 130 memcpy(p, initial_boot_params, size);
060f78c2 131 initial_boot_params = p;
2babf5c2
ME
132 DBG("Moved device tree to 0x%p\n", p);
133 }
134
135 DBG("<- move_device_tree\n");
136}
9b6b563c 137
d205819e
PM
138/*
139 * ibm,pa-features is a per-cpu property that contains a string of
140 * attribute descriptors, each of which has a 2 byte header plus up
141 * to 254 bytes worth of processor attribute bits. First header
142 * byte specifies the number of bytes following the header.
143 * Second header byte is an "attribute-specifier" type, of which
144 * zero is the only currently-defined value.
145 * Implementation: Pass in the byte and bit offset for the feature
146 * that we are interested in. The function will return -1 if the
147 * pa-features property is missing, or a 1/0 to indicate if the feature
148 * is supported/not supported. Note that the bit numbers are
149 * big-endian to match the definition in PAPR.
150 */
151static struct ibm_pa_feature {
152 unsigned long cpu_features; /* CPU_FTR_xxx bit */
44ae3ab3 153 unsigned long mmu_features; /* MMU_FTR_xxx bit */
d205819e 154 unsigned int cpu_user_ftrs; /* PPC_FEATURE_xxx bit */
beff8237 155 unsigned int cpu_user_ftrs2; /* PPC_FEATURE2_xxx bit */
d205819e
PM
156 unsigned char pabyte; /* byte number in ibm,pa-features */
157 unsigned char pabit; /* bit number (big-endian) */
158 unsigned char invert; /* if 1, pa bit set => clear feature */
159} ibm_pa_features[] __initdata = {
e9eb0278
ME
160 { .pabyte = 0, .pabit = 0, .cpu_user_ftrs = PPC_FEATURE_HAS_MMU },
161 { .pabyte = 0, .pabit = 1, .cpu_user_ftrs = PPC_FEATURE_HAS_FPU },
162 { .pabyte = 0, .pabit = 3, .cpu_features = CPU_FTR_CTRL },
163 { .pabyte = 0, .pabit = 6, .cpu_features = CPU_FTR_NOEXECUTE },
164 { .pabyte = 1, .pabit = 2, .mmu_features = MMU_FTR_CI_LARGE_PAGE },
d957fb4d 165#ifdef CONFIG_PPC_RADIX_MMU
e9eb0278 166 { .pabyte = 40, .pabit = 0, .mmu_features = MMU_FTR_TYPE_RADIX },
d957fb4d 167#endif
e9eb0278
ME
168 { .pabyte = 1, .pabit = 1, .invert = 1, .cpu_features = CPU_FTR_NODSISRALIGN },
169 { .pabyte = 5, .pabit = 0, .cpu_features = CPU_FTR_REAL_LE,
170 .cpu_user_ftrs = PPC_FEATURE_TRUE_LE },
9e819963 171 /*
4705e024
AB
172 * If the kernel doesn't support TM (ie CONFIG_PPC_TRANSACTIONAL_MEM=n),
173 * we don't want to turn on TM here, so we use the *_COMP versions
174 * which are 0 if the kernel doesn't support TM.
9e819963 175 */
e9eb0278
ME
176 { .pabyte = 22, .pabit = 0, .cpu_features = CPU_FTR_TM_COMP,
177 .cpu_user_ftrs2 = PPC_FEATURE2_HTM_COMP | PPC_FEATURE2_HTM_NOSC_COMP },
d205819e
PM
178};
179
9d0c4dfe 180static void __init scan_features(unsigned long node, const unsigned char *ftrs,
974a76f5
PM
181 unsigned long tablelen,
182 struct ibm_pa_feature *fp,
183 unsigned long ft_size)
d205819e 184{
974a76f5 185 unsigned long i, len, bit;
d205819e
PM
186
187 /* find descriptor with type == 0 */
188 for (;;) {
189 if (tablelen < 3)
190 return;
974a76f5 191 len = 2 + ftrs[0];
d205819e
PM
192 if (tablelen < len)
193 return; /* descriptor 0 not found */
974a76f5 194 if (ftrs[1] == 0)
d205819e
PM
195 break;
196 tablelen -= len;
974a76f5 197 ftrs += len;
d205819e
PM
198 }
199
200 /* loop over bits we know about */
974a76f5
PM
201 for (i = 0; i < ft_size; ++i, ++fp) {
202 if (fp->pabyte >= ftrs[0])
d205819e 203 continue;
974a76f5 204 bit = (ftrs[2 + fp->pabyte] >> (7 - fp->pabit)) & 1;
d205819e
PM
205 if (bit ^ fp->invert) {
206 cur_cpu_spec->cpu_features |= fp->cpu_features;
207 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
beff8237 208 cur_cpu_spec->cpu_user_features2 |= fp->cpu_user_ftrs2;
44ae3ab3 209 cur_cpu_spec->mmu_features |= fp->mmu_features;
d205819e
PM
210 } else {
211 cur_cpu_spec->cpu_features &= ~fp->cpu_features;
212 cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
beff8237 213 cur_cpu_spec->cpu_user_features2 &= ~fp->cpu_user_ftrs2;
44ae3ab3 214 cur_cpu_spec->mmu_features &= ~fp->mmu_features;
d205819e
PM
215 }
216 }
217}
218
974a76f5
PM
219static void __init check_cpu_pa_features(unsigned long node)
220{
9d0c4dfe
RH
221 const unsigned char *pa_ftrs;
222 int tablelen;
974a76f5
PM
223
224 pa_ftrs = of_get_flat_dt_prop(node, "ibm,pa-features", &tablelen);
225 if (pa_ftrs == NULL)
226 return;
227
228 scan_features(node, pa_ftrs, tablelen,
229 ibm_pa_features, ARRAY_SIZE(ibm_pa_features));
230}
231
4e003747 232#ifdef CONFIG_PPC_BOOK3S_64
9c61f7a0 233static void __init init_mmu_slb_size(unsigned long node)
584f8b71 234{
9d0c4dfe 235 const __be32 *slb_size_ptr;
584f8b71 236
9c61f7a0
AK
237 slb_size_ptr = of_get_flat_dt_prop(node, "slb-size", NULL) ? :
238 of_get_flat_dt_prop(node, "ibm,slb-size", NULL);
239
240 if (slb_size_ptr)
dc0e643a 241 mmu_slb_size = be32_to_cpup(slb_size_ptr);
584f8b71
MN
242}
243#else
9c61f7a0 244#define init_mmu_slb_size(node) do { } while(0)
584f8b71
MN
245#endif
246
974a76f5
PM
247static struct feature_property {
248 const char *name;
249 u32 min_value;
250 unsigned long cpu_feature;
251 unsigned long cpu_user_ftr;
252} feature_properties[] __initdata = {
253#ifdef CONFIG_ALTIVEC
254 {"altivec", 0, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC},
255 {"ibm,vmx", 1, CPU_FTR_ALTIVEC, PPC_FEATURE_HAS_ALTIVEC},
256#endif /* CONFIG_ALTIVEC */
b962ce9d
MN
257#ifdef CONFIG_VSX
258 /* Yes, this _really_ is ibm,vmx == 2 to enable VSX */
259 {"ibm,vmx", 2, CPU_FTR_VSX, PPC_FEATURE_HAS_VSX},
260#endif /* CONFIG_VSX */
974a76f5
PM
261#ifdef CONFIG_PPC64
262 {"ibm,dfp", 1, 0, PPC_FEATURE_HAS_DFP},
263 {"ibm,purr", 1, CPU_FTR_PURR, 0},
264 {"ibm,spurr", 1, CPU_FTR_SPURR, 0},
265#endif /* CONFIG_PPC64 */
266};
267
14b3d926
VB
268#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
269static inline void identical_pvr_fixup(unsigned long node)
270{
271 unsigned int pvr;
9d0c4dfe 272 const char *model = of_get_flat_dt_prop(node, "model", NULL);
14b3d926
VB
273
274 /*
275 * Since 440GR(x)/440EP(x) processors have the same pvr,
276 * we check the node path and set bit 28 in the cur_cpu_spec
277 * pvr for EP(x) processor version. This bit is always 0 in
278 * the "real" pvr. Then we call identify_cpu again with
279 * the new logical pvr to enable FPU support.
280 */
281 if (model && strstr(model, "440EP")) {
282 pvr = cur_cpu_spec->pvr_value | 0x8;
283 identify_cpu(0, pvr);
284 DBG("Using logical pvr %x for %s\n", pvr, model);
285 }
286}
287#else
288#define identical_pvr_fixup(node) do { } while(0)
289#endif
290
974a76f5
PM
291static void __init check_cpu_feature_properties(unsigned long node)
292{
4f1f40f7 293 int i;
974a76f5 294 struct feature_property *fp = feature_properties;
dc0e643a 295 const __be32 *prop;
974a76f5 296
4f1f40f7 297 for (i = 0; i < (int)ARRAY_SIZE(feature_properties); ++i, ++fp) {
974a76f5 298 prop = of_get_flat_dt_prop(node, fp->name, NULL);
dc0e643a 299 if (prop && be32_to_cpup(prop) >= fp->min_value) {
974a76f5
PM
300 cur_cpu_spec->cpu_features |= fp->cpu_feature;
301 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftr;
302 }
303 }
304}
305
9b6b563c 306static int __init early_init_dt_scan_cpus(unsigned long node,
4df20460
AB
307 const char *uname, int depth,
308 void *data)
9b6b563c 309{
9d0c4dfe 310 const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
dc0e643a
IM
311 const __be32 *prop;
312 const __be32 *intserv;
4df20460 313 int i, nthreads;
9d0c4dfe 314 int len;
9d07bc84 315 int found = -1;
208b3a4c 316 int found_thread = 0;
9b6b563c
PM
317
318 /* We are scanning "cpu" nodes only */
319 if (type == NULL || strcmp(type, "cpu") != 0)
320 return 0;
321
4df20460
AB
322 /* Get physical cpuid */
323 intserv = of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", &len);
e16c8765
AF
324 if (!intserv)
325 intserv = of_get_flat_dt_prop(node, "reg", &len);
326
327 nthreads = len / sizeof(int);
4df20460
AB
328
329 /*
330 * Now see if any of these threads match our boot cpu.
331 * NOTE: This must match the parsing done in smp_setup_cpu_maps.
332 */
333 for (i = 0; i < nthreads; i++) {
89c19062
ME
334 if (be32_to_cpu(intserv[i]) ==
335 fdt_boot_cpuid_phys(initial_boot_params)) {
336 found = boot_cpu_count;
337 found_thread = i;
9b6b563c 338 }
4df20460
AB
339#ifdef CONFIG_SMP
340 /* logical cpu id is always 0 on UP kernels */
9d07bc84 341 boot_cpu_count++;
4df20460
AB
342#endif
343 }
344
7222f779
BH
345 /* Not the boot CPU */
346 if (found < 0)
347 return 0;
9b6b563c 348
7222f779
BH
349 DBG("boot cpu: logical %d physical %d\n", found,
350 be32_to_cpu(intserv[found_thread]));
351 boot_cpuid = found;
14b3d926 352
7222f779
BH
353 /*
354 * PAPR defines "logical" PVR values for cpus that
355 * meet various levels of the architecture:
356 * 0x0f000001 Architecture version 2.04
357 * 0x0f000002 Architecture version 2.05
358 * If the cpu-version property in the cpu node contains
359 * such a value, we call identify_cpu again with the
360 * logical PVR value in order to use the cpu feature
361 * bits appropriate for the architecture level.
362 *
363 * A POWER6 partition in "POWER6 architected" mode
364 * uses the 0x0f000002 PVR value; in POWER5+ mode
365 * it uses 0x0f000001.
5a61ef74
NP
366 *
367 * If we're using device tree CPU feature discovery then we don't
368 * support the cpu-version property, and it's the responsibility of the
369 * firmware/hypervisor to provide the correct feature set for the
370 * architecture level via the ibm,powerpc-cpu-features binding.
7222f779 371 */
5a61ef74
NP
372 if (!dt_cpu_ftrs_in_use()) {
373 prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
374 if (prop && (be32_to_cpup(prop) & 0xff000000) == 0x0f000000)
375 identify_cpu(0, be32_to_cpup(prop));
7222f779 376
5a61ef74
NP
377 check_cpu_feature_properties(node);
378 check_cpu_pa_features(node);
379 }
9b6b563c 380
5a61ef74 381 identical_pvr_fixup(node);
9c61f7a0 382 init_mmu_slb_size(node);
d205819e 383
4a85b31d 384#ifdef CONFIG_PPC64
5a61ef74 385 if (nthreads == 1)
4df20460 386 cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
5a61ef74
NP
387 else if (!dt_cpu_ftrs_in_use())
388 cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
59f57774 389 allocate_paca(boot_cpuid);
9b6b563c 390#endif
59f57774 391 set_hard_smp_processor_id(found, be32_to_cpu(intserv[found_thread]));
5a61ef74 392
9b6b563c
PM
393 return 0;
394}
395
e51df2c1
AB
396static int __init early_init_dt_scan_chosen_ppc(unsigned long node,
397 const char *uname,
398 int depth, void *data)
9b6b563c 399{
9d0c4dfe 400 const unsigned long *lprop; /* All these set by kernel, so no need to convert endian */
9b6b563c 401
32c97689
GL
402 /* Use common scan routine to determine if this is the chosen node */
403 if (early_init_dt_scan_chosen(node, uname, depth, data) == 0)
404 return 0;
405
9b6b563c
PM
406#ifdef CONFIG_PPC64
407 /* check if iommu is forced on or off */
3c726f8d 408 if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
9b6b563c 409 iommu_is_off = 1;
3c726f8d 410 if (of_get_flat_dt_prop(node, "linux,iommu-force-on", NULL) != NULL)
9b6b563c
PM
411 iommu_force_on = 1;
412#endif
413
2babf5c2 414 /* mem=x on the command line is the preferred mechanism */
86e03221
GL
415 lprop = of_get_flat_dt_prop(node, "linux,memory-limit", NULL);
416 if (lprop)
417 memory_limit = *lprop;
9b6b563c
PM
418
419#ifdef CONFIG_PPC64
86e03221
GL
420 lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-start", NULL);
421 if (lprop)
422 tce_alloc_start = *lprop;
423 lprop = of_get_flat_dt_prop(node, "linux,tce-alloc-end", NULL);
424 if (lprop)
425 tce_alloc_end = *lprop;
9b6b563c
PM
426#endif
427
da665885 428#ifdef CONFIG_KEXEC_CORE
63277161 429 lprop = of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL);
70c6cc37
LV
430 if (lprop)
431 crashk_res.start = *lprop;
dcee3036 432
63277161 433 lprop = of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL);
70c6cc37
LV
434 if (lprop)
435 crashk_res.end = crashk_res.start + *lprop - 1;
dcee3036 436#endif
32c97689
GL
437
438 /* break now */
439 return 1;
9b6b563c
PM
440}
441
6aba0c84
AK
442/*
443 * Compare the range against max mem limit and update
444 * size if it cross the limit.
445 */
446
447#ifdef CONFIG_SPARSEMEM
448static bool validate_mem_limit(u64 base, u64 *size)
449{
450 u64 max_mem = 1UL << (MAX_PHYSMEM_BITS);
451
452 if (base >= max_mem)
453 return false;
454 if ((base + *size) > max_mem)
455 *size = max_mem - base;
456 return true;
457}
458#else
459static bool validate_mem_limit(u64 base, u64 *size)
460{
461 return true;
462}
463#endif
464
0204568a
PM
465#ifdef CONFIG_PPC_PSERIES
466/*
6c6ea537 467 * Interpret the ibm dynamic reconfiguration memory LMBs.
0204568a
PM
468 * This contains a list of memory blocks along with NUMA affinity
469 * information.
470 */
6c6ea537
NF
471static void __init early_init_drmem_lmb(struct drmem_lmb *lmb,
472 const __be32 **usm)
0204568a 473{
6c6ea537
NF
474 u64 base, size;
475 int is_kexec_kdump = 0, rngs;
0204568a 476
6c6ea537
NF
477 base = lmb->base_addr;
478 size = drmem_lmb_size();
479 rngs = 1;
0204568a 480
6c6ea537
NF
481 /*
482 * Skip this block if the reserved bit is set in flags
483 * or if the block is not assigned to this partition.
484 */
485 if ((lmb->flags & DRCONF_MEM_RESERVED) ||
486 !(lmb->flags & DRCONF_MEM_ASSIGNED))
487 return;
0204568a 488
6c6ea537 489 if (*usm)
cf00085d
C
490 is_kexec_kdump = 1;
491
6c6ea537
NF
492 if (is_kexec_kdump) {
493 /*
494 * For each memblock in ibm,dynamic-memory, a
495 * corresponding entry in linux,drconf-usable-memory
496 * property contains a counter 'p' followed by 'p'
497 * (base, size) duple. Now read the counter from
498 * linux,drconf-usable-memory property
499 */
500 rngs = dt_mem_next_cell(dt_root_size_cells, usm);
501 if (!rngs) /* there are no (base, size) duple */
502 return;
503 }
504
505 do {
cf00085d 506 if (is_kexec_kdump) {
6c6ea537
NF
507 base = dt_mem_next_cell(dt_root_addr_cells, usm);
508 size = dt_mem_next_cell(dt_root_size_cells, usm);
509 }
510
511 if (iommu_is_off) {
512 if (base >= 0x80000000ul)
0204568a 513 continue;
6c6ea537
NF
514 if ((base + size) > 0x80000000ul)
515 size = 0x80000000ul - base;
0204568a 516 }
6c6ea537
NF
517
518 DBG("Adding: %llx -> %llx\n", base, size);
6aba0c84
AK
519 if (validate_mem_limit(base, &size))
520 memblock_add(base, size);
6c6ea537 521 } while (--rngs);
0204568a 522}
0204568a 523#endif /* CONFIG_PPC_PSERIES */
9b6b563c 524
51975db0
GL
525static int __init early_init_dt_scan_memory_ppc(unsigned long node,
526 const char *uname,
527 int depth, void *data)
9b6b563c 528{
6c6ea537 529#ifdef CONFIG_PPC_PSERIES
0204568a 530 if (depth == 1 &&
6c6ea537
NF
531 strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0) {
532 walk_drmem_lmbs_early(node, early_init_drmem_lmb);
533 return 0;
534 }
535#endif
51975db0
GL
536
537 return early_init_dt_scan_memory(node, uname, depth, data);
538}
0204568a 539
b27652dd
KH
540/*
541 * For a relocatable kernel, we need to get the memstart_addr first,
542 * then use it to calculate the virtual kernel start address. This has
543 * to happen at a very early stage (before machine_init). In this case,
544 * we just want to get the memstart_address and would not like to mess the
545 * memblock at this stage. So introduce a variable to skip the memblock_add()
546 * for this reason.
547 */
548#ifdef CONFIG_RELOCATABLE
549static int add_mem_to_memblock = 1;
550#else
551#define add_mem_to_memblock 1
552#endif
553
51975db0
GL
554void __init early_init_dt_add_memory_arch(u64 base, u64 size)
555{
cd3db0c4 556#ifdef CONFIG_PPC64
51975db0
GL
557 if (iommu_is_off) {
558 if (base >= 0x80000000ul)
559 return;
560 if ((base + size) > 0x80000000ul)
561 size = 0x80000000ul - base;
562 }
9b6b563c 563#endif
03bf469a
BH
564 /* Keep track of the beginning of memory -and- the size of
565 * the very first block in the device-tree as it represents
566 * the RMA on ppc64 server
567 */
568 if (base < memstart_addr) {
569 memstart_addr = base;
570 first_memblock_size = size;
571 }
cd3db0c4
BH
572
573 /* Add the chunk to the MEMBLOCK list */
6aba0c84
AK
574 if (add_mem_to_memblock) {
575 if (validate_mem_limit(base, &size))
576 memblock_add(base, size);
577 }
9b6b563c
PM
578}
579
c039e3a8 580static void __init early_reserve_mem_dt(void)
0962e800 581{
9d0c4dfe
RH
582 unsigned long i, dt_root;
583 int len;
0962e800
JK
584 const __be32 *prop;
585
24bbd929 586 early_init_fdt_reserve_self();
edba274c
RH
587 early_init_fdt_scan_reserved_mem();
588
0962e800
JK
589 dt_root = of_get_flat_dt_root();
590
591 prop = of_get_flat_dt_prop(dt_root, "reserved-ranges", &len);
592
593 if (!prop)
c039e3a8
BH
594 return;
595
596 DBG("Found new-style reserved-ranges\n");
0962e800
JK
597
598 /* Each reserved range is an (address,size) pair, 2 cells each,
599 * totalling 4 cells per range. */
600 for (i = 0; i < len / (sizeof(*prop) * 4); i++) {
601 u64 base, size;
602
603 base = of_read_number(prop + (i * 4) + 0, 2);
604 size = of_read_number(prop + (i * 4) + 2, 2);
605
c039e3a8
BH
606 if (size) {
607 DBG("reserving: %llx -> %llx\n", base, size);
0962e800 608 memblock_reserve(base, size);
c039e3a8 609 }
0962e800 610 }
0962e800
JK
611}
612
9b6b563c
PM
613static void __init early_reserve_mem(void)
614{
dc0e643a 615 __be64 *reserve_map;
9b6b563c 616
dc0e643a 617 reserve_map = (__be64 *)(((unsigned long)initial_boot_params) +
060f78c2 618 fdt_off_mem_rsvmap(initial_boot_params));
4d1f3f25 619
c039e3a8
BH
620 /* Look for the new "reserved-regions" property in the DT */
621 early_reserve_mem_dt();
0962e800 622
30437b3e 623#ifdef CONFIG_BLK_DEV_INITRD
c039e3a8
BH
624 /* Then reserve the initrd, if any */
625 if (initrd_start && (initrd_end > initrd_start)) {
307cfe71
BH
626 memblock_reserve(_ALIGN_DOWN(__pa(initrd_start), PAGE_SIZE),
627 _ALIGN_UP(initrd_end, PAGE_SIZE) -
628 _ALIGN_DOWN(initrd_start, PAGE_SIZE));
c039e3a8 629 }
30437b3e
DG
630#endif /* CONFIG_BLK_DEV_INITRD */
631
cbbcf340
KG
632#ifdef CONFIG_PPC32
633 /*
634 * Handle the case where we might be booting from an old kexec
635 * image that setup the mem_rsvmap as pairs of 32-bit values
636 */
dc0e643a 637 if (be64_to_cpup(reserve_map) > 0xffffffffull) {
cbbcf340 638 u32 base_32, size_32;
dc0e643a 639 __be32 *reserve_map_32 = (__be32 *)reserve_map;
cbbcf340 640
c039e3a8
BH
641 DBG("Found old 32-bit reserve map\n");
642
cbbcf340 643 while (1) {
dc0e643a
IM
644 base_32 = be32_to_cpup(reserve_map_32++);
645 size_32 = be32_to_cpup(reserve_map_32++);
cbbcf340
KG
646 if (size_32 == 0)
647 break;
329dda08 648 DBG("reserving: %x -> %x\n", base_32, size_32);
95f72d1e 649 memblock_reserve(base_32, size_32);
cbbcf340
KG
650 }
651 return;
652 }
653#endif
9b6b563c
PM
654}
655
07fd1761
CB
656#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
657static bool tm_disabled __initdata;
658
659static int __init parse_ppc_tm(char *str)
660{
661 bool res;
662
663 if (kstrtobool(str, &res))
664 return -EINVAL;
665
666 tm_disabled = !res;
667
668 return 0;
669}
670early_param("ppc_tm", parse_ppc_tm);
671
672static void __init tm_init(void)
673{
674 if (tm_disabled) {
675 pr_info("Disabling hardware transactional memory (HTM)\n");
676 cur_cpu_spec->cpu_user_features2 &=
677 ~(PPC_FEATURE2_HTM_NOSC | PPC_FEATURE2_HTM);
678 cur_cpu_spec->cpu_features &= ~CPU_FTR_TM;
54820530 679 return;
07fd1761 680 }
54820530
ME
681
682 pnv_tm_init();
07fd1761
CB
683}
684#else
685static void tm_init(void) { }
686#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
687
9b6b563c
PM
688void __init early_init_devtree(void *params)
689{
49a84965 690 phys_addr_t limit;
6ca4f749 691
44348105 692 DBG(" -> early_init_devtree(%p)\n", params);
9b6b563c 693
ad72a279
ME
694 /* Too early to BUG_ON(), do it by hand */
695 if (!early_init_dt_verify(params))
696 panic("BUG: Failed verifying flat device tree, bad version?");
697
458148c0
ME
698#ifdef CONFIG_PPC_RTAS
699 /* Some machines might need RTAS info for debugging, grab it now. */
700 of_scan_flat_dt(early_init_dt_scan_rtas, NULL);
701#endif
702
14a43e69
BH
703#ifdef CONFIG_PPC_POWERNV
704 /* Some machines might need OPAL info for debugging, grab it now. */
705 of_scan_flat_dt(early_init_dt_scan_opal, NULL);
706#endif
707
eb39c880
MS
708#ifdef CONFIG_FA_DUMP
709 /* scan tree to see if dump is active during last boot */
710 of_scan_flat_dt(early_init_dt_scan_fw_dump, NULL);
711#endif
712
9b6b563c
PM
713 /* Retrieve various informations from the /chosen node of the
714 * device-tree, including the platform type, initrd location and
715 * size, TCE reserve, and more ...
716 */
3e47d147 717 of_scan_flat_dt(early_init_dt_scan_chosen_ppc, boot_command_line);
9b6b563c 718
95f72d1e 719 /* Scan memory nodes and rebuild MEMBLOCKs */
3c726f8d 720 of_scan_flat_dt(early_init_dt_scan_root, NULL);
51975db0 721 of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL);
846f77b0 722
846f77b0
ME
723 parse_early_param();
724
ba14f649
KG
725 /* make sure we've parsed cmdline for mem= before this */
726 if (memory_limit)
a84fcd46 727 first_memblock_size = min_t(u64, first_memblock_size, memory_limit);
ba14f649 728 setup_initial_memory_limit(memstart_addr, first_memblock_size);
95f72d1e
YL
729 /* Reserve MEMBLOCK regions used by kernel, initrd, dt, etc... */
730 memblock_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START);
549e8152
PM
731 /* If relocatable, reserve first 32k for interrupt vectors etc. */
732 if (PHYSICAL_START > MEMORY_START)
95f72d1e 733 memblock_reserve(MEMORY_START, 0x8000);
47310413 734 reserve_kdump_trampoline();
eb39c880
MS
735#ifdef CONFIG_FA_DUMP
736 /*
737 * If we fail to reserve memory for firmware-assisted dump then
738 * fallback to kexec based kdump.
739 */
740 if (fadump_reserve_mem() == 0)
741#endif
742 reserve_crashkernel();
9b6b563c
PM
743 early_reserve_mem();
744
14ed7409 745 /* Ensure that total memory size is page-aligned. */
6fbef13c 746 limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);
95f72d1e 747 memblock_enforce_memory_limit(limit);
6ca4f749 748
1aadc056 749 memblock_allow_resize();
95f72d1e 750 memblock_dump_all();
2babf5c2 751
95f72d1e 752 DBG("Phys. mem: %llx\n", memblock_phys_mem_size());
2babf5c2
ME
753
754 /* We may need to relocate the flat tree, do it now.
755 * FIXME .. and the initrd too? */
756 move_device_tree();
757
59f57774 758 allocate_paca_ptrs();
1426d5a3 759
9b6b563c
PM
760 DBG("Scanning CPUs ...\n");
761
5a61ef74
NP
762 dt_cpu_ftrs_scan();
763
25985edc 764 /* Retrieve CPU related informations from the flat tree
3c726f8d 765 * (altivec support, boot CPU ID, ...)
9b6b563c 766 */
3c726f8d 767 of_scan_flat_dt(early_init_dt_scan_cpus, NULL);
36ae37e3 768 if (boot_cpuid < 0) {
d939be3a 769 printk("Failed to identify boot CPU !\n");
36ae37e3
BH
770 BUG();
771 }
9b6b563c 772
7ac87abb
ME
773#if defined(CONFIG_SMP) && defined(CONFIG_PPC64)
774 /* We'll later wait for secondaries to check in; there are
775 * NCPUS-1 non-boot CPUs :-)
776 */
777 spinning_secondaries = boot_cpu_count - 1;
778#endif
779
1a01dc87
ME
780 mmu_early_init_devtree();
781
55672ecf
MS
782#ifdef CONFIG_PPC_POWERNV
783 /* Scan and build the list of machine check recoverable ranges */
784 of_scan_flat_dt(early_init_dt_scan_recoverable_ranges, NULL);
785#endif
da6a97bf 786 epapr_paravirt_early_init();
55672ecf 787
3808a889
BH
788 /* Now try to figure out if we are running on LPAR and so on */
789 pseries_probe_fw_features();
790
166dd7d3
BH
791#ifdef CONFIG_PPC_PS3
792 /* Identify PS3 firmware */
793 if (of_flat_dt_is_compatible(of_get_flat_dt_root(), "sony,ps3"))
794 powerpc_firmware_features |= FW_FEATURE_PS3_POSSIBLE;
795#endif
796
07fd1761
CB
797 tm_init();
798
9b6b563c
PM
799 DBG(" <- early_init_devtree()\n");
800}
801
b27652dd
KH
802#ifdef CONFIG_RELOCATABLE
803/*
804 * This function run before early_init_devtree, so we have to init
805 * initial_boot_params.
806 */
807void __init early_get_first_memblock_info(void *params, phys_addr_t *size)
808{
809 /* Setup flat device-tree pointer */
810 initial_boot_params = params;
811
812 /*
813 * Scan the memory nodes and set add_mem_to_memblock to 0 to avoid
814 * mess the memblock.
815 */
816 add_mem_to_memblock = 0;
817 of_scan_flat_dt(early_init_dt_scan_root, NULL);
818 of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL);
819 add_mem_to_memblock = 1;
820
821 if (size)
822 *size = first_memblock_size;
823}
824#endif
825
9b6b563c
PM
826/*******
827 *
828 * New implementation of the OF "find" APIs, return a refcounted
829 * object, call of_node_put() when done. The device tree and list
830 * are protected by a rw_lock.
831 *
832 * Note that property management will need some locking as well,
833 * this isn't dealt with yet.
834 *
835 *******/
836
b37193b7
BH
837/**
838 * of_get_ibm_chip_id - Returns the IBM "chip-id" of a device
839 * @np: device node of the device
840 *
841 * This looks for a property "ibm,chip-id" in the node or any
842 * of its parents and returns its content, or -1 if it cannot
843 * be found.
844 */
845int of_get_ibm_chip_id(struct device_node *np)
846{
847 of_node_get(np);
1856f50c 848 while (np) {
1856f50c 849 u32 chip_id;
b37193b7 850
1856f50c
CJ
851 /*
852 * Skiboot may produce memory nodes that contain more than one
853 * cell in chip-id, we only read the first one here.
854 */
855 if (!of_property_read_u32(np, "ibm,chip-id", &chip_id)) {
b37193b7 856 of_node_put(np);
1856f50c 857 return chip_id;
b37193b7 858 }
16c1d606
ME
859
860 np = of_get_next_parent(np);
b37193b7
BH
861 }
862 return -1;
863}
b130e7c0 864EXPORT_SYMBOL(of_get_ibm_chip_id);
b37193b7 865
3eb906c6
ME
866/**
867 * cpu_to_chip_id - Return the cpus chip-id
868 * @cpu: The logical cpu number.
869 *
870 * Return the value of the ibm,chip-id property corresponding to the given
871 * logical cpu number. If the chip-id can not be found, returns -1.
872 */
873int cpu_to_chip_id(int cpu)
874{
875 struct device_node *np;
876
877 np = of_get_cpu_node(cpu, NULL);
878 if (!np)
879 return -1;
880
881 of_node_put(np);
882 return of_get_ibm_chip_id(np);
883}
884EXPORT_SYMBOL(cpu_to_chip_id);
885
819d5965
SK
886bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
887{
9f593f13
NP
888#ifdef CONFIG_SMP
889 /*
890 * Early firmware scanning must use this rather than
891 * get_hard_smp_processor_id because we don't have pacas allocated
892 * until memory topology is discovered.
893 */
894 if (cpu_to_phys_id != NULL)
895 return (int)phys_id == cpu_to_phys_id[cpu];
896#endif
897
819d5965
SK
898 return (int)phys_id == get_hard_smp_processor_id(cpu);
899}