smp.c 11.2 KB
Newer Older
1 2 3 4
/*
 * Author: Andy Fleming <afleming@freescale.com>
 * 	   Kumar Gala <galak@kernel.crashing.org>
 *
5
 * Copyright 2006-2008, 2011-2012, 2015 Freescale Semiconductor Inc.
6 7 8 9 10 11 12 13 14 15 16 17
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 */

#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/of.h>
18
#include <linux/kexec.h>
19
#include <linux/highmem.h>
20
#include <linux/cpu.h>
21
#include <linux/fsl/guts.h>
22 23 24 25 26 27

#include <asm/machdep.h>
#include <asm/pgtable.h>
#include <asm/page.h>
#include <asm/mpic.h>
#include <asm/cacheflush.h>
28
#include <asm/dbell.h>
29
#include <asm/code-patching.h>
30
#include <asm/cputhreads.h>
31
#include <asm/fsl_pm.h>
32 33

#include <sysdev/fsl_soc.h>
34
#include <sysdev/mpic.h>
35
#include "smp.h"
36

37 38 39 40 41 42 43 44
struct epapr_spin_table {
	u32	addr_h;
	u32	addr_l;
	u32	r3_h;
	u32	r3_l;
	u32	reserved;
	u32	pir;
};
45

46
#ifdef CONFIG_HOTPLUG_CPU
47 48 49 50 51 52 53 54 55 56 57 58 59 60
static u64 timebase;
static int tb_req;
static int tb_valid;

static void mpc85xx_give_timebase(void)
{
	unsigned long flags;

	local_irq_save(flags);

	while (!tb_req)
		barrier();
	tb_req = 0;

61
	qoriq_pm_ops->freeze_time_base(true);
62 63 64 65 66 67 68 69 70 71 72 73 74 75
#ifdef CONFIG_PPC64
	/*
	 * e5500/e6500 have a workaround for erratum A-006958 in place
	 * that will reread the timebase until TBL is non-zero.
	 * That would be a bad thing when the timebase is frozen.
	 *
	 * Thus, we read it manually, and instead of checking that
	 * TBL is non-zero, we ensure that TB does not change.  We don't
	 * do that for the main mftb implementation, because it requires
	 * a scratch register
	 */
	{
		u64 prev;

76 77
		asm volatile("mfspr %0, %1" : "=r" (timebase) :
			     "i" (SPRN_TBRL));
78 79 80

		do {
			prev = timebase;
81 82
			asm volatile("mfspr %0, %1" : "=r" (timebase) :
				     "i" (SPRN_TBRL));
83 84 85
		} while (prev != timebase);
	}
#else
86
	timebase = get_tb();
87
#endif
88 89 90 91 92 93
	mb();
	tb_valid = 1;

	while (tb_valid)
		barrier();

94
	qoriq_pm_ops->freeze_time_base(false);
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

	local_irq_restore(flags);
}

static void mpc85xx_take_timebase(void)
{
	unsigned long flags;

	local_irq_save(flags);

	tb_req = 1;
	while (!tb_valid)
		barrier();

	set_tb(timebase >> 32, timebase & 0xffffffff);
	isync();
	tb_valid = 0;

	local_irq_restore(flags);
}

116
static void smp_85xx_mach_cpu_die(void)
117 118 119 120
{
	unsigned int cpu = smp_processor_id();

	local_irq_disable();
121 122 123 124
	hard_irq_disable();
	/* mask all irqs to prevent cpu wakeup */
	qoriq_pm_ops->irq_mask(cpu);

125 126 127
	idle_task_exit();

	mtspr(SPRN_TCR, 0);
128
	mtspr(SPRN_TSR, mfspr(SPRN_TSR));
129

130
	generic_set_cpu_dead(cpu);
131

132
	cur_cpu_spec->cpu_down_flush();
133

134
	qoriq_pm_ops->cpu_die(cpu);
135 136 137 138 139 140

	while (1)
		;
}
#endif

141 142 143 144 145 146 147 148 149 150 151 152 153
static inline void flush_spin_table(void *spin_table)
{
	flush_dcache_range((ulong)spin_table,
		(ulong)spin_table + sizeof(struct epapr_spin_table));
}

