smp.c 11.3 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
static u64 timebase;
static int tb_req;
static int tb_valid;

static void mpc85xx_give_timebase(void)
{
	unsigned long flags;

	local_irq_save(flags);
56
	hard_irq_disable();
57 58 59 60 61

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

62
	qoriq_pm_ops->freeze_time_base(true);
63 64 65 66 67 68 69 70 71 72 73 74 75 76
#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;

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

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

	while (tb_valid)
		barrier();

95
	qoriq_pm_ops->freeze_time_base(false);
96 97 98 99 100 101 102 103 104

	local_irq_restore(flags);
}

static void mpc85xx_take_timebase(void)
{
	unsigned long flags;

	local_irq_save(flags);
105
	hard_irq_disable();
106 107 108 109 110 111 112 113 114 115 116 117

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

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

	local_irq_restore(flags);
}

118
static void smp_85xx_mach_cpu_die(void)
119 120 121 122
{
	unsigned int cpu = smp_processor_id();

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

127 128 129
	idle_task_exit();

	mtspr(SPRN_TCR, 0);
130
	mtspr(SPRN_TSR, mfspr(SPRN_TSR));
131

132
	generic_set_cpu_dead(cpu);
133

134
	cur_cpu_spec->cpu_down_flush();
135

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

	while (1)
		;
}
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156

static void qoriq_cpu_kill(unsigned int cpu)
{
	int i;

	for (i = 0; i < 500; i++) {
		if (is_cpu_dead(cpu)) {
#ifdef CONFIG_PPC64
			paca[cpu].cpu_start = 0;
#endif
			return;
		}
		msleep(20);
	}
	pr_err("CPU%d didn't die...\n", cpu);
}
157 158
#endif

159 160 161 162 163 164 165
/*
 * 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.
 */
166 167 168 169 170 171 172 173 174 175 176 177 178
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);
}

179 180 181 182
#ifdef CONFIG_PPC64
static void wake_hw_thread(void *info)
{
	void fsl_secondary_thread_init(void);
183 184
	unsigned long inia;
	int cpu = *(const int *)info;
185

186
	inia = *(unsigned long *)fsl_secondary_thread_init;
187
	book3e_start_thread(cpu_thread_in_core(cpu), inia);
188 189 190
}
#endif

191
static int smp_85xx_start_cpu(int cpu)
192
{
193
	int ret = 0;
194
	struct device_node *np;
195 196
	const u64 *cpu_rel_addr;
	unsigned long flags;
197
	int ioremappable;
198 199
	int hw_cpu = get_hard_smp_processor_id(cpu);
	struct epapr_spin_table __iomem *spin_table;
200

201
	np = of_get_cpu_node(cpu, NULL);
202
	cpu_rel_addr = of_get_property(np, "cpu-release-addr", NULL);
203 204
	if (!cpu_rel_addr) {
		pr_err("No cpu-release-addr for cpu %d\n", cpu);
205
		return -ENOENT;
206 207
	}

208 209 210 211 212 213 214 215
	/*
	 * 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);

216
	/* Map the spin table */
217
	if (ioremappable)
218 219
		spin_table = ioremap_prot(*cpu_rel_addr,
			sizeof(struct epapr_spin_table), _PAGE_COHERENT);
220
	else
221
		spin_table = phys_to_virt(*cpu_rel_addr);
222

223
	local_irq_save(flags);
224
	hard_irq_disable();
225

226 227
	if (qoriq_pm_ops)
		qoriq_pm_ops->cpu_up_prepare(cpu);
228

229 230
	/* if cpu is not spinning, reset it */
	if (read_spin_table_addr_l(spin_table) != 1) {
231 232 233 234
		/*
		 * We don't set the BPTR register here since it already points
		 * to the boot page properly.
		 */
235
		mpic_reset_core(cpu);
236

237 238 239 240 241 242 243 244
		/*
		 * 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)) {
245 246 247 248
			pr_err("timeout waiting for cpu %d to reset\n",
				hw_cpu);
			ret = -EAGAIN;
			goto err;
249 250
		}
	}
251

252
	flush_spin_table(spin_table);
253
	out_be32(&spin_table->pir, hw_cpu);
254
#ifdef CONFIG_PPC64
255
	out_be64((u64 *)(&spin_table->addr_h),
256
		__pa(ppc_function_entry(generic_secondary_smp_init)));
257 258
#else
	out_be32(&spin_table->addr_l, __pa(__early_start));
259
#endif
260 261
	flush_spin_table(spin_table);
err:
262 263
	local_irq_restore(flags);

264
	if (ioremappable)
265
		iounmap(spin_table);
266

267
	return ret;
268 269
}

270 271 272 273 274 275 276 277 278 279 280 281
static int smp_85xx_kick_cpu(int nr)
{
	int ret = 0;
#ifdef CONFIG_PPC64
	int primary = nr;
#endif

	WARN_ON(nr < 0 || nr >= num_possible_cpus());

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

#ifdef CONFIG_PPC64
282
	if (threads_per_core == 2) {
283 284 285
		if (WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_SMT)))
			return -ENOENT;

286 287
		booting_thread_hwid = cpu_thread_in_core(nr);
		primary = cpu_first_thread_sibling(nr);
288

289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
		if (qoriq_pm_ops)
			qoriq_pm_ops->cpu_up_prepare(nr);

		/*
		 * If either thread in the core is online, use it to start
		 * the other.
		 */
		if (cpu_online(primary)) {
			smp_call_function_single(primary,
					wake_hw_thread, &nr, 1);
			goto done;
		} else if (cpu_online(primary + 1)) {
			smp_call_function_single(primary + 1,
					wake_hw_thread, &nr, 1);
			goto done;
304 305
		}

306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
		/*
		 * If getting here, it means both threads in the core are
		 * offline. So start the primary thread, then it will start
		 * the thread specified in booting_thread_hwid, the one
		 * corresponding to nr.
		 */

	} else if (threads_per_core == 1) {
		/*
		 * If one core has only one thread, set booting_thread_hwid to
		 * an invalid value.
		 */
		booting_thread_hwid = INVALID_THREAD_HWID;

	} else if (threads_per_core > 2) {
		pr_err("Do not support more than 2 threads per CPU.");
		return -EINVAL;
323 324 325 326 327 328
	}

	ret = smp_85xx_start_cpu(primary);
	if (ret)
		return ret;

329
done:
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
	paca[nr].cpu_start = 1;
	generic_set_cpu_up(nr);

	return ret;
#else
	ret = smp_85xx_start_cpu(nr);
	if (ret)
		return ret;

	generic_set_cpu_up(nr);

	return ret;
#endif
}

