libsp: Add build system files.

- Add opteesp deployment.
    This deployment builds libsp as a static library targeting aarch64
    SPs running under OP-TEE.
- Add inport and export interfaces for OP TEE-OS.
- Add opteesp environment files.
- Add shared CMake scripts including GCC compiler support.

Change-Id: Ie8643756d45d0d96822fd98c4c37e7264a7378a1
Signed-off-by: Gyorgy Szing <gyorgy.szing@arm.com>
diff --git a/external/Spdevkit/FindSpdevkit.cmake b/external/Spdevkit/FindSpdevkit.cmake
new file mode 100644
index 0000000..4a5df37
--- /dev/null
+++ b/external/Spdevkit/FindSpdevkit.cmake
@@ -0,0 +1,180 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+#[===[.rst:
+  Abstraction to interface to SP DEV KIT.
+  ---------------------------------------
+
+  SP DEV KIT is a component generated by the OP-TEE OS build and defines the
+  FF-A SP interface for the OS to SPs.
+
+  This file provides the following functionality:
+	- creates a static library to easy building the SP side component of the
+	  SP DEV KIT. This library will be properly configured with transitive
+	  dependencies to apply the needed compiler configurations to the
+	  target linking against it.
+	- defines a function to allow configuration of the linking phase of the
+	  executable target. (See: :command:`sp_dev_kit_configure_linking`)
+
+  Inputs:
+  ``SP_DEV_KIT_DIR``
+  A cmake or environment variable specifying the location of the SP DEV KIT.
+  This is mandatory.
+
+  ``SP_DEV_KIT_INC_DIR``
+  The SP DEV KIT depends on some header files living in the SP. This variable
+  must be set to an include path giving access to these headers.
+
+  Outputs:
+  :command:sp_dev_kit_configure_linking()
+
+  :variable:`SP_DEV_KIT_LIBRARIES`
+
+#]===]
+
+# Store SP DEV KIT location to cache.
+# If a cmake variable exist, use it as is.
+# If not, try to copy over the value from the environment.
+if(NOT DEFINED SP_DEV_KIT_DIR AND NOT DEFINED ENV{SP_DEV_KIT_DIR})
+	message(FATAL_ERROR "'SP_DEV_KIT_DIR' is not defined.")
+endif()
+set(SP_DEV_KIT_DIR $ENV{SP_DEV_KIT_DIR} CACHE STRING "SP dev kit from original OP-TEE build system")
+
+if (DEFINED ENV{SP_DEV_KIT_DIR} AND NOT SP_DEV_KIT_DIR STREQUAL "$ENV{SP_DEV_KIT_DIR}")
+	message(WARNING "Suspicious settings: the value of SP_DEV_KIT_DIR in the environment is not matching cmakes settings!")
+endif()
+
+# Find the directories inside SP DEV KIT. This gives more flexibility than when using static settings.
+find_path (SP_DEV_KIT_SRC_DIR
+	NAMES
+		sp_header.c
+	PATHS
+		${SP_DEV_KIT_DIR}
+	PATH_SUFFIXES
+		"src"
+	NO_DEFAULT_PATH
+	REQUIRED
+	DOC
+		"SP DEV KIT source directory"
+	)
+
+find_path (SP_DEV_KIT_INCLUDE_DIR
+	NAMES
+		ffa.h atomic.h compiler.h
+	PATHS
+		${SP_DEV_KIT_DIR}
+	PATH_SUFFIXES
+		"include"
+	NO_DEFAULT_PATH
+	REQUIRED
+	DOC
+		"SP DEV KIT include directory"
+	)
+
+find_path (SP_DEV_KIT_LIB_DIR
+	NAMES
+		${CMAKE_STATIC_LIBRARY_PREFIX}utils${CMAKE_STATIC_LIBRARY_SUFFIX} libutils.a utils.a utils.lib libutils.link_libraries
+	PATHS
+		${SP_DEV_KIT_DIR}
+	PATH_SUFFIXES
+		"lib"
+	NO_DEFAULT_PATH
+	REQUIRED
+	DOC
+		"SP DEV KIT library directory"
+	)
+
+#[===[.rst:
+.. cmake:variable:: SP_DEV_KIT_LIBRARIES
+
+  List of libraries forming the SP DEV KIT interface.
+
+#]===]
+
+# Create an imported target for libutils.a
+add_library(spdevkit::libutils STATIC IMPORTED)
+set_target_properties(spdevkit::libutils PROPERTIES
+	INTERFACE_INCLUDE_DIRECTORIES "${SP_DEV_KIT_INCLUDE_DIR}"
+	INTERFACE_LINK_LIBRARIES "${SP_DEV_KIT_LIB_DIR}/libutils.a"
+	IMPORTED_LOCATION "${SP_DEV_KIT_LIB_DIR}/libutils.a"
+)
+list(APPEND SP_DEV_KIT_LIBRARIES spdevkit::libutils)
+
+if (NOT Spdevkit_FIND_COMPONENTS OR "SP_HEADER" IN_LIST Spdevkit_FIND_COMPONENTS)
+	if (NOT DEFINED SP_DEV_KIT_INC_DIR)
+		message(FATAL_ERROR "Mandatory input variable 'SP_DEV_KIT_INC_DIR' is not defined.")
+	endif()
+
+	# Define a static library to compile the SP side source files and to
+	# capture dependencies (settings).
+	add_library(sp_header STATIC
+		${SP_DEV_KIT_SRC_DIR}/sp_assert.c
+		${SP_DEV_KIT_SRC_DIR}/sp_entry.c
+		${SP_DEV_KIT_SRC_DIR}/sp_header.c
+		${SP_DEV_KIT_SRC_DIR}/sp_trace.c
+		)
+
+	target_include_directories(sp_header
+							PRIVATE
+								${SP_DEV_KIT_INC_DIR}
+							)
+
+	target_link_libraries(sp_header PRIVATE spdevkit::libutils)
+	add_library(spdevkit::sp_header ALIAS sp_header)
+	list(APPEND SP_DEV_KIT_LIBRARIES spdevkit::sp_header)
+endif()
+
+#[===[.rst:
+.. cmake:command:: sp_dev_kit_configure_linking
+
+  .. code-block:: cmake
+
+    sp_dev_kit_configure_linking(TARGET <executable target> DEFINES <list of pre-processor macros>)
+
+  Connect an executable target to SP DEV KIT link requirements:
+	- add rules to run the linker command file trough the pre-processor if needed
+	- configure the target to use the linker command file
+	- link SP DEV KIT libraries to the target
+
+  Inputs:
+
+  ``TARGET``
+  Mandatory. The name of an already defined executable target (add_executable())
+
+  ``DEFINES``
+  Optional. Macro definitions for the pre-processing step.
+
+#]===]
+function(sp_dev_kit_configure_linking)
+	set(options  )
+	set(oneValueArgs TARGET)
+	set(multiValueArgs DEFINES)
+	cmake_parse_arguments(MY_PARAMS "${options}" "${oneValueArgs}"
+						"${multiValueArgs}" ${ARGN} )
+
+	if(NOT DEFINED MY_PARAMS_TARGET)
+		message(FATAL_ERROR "sp_dev_kit_configure_linking: mandatory parameter TARGET not defined!")
+	endif()
+
+	if(NOT DEFINED MY_PARAMS_DEFINES)
+		set(MY_PARAMS_DEFINES "")
+	endif()
+
+	compiler_preprocess_file(
+		SRC ${SP_DEV_KIT_DIR}/src/sp.ld.S
+		DST ${CMAKE_BINARY_DIR}/sp.ld
+		DEFINES ${MY_PARAMS_DEFINES}
+	)
+
+	add_custom_target(${MY_PARAMS_TARGET}-pplscript DEPENDS ${CMAKE_BINARY_DIR}/sp.ld)
+	add_dependencies(${MY_PARAMS_TARGET} ${MY_PARAMS_TARGET}-pplscript)
+
+	target_link_options(${MY_PARAMS_TARGET} PRIVATE
+		-T${CMAKE_BINARY_DIR}/sp.ld
+	)
+endfunction()
+