mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: Replace call_smc with arm_smccc_smc
call_smc is a subset of arm_smccc_smc. Rather than having 2 methods to do SMCCC call, replace all call to the former by the later. Signed-off-by: Julien Grall <julien.grall@arm.com> [PSCI_RET(res.a0)/PSCI_RET(res)] Signed-off-by: Stefano Stabellini <sstabellini@kernel.org> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
21dd0bbef6
commit
0bc6a68da5
6 files changed
+29
-40
No files matched your search
@@ -39,7 +39,6 @@ obj-y += processor.o
|
||||
obj-y += psci.o
|
||||
obj-y += setup.o
|
||||
obj-y += shutdown.o
|
||||
obj-y += smc.o
|
||||
obj-y += smp.o
|
||||
obj-y += smpboot.o
|
||||
obj-y += sysctl.o
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <asm/platforms/exynos5.h>
|
||||
#include <asm/platform.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/smccc.h>
|
||||
|
||||
static bool secure_firmware;
|
||||
|
||||
@@ -249,7 +250,7 @@ static int exynos5_cpu_up(int cpu)
|
||||
iounmap(power);
|
||||
|
||||
if ( secure_firmware )
|
||||
call_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
|
||||
arm_smccc_smc(SMC_CMD_CPU1BOOT, cpu, NULL);
|
||||
|
||||
return cpu_up_send_sgi(cpu);
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ static const char * const seattle_dt_compat[] __initconst =
|
||||
*/
|
||||
static void seattle_system_reset(void)
|
||||
{
|
||||
call_smc(PSCI_0_2_FN32_SYSTEM_RESET, 0, 0, 0);
|
||||
arm_smccc_smc(PSCI_0_2_FN32_SYSTEM_RESET, NULL);
|
||||
}
|
||||
|
||||
static void seattle_system_off(void)
|
||||
{
|
||||
call_smc(PSCI_0_2_FN32_SYSTEM_OFF, 0, 0, 0);
|
||||
arm_smccc_smc(PSCI_0_2_FN32_SYSTEM_OFF, NULL);
|
||||
}
|
||||
|
||||
PLATFORM_START(seattle, "SEATTLE")
|
||||
|
||||
+25
-12
@@ -42,42 +42,53 @@ uint32_t smccc_ver;
|
||||
|
||||
static uint32_t psci_cpu_on_nr;
|
||||
|
||||
#define PSCI_RET(res) ((int32_t)(res).a0)
|
||||
|
||||
int call_psci_cpu_on(int cpu)
|
||||
{
|
||||
return call_smc(psci_cpu_on_nr, cpu_logical_map(cpu), __pa(init_secondary), 0);
|
||||
struct arm_smccc_res res;
|
||||
|
||||
arm_smccc_smc(psci_cpu_on_nr, cpu_logical_map(cpu), __pa(init_secondary),
|
||||
&res);
|
||||
|
||||
return PSCI_RET(res);
|
||||
}
|
||||
|
||||
void call_psci_cpu_off(void)
|
||||
{
|
||||
if ( psci_ver > PSCI_VERSION(0, 1) )
|
||||
{
|
||||
int errno;
|
||||
struct arm_smccc_res res;
|
||||
|
||||
/* If successfull the PSCI cpu_off call doesn't return */
|
||||
errno = call_smc(PSCI_0_2_FN32_CPU_OFF, 0, 0, 0);
|
||||
arm_smccc_smc(PSCI_0_2_FN32_CPU_OFF, &res);
|
||||
panic("PSCI cpu off failed for CPU%d err=%d\n", smp_processor_id(),
|
||||
errno);
|
||||
PSCI_RET(res));
|
||||
}
|
||||
}
|
||||
|
||||
void call_psci_system_off(void)
|
||||
{
|
||||
if ( psci_ver > PSCI_VERSION(0, 1) )
|
||||
call_smc(PSCI_0_2_FN32_SYSTEM_OFF, 0, 0, 0);
|
||||
arm_smccc_smc(PSCI_0_2_FN32_SYSTEM_OFF, NULL);
|
||||
}
|
||||
|
||||
void call_psci_system_reset(void)
|
||||
{
|
||||
if ( psci_ver > PSCI_VERSION(0, 1) )
|
||||
call_smc(PSCI_0_2_FN32_SYSTEM_RESET, 0, 0, 0);
|
||||
arm_smccc_smc(PSCI_0_2_FN32_SYSTEM_RESET, NULL);
|
||||
}
|
||||
|
||||
static int __init psci_features(uint32_t psci_func_id)
|
||||
{
|
||||
struct arm_smccc_res res;
|
||||
|
||||
if ( psci_ver < PSCI_VERSION(1, 0) )
|
||||
return PSCI_NOT_SUPPORTED;
|
||||
|
||||
return call_smc(PSCI_1_0_FN32_PSCI_FEATURES, psci_func_id, 0, 0);
|
||||
arm_smccc_smc(PSCI_1_0_FN32_PSCI_FEATURES, psci_func_id, NULL);
|
||||
|
||||
return PSCI_RET(res);
|
||||
}
|
||||
|
||||
static int __init psci_is_smc_method(const struct dt_device_node *psci)
|
||||
@@ -112,11 +123,11 @@ static void __init psci_init_smccc(void)
|
||||
|
||||
if ( psci_features(ARM_SMCCC_VERSION_FID) != PSCI_NOT_SUPPORTED )
|
||||
{
|
||||
uint32_t ret;
|
||||
struct arm_smccc_res res;
|
||||
|
||||
ret = call_smc(ARM_SMCCC_VERSION_FID, 0, 0, 0);
|
||||
if ( ret != ARM_SMCCC_NOT_SUPPORTED )
|
||||
smccc_ver = ret;
|
||||
arm_smccc_smc(ARM_SMCCC_VERSION_FID, &res);
|
||||
if ( PSCI_RET(res) != ARM_SMCCC_NOT_SUPPORTED )
|
||||
smccc_ver = PSCI_RET(res);
|
||||
}
|
||||
|
||||
if ( smccc_ver >= SMCCC_VERSION(1, 1) )
|
||||
@@ -165,6 +176,7 @@ static int __init psci_init_0_2(void)
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
int ret;
|
||||
struct arm_smccc_res res;
|
||||
|
||||
if ( acpi_disabled )
|
||||
{
|
||||
@@ -186,7 +198,8 @@ static int __init psci_init_0_2(void)
|
||||
}
|
||||
}
|
||||
|
||||
psci_ver = call_smc(PSCI_0_2_FN32_PSCI_VERSION, 0, 0, 0);
|
||||
arm_smccc_smc(PSCI_0_2_FN32_PSCI_VERSION, &res);
|
||||
psci_ver = PSCI_RET(res);
|
||||
|
||||
/* For the moment, we only support PSCI 0.2 and PSCI 1.x */
|
||||
if ( psci_ver != PSCI_VERSION(0, 2) && PSCI_VERSION_MAJOR(psci_ver) != 1 )
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* xen/arch/arm/smc.S
|
||||
*
|
||||
* Wrapper for Secure Monitors Calls
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <asm/macros.h>
|
||||
|
||||
ENTRY(call_smc)
|
||||
smc #0
|
||||
ret
|
||||
@@ -812,9 +812,6 @@ void vcpu_regs_hyp_to_user(const struct vcpu *vcpu,
|
||||
void vcpu_regs_user_to_hyp(struct vcpu *vcpu,
|
||||
const struct vcpu_guest_core_regs *regs);
|
||||
|
||||
int call_smc(register_t function_id, register_t arg0, register_t arg1,
|
||||
register_t arg2);
|
||||
|
||||
void do_trap_hyp_serror(struct cpu_user_regs *regs);
|
||||
|
||||
void do_trap_guest_serror(struct cpu_user_regs *regs);
|
||||
|
||||