mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 22:44:27 +08:00
6e085e0ac9
Although the SMCCC specification provides some limited functionality for describing the presence of hypervisor and firmware services, this is generally applicable only to functions designated as "Arm Architecture Service Functions" and no portable discovery mechanism is provided for standard hypervisor services, despite having a designated range of function identifiers reserved by the specification. In an attempt to avoid the need for additional firmware changes every time a new function is added, introduce a UID to identify the service provider as being compatible with KVM. Once this has been established, additional services can be discovered via a feature bitmap. Reviewed-by: Steven Price <steven.price@arm.com> Signed-off-by: Will Deacon <will@kernel.org> Signed-off-by: Jianyong Wu <jianyong.wu@arm.com> [maz: move code to its own file, plug it into PSCI] Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20201209060932.212364-2-jianyong.wu@arm.com
41 lines
906 B
C
41 lines
906 B
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright (C) 2020 Arm Limited
|
|
*/
|
|
|
|
#define pr_fmt(fmt) "smccc: " fmt
|
|
|
|
#include <linux/cache.h>
|
|
#include <linux/init.h>
|
|
#include <linux/arm-smccc.h>
|
|
#include <linux/kernel.h>
|
|
#include <asm/archrandom.h>
|
|
|
|
static u32 smccc_version = ARM_SMCCC_VERSION_1_0;
|
|
static enum arm_smccc_conduit smccc_conduit = SMCCC_CONDUIT_NONE;
|
|
|
|
bool __ro_after_init smccc_trng_available = false;
|
|
|
|
void __init arm_smccc_version_init(u32 version, enum arm_smccc_conduit conduit)
|
|
{
|
|
smccc_version = version;
|
|
smccc_conduit = conduit;
|
|
|
|
smccc_trng_available = smccc_probe_trng();
|
|
}
|
|
|
|
enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void)
|
|
{
|
|
if (smccc_version < ARM_SMCCC_VERSION_1_1)
|
|
return SMCCC_CONDUIT_NONE;
|
|
|
|
return smccc_conduit;
|
|
}
|
|
EXPORT_SYMBOL_GPL(arm_smccc_1_1_get_conduit);
|
|
|
|
u32 arm_smccc_get_version(void)
|
|
{
|
|
return smccc_version;
|
|
}
|
|
EXPORT_SYMBOL_GPL(arm_smccc_get_version);
|