static inline u32 read_spin_table_addr_l(void *spin_table)
{
	flush_dcache_range((ulong)spin_table,
		(ulong)spin_table + sizeof(struct epapr_spin_table));
	return in_be32(&((struct epapr_spin_table *)spin_table)->addr_l);
}

154 155 156 157
#ifdef CONFIG_PPC64
static void wake_hw_thread(void *info)
{
	void fsl_secondary_thread_init(void);
158
	unsigned long imsr, inia;
159 160
	int nr = *(const int *)info;

161 162 163 164 165 166 167 168 169 170 171 172 173
	imsr = MSR_KERNEL;
	inia = *(unsigned long *)fsl_secondary_thread_init;

	if (cpu_thread_in_core(nr) == 0) {
		/* For when we boot on a secondary thread with kdump */
		mttmr(TMRN_IMSR0, imsr);
		mttmr(TMRN_INIA0, inia);
		mtspr(SPRN_TENS, TEN_THREAD(0));
	} else {
		mttmr(TMRN_IMSR1, imsr);
		mttmr(TMRN_INIA1, inia);
		mtspr(SPRN_TENS, TEN_THREAD(1));
	}
174 175 176 177 178

	smp_generic_kick_cpu(nr);
}
#endif

179
static int smp_85xx_kick_cpu(int nr)
180 181 182
{
	unsigned long flags;
	const u64 *cpu_rel_addr;
183
	__iomem struct epapr_spin_table *spin_table;
184
	struct device_node *np;
185
	int hw_cpu = get_hard_smp_processor_id(nr);
186
	int ioremappable;
187
	int ret = 0;
188

189 190
	WARN_ON(nr < 0 || nr >= NR_CPUS);
	WARN_ON(hw_cpu < 0 || hw_cpu >= NR_CPUS);
191 192 193

	pr_debug("smp_85xx_kick_cpu: kick CPU #%d\n", nr);

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
#ifdef CONFIG_PPC64
	/* Threads don't use the spin table */
	if (cpu_thread_in_core(nr) != 0) {
		int primary = cpu_first_thread_sibling(nr);

		if (WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_SMT)))
			return -ENOENT;

		if (cpu_thread_in_core(nr) != 1) {
			pr_err("%s: cpu %d: invalid hw thread %d\n",
			       __func__, nr, cpu_thread_in_core(nr));
			return -ENOENT;
		}

		if (!cpu_online(primary)) {
			pr_err("%s: cpu %d: primary %d not online\n",
			       __func__, nr, primary);
			return -ENOENT;
		}

		smp_call_function_single(primary, wake_hw_thread, &nr, 0);
		return 0;
216 217 218 219 220 221
	} else if (cpu_thread_in_core(boot_cpuid) != 0 &&
		   cpu_first_thread_sibling(boot_cpuid) == nr) {
		if (WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_SMT)))
			return -ENOENT;

		smp_call_function_single(boot_cpuid, wake_hw_thread, &nr, 0);
222 223 224
	}
#endif

225 226 227 228 229
	np = of_get_cpu_node(nr, NULL);
	cpu_rel_addr = of_get_property(np, "cpu-release-addr", NULL);

	if (cpu_rel_addr == NULL) {
		printk(KERN_ERR "No cpu-release-addr for cpu %d\n", nr);
230
		return -ENOENT;
231 232
	}

233 234 235 236 237 238 239 240
	/*
	 * A secondary core could be in a spinloop in the bootpage
	 * (0xfffff000), somewhere in highmem, or somewhere in lowmem.
	 * The bootpage and highmem can be accessed via ioremap(), but
	 * we need to directly access the spinloop if its in lowmem.
	 */
	ioremappable = *cpu_rel_addr > virt_to_phys(high_memory);

241
	/* Map the spin table */
242
	if (ioremappable)
243 244
		spin_table = ioremap_prot(*cpu_rel_addr,
			sizeof(struct epapr_spin_table), _PAGE_COHERENT);
245
	else
246
		spin_table = phys_to_virt(*cpu_rel_addr);
247

248
	local_irq_save(flags);
