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()
319 * bL_switch_request_cb - Switch to a specific cluster for the given CPU,
324 * @completer: switch completion callback. if non-NULL,
326 * the switch, in non-atomic context.
348 return -EINVAL; in bL_switch_request_cb()
353 if (IS_ERR(t->task)) in bL_switch_request_cb()
354 return PTR_ERR(t->task); in bL_switch_request_cb()
355 if (!t->task) in bL_switch_request_cb()
356 return -ESRCH; in bL_switch_request_cb()
358 spin_lock(&t->lock); in bL_switch_request_cb()
359 if (t->completer) { in bL_switch_request_cb()
360 spin_unlock(&t->lock); in bL_switch_request_cb()
361 return -EBUSY; in bL_switch_request_cb()
363 t->completer = completer; in bL_switch_request_cb()
364 t->completer_cookie = completer_cookie; in bL_switch_request_cb()
365 t->wanted_cluster = new_cluster_id; in bL_switch_request_cb()
366 spin_unlock(&t->lock); in bL_switch_request_cb()
367 wake_up(&t->wq); in bL_switch_request_cb()
430 return -EINVAL; in bL_switcher_halve_cpus()
433 return -EINVAL; in bL_switcher_halve_cpus()
438 return -EINVAL; in bL_switcher_halve_cpus()
445 * we'll use logical CPUs initially belonging to the same cluster. in bL_switcher_halve_cpus()
447 memset(bL_switcher_cpu_pairing, -1, sizeof(bL_switcher_cpu_pairing)); in bL_switcher_halve_cpus()
449 cluster_0 = -1; in bL_switcher_halve_cpus()
451 int match = -1; in bL_switcher_halve_cpus()
453 if (cluster_0 == -1) in bL_switcher_halve_cpus()
469 if (match != -1) { in bL_switcher_halve_cpus()
490 return -EINVAL; in bL_switcher_halve_cpus()
496 if (bL_switcher_cpu_pairing[i] != -1) { in bL_switcher_halve_cpus()
518 return -EUNATCH; in bL_switcher_get_logical_index()
523 if (pairing == -1) in bL_switcher_get_logical_index()
529 return -EINVAL; in bL_switcher_get_logical_index()
576 spin_lock_init(&t->lock); in bL_switcher_enable()
577 init_waitqueue_head(&t->wq); in bL_switcher_enable()
578 init_completion(&t->started); in bL_switcher_enable()
579 t->wanted_cluster = -1; in bL_switcher_enable()
580 t->task = bL_switcher_thread_create(cpu, t); in bL_switcher_enable()
629 task = t->task; in bL_switcher_disable()
630 t->task = NULL; in bL_switcher_disable()
638 init_completion(&t->started); in bL_switcher_disable()
639 t->wanted_cluster = bL_switcher_cpu_original_cluster[cpu]; in bL_switcher_disable()
642 wait_for_completion(&t->started); in bL_switcher_disable()
687 ret = -EINVAL; in bL_switcher_active_store()
725 return -ENOMEM; in bL_switcher_sysfs_init()
762 if (pairing == -1) in bL_switcher_cpu_pre()
763 return -EINVAL; in bL_switcher_cpu_pre()
775 return -ENODEV; in bL_switcher_init()