xref: /openbmc/linux/arch/arm/common/bL_switcher.c (revision 12eb4683)
1 /*
2  * arch/arm/common/bL_switcher.c -- big.LITTLE cluster switcher core driver
3  *
4  * Created by:	Nicolas Pitre, March 2012
5  * Copyright:	(C) 2012-2013  Linaro Limited
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 
12 #include <linux/atomic.h>
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/sched.h>
17 #include <linux/interrupt.h>
18 #include <linux/cpu_pm.h>
19 #include <linux/cpu.h>
20 #include <linux/cpumask.h>
21 #include <linux/kthread.h>
22 #include <linux/wait.h>
23 #include <linux/time.h>
24 #include <linux/clockchips.h>
25 #include <linux/hrtimer.h>
26 #include <linux/tick.h>
27 #include <linux/notifier.h>
28 #include <linux/mm.h>
29 #include <linux/mutex.h>
30 #include <linux/smp.h>
31 #include <linux/spinlock.h>
32 #include <linux/string.h>
33 #include <linux/sysfs.h>
34 #include <linux/irqchip/arm-gic.h>
35 #include <linux/moduleparam.h>
36 
37 #include <asm/smp_plat.h>
38 #include <asm/cputype.h>
39 #include <asm/suspend.h>
40 #include <asm/mcpm.h>
41 #include <asm/bL_switcher.h>
42 
43 #define CREATE_TRACE_POINTS
44 #include <trace/events/power_cpu_migrate.h>
45 
46 
47 /*
48  * Use our own MPIDR accessors as the generic ones in asm/cputype.h have
49  * __attribute_const__ and we don't want the compiler to assume any
50  * constness here as the value _does_ change along some code paths.
51  */
52 
53 static int read_mpidr(void)
54 {
55 	unsigned int id;
56 	asm volatile ("mrc p15, 0, %0, c0, c0, 5" : "=r" (id));
57 	return id & MPIDR_HWID_BITMASK;
58 }
59 
60 /*
61  * Get a global nanosecond time stamp for tracing.
62  */
63 static s64 get_ns(void)
64 {
65 	struct timespec ts;
66 	getnstimeofday(&ts);
67 	return timespec_to_ns(&ts);
68 }
69 
70 /*
71  * bL switcher core code.
72  */
73 
74 static void bL_do_switch(void *_arg)
75 {
76 	unsigned ib_mpidr, ib_cpu, ib_cluster;
77 	long volatile handshake, **handshake_ptr = _arg;
78 
79 	pr_debug("%s\n", __func__);
80 
81 	ib_mpidr = cpu_logical_map(smp_processor_id());
82 	ib_cpu = MPIDR_AFFINITY_LEVEL(ib_mpidr, 0);
83 	ib_cluster = MPIDR_AFFINITY_LEVEL(ib_mpidr, 1);
84 
85 	/* Advertise our handshake location */
86 	if (handshake_ptr) {
87 		handshake = 0;
88 		*handshake_ptr = &handshake;
89 	} else
90 		handshake = -1;
91 
92 	/*
93 	 * Our state has been saved at this point.  Let's release our
94 	 * inbound CPU.
95 	 */
96 	mcpm_set_entry_vector(ib_cpu, ib_cluster, cpu_resume);
97 	sev();
98 
99 	/*
100 	 * From this point, we must assume that our counterpart CPU might
101 	 * have taken over in its parallel world already, as if execution
102 	 * just returned from cpu_suspend().  It is therefore important to
103 	 * be very careful not to make any change the other guy is not
104 	 * expecting.  This is why we need stack isolation.
105 	 *
106 	 * Fancy under cover tasks could be performed here.  For now
107 	 * we have none.
108 	 */
109 
110 	/*
111 	 * Let's wait until our inbound is alive.
112 	 */
113 	while (!handshake) {
114 		wfe();
115 		smp_mb();
116 	}
117 
118 	/* Let's put ourself down. */
119 	mcpm_cpu_power_down();
120 
121 	/* should never get here */
122 	BUG();
123 }
124 
125 /*
126  * Stack isolation.  To ensure 'current' remains valid, we just use another
127  * piece of our thread's stack space which should be fairly lightly used.
128  * The selected area starts just above the thread_info structure located
129  * at the very bottom of the stack, aligned to a cache line, and indexed
130  * with the cluster number.
131  */
132 #define STACK_SIZE 512
133 extern void call_with_stack(void (*fn)(void *), void *arg, void *sp);
134 static int bL_switchpoint(unsigned long _arg)
135 {
136 	unsigned int mpidr = read_mpidr();
137 	unsigned int clusterid = MPIDR_AFFINITY_LEVEL(mpidr, 1);
138 	void *stack = current_thread_info() + 1;
139 	stack = PTR_ALIGN(stack, L1_CACHE_BYTES);
140 	stack += clusterid * STACK_SIZE + STACK_SIZE;
141 	call_with_stack(bL_do_switch, (void *)_arg, stack);
142 	BUG();
143 }
144 
145 /*
146  * Generic switcher interface
147  */
148 
149 static unsigned int bL_gic_id[MAX_CPUS_PER_CLUSTER][MAX_NR_CLUSTERS];
150 static int bL_switcher_cpu_pairing[NR_CPUS];
151 
152 /*
153  * bL_switch_to - Switch to a specific cluster for the current CPU
154  * @new_cluster_id: the ID of the cluster to switch to.
155  *
156  * This function must be called on the CPU to be switched.
157  * Returns 0 on success, else a negative status code.
158  */
159 static int bL_switch_to(unsigned int new_cluster_id)
160 {
161 	unsigned int mpidr, this_cpu, that_cpu;
162 	unsigned int ob_mpidr, ob_cpu, ob_cluster, ib_mpidr, ib_cpu, ib_cluster;
163 	struct completion inbound_alive;
164 	struct tick_device *tdev;
165 	enum clock_event_mode tdev_mode;
166 	long volatile *handshake_ptr;
167 	int ipi_nr, ret;
168 
169 	this_cpu = smp_processor_id();
170 	ob_mpidr = read_mpidr();
171 	ob_cpu = MPIDR_AFFINITY_LEVEL(ob_mpidr, 0);
172 	ob_cluster = MPIDR_AFFINITY_LEVEL(ob_mpidr, 1);
173 	BUG_ON(cpu_logical_map(this_cpu) != ob_mpidr);
174 
175 	if (new_cluster_id == ob_cluster)
176 		return 0;
177 
178 	that_cpu = bL_switcher_cpu_pairing[this_cpu];
179 	ib_mpidr = cpu_logical_map(that_cpu);
180 	ib_cpu = MPIDR_AFFINITY_LEVEL(ib_mpidr, 0);
181 	ib_cluster = MPIDR_AFFINITY_LEVEL(ib_mpidr, 1);
182 
183 	pr_debug("before switch: CPU %d MPIDR %#x -> %#x\n",
184 		 this_cpu, ob_mpidr, ib_mpidr);
185 
186 	this_cpu = smp_processor_id();
187 
188 	/* Close the gate for our entry vectors */
189 	mcpm_set_entry_vector(ob_cpu, ob_cluster, NULL);
190 	mcpm_set_entry_vector(ib_cpu, ib_cluster, NULL);
191 
192 	/* Install our "inbound alive" notifier. */
193 	init_completion(&inbound_alive);
194 	ipi_nr = register_ipi_completion(&inbound_alive, this_cpu);
195 	ipi_nr |= ((1 << 16) << bL_gic_id[ob_cpu][ob_cluster]);
196 	mcpm_set_early_poke(ib_cpu, ib_cluster, gic_get_sgir_physaddr(), ipi_nr);
197 
198 	/*
199 	 * Let's wake up the inbound CPU now in case it requires some delay
200 	 * to come online, but leave it gated in our entry vector code.
201 	 */
202 	ret = mcpm_cpu_power_up(ib_cpu, ib_cluster);
203 	if (ret) {
204 		pr_err("%s: mcpm_cpu_power_up() returned %d\n", __func__, ret);
205 		return ret;
206 	}
207 
208 	/*
209 	 * Raise a SGI on the inbound CPU to make sure it doesn't stall
210 	 * in a possible WFI, such as in bL_power_down().
211 	 */
212 	gic_send_sgi(bL_gic_id[ib_cpu][ib_cluster], 0);
213 
214 	/*
215 	 * Wait for the inbound to come up.  This allows for other
216 	 * tasks to be scheduled in the mean time.
217 	 */
218 	wait_for_completion(&inbound_alive);
219 	mcpm_set_early_poke(ib_cpu, ib_cluster, 0, 0);
220 
221 	/*
222 	 * From this point we are entering the switch critical zone
223 	 * and can't take any interrupts anymore.
224 	 */
225 	local_irq_disable();
226 	local_fiq_disable();
227 	trace_cpu_migrate_begin(get_ns(), ob_mpidr);
228 
229 	/* redirect GIC's SGIs to our counterpart */
230 	gic_migrate_target(bL_gic_id[ib_cpu][ib_cluster]);
231 
232 	tdev = tick_get_device(this_cpu);
233 	if (tdev && !cpumask_equal(tdev->evtdev->cpumask, cpumask_of(this_cpu)))
234 		tdev = NULL;
235 	if (tdev) {
236 		tdev_mode = tdev->evtdev->mode;
237 		clockevents_set_mode(tdev->evtdev, CLOCK_EVT_MODE_SHUTDOWN);
238 	}
239 
240 	ret = cpu_pm_enter();
241 
242 	/* we can not tolerate errors at this point */
243 	if (ret)
244 		panic("%s: cpu_pm_enter() returned %d\n", __func__, ret);
245 
246 	/* Swap the physical CPUs in the logical map for this logical CPU. */
247 	cpu_logical_map(this_cpu) = ib_mpidr;
248 	cpu_logical_map(that_cpu) = ob_mpidr;
249 
250 	/* Let's do the actual CPU switch. */
251 	ret = cpu_suspend((unsigned long)&handshake_ptr, bL_switchpoint);
252 	if (ret > 0)
253 		panic("%s: cpu_suspend() returned %d\n", __func__, ret);
254 
255 	/* We are executing on the inbound CPU at this point */
256 	mpidr = read_mpidr();
257 	pr_debug("after switch: CPU %d MPIDR %#x\n", this_cpu, mpidr);
258 	BUG_ON(mpidr != ib_mpidr);
259 
260 	mcpm_cpu_powered_up();
261 
262 	ret = cpu_pm_exit();
263 
264 	if (tdev) {
265 		clockevents_set_mode(tdev->evtdev, tdev_mode);
266 		clockevents_program_event(tdev->evtdev,
267 					  tdev->evtdev->next_event, 1);
268 	}
269 
270 	trace_cpu_migrate_finish(get_ns(), ib_mpidr);
271 	local_fiq_enable();
272 	local_irq_enable();
273 
274 	*handshake_ptr = 1;
275 	dsb_sev();
276 
277 	if (ret)
278 		pr_err("%s exiting with error %d\n", __func__, ret);
279 	return ret;
280 }
281 
282 struct bL_thread {
283 	spinlock_t lock;
284 	struct task_struct *task;
285 	wait_queue_head_t wq;
286 	int wanted_cluster;
287 	struct completion started;
288 	bL_switch_completion_handler completer;
289 	void *completer_cookie;
290 };
291 
292 static struct bL_thread bL_threads[NR_CPUS];
293 
294 static int bL_switcher_thread(void *arg)
295 {
296 	struct bL_thread *t = arg;
297 	struct sched_param param = { .sched_priority = 1 };
298 	int cluster;
299 	bL_switch_completion_handler completer;
300 	void *completer_cookie;
301 
302 	sched_setscheduler_nocheck(current, SCHED_FIFO, &param);
303 	complete(&t->started);
304 
305 	do {
306 		if (signal_pending(current))
307 			flush_signals(current);
308 		wait_event_interruptible(t->wq,
309 				t->wanted_cluster != -1 ||
310 				kthread_should_stop());
311 
312 		spin_lock(&t->lock);
313 		cluster = t->wanted_cluster;
314 		completer = t->completer;
315 		completer_cookie = t->completer_cookie;
316 		t->wanted_cluster = -1;
317 		t->completer = NULL;
318 		spin_unlock(&t->lock);
319 
320 		if (cluster != -1) {
321 			bL_switch_to(cluster);
322 
323 			if (completer)
324 				completer(completer_cookie);
325 		}
326 	} while (!kthread_should_stop());
327 
328 	return 0;
329 }
330 
331 static struct task_struct *bL_switcher_thread_create(int cpu, void *arg)
332 {
333 	struct task_struct *task;
334 
335 	task = kthread_create_on_node(bL_switcher_thread, arg,
336 				      cpu_to_node(cpu), "kswitcher_%d", cpu);
337 	if (!IS_ERR(task)) {
338 		kthread_bind(task, cpu);
339 		wake_up_process(task);
340 	} else
341 		pr_err("%s failed for CPU %d\n", __func__, cpu);
342 	return task;
343 }
344 
345 /*
346  * bL_switch_request_cb - Switch to a specific cluster for the given CPU,
347  *      with completion notification via a callback
348  *
349  * @cpu: the CPU to switch
350  * @new_cluster_id: the ID of the cluster to switch to.
351  * @completer: switch completion callback.  if non-NULL,
352  *	@completer(@completer_cookie) will be called on completion of
353  *	the switch, in non-atomic context.
354  * @completer_cookie: opaque context argument for @completer.
355  *
356  * This function causes a cluster switch on the given CPU by waking up
357  * the appropriate switcher thread.  This function may or may not return
358  * before the switch has occurred.
359  *
360  * If a @completer callback function is supplied, it will be called when
361  * the switch is complete.  This can be used to determine asynchronously
362  * when the switch is complete, regardless of when bL_switch_request()
363  * returns.  When @completer is supplied, no new switch request is permitted
364  * for the affected CPU until after the switch is complete, and @completer
365  * has returned.
366  */
367 int bL_switch_request_cb(unsigned int cpu, unsigned int new_cluster_id,
368 			 bL_switch_completion_handler completer,
369 			 void *completer_cookie)
370 {
371 	struct bL_thread *t;
372 
373 	if (cpu >= ARRAY_SIZE(bL_threads)) {
374 		pr_err("%s: cpu %d out of bounds\n", __func__, cpu);
375 		return -EINVAL;
376 	}
377 
378 	t = &bL_threads[cpu];
379 
380 	if (IS_ERR(t->task))
381 		return PTR_ERR(t->task);
382 	if (!t->task)
383 		return -ESRCH;
384 
385 	spin_lock(&t->lock);
386 	if (t->completer) {
387 		spin_unlock(&t->lock);
388 		return -EBUSY;
389 	}
390 	t->completer = completer;
391 	t->completer_cookie = completer_cookie;
392 	t->wanted_cluster = new_cluster_id;
393 	spin_unlock(&t->lock);
394 	wake_up(&t->wq);
395 	return 0;
396 }
397 EXPORT_SYMBOL_GPL(bL_switch_request_cb);
398 
399 /*
400  * Activation and configuration code.
401  */
402 
403 static DEFINE_MUTEX(bL_switcher_activation_lock);
404 static BLOCKING_NOTIFIER_HEAD(bL_activation_notifier);
405 static unsigned int bL_switcher_active;
406 static unsigned int bL_switcher_cpu_original_cluster[NR_CPUS];
407 static cpumask_t bL_switcher_removed_logical_cpus;
408 
409 int bL_switcher_register_notifier(struct notifier_block *nb)
410 {
411 	return blocking_notifier_chain_register(&bL_activation_notifier, nb);
412 }
413 EXPORT_SYMBOL_GPL(bL_switcher_register_notifier);
414 
415 int bL_switcher_unregister_notifier(struct notifier_block *nb)
416 {
417 	return blocking_notifier_chain_unregister(&bL_activation_notifier, nb);
418 }
419 EXPORT_SYMBOL_GPL(bL_switcher_unregister_notifier);
420 
421 static int bL_activation_notify(unsigned long val)
422 {
423 	int ret;
424 
425 	ret = blocking_notifier_call_chain(&bL_activation_notifier, val, NULL);
426 	if (ret & NOTIFY_STOP_MASK)
427 		pr_err("%s: notifier chain failed with status 0x%x\n",
428 			__func__, ret);
429 	return notifier_to_errno(ret);
430 }
431 
432 static void bL_switcher_restore_cpus(void)
433 {
434 	int i;
435 
436 	for_each_cpu(i, &bL_switcher_removed_logical_cpus)
437 		cpu_up(i);
438 }
439 
440 static int bL_switcher_halve_cpus(void)
441 {
442 	int i, j, cluster_0, gic_id, ret;
443 	unsigned int cpu, cluster, mask;
444 	cpumask_t available_cpus;
445 
446 	/* First pass to validate what we have */
447 	mask = 0;
448 	for_each_online_cpu(i) {
449 		cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 0);
450 		cluster = MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 1);
451 		if (cluster >= 2) {
452 			pr_err("%s: only dual cluster systems are supported\n", __func__);
453 			return -EINVAL;
454 		}
455 		if (WARN_ON(cpu >= MAX_CPUS_PER_CLUSTER))
456 			return -EINVAL;
457 		mask |= (1 << cluster);
458 	}
459 	if (mask != 3) {
460 		pr_err("%s: no CPU pairing possible\n", __func__);
461 		return -EINVAL;
462 	}
463 
464 	/*
465 	 * Now let's do the pairing.  We match each CPU with another CPU
466 	 * from a different cluster.  To get a uniform scheduling behavior
467 	 * without fiddling with CPU topology and compute capacity data,
468 	 * we'll use logical CPUs initially belonging to the same cluster.
469 	 */
470 	memset(bL_switcher_cpu_pairing, -1, sizeof(bL_switcher_cpu_pairing));
471 	cpumask_copy(&available_cpus, cpu_online_mask);
472 	cluster_0 = -1;
473 	for_each_cpu(i, &available_cpus) {
474 		int match = -1;
475 		cluster = MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 1);
476 		if (cluster_0 == -1)
477 			cluster_0 = cluster;
478 		if (cluster != cluster_0)
479 			continue;
480 		cpumask_clear_cpu(i, &available_cpus);
481 		for_each_cpu(j, &available_cpus) {
482 			cluster = MPIDR_AFFINITY_LEVEL(cpu_logical_map(j), 1);
483 			/*
484 			 * Let's remember the last match to create "odd"
485 			 * pairings on purpose in order for other code not
486 			 * to assume any relation between physical and
487 			 * logical CPU numbers.
488 			 */
489 			if (cluster != cluster_0)
490 				match = j;
491 		}
492 		if (match != -1) {
493 			bL_switcher_cpu_pairing[i] = match;
494 			cpumask_clear_cpu(match, &available_cpus);
495 			pr_info("CPU%d paired with CPU%d\n", i, match);
496 		}
497 	}
498 
499 	/*
500 	 * Now we disable the unwanted CPUs i.e. everything that has no
501 	 * pairing information (that includes the pairing counterparts).
502 	 */
503 	cpumask_clear(&bL_switcher_removed_logical_cpus);
504 	for_each_online_cpu(i) {
505 		cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 0);
506 		cluster = MPIDR_AFFINITY_LEVEL(cpu_logical_map(i), 1);
507 
508 		/* Let's take note of the GIC ID for this CPU */
509 		gic_id = gic_get_cpu_id(i);
510 		if (gic_id < 0) {
511 			pr_err("%s: bad GIC ID for CPU %d\n", __func__, i);
512 			bL_switcher_restore_cpus();
513 			return -EINVAL;
514 		}
515 		bL_gic_id[cpu][cluster] = gic_id;
516 		pr_info("GIC ID for CPU %u cluster %u is %u\n",
517 			cpu, cluster, gic_id);
518 
519 		if (bL_switcher_cpu_pairing[i] != -1) {
520 			bL_switcher_cpu_original_cluster[i] = cluster;
521 			continue;
522 		}
523 
524 		ret = cpu_down(i);
525 		if (ret) {
526 			bL_switcher_restore_cpus();
527 			return ret;
528 		}
529 		cpumask_set_cpu(i, &bL_switcher_removed_logical_cpus);
530 	}
531 
532 	return 0;
533 }
534 
535 /* Determine the logical CPU a given physical CPU is grouped on. */
536 int bL_switcher_get_logical_index(u32 mpidr)
537 {
538 	int cpu;
539 
540 	if (!bL_switcher_active)
541 		return -EUNATCH;
542 
543 	mpidr &= MPIDR_HWID_BITMASK;
544 	for_each_online_cpu(cpu) {
545 		int pairing = bL_switcher_cpu_pairing[cpu];
546 		if (pairing == -1)
547 			continue;
548 		if ((mpidr == cpu_logical_map(cpu)) ||
549 		    (mpidr == cpu_logical_map(pairing)))
550 			return cpu;
551 	}
552 	return -EINVAL;
553 }
554 
555 static void bL_switcher_trace_trigger_cpu(void *__always_unused info)
556 {
557 	trace_cpu_migrate_current(get_ns(), read_mpidr());
558 }
559 
560 int bL_switcher_trace_trigger(void)
561 {
562 	int ret;
563 
564 	preempt_disable();
565 
566 	bL_switcher_trace_trigger_cpu(NULL);
567 	ret = smp_call_function(bL_switcher_trace_trigger_cpu, NULL, true);
568 
569 	preempt_enable();
570 
571 	return ret;
572 }
573 EXPORT_SYMBOL_GPL(bL_switcher_trace_trigger);
574 
575 static int bL_switcher_enable(void)
576 {
577 	int cpu, ret;
578 
579 	mutex_lock(&bL_switcher_activation_lock);
580 	lock_device_hotplug();
581 	if (bL_switcher_active) {
582 		unlock_device_hotplug();
583 		mutex_unlock(&bL_switcher_activation_lock);
584 		return 0;
585 	}
586 
587 	pr_info("big.LITTLE switcher initializing\n");
588 
589 	ret = bL_activation_notify(BL_NOTIFY_PRE_ENABLE);
590 	if (ret)
591 		goto error;
592 
593 	ret = bL_switcher_halve_cpus();
594 	if (ret)
595 		goto error;
596 
597 	bL_switcher_trace_trigger();
598 
599 	for_each_online_cpu(cpu) {
600 		struct bL_thread *t = &bL_threads[cpu];
601 		spin_lock_init(&t->lock);
602 		init_waitqueue_head(&t->wq);
603 		init_completion(&t->started);
604 		t->wanted_cluster = -1;
605 		t->task = bL_switcher_thread_create(cpu, t);
606 	}
607 
608 	bL_switcher_active = 1;
609 	bL_activation_notify(BL_NOTIFY_POST_ENABLE);
610 	pr_info("big.LITTLE switcher initialized\n");
611 	goto out;
612 
613 error:
614 	pr_warn("big.LITTLE switcher initialization failed\n");
615 	bL_activation_notify(BL_NOTIFY_POST_DISABLE);
616 
617 out:
618 	unlock_device_hotplug();
619 	mutex_unlock(&bL_switcher_activation_lock);
620 	return ret;
621 }
622 
623 #ifdef CONFIG_SYSFS
624 
625 static void bL_switcher_disable(void)
626 {
627 	unsigned int cpu, cluster;
628 	struct bL_thread *t;
629 	struct task_struct *task;
630 
631 	mutex_lock(&bL_switcher_activation_lock);
632 	lock_device_hotplug();
633 
634 	if (!bL_switcher_active)
635 		goto out;
636 
637 	if (bL_activation_notify(BL_NOTIFY_PRE_DISABLE) != 0) {
638 		bL_activation_notify(BL_NOTIFY_POST_ENABLE);
639 		goto out;
640 	}
641 
642 	bL_switcher_active = 0;
643 
644 	/*
645 	 * To deactivate the switcher, we must shut down the switcher
646 	 * threads to prevent any other requests from being accepted.
647 	 * Then, if the final cluster for given logical CPU is not the
648 	 * same as the original one, we'll recreate a switcher thread
649 	 * just for the purpose of switching the CPU back without any
650 	 * possibility for interference from external requests.
651 	 */
652 	for_each_online_cpu(cpu) {
653 		t = &bL_threads[cpu];
654 		task = t->task;
655 		t->task = NULL;
656 		if (!task || IS_ERR(task))
657 			continue;
658 		kthread_stop(task);
659 		/* no more switch may happen on this CPU at this point */
660 		cluster = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1);
661 		if (cluster == bL_switcher_cpu_original_cluster[cpu])
662 			continue;
663 		init_completion(&t->started);
664 		t->wanted_cluster = bL_switcher_cpu_original_cluster[cpu];
665 		task = bL_switcher_thread_create(cpu, t);
666 		if (!IS_ERR(task)) {
667 			wait_for_completion(&t->started);
668 			kthread_stop(task);
669 			cluster = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1);
670 			if (cluster == bL_switcher_cpu_original_cluster[cpu])
671 				continue;
672 		}
673 		/* If execution gets here, we're in trouble. */
674 		pr_crit("%s: unable to restore original cluster for CPU %d\n",
675 			__func__, cpu);
676 		pr_crit("%s: CPU %d can't be restored\n",
677 			__func__, bL_switcher_cpu_pairing[cpu]);
678 		cpumask_clear_cpu(bL_switcher_cpu_pairing[cpu],
679 				  &bL_switcher_removed_logical_cpus);
680 	}
681 
682 	bL_switcher_restore_cpus();
683 	bL_switcher_trace_trigger();
684 
685 	bL_activation_notify(BL_NOTIFY_POST_DISABLE);
686 
687 out:
688 	unlock_device_hotplug();
689 	mutex_unlock(&bL_switcher_activation_lock);
690 }
691 
692 static ssize_t bL_switcher_active_show(struct kobject *kobj,
693 		struct kobj_attribute *attr, char *buf)
694 {
695 	return sprintf(buf, "%u\n", bL_switcher_active);
696 }
697 
698 static ssize_t bL_switcher_active_store(struct kobject *kobj,
699 		struct kobj_attribute *attr, const char *buf, size_t count)
700 {
701 	int ret;
702 
703 	switch (buf[0]) {
704 	case '0':
705 		bL_switcher_disable();
706 		ret = 0;
707 		break;
708 	case '1':
709 		ret = bL_switcher_enable();
710 		break;
711 	default:
712 		ret = -EINVAL;
713 	}
714 
715 	return (ret >= 0) ? count : ret;
716 }
717 
718 static ssize_t bL_switcher_trace_trigger_store(struct kobject *kobj,
719 		struct kobj_attribute *attr, const char *buf, size_t count)
720 {
721 	int ret = bL_switcher_trace_trigger();
722 
723 	return ret ? ret : count;
724 }
725 
726 static struct kobj_attribute bL_switcher_active_attr =
727 	__ATTR(active, 0644, bL_switcher_active_show, bL_switcher_active_store);
728 
729 static struct kobj_attribute bL_switcher_trace_trigger_attr =
730 	__ATTR(trace_trigger, 0200, NULL, bL_switcher_trace_trigger_store);
731 
732 static struct attribute *bL_switcher_attrs[] = {
733 	&bL_switcher_active_attr.attr,
734 	&bL_switcher_trace_trigger_attr.attr,
735 	NULL,
736 };
737 
738 static struct attribute_group bL_switcher_attr_group = {
739 	.attrs = bL_switcher_attrs,
740 };
741 
742 static struct kobject *bL_switcher_kobj;
743 
744 static int __init bL_switcher_sysfs_init(void)
745 {
746 	int ret;
747 
748 	bL_switcher_kobj = kobject_create_and_add("bL_switcher", kernel_kobj);
749 	if (!bL_switcher_kobj)
750 		return -ENOMEM;
751 	ret = sysfs_create_group(bL_switcher_kobj, &bL_switcher_attr_group);
752 	if (ret)
753 		kobject_put(bL_switcher_kobj);
754 	return ret;
755 }
756 
757 #endif  /* CONFIG_SYSFS */
758 
759 bool bL_switcher_get_enabled(void)
760 {
761 	mutex_lock(&bL_switcher_activation_lock);
762 
763 	return bL_switcher_active;
764 }
765 EXPORT_SYMBOL_GPL(bL_switcher_get_enabled);
766 
767 void bL_switcher_put_enabled(void)
768 {
769 	mutex_unlock(&bL_switcher_activation_lock);
770 }
771 EXPORT_SYMBOL_GPL(bL_switcher_put_enabled);
772 
773 /*
774  * Veto any CPU hotplug operation on those CPUs we've removed
775  * while the switcher is active.
776  * We're just not ready to deal with that given the trickery involved.
777  */
778 static int bL_switcher_hotplug_callback(struct notifier_block *nfb,
779 					unsigned long action, void *hcpu)
780 {
781 	if (bL_switcher_active) {
782 		int pairing = bL_switcher_cpu_pairing[(unsigned long)hcpu];
783 		switch (action & 0xf) {
784 		case CPU_UP_PREPARE:
785 		case CPU_DOWN_PREPARE:
786 			if (pairing == -1)
787 				return NOTIFY_BAD;
788 		}
789 	}
790 	return NOTIFY_DONE;
791 }
792 
793 static bool no_bL_switcher;
794 core_param(no_bL_switcher, no_bL_switcher, bool, 0644);
795 
796 static int __init bL_switcher_init(void)
797 {
798 	int ret;
799 
800 	if (MAX_NR_CLUSTERS != 2) {
801 		pr_err("%s: only dual cluster systems are supported\n", __func__);
802 		return -EINVAL;
803 	}
804 
805 	cpu_notifier(bL_switcher_hotplug_callback, 0);
806 
807 	if (!no_bL_switcher) {
808 		ret = bL_switcher_enable();
809 		if (ret)
810 			return ret;
811 	}
812 
813 #ifdef CONFIG_SYSFS
814 	ret = bL_switcher_sysfs_init();
815 	if (ret)
816 		pr_err("%s: unable to create sysfs entry\n", __func__);
817 #endif
818 
819 	return 0;
820 }
821 
822 late_initcall(bL_switcher_init);
823