blob: 78701b933636d189877bb4973f14b97709436826 [file] [log] [blame]
#-------------------------------------------------------------------------------
# Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
include(${CMAKE_CURRENT_LIST_DIR}/Uuid.cmake)
#[===[.rst:
.. cmake:command:: export_sp
.. code:: cmake
export_sp(
SP_FFA_UUID_CANON <uuid_str_canon>
SP_NAME <name> MK_IN <.mk path>
DTS_IN <DTS path>
DTS_MEM_REGIONS <Memory region manifest path>
JSON_IN <JSON path>
)
INPUTS:
``SP_FFA_UUID_CANON``
The FF-A UUID of the SP as a canonical string.
``SP_BIN_UUID_CANON``
The UUID of the SP binary a canonical string. When not set use the
SP_FFA_UUID_CANON as the SP_BIN_UUID_CANON.
``SP_NAME``
The name of the SP.
``MK_IN``
Optional, Makefile template for OP-TEE build
``DTS_IN``
Manifest file template
`DTS_MEM_REGIONS`
Optional, Memory region manifest file
``JSON_IN``
Optional, SP layout JSON file template for TF-A
#]===]
function (export_sp)
set(options)
set(oneValueArgs SP_FFA_UUID_CANON SP_BIN_UUID_CANON SP_NAME MK_IN DTS_IN DTS_MEM_REGIONS JSON_IN)
set(multiValueArgs)
cmake_parse_arguments(EXPORT "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN} )
if(NOT DEFINED EXPORT_SP_FFA_UUID_CANON)
message(FATAL_ERROR "export_sp: mandatory parameter SP_FFA_UUID_CANON not defined!")
endif()
if(NOT DEFINED EXPORT_SP_BIN_UUID_CANON)
# We use the same UUID for the binary and FF-A if the UUID of the SP binary is not set
set(EXPORT_SP_BIN_UUID_CANON ${EXPORT_SP_FFA_UUID_CANON})
endif()
if(NOT DEFINED EXPORT_SP_NAME)
message(FATAL_ERROR "export_sp: mandatory parameter SP_NAME not defined!")
endif()
if(NOT DEFINED EXPORT_DTS_IN)
message(FATAL_ERROR "export_sp: mandatory parameter DTS_IN not defined!")
endif()
if (DEFINED EXPORT_MK_IN)
configure_file(${EXPORT_MK_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.mk @ONLY NEWLINE_STYLE UNIX)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.mk DESTINATION ${TS_ENV}/lib/make)
endif()
# In the SP manifest DT the UUID format is four uint32 numbers (little-endian)
# Create a litte endian 4 digit octests representation.
uuid_canon_to_le_words(UUID ${EXPORT_SP_FFA_UUID_CANON} RES _le_words)
list(JOIN _le_words " 0x" _uuid_le)
set(SP_UUID_LE " 0x${_uuid_le}" PARENT_SCOPE)
set(EXPORT_SP_UUID_DT " 0x${_uuid_le}")
# As the .dtsi is meant to be included in .dts file, it shouldn't contain a separate
# /dts-v1/ tag and its node should be unique, i.e. the SP name.
set(DTS_TAG "")
set(DTS_NODE "${EXPORT_SP_NAME}")
configure_file(${EXPORT_DTS_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}_before_preprocessing.dtsi @ONLY NEWLINE_STYLE UNIX)
compiler_preprocess_file(
SRC ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}_before_preprocessing.dtsi
DST ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}.dtsi
TARGET ${EXPORT_SP_NAME}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}.dtsi DESTINATION ${TS_ENV}/manifest)
# The .dts file is a standalone structure, thus it should have the /dts-v1/ tag and it
# starts with the root node.
set(DTS_TAG "/dts-v1/;")
set(DTS_NODE "/")
configure_file(${EXPORT_DTS_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}_before_preprocessing.dts @ONLY NEWLINE_STYLE UNIX)
compiler_preprocess_file(
SRC ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}_before_preprocessing.dts
DST ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}.dts
TARGET ${EXPORT_SP_NAME}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}.dts DESTINATION ${TS_ENV}/manifest)
if (DEFINED EXPORT_DTS_MEM_REGIONS)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_DTS_MEM_REGIONS} DESTINATION ${TS_ENV}/manifest)
endif()
if (DEFINED EXPORT_JSON_IN)
configure_file(${EXPORT_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.json @ONLY NEWLINE_STYLE UNIX)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.json DESTINATION ${TS_ENV}/json)
endif()
endfunction()