Lines Matching +full:use +full:- +full:handshake
1 // SPDX-License-Identifier: GPL-2.0-only
3 * arch/arm/common/bL_switcher.c -- big.LITTLE cluster switcher core driver
6 * Copyright: (C) 2012-2013 Linaro Limited
32 #include <linux/irqchip/arm-gic.h>
46 * Use our own MPIDR accessors as the generic ones in asm/cputype.h have
65 long volatile handshake, **handshake_ptr = _arg; in bL_do_switch() local
73 /* Advertise our handshake location */ in bL_do_switch()
75 handshake = 0; in bL_do_switch()
76 *handshake_ptr = &handshake; in bL_do_switch()
78 handshake = -1; in bL_do_switch()
101 while (!handshake) { in bL_do_switch()
114 * Stack isolation. To ensure 'current' remains valid, we just use another
141 * bL_switch_to - Switch to a specific cluster for the current CPU
169 pr_debug("before switch: CPU %d MPIDR %#x -> %#x\n", in bL_switch_to()
278 complete(&t->started); in bL_switcher_thread()
283 wait_event_interruptible(t->wq, in bL_switcher_thread()
284 t->wanted_cluster != -1 || in bL_switcher_thread()
287 spin_lock(&t->lock); in bL_switcher_thread()
288 cluster = t->wanted_cluster; in bL_switcher_thread()
289 completer = t->completer; in bL_switcher_thread()
290 completer_cookie = t->completer_cookie; in bL_switcher_thread()
291 t->wanted_cluster = -1; in bL_switcher_thread()
292 t->completer = NULL; in bL_switcher_thread()
293 spin_unlock(&t->lock); in bL_switcher_thread()
295 if (cluster != -1) { in bL_switcher_thread()
321 * bL_switch_request_cb - Switch to a specific cluster for the given CPU,
326 * @completer: switch completion callback. if non-NULL,
328 * the switch, in non-atomic context.
350 return -EINVAL; in bL_switch_request_cb()
355 if (IS_ERR(t->task)) in bL_switch_request_cb()
356 return PTR_ERR(t->task); in bL_switch_request_cb()
357 if (!t->task) in bL_switch_request_cb()
358 return -ESRCH; in bL_switch_request_cb()
360 spin_lock(&t->lock); in bL_switch_request_cb()
361 if (t->completer) { in bL_switch_request_cb()
362 spin_unlock(&t->lock); in bL_switch_request_cb()
363 return -EBUSY; in bL_switch_request_cb()
365 t->completer = completer; in bL_switch_request_cb()
366 t->completer_cookie = completer_cookie; in bL_switch_request_cb()
367 t->wanted_cluster = new_cluster_id; in bL_switch_request_cb()
368 spin_unlock(&t->lock); in bL_switch_request_cb()
369 wake_up(&t->wq); in bL_switch_request_cb()
432 return -EINVAL; in bL_switcher_halve_cpus()
435 return -EINVAL; in bL_switcher_halve_cpus()
440 return -EINVAL; in bL_switcher_halve_cpus()
447 * we'll use logical CPUs initially belonging to the same cluster. in bL_switcher_halve_cpus()
449 memset(bL_switcher_cpu_pairing, -1, sizeof(bL_switcher_cpu_pairing)); in bL_switcher_halve_cpus()
451 cluster_0 = -1; in bL_switcher_halve_cpus()
453 int match = -1; in bL_switcher_halve_cpus()
455 if (cluster_0 == -1) in bL_switcher_halve_cpus()
471 if (match != -1) { in bL_switcher_halve_cpus()
492 return -EINVAL; in bL_switcher_halve_cpus()
498 if (bL_switcher_cpu_pairing[i] != -1) { in bL_switcher_halve_cpus()
520 return -EUNATCH; in bL_switcher_get_logical_index()
525 if (pairing == -1) in bL_switcher_get_logical_index()
531 return -EINVAL; in bL_switcher_get_logical_index()
578 spin_lock_init(&t->lock); in bL_switcher_enable()
579 init_waitqueue_head(&t->wq); in bL_switcher_enable()
580 init_completion(&t->started); in bL_switcher_enable()
581 t->wanted_cluster = -1; in bL_switcher_enable()
582 t->task = bL_switcher_thread_create(cpu, t); in bL_switcher_enable()
631 task = t->task; in bL_switcher_disable()
632 t->task = NULL; in bL_switcher_disable()
640 init_completion(&t->started); in bL_switcher_disable()
641 t->wanted_cluster = bL_switcher_cpu_original_cluster[cpu]; in bL_switcher_disable()
644 wait_for_completion(&t->started); in bL_switcher_disable()
689 ret = -EINVAL; in bL_switcher_active_store()
727 return -ENOMEM; in bL_switcher_sysfs_init()
764 if (pairing == -1) in bL_switcher_cpu_pre()
765 return -EINVAL; in bL_switcher_cpu_pre()
777 return -ENODEV; in bL_switcher_init()