249 250 251 252 253 254
#ifdef CONFIG_PPC32
#ifdef CONFIG_HOTPLUG_CPU
	/* Corresponding to generic_set_cpu_dead() */
	generic_set_cpu_up(nr);

	if (system_state == SYSTEM_RUNNING) {
255 256 257 258 259 260 261 262
		/*
		 * To keep it compatible with old boot program which uses
		 * cache-inhibit spin table, we need to flush the cache
		 * before accessing spin table to invalidate any staled data.
		 * We also need to flush the cache after writing to spin
		 * table to push data out.
		 */
		flush_spin_table(spin_table);
263
		out_be32(&spin_table->addr_l, 0);
264
		flush_spin_table(spin_table);
265

266 267 268 269
		/*
		 * We don't set the BPTR register here since it already points
		 * to the boot page properly.
		 */
270
		mpic_reset_core(nr);
271

272 273 274 275 276 277 278 279
		/*
		 * wait until core is ready...
		 * We need to invalidate the stale data, in case the boot
		 * loader uses a cache-inhibited spin table.
		 */
		if (!spin_event_timeout(
				read_spin_table_addr_l(spin_table) == 1,
				10000, 100)) {
280 281 282 283 284 285 286 287 288 289
			pr_err("%s: timeout waiting for core %d to reset\n",
							__func__, hw_cpu);
			ret = -ENOENT;
			goto out;
		}

		/*  clear the acknowledge status */
		__secondary_hold_acknowledge = -1;
	}
#endif
290
	flush_spin_table(spin_table);
291 292
	out_be32(&spin_table->pir, hw_cpu);
	out_be32(&spin_table->addr_l, __pa(__early_start));
293
	flush_spin_table(spin_table);
294

295
	/* Wait a bit for the CPU to ack. */
296 297 298 299 300 301 302 303
	if (!spin_event_timeout(__secondary_hold_acknowledge == hw_cpu,
					10000, 100)) {
		pr_err("%s: timeout waiting for core %d to ack\n",
						__func__, hw_cpu);
		ret = -ENOENT;
		goto out;
	}
out:
304
#else
305 306
	smp_generic_kick_cpu(nr);

307
	flush_spin_table(spin_table);
308
	out_be32(&spin_table->pir, hw_cpu);
309
	out_be64((u64 *)(&spin_table->addr_h),
310
		__pa(ppc_function_entry(generic_secondary_smp_init)));
311
	flush_spin_table(spin_table);
312
#endif
313 314 315

	local_irq_restore(flags);

316
	if (ioremappable)
317
		iounmap(spin_table);
318

319
	return ret;
320 321 322 323
}

struct smp_ops_t smp_85xx_ops = {
	.kick_cpu = smp_85xx_kick_cpu,
324
	.cpu_bootable = smp_generic_cpu_bootable,
325 326 327 328
#ifdef CONFIG_HOTPLUG_CPU
	.cpu_disable	= generic_cpu_disable,
	.cpu_die	= generic_cpu_die,
#endif
329
#if defined(CONFIG_KEXEC) && !defined(CONFIG_PPC64)
330 331 332
	.give_timebase	= smp_generic_give_timebase,
	.take_timebase	= smp_generic_take_timebase,
#endif
333 334
};

335
#ifdef CONFIG_KEXEC
336
#ifdef CONFIG_PPC32
337
atomic_t kexec_down_cpus = ATOMIC_INIT(0);
338 339 340

void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary)
{
341
	local_irq_disable();
342

343
	if (secondary) {
344
		cur_cpu_spec->cpu_down_flush();
345 346
		atomic_inc(&kexec_down_cpus);
		/* loop forever */
347 348 349 350 351 352 353 354 355
		while (1);
	}
}