345 346
struct smp_ops_t smp_85xx_ops = {
	.kick_cpu = smp_85xx_kick_cpu,
347
	.cpu_bootable = smp_generic_cpu_bootable,
348 349 350 351
#ifdef CONFIG_HOTPLUG_CPU
	.cpu_disable	= generic_cpu_disable,
	.cpu_die	= generic_cpu_die,
#endif
352
#if defined(CONFIG_KEXEC) && !defined(CONFIG_PPC64)
353 354 355
	.give_timebase	= smp_generic_give_timebase,
	.take_timebase	= smp_generic_take_timebase,
#endif
356 357
};

358
#ifdef CONFIG_KEXEC
359
#ifdef CONFIG_PPC32
360
atomic_t kexec_down_cpus = ATOMIC_INIT(0);
361 362 363

void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary)
{
364
	local_irq_disable();
365

366
	if (secondary) {
367
		cur_cpu_spec->cpu_down_flush();
368 369
		atomic_inc(&kexec_down_cpus);
		/* loop forever */
370 371 372 373 374 375 376 377 378
		while (1);
	}
}

static void mpc85xx_smp_kexec_down(void *arg)
{
	if (ppc_md.kexec_cpu_down)
		ppc_md.kexec_cpu_down(0,1);
}
379 380 381
#else
void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary)
{
382 383 384 385 386 387 388 389
	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;

390 391 392
	local_irq_disable();
	hard_irq_disable();
	mpic_teardown_this_cpu(secondary);
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430

	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();
	}
431 432
}
#endif
433 434 435

static void mpc85xx_smp_machine_kexec(struct kimage *image)
{
436
#ifdef CONFIG_PPC32
437 438
	int timeout = INT_MAX;
	int i, num_cpus = num_present_cpus();
439

440 441
	if (image->type == KEXEC_TYPE_DEFAULT)
		smp_call_function(mpc85xx_smp_kexec_down, NULL, 0);
442

443
	while ( (atomic_read(&kexec_down_cpus) != (num_cpus - 1)) &&
444 445 446 447 448 449 450 451
		( timeout > 0 ) )
	{
		timeout--;
	}

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

452
	for_each_online_cpu(i)
453 454 455 456
	{
		if ( i == smp_processor_id() ) continue;
		mpic_reset_core(i);
	}
457
#endif
458 459 460 461 462

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

463
static void smp_85xx_basic_setup(int cpu_nr)
464 465 466 467 468
{
	if (cpu_has_feature(CPU_FTR_DBELL))
		doorbell_setup_this_cpu();
}

469 470 471 472 473 474
static void smp_85xx_setup_cpu(int cpu_nr)
{
	mpic_setup_this_cpu();
	smp_85xx_basic_setup(cpu_nr);
}

475 476 477 478
void __init mpc85xx_smp_init(void)
{
	struct device_node *np;

479

480 481 482
	np = of_find_node_by_type(NULL, "open-pic");
	if (np) {
		smp_85xx_ops.probe = smp_mpic_probe;
483
		smp_85xx_ops.setup_cpu = smp_85xx_setup_cpu;
484
		smp_85xx_ops.message_pass = smp_mpic_message_pass;
485 486
	} else
		smp_85xx_ops.setup_cpu = smp_85xx_basic_setup;
487

488
	if (cpu_has_feature(CPU_FTR_DBELL)) {
489 490 491 492
		/*
		 * If left NULL, .message_pass defaults to
		 * smp_muxed_ipi_message_pass
		 */
493
		smp_85xx_ops.message_pass = NULL;
494
		smp_85xx_ops.cause_ipi = doorbell_cause_ipi;
495
		smp_85xx_ops.probe = NULL;
496
	}
497

498
#ifdef CONFIG_HOTPLUG_CPU
499 500 501 502
#ifdef CONFIG_FSL_CORENET_RCPM
	fsl_rcpm_init();
#endif

503 504 505 506
#ifdef CONFIG_FSL_PMC
	mpc85xx_setup_pmc();
#endif
	if (qoriq_pm_ops) {
507 508
		smp_85xx_ops.give_timebase = mpc85xx_give_timebase;
		smp_85xx_ops.take_timebase = mpc85xx_take_timebase;
509
		ppc_md.cpu_die = smp_85xx_mach_cpu_die;
510
		smp_85xx_ops.cpu_die = qoriq_cpu_kill;
511
	}
512
#endif
513
	smp_ops = &smp_85xx_ops;
514 515 516 517 518

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