/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright 2009 Freescale Semiconductor, Inc. * * provides masks and opcode images for use by code generation, emulation * and for instructions that older assemblers might not know about
*/ #ifndef _ASM_POWERPC_DBELL_H #define _ASM_POWERPC_DBELL_H
/* * Doorbells must only be used if CPU_FTR_DBELL is available. * msgsnd is used in HV, and msgsndp is used in !HV. * * These should be used by platform code that is aware of restrictions. * Other arch code should use ->cause_ipi. * * doorbell_global_ipi() sends a dbell to any target CPU. * Must be used only by architectures that address msgsnd target * by PIR/get_hard_smp_processor_id.
*/ staticinlinevoid doorbell_global_ipi(int cpu)
{
u32 tag = get_hard_smp_processor_id(cpu);
kvmppc_set_host_ipi(cpu); /* Order previous accesses vs. msgsnd, which is treated as a store */
ppc_msgsnd_sync();
ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag);
}
/* * doorbell_core_ipi() sends a dbell to a target CPU in the same core. * Must be used only by architectures that address msgsnd target * by TIR/cpu_thread_in_core.
*/ staticinlinevoid doorbell_core_ipi(int cpu)
{
u32 tag = cpu_thread_in_core(cpu);
kvmppc_set_host_ipi(cpu); /* Order previous accesses vs. msgsnd, which is treated as a store */
ppc_msgsnd_sync();
ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag);
}
/* * Attempt to cause a core doorbell if destination is on the same core. * Returns 1 on success, 0 on failure.
*/ staticinlineint doorbell_try_core_ipi(int cpu)
{ int this_cpu = get_cpu(); int ret = 0;
if (cpumask_test_cpu(cpu, cpu_sibling_mask(this_cpu))) {
doorbell_core_ipi(cpu);
ret = 1;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.