static void mpc85xx_smp_kexec_down(void *arg)
{
	if (ppc_md.kexec_cpu_down)
		ppc_md.kexec_cpu_down(0,1);
}
356 357 358
#else
void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary)
{
359 360 361 362 363 364 365 366
	int cpu = smp_processor_id();
	int sibling = cpu_last_thread_sibling(cpu);
	bool notified = false;
	int disable_cpu;
	int disable_threadbit = 0;
	long start = mftb();
	long now;

367 368 369
	local_irq_disable();
	hard_irq_disable();
	mpic_teardown_this_cpu(secondary);
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407

	if (cpu == crashing_cpu && cpu_thread_in_core(cpu) != 0) {
		/*
		 * We enter the crash kernel on whatever cpu crashed,
		 * even if it's a secondary thread.  If that's the case,
		 * disable the corresponding primary thread.
		 */
		disable_threadbit = 1;
		disable_cpu = cpu_first_thread_sibling(cpu);
	} else if (sibling != crashing_cpu &&
		   cpu_thread_in_core(cpu) == 0 &&
		   cpu_thread_in_core(sibling) != 0) {
		disable_threadbit = 2;
		disable_cpu = sibling;
	}

	if (disable_threadbit) {
		while (paca[disable_cpu].kexec_state < KEXEC_STATE_REAL_MODE) {
			barrier();
			now = mftb();
			if (!notified && now - start > 1000000) {
				pr_info("%s/%d: waiting for cpu %d to enter KEXEC_STATE_REAL_MODE (%d)\n",
					__func__, smp_processor_id(),
					disable_cpu,
					paca[disable_cpu].kexec_state);
				notified = true;
			}
		}

		if (notified) {
			pr_info("%s: cpu %d done waiting\n",
				__func__, disable_cpu);
		}

		mtspr(SPRN_TENC, disable_threadbit);
		while (mfspr(SPRN_TENSR) & disable_threadbit)
			cpu_relax();
	}
408 409
}
#endif
410 411 412

static void mpc85xx_smp_machine_kexec(struct kimage *image)
{
413
#ifdef CONFIG_PPC32
414 415
	int timeout = INT_MAX;
	int i, num_cpus = num_present_cpus();
416

417 418
	if (image->type == KEXEC_TYPE_DEFAULT)
		smp_call_function(mpc85xx_smp_kexec_down, NULL, 0);
419

420
	while ( (atomic_read(&kexec_down_cpus) != (num_cpus - 1)) &&
421 422 423 424 425 426 427 428
		( timeout > 0 ) )
	{
		timeout--;
	}

	if ( !timeout )
		printk(KERN_ERR "Unable to bring down secondary cpu(s)");

429
	for_each_online_cpu(i)
430 431 432 433
	{
		if ( i == smp_processor_id() ) continue;
		mpic_reset_core(i);
	}
434
#endif
435 436 437 438 439

	default_machine_kexec(image);
}
#endif /* CONFIG_KEXEC */

440
static void smp_85xx_basic_setup(int cpu_nr)
441 442 443 444 445
{
	if (cpu_has_feature(CPU_FTR_DBELL))
		doorbell_setup_this_cpu();
}

446 447 448 449 450 451
static void smp_85xx_setup_cpu(int cpu_nr)
{
	mpic_setup_this_cpu();
	smp_85xx_basic_setup(cpu_nr);
}

452 453 454 455
void __init mpc85xx_smp_init(void)
{
	struct device_node *np;

456

457 458 459
	np = of_find_node_by_type(NULL, "open-pic");
	if (np) {
		smp_85xx_ops.probe = smp_mpic_probe;
460
		smp_85xx_ops.setup_cpu = smp_85xx_setup_cpu;
461
		smp_85xx_ops.message_pass = smp_mpic_message_pass;
462 463
	} else
		smp_85xx_ops.setup_cpu = smp_85xx_basic_setup;
464

465
	if (cpu_has_feature(CPU_FTR_DBELL)) {
466 467 468 469
		/*
		 * If left NULL, .message_pass defaults to
		 * smp_muxed_ipi_message_pass
		 */
470
		smp_85xx_ops.message_pass = NULL;
471
		smp_85xx_ops.cause_ipi = doorbell_cause_ipi;
472
		smp_85xx_ops.probe = NULL;
473
	}
474

475 476 477 478 479
#ifdef CONFIG_HOTPLUG_CPU
#ifdef CONFIG_FSL_PMC
	mpc85xx_setup_pmc();
#endif
	if (qoriq_pm_ops) {
480 481
		smp_85xx_ops.give_timebase = mpc85xx_give_timebase;
		smp_85xx_ops.take_timebase = mpc85xx_take_timebase;
482
		ppc_md.cpu_die = smp_85xx_mach_cpu_die;
483
	}
484
#endif
485
	smp_ops = &smp_85xx_ops;
486 487 488 489 490

#ifdef CONFIG_KEXEC
	ppc_md.kexec_cpu_down = mpc85xx_smp_kexec_cpu_down;
	ppc_md.machine_kexec = mpc85xx_smp_machine_kexec;
#endif
491
}