Browse Source
Manage MTK SiP SMC ID with macros for 32/64 bit and function declaration code generation. Partition SMC ID with different exception level sources. Signed-off-by: Leon Chen <leon.chen@mediatek.com> Change-Id: I8966cd94f0d825e7ebae08833d2bd9fceedfd45epull/1988/head
Leon Chen
2 years ago
committed by
Bo-Chen Chen
12 changed files with 145 additions and 75 deletions
@ -1,61 +0,0 @@ |
|||
/*
|
|||
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
|||
#ifndef MTK_SIP_SVC_H |
|||
#define MTK_SIP_SVC_H |
|||
|
|||
#include <stdint.h> |
|||
|
|||
/* SMC function IDs for SiP Service queries */ |
|||
#define SIP_SVC_CALL_COUNT 0x8200ff00 |
|||
#define SIP_SVC_UID 0x8200ff01 |
|||
/* 0x8200ff02 is reserved */ |
|||
#define SIP_SVC_VERSION 0x8200ff03 |
|||
|
|||
/* Mediatek SiP Service Calls version numbers */ |
|||
#define MTK_SIP_SVC_VERSION_MAJOR 0x0 |
|||
#define MTK_SIP_SVC_VERSION_MINOR 0x1 |
|||
|
|||
#define SMC_AARCH64_BIT 0x40000000 |
|||
|
|||
/* Number of Mediatek SiP Calls implemented */ |
|||
#define MTK_COMMON_SIP_NUM_CALLS 4 |
|||
|
|||
/* Mediatek SiP Service Calls function IDs */ |
|||
#define MTK_SIP_SET_AUTHORIZED_SECURE_REG 0x82000001 |
|||
|
|||
/* For MTK SMC from Secure OS */ |
|||
/* 0x82000000 - 0x820000FF & 0xC2000000 - 0xC20000FF */ |
|||
#define MTK_SIP_KERNEL_BOOT_AARCH32 0x82000200 |
|||
#define MTK_SIP_KERNEL_BOOT_AARCH64 0xC2000200 |
|||
|
|||
/* VCORE */ |
|||
#define MTK_SIP_VCORE_CONTROL_ARCH32 0x82000506 |
|||
#define MTK_SIP_VCORE_CONTROL_ARCH64 0xC2000506 |
|||
|
|||
/* APUSYS SMC call */ |
|||
#define MTK_SIP_APUSYS_CONTROL_AARCH32 0x8200051E |
|||
#define MTK_SIP_APUSYS_CONTROL_AARCH64 0xC200051E |
|||
|
|||
/* Mediatek SiP Calls error code */ |
|||
enum { |
|||
MTK_SIP_E_SUCCESS = 0, |
|||
MTK_SIP_E_INVALID_PARAM = -1, |
|||
MTK_SIP_E_NOT_SUPPORTED = -2, |
|||
MTK_SIP_E_INVALID_RANGE = -3, |
|||
MTK_SIP_E_PERMISSION_DENY = -4, |
|||
MTK_SIP_E_LOCK_FAIL = -5 |
|||
}; |
|||
|
|||
/*
|
|||
* This function should be implemented in Mediatek SOC directory. It fullfills |
|||
* MTK_SIP_SET_AUTHORIZED_SECURE_REG SiP call by checking the sreg with the |
|||
* predefined secure register list, if a match was found, set val to sreg. |
|||
* |
|||
* Return MTK_SIP_E_SUCCESS on success, and MTK_SIP_E_INVALID_PARAM on failure. |
|||
*/ |
|||
uint64_t mt_sip_set_authorized_sreg(uint32_t sreg, uint32_t val); |
|||
|
|||
#endif /* MTK_SIP_SVC_H */ |
@ -0,0 +1,20 @@ |
|||
/*
|
|||
* Copyright (c) 2022, MediaTek Inc. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
|||
|
|||
#ifndef MTK_SIP_DEF_H |
|||
#define MTK_SIP_DEF_H |
|||
|
|||
/* Define SiP SMC ID here */ |
|||
#define MTK_SIP_SMC_FROM_NS_EL1_TABLE(_func) \ |
|||
_func(MTK_SIP_KERNEL_TIME_SYNC, 0x202) \ |
|||
_func(MTK_SIP_VCORE_CONTROL, 0x506) \ |
|||
_func(MTK_SIP_APUSYS_CONTROL, 0x51E) \ |
|||
_func(MTK_SIP_KERNEL_GIC_OP, 0x526) |
|||
|
|||
#define MTK_SIP_SMC_FROM_BL33_TABLE(_func) \ |
|||
_func(MTK_SIP_KERNEL_BOOT, 0x115) |
|||
|
|||
#endif /* MTK_SIP_DEF_H */ |
@ -0,0 +1,106 @@ |
|||
/*
|
|||
* Copyright (c) 2022, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
|||
|
|||
#ifndef MTK_SIP_SVC_H |
|||
#define MTK_SIP_SVC_H |
|||
|
|||
#include <stdint.h> |
|||
#include <lib/smccc.h> |
|||
#include <mtk_sip_def.h> |
|||
|
|||
/* SMC function IDs for SiP Service queries */ |
|||
#define SIP_SVC_CALL_COUNT U(0x8200ff00) |
|||
#define SIP_SVC_UID U(0x8200ff01) |
|||
/* 0x8200ff02 is reserved */ |
|||
#define SIP_SVC_VERSION U(0x8200ff03) |
|||
|
|||
/* MediaTek SiP Service Calls version numbers */ |
|||
#define MTK_SIP_SVC_VERSION_MAJOR U(0x0) |
|||
#define MTK_SIP_SVC_VERSION_MINOR U(0x1) |
|||
|
|||
/* Number of MediaTek SiP Calls implemented */ |
|||
#define MTK_COMMON_SIP_NUM_CALLS U(4) |
|||
|
|||
/* MediaTek SiP Service Calls function IDs */ |
|||
#define MTK_SIP_SET_AUTHORIZED_SECURE_REG U(0x82000001) |
|||
|
|||
#define SMC_ID_EXPAND_AS_ENUM(_smc_id, _smc_num) \ |
|||
_smc_id##_AARCH32 = ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ |
|||
((0) << FUNCID_CC_SHIFT) | \ |
|||
(OEN_SIP_START << FUNCID_OEN_SHIFT) | \ |
|||
((_smc_num) << FUNCID_NUM_SHIFT)), \ |
|||
_smc_id##_AARCH64 = ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ |
|||
((1) << FUNCID_CC_SHIFT) | \ |
|||
(OEN_SIP_START << FUNCID_OEN_SHIFT) | \ |
|||
((_smc_num) << FUNCID_NUM_SHIFT)), |
|||
|
|||
#define SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX(_smc_id, _smc_num) \ |
|||
extern short _smc_id##_descriptor_index; |
|||
|
|||
/* Bind SMC handler with SMC ID */ |
|||
#define DECLARE_SMC_HANDLER(_smc_id, _smc_handler) \ |
|||
const struct smc_descriptor _smc_id##_descriptor \ |
|||
__used \ |
|||
__aligned(sizeof(void *)) \ |
|||
__section(".mtk_smc_descriptor_pool") = { \ |
|||
.smc_handler = _smc_handler, \ |
|||
.smc_name = #_smc_id, \ |
|||
.smc_id_aarch32 = _smc_id##_AARCH32, \ |
|||
.smc_id_aarch64 = _smc_id##_AARCH64, \ |
|||
.smc_descriptor_index = &_smc_id##_descriptor_index \ |
|||
} |
|||
|
|||
MTK_SIP_SMC_FROM_BL33_TABLE(SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX); |
|||
MTK_SIP_SMC_FROM_NS_EL1_TABLE(SMC_ID_EXPAND_AS_EXTERN_SMC_INDEX); |
|||
|
|||
/* Expand SiP SMC ID table as enum */ |
|||
enum { |
|||
MTK_SIP_SMC_FROM_BL33_TABLE(SMC_ID_EXPAND_AS_ENUM) |
|||
MTK_SIP_SMC_FROM_NS_EL1_TABLE(SMC_ID_EXPAND_AS_ENUM) |
|||
MTK_SIP_SMC_MAX_NUMBER |
|||
}; |
|||
|
|||
/* MediaTek SiP Calls error code */ |
|||
enum { |
|||
MTK_SIP_E_SUCCESS = 0, |
|||
MTK_SIP_E_INVALID_PARAM = -1, |
|||
MTK_SIP_E_NOT_SUPPORTED = -2, |
|||
MTK_SIP_E_INVALID_RANGE = -3, |
|||
MTK_SIP_E_PERMISSION_DENY = -4, |
|||
MTK_SIP_E_LOCK_FAIL = -5, |
|||
}; |
|||
|
|||
struct smccc_res { |
|||
uint64_t a1; |
|||
uint64_t a2; |
|||
uint64_t a3; |
|||
}; |
|||
|
|||
typedef uintptr_t (*smc_handler_t)(u_register_t, |
|||
u_register_t, |
|||
u_register_t, |
|||
u_register_t, |
|||
void *, |
|||
struct smccc_res *); |
|||
|
|||
struct smc_descriptor { |
|||
smc_handler_t smc_handler; |
|||
const uint32_t smc_id_aarch32; |
|||
const uint32_t smc_id_aarch64; |
|||
const char *smc_name; |
|||
short *const smc_descriptor_index; |
|||
}; |
|||
|
|||
/*
|
|||
* This function should be implemented in MediaTek SOC directory. It fullfills |
|||
* MTK_SIP_SET_AUTHORIZED_SECURE_REG SiP call by checking the sreg with the |
|||
* predefined secure register list, if a match was found, set val to sreg. |
|||
* |
|||
* Return MTK_SIP_E_SUCCESS on success, and MTK_SIP_E_INVALID_PARAM on failure. |
|||
*/ |
|||
uint64_t mt_sip_set_authorized_sreg(uint32_t sreg, uint32_t val); |
|||
|
|||
#endif /* MTK_SIP_SVC_H */ |
Loading…
Reference in new issue