1#-------------------------------------------------------------------------------
2# Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
8include(${CMAKE_CURRENT_LIST_DIR}/Uuid.cmake)
9
10#[===[.rst:
11.. cmake:command:: export_sp
12
13	.. code:: cmake
14
15		export_sp(
16			SP_FFA_UUID_CANON <uuid_str_canon>
17			SP_NAME <name> MK_IN <.mk path>
18			SP_BOOT_ORDER <number>
19			DTS_IN <DTS path>
20			DTS_MEM_REGIONS <Memory region manifest path>
21			JSON_IN <JSON path>
22		)
23
24	INPUTS:
25
26	``SP_FFA_UUID_CANON``
27	The FF-A UUID of the SP as a canonical string.
28
29	``SP_BIN_UUID_CANON``
30	The UUID of the SP binary a canonical string. When not set use the
31	SP_FFA_UUID_CANON as the SP_BIN_UUID_CANON.
32
33	``SP_BOOT_ORDER``
34	Boot-order of the SP. 0 will be booted first.
35
36	``SP_NAME``
37	The name of the SP.
38
39	``MK_IN``
40	Optional, Makefile template for OP-TEE build
41
42	``DTS_IN``
43	Manifest file template
44
45	`DTS_MEM_REGIONS`
46	Optional, Memory region manifest file
47
48	``JSON_IN``
49	Optional, SP layout JSON file template for TF-A
50
51#]===]
52function (export_sp)
53	set(options)
54	set(oneValueArgs SP_FFA_UUID_CANON SP_BIN_UUID_CANON SP_BOOT_ORDER SP_NAME MK_IN DTS_IN DTS_MEM_REGIONS JSON_IN)
55	set(multiValueArgs)
56	cmake_parse_arguments(EXPORT "${options}" "${oneValueArgs}"
57						"${multiValueArgs}" ${ARGN} )
58
59	if(NOT DEFINED EXPORT_SP_FFA_UUID_CANON)
60		message(FATAL_ERROR "export_sp: mandatory parameter SP_FFA_UUID_CANON not defined!")
61	endif()
62	if(NOT DEFINED EXPORT_SP_BIN_UUID_CANON)
63		# We use the same UUID for the binary and FF-A if the UUID of the SP binary is not set
64		set(EXPORT_SP_BIN_UUID_CANON ${EXPORT_SP_FFA_UUID_CANON})
65	endif()
66	if(NOT DEFINED EXPORT_SP_BOOT_ORDER)
67		message(FATAL_ERROR "export_sp: mandatory parameter SP_BOOT_ORDER not defined!")
68	endif()
69	if(NOT DEFINED EXPORT_SP_NAME)
70		message(FATAL_ERROR "export_sp: mandatory parameter SP_NAME not defined!")
71	endif()
72	if(NOT DEFINED EXPORT_DTS_IN)
73		message(FATAL_ERROR "export_sp: mandatory parameter DTS_IN not defined!")
74	endif()
75
76	if (DEFINED EXPORT_MK_IN)
77		configure_file(${EXPORT_MK_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.mk @ONLY NEWLINE_STYLE UNIX)
78		install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.mk DESTINATION ${TS_ENV}/lib/make)
79	endif()
80
81	# In the SP manifest DT the UUID format is four uint32 numbers (little-endian)
82	# Create a litte endian 4 digit octests representation.
83	uuid_canon_to_le_words(UUID ${EXPORT_SP_FFA_UUID_CANON} RES _le_words)
84	list(JOIN _le_words " 0x" _uuid_le)
85	set(SP_UUID_LE " 0x${_uuid_le}" PARENT_SCOPE)
86	set(EXPORT_SP_UUID_DT " 0x${_uuid_le}")
87
88	# The .dts file is a standalone structure, thus it should have the /dts-v1/ tag and it
89	# starts with the root node.
90	set(DTS_TAG "/dts-v1/;")
91	set(DTS_NODE "/")
92	configure_file(${EXPORT_DTS_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}_before_preprocessing.dts @ONLY NEWLINE_STYLE UNIX)
93
94	compiler_preprocess_file(
95		SRC ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}_before_preprocessing.dts
96		DST ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}.dts
97		TARGET ${EXPORT_SP_NAME}
98	)
99
100	install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_BIN_UUID_CANON}.dts DESTINATION ${TS_ENV}/manifest)
101
102	if (DEFINED EXPORT_DTS_MEM_REGIONS)
103		install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_DTS_MEM_REGIONS} DESTINATION ${TS_ENV}/manifest)
104	endif()
105
106	if (DEFINED EXPORT_JSON_IN)
107		configure_file(${EXPORT_JSON_IN} ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.json @ONLY NEWLINE_STYLE UNIX)
108		install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${EXPORT_SP_NAME}.json DESTINATION ${TS_ENV}/json)
109	endif()
110endfunction()
111