mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

KVM is about to learn some new tricks to virtualize PMUv3 on IMPDEF hardware. As part of that, we now need to differentiate host support from guest support for PMUv3. Add a cpucap to determine if an architectural PMUv3 is present to guard host usage of PMUv3 controls. Tested-by: Janne Grunau <j@jannau.net> Reviewed-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20250305202641.428114-6-oliver.upton@linux.dev Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
82 lines
2.3 KiB
C
82 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#ifndef __ASM_CPUCAPS_H
|
|
#define __ASM_CPUCAPS_H
|
|
|
|
#include <asm/cpucap-defs.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#include <linux/types.h>
|
|
/*
|
|
* Check whether a cpucap is possible at compiletime.
|
|
*/
|
|
static __always_inline bool
|
|
cpucap_is_possible(const unsigned int cap)
|
|
{
|
|
compiletime_assert(__builtin_constant_p(cap),
|
|
"cap must be a constant");
|
|
compiletime_assert(cap < ARM64_NCAPS,
|
|
"cap must be < ARM64_NCAPS");
|
|
|
|
switch (cap) {
|
|
case ARM64_HAS_PAN:
|
|
return IS_ENABLED(CONFIG_ARM64_PAN);
|
|
case ARM64_HAS_EPAN:
|
|
return IS_ENABLED(CONFIG_ARM64_EPAN);
|
|
case ARM64_SVE:
|
|
return IS_ENABLED(CONFIG_ARM64_SVE);
|
|
case ARM64_SME:
|
|
case ARM64_SME2:
|
|
case ARM64_SME_FA64:
|
|
return IS_ENABLED(CONFIG_ARM64_SME);
|
|
case ARM64_HAS_CNP:
|
|
return IS_ENABLED(CONFIG_ARM64_CNP);
|
|
case ARM64_HAS_ADDRESS_AUTH:
|
|
case ARM64_HAS_GENERIC_AUTH:
|
|
return IS_ENABLED(CONFIG_ARM64_PTR_AUTH);
|
|
case ARM64_HAS_GIC_PRIO_MASKING:
|
|
return IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI);
|
|
case ARM64_MTE:
|
|
return IS_ENABLED(CONFIG_ARM64_MTE);
|
|
case ARM64_BTI:
|
|
return IS_ENABLED(CONFIG_ARM64_BTI);
|
|
case ARM64_HAS_TLB_RANGE:
|
|
return IS_ENABLED(CONFIG_ARM64_TLB_RANGE);
|
|
case ARM64_HAS_S1POE:
|
|
return IS_ENABLED(CONFIG_ARM64_POE);
|
|
case ARM64_HAS_GCS:
|
|
return IS_ENABLED(CONFIG_ARM64_GCS);
|
|
case ARM64_HAFT:
|
|
return IS_ENABLED(CONFIG_ARM64_HAFT);
|
|
case ARM64_UNMAP_KERNEL_AT_EL0:
|
|
return IS_ENABLED(CONFIG_UNMAP_KERNEL_AT_EL0);
|
|
case ARM64_WORKAROUND_843419:
|
|
return IS_ENABLED(CONFIG_ARM64_ERRATUM_843419);
|
|
case ARM64_WORKAROUND_1742098:
|
|
return IS_ENABLED(CONFIG_ARM64_ERRATUM_1742098);
|
|
case ARM64_WORKAROUND_2645198:
|
|
return IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198);
|
|
case ARM64_WORKAROUND_2658417:
|
|
return IS_ENABLED(CONFIG_ARM64_ERRATUM_2658417);
|
|
case ARM64_WORKAROUND_CAVIUM_23154:
|
|
return IS_ENABLED(CONFIG_CAVIUM_ERRATUM_23154);
|
|
case ARM64_WORKAROUND_NVIDIA_CARMEL_CNP:
|
|
return IS_ENABLED(CONFIG_NVIDIA_CARMEL_CNP_ERRATUM);
|
|
case ARM64_WORKAROUND_REPEAT_TLBI:
|
|
return IS_ENABLED(CONFIG_ARM64_WORKAROUND_REPEAT_TLBI);
|
|
case ARM64_WORKAROUND_SPECULATIVE_SSBS:
|
|
return IS_ENABLED(CONFIG_ARM64_ERRATUM_3194386);
|
|
case ARM64_MPAM:
|
|
/*
|
|
* KVM MPAM support doesn't rely on the host kernel supporting MPAM.
|
|
*/
|
|
return true;
|
|
case ARM64_HAS_PMUV3:
|
|
return IS_ENABLED(CONFIG_HW_PERF_EVENTS);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __ASM_CPUCAPS_H */
|