blob: eb51ef71b6735a3428059fbf681ecff41c92bf7f [file] [log] [blame]
Brad Bishopbec4ebc2022-08-03 09:55:16 -04001From 90712f624c7b676e5b9a2d95cbe97d2b63fddcc9 Mon Sep 17 00:00:00 2001
2From: Vishnu Banavath <vishnu.banavath@arm.com>
3Date: Fri, 3 Dec 2021 16:36:51 +0000
4Subject: [PATCH] Add openamp to SE proxy deployment
5
6Openamp is required to communicate between secure partitions(running on
7Cortex-A) and trusted-firmware-m(running on Cortex-M).
8These changes are to fetch libmetal and openamp from github repo's
9and build it.
10
11Signed-off-by: Rui Miguel Silva <rui.silva@arm.com>
12Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
13
14Upstream-Status: Pending [Not submitted to upstream yet]
15Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
16
17
18---
19 deployments/se-proxy/opteesp/CMakeLists.txt | 14 ++++
20 deployments/se-proxy/opteesp/lse.S | 19 +++++
21 external/openamp/libmetal.cmake | 81 ++++++++++++++++++++
22 external/openamp/openamp.cmake | 82 +++++++++++++++++++++
23 4 files changed, 196 insertions(+)
24 create mode 100644 deployments/se-proxy/opteesp/lse.S
25 create mode 100644 external/openamp/libmetal.cmake
26 create mode 100644 external/openamp/openamp.cmake
27
28diff --git a/deployments/se-proxy/opteesp/CMakeLists.txt b/deployments/se-proxy/opteesp/CMakeLists.txt
29index 4e2069a5..248bd7e3 100644
30--- a/deployments/se-proxy/opteesp/CMakeLists.txt
31+++ b/deployments/se-proxy/opteesp/CMakeLists.txt
32@@ -89,6 +89,7 @@ add_components(TARGET "se-proxy"
33 target_sources(se-proxy PRIVATE
34 se_proxy_sp.c
35 service_proxy_factory.c
36+ lse.S
37 )
38
39 #-------------------------------------------------------------------------------
40@@ -108,6 +109,19 @@ include(../../../external/nanopb/nanopb.cmake)
41 target_link_libraries(se-proxy PRIVATE nanopb::protobuf-nanopb-static)
42 protobuf_generate_all(TGT "se-proxy" NAMESPACE "protobuf" BASE_DIR "${TS_ROOT}/protocols")
43
44+# libmetal
45+list(APPEND LIBMETAL_EXTERNAL_INCLUDE_PATHS ${SP_DEV_KIT_INCLUDE_DIR})
46+set(LIBMETAL_EXTRA_INCLUDE_PATHS ${LIBMETAL_EXTRA_INCLUDE_PATHS}
47+ CACHE STRING "" FORCE)
48+include(../../../external/openamp/libmetal.cmake)
49+
50+# OpenAMP
51+list(APPEND OPENAMP_EXTERNAL_INCLUDE_PATHS ${SP_DEV_KIT_INCLUDE_DIR})
52+set(OPENAMP_EXTRA_INCLUDE_PATHS ${OPENAMP_EXTRA_INCLUDE_PATHS}
53+ CACHE STRING "" FORCE)
54+include(../../../external/openamp/openamp.cmake)
55+target_link_libraries(se-proxy PRIVATE openamp libmetal)
56+
57 #################################################################
58
59 target_compile_definitions(se-proxy PRIVATE
60diff --git a/deployments/se-proxy/opteesp/lse.S b/deployments/se-proxy/opteesp/lse.S
61new file mode 100644
62index 00000000..840683a6
63--- /dev/null
64+++ b/deployments/se-proxy/opteesp/lse.S
65@@ -0,0 +1,19 @@
66+// SPDX-License-Identifier: BSD-3-Clause
67+/*
68+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
69+ */
70+
71+.text
72+.globl __aarch64_cas4_acq_rel
73+
74+__aarch64_cas4_acq_rel:
75+ mov w16, w0
76+ ldaxr w0, [x2]
77+ cmp w0, w16
78+0: bne 1f
79+
80+ stlxr w17, w1, [x2]
81+ cbnz w17, 0b
82+1: ret
83+
84+
85diff --git a/external/openamp/libmetal.cmake b/external/openamp/libmetal.cmake
86new file mode 100644
87index 00000000..3a647e69
88--- /dev/null
89+++ b/external/openamp/libmetal.cmake
90@@ -0,0 +1,81 @@
91+#-------------------------------------------------------------------------------
92+# Copyright (c) 2021 Linaro Limited
93+# Copyright (c) 2021, Arm Limited. All rights reserved.
94+#
95+# SPDX-License-Identifier: BSD-3-Clause
96+#
97+#-------------------------------------------------------------------------------
98+
99+set (LIBMETAL_URL "https://github.com/OpenAMP/libmetal.git" CACHE STRING "libmetal repository URL")
100+set (LIBMETAL_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/libmetal_install" CACHE PATH "libmetal installation directory")
101+set (LIBMETAL_PACKAGE_PATH "${LIBMETAL_INSTALL_PATH}/libmetal/cmake" CACHE PATH "libmetal CMake package directory")
102+set (LIBMETAL_TARGET_NAME "libmetal")
103+set (LIBMETAL_VERSION "f252f0e007fbfb8b3a52b1d5901250ddac96baad" CACHE STRING "The version of libmetal to use")
104+
105+if(NOT LIBMETAL_DEBUG)
106+ set(LIBMETAL_BUILD_TYPE "Release")
107+else()
108+ set(LIBMETAL_BUILD_TYPE "Debug")
109+endif()
110+
111+include(FetchContent)
112+
113+# Checking git
114+find_program(GIT_COMMAND "git")
115+if (NOT GIT_COMMAND)
116+ message(FATAL_ERROR "Please install git")
117+endif()
118+
119+FetchContent_Declare(
120+ libmetal
121+ GIT_REPOSITORY ${LIBMETAL_URL}
122+ GIT_TAG ${LIBMETAL_VERSION}
123+)
124+
125+# FetchContent_GetProperties exports libmetal_SOURCE_DIR and libmetal_BINARY_DIR variables
126+FetchContent_GetProperties(libmetal)
127+if(NOT libmetal_POPULATED)
128+ message(STATUS "Fetching libmetal")
129+ FetchContent_Populate(libmetal)
130+endif()
131+
132+# Ensure list of include paths is separated correctly
133+string(REPLACE ";" "\\;" LIBMETAL_EXTERNAL_INCLUDE_PATHS "${LIBMETAL_EXTERNAL_INCLUDE_PATHS}")
134+
135+#Configure the library
136+execute_process(COMMAND
137+ ${CMAKE_COMMAND}
138+ -DCMAKE_BUILD_TYPE=${LIBMETAL_BUILD_TYPE}
139+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
140+ -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
141+ -DCMAKE_TOOLCHAIN_FILE=${TS_EXTERNAL_LIB_TOOLCHAIN_FILE}
142+ -DCMAKE_INSTALL_PREFIX=${LIBMETAL_INSTALL_PATH}
143+ -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
144+ -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
145+ -DCMAKE_C_OUTPUT_EXTENSION=.o
146+ -DCMAKE_C_COMPILER_WORKS=true
147+ -DCMAKE_SYSTEM_PROCESSOR=arm
148+ -DWITH_DOC=off
149+ -DWITH_TESTS=off
150+ -DWITH_EXAMPLES=off
151+ -DWITH_DEFAULT_LOGGER=off
152+ -DEXTERNAL_INCLUDE_PATHS=${LIBMETAL_EXTERNAL_INCLUDE_PATHS}
153+ -DMACHINE=template
154+ ${libmetal_SOURCE_DIR}
155+ WORKING_DIRECTORY
156+ ${libmetal_BINARY_DIR}
157+)
158+
159+# Build the library
160+execute_process(COMMAND
161+ ${CMAKE_COMMAND} --build ${libmetal_BINARY_DIR} -- install
162+ RESULT_VARIABLE _exec_error
163+ )
164+if (_exec_error)
165+ message(FATAL_ERROR "Build step of libmetal failed with ${_exec_error}.")
166+endif()
167+
168+#Create an imported target to have clean abstraction in the build-system.
169+add_library(libmetal STATIC IMPORTED)
170+set_property(TARGET libmetal PROPERTY IMPORTED_LOCATION "${LIBMETAL_INSTALL_PATH}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}metal${CMAKE_STATIC_LIBRARY_SUFFIX}")
171+set_property(TARGET libmetal PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${LIBMETAL_INSTALL_PATH}/include")
172diff --git a/external/openamp/openamp.cmake b/external/openamp/openamp.cmake
173new file mode 100644
174index 00000000..aae13bad
175--- /dev/null
176+++ b/external/openamp/openamp.cmake
177@@ -0,0 +1,82 @@
178+#-------------------------------------------------------------------------------
179+# Copyright (c) 2021 Linaro Limited
180+# Copyright (c) 2021, Arm Limited. All rights reserved.
181+#
182+# SPDX-License-Identifier: BSD-3-Clause
183+#
184+#-------------------------------------------------------------------------------
185+
186+set (OPENAMP_URL "https://github.com/OpenAMP/open-amp.git" CACHE STRING "OpenAMP repository URL")
187+set (OPENAMP_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/openamp_install" CACHE PATH "OpenAMP installation directory")
188+set (OPENAMP_PACKAGE_PATH "${OPENAMP_INSTALL_PATH}/openamp/cmake" CACHE PATH "OpenAMP CMake package directory")
189+set (OPENAMP_TARGET_NAME "openamp")
190+set (OPENAMP_VERSION "347397decaa43372fc4d00f965640ebde042966d" CACHE STRING "The version of openamp to use")
191+
192+
193+if(NOT OPENAMP_DEBUG)
194+ set(OPENAMP_BUILD_TYPE "Release")
195+else()
196+ set(OPENAMP_BUILD_TYPE "Debug")
197+endif()
198+
199+include(FetchContent)
200+
201+# Checking git
202+find_program(GIT_COMMAND "git")
203+if (NOT GIT_COMMAND)
204+ message(FATAL_ERROR "Please install git")
205+endif()
206+
207+FetchContent_Declare(
208+ openamp
209+ GIT_REPOSITORY ${OPENAMP_URL}
210+ GIT_TAG ${OPENAMP_VERSION}
211+)
212+
213+# FetchContent_GetProperties exports openamp_SOURCE_DIR and openamp_BINARY_DIR variables
214+FetchContent_GetProperties(openamp)
215+if(NOT openamp_POPULATED)
216+ message(STATUS "Fetching openamp")
217+ FetchContent_Populate(openamp)
218+endif()
219+
220+# Ensure list of include paths is separated correctly
221+get_target_property(_libmetal_inc libmetal INTERFACE_INCLUDE_DIRECTORIES)
222+set (_openam_external_include_paths ${_libmetal_inc} ${OPENAMP_EXTERNAL_INCLUDE_PATHS})
223+string(REPLACE ";" "\\;" OPENAMP_EXTERNAL_INCLUDE_PATHS "${_openam_external_include_paths}")
224+
225+#Configure the library
226+execute_process(COMMAND
227+ ${CMAKE_COMMAND}
228+ -DCMAKE_BUILD_TYPE=${OPENAMP_BUILD_TYPE}
229+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
230+ -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
231+ -DCMAKE_TOOLCHAIN_FILE=${TS_EXTERNAL_LIB_TOOLCHAIN_FILE}
232+ -DCMAKE_INSTALL_PREFIX=${OPENAMP_INSTALL_PATH}
233+ -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
234+ -DLIBMETAL_INCLUDE_DIR=${CMAKE_CURRENT_BINARY_DIR}/libmetal/lib/include
235+ -DLIBMETAL_LIB=${CMAKE_CURRENT_BINARY_DIR}/libmetal/lib
236+ -DCMAKE_C_OUTPUT_EXTENSION=.o
237+ -DCMAKE_C_COMPILER_WORKS=true
238+ -DCMAKE_SYSTEM_PROCESSOR=arm
239+ -DEXTERNAL_INCLUDE_PATHS=${OPENAMP_EXTERNAL_INCLUDE_PATHS}
240+ -DMACHINE=template
241+ -DRPMSG_BUFFER_SIZE=512
242+ ${openamp_SOURCE_DIR}
243+ WORKING_DIRECTORY
244+ ${openamp_BINARY_DIR}
245+)
246+
247+# Build the library
248+execute_process(COMMAND
249+ ${CMAKE_COMMAND} --build ${openamp_BINARY_DIR} -- install
250+ RESULT_VARIABLE _exec_error
251+ )
252+if (_exec_error)
253+ message(FATAL_ERROR "Build step of OpenAMP failed with ${_exec_error}.")
254+endif()
255+
256+#Create an imported target to have clean abstraction in the build-system.
257+add_library(openamp STATIC IMPORTED)
258+set_property(TARGET openamp PROPERTY IMPORTED_LOCATION "${OPENAMP_INSTALL_PATH}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}open_amp${CMAKE_STATIC_LIBRARY_SUFFIX}")
259+set_property(TARGET openamp PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${OPENAMP_INSTALL_PATH}/include")