• Antonio Nino Diaz's avatar
    Add support for the SMC Calling Convention 2.0 · 2f370465
    Antonio Nino Diaz authored
    
    Due to differences in the bitfields of the SMC IDs, it is not possible
    to support SMCCC 1.X and 2.0 at the same time.
    
    The behaviour of `SMCCC_MAJOR_VERSION` has changed. Now, it is a build
    option that specifies the major version of the SMCCC that the Trusted
    Firmware supports. The only two allowed values are 1 and 2, and it
    defaults to 1. The value of `SMCCC_MINOR_VERSION` is derived from it.
    
    Note: Support for SMCCC v2.0 is an experimental feature to enable
    prototyping of secure partition specifications. Support for this
    convention is disabled by default and could be removed without notice.
    
    Change-Id: I88abf9ccf08e9c66a13ce55c890edea54d9f16a7
    Signed-off-by: default avatarAntonio Nino Diaz <antonio.ninodiaz@arm.com>
    2f370465
smccc_v1.h 2.36 KB
/*
 * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef SMCCC_V1_H
#define SMCCC_V1_H

#ifndef __SMCCC_H__
#error "This file must only be included from smccc.h"
#endif

/*******************************************************************************
 * Bit definitions inside the function id as per the SMC calling convention
 ******************************************************************************/
#define FUNCID_TYPE_SHIFT		U(31)
#define FUNCID_TYPE_MASK		U(0x1)
#define FUNCID_TYPE_WIDTH		U(1)

#define FUNCID_CC_SHIFT			U(30)
#define FUNCID_CC_MASK			U(0x1)
#define FUNCID_CC_WIDTH			U(1)

#define FUNCID_OEN_SHIFT		U(24)
#define FUNCID_OEN_MASK			U(0x3f)
#define FUNCID_OEN_WIDTH		U(6)

#define FUNCID_NUM_SHIFT		U(0)
#define FUNCID_NUM_MASK			U(0xffff)
#define FUNCID_NUM_WIDTH		U(16)

#define GET_SMC_TYPE(id)		(((id) >> FUNCID_TYPE_SHIFT) & \
					 FUNCID_TYPE_MASK)
#define GET_SMC_CC(id)			(((id) >> FUNCID_CC_SHIFT) & \
					 FUNCID_CC_MASK)
#define GET_SMC_OEN(id)			(((id) >> FUNCID_OEN_SHIFT) & \
					 FUNCID_OEN_MASK)

/*******************************************************************************
 * Owning entity number definitions inside the function id as per the SMC
 * calling convention
 ******************************************************************************/
#define OEN_ARM_START			U(0)
#define OEN_ARM_END			U(0)
#define OEN_CPU_START			U(1)
#define OEN_CPU_END			U(1)
#define OEN_SIP_START			U(2)
#define OEN_SIP_END			U(2)
#define OEN_OEM_START			U(3)
#define OEN_OEM_END			U(3)
#define OEN_STD_START			U(4)	/* Standard Service Calls */
#define OEN_STD_END			U(4)
#define OEN_STD_HYP_START		U(5)	/* Standard Hypervisor Service calls */
#define OEN_STD_HYP_END			U(5)
#define OEN_VEN_HYP_START		U(6)	/* Vendor Hypervisor Service calls */
#define OEN_VEN_HYP_END			U(6)
#define OEN_TAP_START			U(48)	/* Trusted Applications */
#define OEN_TAP_END			U(49)
#define OEN_TOS_START			U(50)	/* Trusted OS */
#define OEN_TOS_END			U(63)
#define OEN_LIMIT			U(64)

/* Flags and error codes */
#define SMC_64				U(1)
#define SMC_32				U(0)

#define SMC_TYPE_FAST			ULL(1)
#if !ERROR_DEPRECATED
#define SMC_TYPE_STD			ULL(0)
#endif
#define SMC_TYPE_YIELD			ULL(0)

#define SMC_OK				ULL(0)
#define SMC_UNK				-1
#define SMC_PREEMPTED			-2	/* Not defined by the SMCCC */

#endif /* SMCCC_V1_H */