1# SCMI server library is built from SCP-firmware source tree. 2# The firmware is made of a framework, a product and modules. 3# Only modules used by firmware must be built, as stated by 4# CFG_SCPFW_MOD_* swtches. SCP-firmware needs a C source and 5# a header file to be generated to describe embedded modules. 6# This is done through cmake configuration of the package. 7# The toolchain build directive must also match the list of 8# embedded modules. 9 10scpfw-path = $(CFG_SCP_FIRMWARE) 11scpfw-product = $(CFG_SCMI_SCPFW_PRODUCT) 12scpfw-out-path := $(out-dir)/$(libdir) 13 14# This script was validated against SCP-firmware 2.11.0 development branch, 15# from commit f1d894921d76 ("product/optee-fvp: Add new OPTEE FVP product"). 16scpfw-integ-version-maj = 2 17scpfw-integ-version-min = 11 18scpfw-integ-version-pat = 0 19scpfw-integ-version = $(scpfw-integ-version-maj).$(scpfw-integ-version-min).$(scpfw-integ-version-pat) 20 21srcs-y += scmi_server.c 22incdirs-y += include 23 24# SCP-firmware cmake configuration generates header fwk_module_idx.h and 25# source files fwk_module_list.c needed for scp-firmware compilation. 26scpfw-cmake-flags-y = -DSCP_FIRMWARE_SOURCE_DIR:PATH=$(scpfw-product)/fw \ 27 -DSCP_LOG_LEVEL="TRACE" \ 28 -DDISABLE_CPPCHECK=1 \ 29 -DCFG_NUM_THREADS=$(CFG_NUM_THREADS) \ 30 -DSCP_OPTEE_DIR:PATH=$(CURDIR) \ 31 -DCFG_CROSS_COMPILE=$(lastword $(CROSS_COMPILE_core)) 32 33# CMake does not need to check the cross compilation toolchain since we do not 34# compile any source file with CMake, we only generate some SCP-firmware 35# files. 36scpfw-cmake-flags-y += -DCMAKE_C_COMPILER_WORKS=1 37 38ifeq ($(cmd-echo-silent),true) 39scpfw-cmake-redirect = >/dev/null 40endif 41 42gensrcs-y += fwk_module_list 43force-gensrc-fwk_module_list := y 44produce-fwk_module_list = build/framework/src/fwk_module_list.c 45recipe-fwk_module_list = cmake -S $(scpfw-path) -B $(scpfw-out-path)/build \ 46 $(scpfw-cmake-flags-y) --log-level=WARNING $(scpfw-cmake-redirect) 47depends-fwk_module_list = $(scpfw-path)/product/$(scpfw-product)/fw/Firmware.cmake $(conf-file) 48# Include path of generated header file fwk_module_idx.h 49incdirs_ext-y += $(scpfw-out-path)/build/framework/include 50 51cppflags-lib-y += -DBUILD_VERSION_MAJOR=$(scpfw-integ-version-maj) \ 52 -DBUILD_VERSION_MINOR=$(scpfw-integ-version-min) \ 53 -DBUILD_VERSION_PATCH=$(scpfw-integ-version-pat) 54 55scpfw-impl-version := $(shell git -C $(scpfw-path) describe --tags --always --dirty=-dev 2>/dev/null || \ 56 echo Unknown_$(scpfw-integ-version)) 57cppflags-lib-y += -DBUILD_VERSION_DESCRIBE_STRING=\"$(scpfw-impl-version)\" 58 59cppflags-lib-y += -DFWK_LOG_LEVEL=$(CFG_SCPFW_LOG_LEVEL) 60ifneq ($(CFG_SCPFW_LOG_LEVEL),0) 61cppflags-lib-y += -DFMW_LOG_MINIMAL_BANNER=1 62endif 63 64cflags-lib-y += -Wno-cast-align \ 65 -Wno-nonnull-compare \ 66 -Wno-unused-parameter \ 67 -Wno-suggest-attribute=format \ 68 -Wno-declaration-after-statement 69 70# The below directives will be removed once SCP-firmware pull requests 71# 728 and 732 are merged. 72cflags-lib-y += -Wno-undef \ 73 -Wno-missing-prototypes \ 74 -Wno-missing-declarations \ 75 -Wno-unused-but-set-variable \ 76 -Wno-suggest-attribute=format 77 78# Notification implementation has strict aliasing issues 79cflags-lib-$(CFG_SCPFW_NOTIFICATION) += -Wno-strict-aliasing 80 81cppflags-lib-y += -DBUILD_HAS_SUB_SYSTEM_MODE=1 \ 82 -DBUILD_HAS_BASE_PROTOCOL 83 84cppflags-lib-$(CFG_SCPFW_NOTIFICATION) += -DBUILD_HAS_NOTIFICATION \ 85 -DBUILD_HAS_SCMI_NOTIFICATIONS 86 87cppflags-lib-$(CFG_SCPFW_FAST_CHANNELS) += -DBUILD_HAS_FAST_CHANNELS \ 88 -DBUILD_HAS_SCMI_FAST_CHANNELS 89 90cppflags-lib-$(CFG_SCPFW_CLOCK_TREE_MGMT) += -DBUILD_HAS_CLOCK_TREE_MGMT 91 92cppflags-lib-$(CFG_SCPFW_SCMI_PERF_FAST_CHANNELS) += -DBUILD_HAS_SCMI_PERF_FAST_CHANNELS 93 94cppflags-lib-$(CFG_SCPFW_SCMI_PERF_PROTOCOL_OPS) \ 95 += -DBUILD_HAS_SCMI_PERF_PROTOCOL_OPS 96 97cppflags-lib-$(CFG_SCPFW_SCMI_SENSOR_EVENTS) += -DBUILD_HAS_SCMI_SENSOR_EVENTS 98cppflags-lib-$(CFG_SCPFW_SCMI_SENSOR_V2) += -DBUILD_HAS_SCMI_SENSOR_V2 \ 99 -DBUILD_HAS_SENSOR_TIMESTAMP \ 100 -DBUILD_HAS_SENSOR_MULTI_AXIS \ 101 -DBUILD_HAS_SENSOR_EXT_ATTRIBS \ 102 -DBUILD_HAS_SENSOR_SIGNED_VALUE 103 104cppflags-lib-$(CFG_SCPFW_SENSOR_TIMESTAMP) += -DBUILD_HAS_SENSOR_TIMESTAMP 105cppflags-lib-$(CFG_SCPFW_SENSOR_MULTI_AXIS) += -DBUILD_HAS_SENSOR_MULTI_AXI 106cppflags-lib-$(CFG_SCPFW_SENSOR_EXT_ATTRIBS) += -DBUILD_HAS_SENSOR_EXT_ATTRIBS 107cppflags-lib-$(CFG_SCPFW_SENSOR_SIGNED_VALUE) += -DBUILD_HAS_SENSOR_SIGNED_VALUE 108cppflags-lib-$(CFG_SCPFW_INBAND_MSG_SUPPORT) += -DBUILD_HAS_INBAND_MSG_SUPPORT 109 110incdirs_ext-y += $(scpfw-path)/arch/none/optee/include 111srcs-y += $(scpfw-path)/arch/none/optee/src/arch_interrupt.c 112srcs-y += $(scpfw-path)/arch/none/optee/src/arch_main.c 113 114incdirs_ext-y += $(scpfw-path)/framework/include 115srcs-y += $(scpfw-path)/framework/src/fwk_arch.c 116srcs-y += $(scpfw-path)/framework/src/fwk_dlist.c 117srcs-y += $(scpfw-path)/framework/src/fwk_id.c 118srcs-y += $(scpfw-path)/framework/src/fwk_interrupt.c 119srcs-y += $(scpfw-path)/framework/src/fwk_io.c 120srcs-y += $(scpfw-path)/framework/src/fwk_log.c 121srcs-y += $(scpfw-path)/framework/src/fwk_mm.c 122srcs-y += $(scpfw-path)/framework/src/fwk_module.c 123srcs-y += $(scpfw-path)/framework/src/fwk_ring.c 124srcs-y += $(scpfw-path)/framework/src/fwk_slist.c 125srcs-y += $(scpfw-path)/framework/src/fwk_status.c 126srcs-y += $(scpfw-path)/framework/src/fwk_string.c 127srcs-y += $(scpfw-path)/framework/src/fwk_delayed_resp.c 128srcs-y += $(scpfw-path)/framework/src/fwk_time.c 129srcs-y += $(scpfw-path)/framework/src/fwk_core.c 130srcs-y += $(scpfw-path)/framework/src/assert.c 131srcs-y += $(scpfw-path)/framework/src/stdlib.c 132srcs-$(CFG_SCPFW_NOTIFICATION) += $(scpfw-path)/framework/src/fwk_notification.c 133 134# Helper macros for listing SCP-firmware modules source files (in srcs-y) 135# and header include paths (in incdirs_ext-y). Each module provides a C source 136# file named mod_<module-name>.c and possibly an include directory. Build 137# directive BUILD_HAS_MOD_<NAME> must be set for each embedded module. 138# 139# Standard modules source tree: <scp-path>/module/<name>/src/mod_<name>.c 140# Optee modules source tree: <scp-path>/module/optee/<short-name>/src/mod_<name>.c 141# Product modules source tree: <scp-path>/product/<product-name>/module/<name>/src/mod_<name>.c 142# 143# scpfw-embed-generic-module is to be used for standard modules. 144# scpfw-embed-optee-module is to be used for optee modules. 145# scpfw-embed-product-module is to be used for product modules. 146# For modules that implement other C source files aside mandatory mod_<name>.c we must 147# add to srcs-y the required source file paths. 148# 149# scpfw-embed-mod takes 4 arguments: 150# $1 module name, lowercase 151# $2 module directory name 152# $3 module parent directory relative path in scpfw tree 153# $4 module name, uppercase, relates to CFG_SCPFW_MOD_$4 154define scpfw-embed-mod 155ifneq (,$$(wildcard $(scpfw-path)/$3/$2/include/*)) 156incdirs_ext-y += $(scpfw-path)/$3/$2/include 157endif 158srcs-$(CFG_SCPFW_MOD_$4) += $(scpfw-path)/$3/$2/src/mod_$1.c 159 160# SCMI_Perf in SCP-firmware has components that can be added conditionally at 161# build time. 162ifeq ($(1), scmi_perf) 163 164ifeq ($(CFG_SCPFW_SCMI_PERF_PROTOCOL_OPS),y) 165srcs-$(CFG_SCPFW_MOD_SCMI_PERF) += $(scpfw-path)/$3/$2/src/scmi_perf_protocol_ops.c 166endif 167 168ifeq ($(CFG_SCPFW_SCMI_PERF_FAST_CHANNELS),y) 169srcs-$(CFG_SCPFW_MOD_SCMI_PERF) += $(scpfw-path)/$3/$2/src/scmi_perf_fastchannels.c 170endif 171 172endif 173 174cflags-lib-$(CFG_SCPFW_MOD_$4) += -DBUILD_HAS_MOD_$4 175endef 176 177define scpfw-embed-generic-module 178$(eval $(call scpfw-embed-mod,$1,$1,module,$(shell echo $1 | tr a-z A-Z))) 179endef 180 181define scpfw-embed-optee-module 182$(eval $(call scpfw-embed-mod,optee_$1,$1,module/optee,OPTEE_$(shell echo $1 | tr a-z A-Z))) 183endef 184 185define scpfw-embed-product-module 186$(eval $(call scpfw-embed-mod,$1,$1,product/$(scpfw-product)/module,$(shell echo $1 | tr a-z A-Z))) 187endef 188 189$(eval $(call scpfw-embed-generic-module,clock)) 190$(eval $(call scpfw-embed-generic-module,dvfs)) 191$(eval $(call scpfw-embed-generic-module,mock_clock)) 192$(eval $(call scpfw-embed-generic-module,mock_ppu)) 193$(eval $(call scpfw-embed-generic-module,mock_psu)) 194$(eval $(call scpfw-embed-generic-module,msg_smt)) 195$(eval $(call scpfw-embed-generic-module,power_domain)) 196$(eval $(call scpfw-embed-generic-module,psu)) 197$(eval $(call scpfw-embed-generic-module,reg_sensor)) 198$(eval $(call scpfw-embed-generic-module,reset_domain)) 199$(eval $(call scpfw-embed-generic-module,sensor)) 200$(eval $(call scpfw-embed-generic-module,scmi)) 201$(eval $(call scpfw-embed-generic-module,scmi_apcore)) 202$(eval $(call scpfw-embed-generic-module,scmi_clock)) 203$(eval $(call scpfw-embed-generic-module,scmi_perf)) 204$(eval $(call scpfw-embed-generic-module,scmi_power_domain)) 205$(eval $(call scpfw-embed-generic-module,scmi_reset_domain)) 206$(eval $(call scpfw-embed-generic-module,scmi_sensor)) 207$(eval $(call scpfw-embed-generic-module,scmi_voltage_domain)) 208$(eval $(call scpfw-embed-generic-module,system_pll)) 209$(eval $(call scpfw-embed-generic-module,voltage_domain)) 210$(eval $(call scpfw-embed-optee-module,clock)) 211$(eval $(call scpfw-embed-optee-module,console)) 212$(eval $(call scpfw-embed-optee-module,mbx)) 213$(eval $(call scpfw-embed-optee-module,reset)) 214$(eval $(call scpfw-embed-optee-module,smt)) 215 216srcs-$(CFG_SCPFW_MOD_CLOCK) += $(scpfw-path)/module/clock/src/clock_tree_management.c 217srcs-$(CFG_SCPFW_MOD_POWER_DOMAIN) += $(scpfw-path)/module/power_domain/src/power_domain_utils.c 218srcs-$(CFG_SCPFW_MOD_SCMI) += $(scpfw-path)/module/scmi/src/mod_scmi_base.c 219srcs-$(CFG_SCPFW_MOD_SCMI_SENSOR) += $(scpfw-path)/module/scmi_sensor/src/mod_scmi_ext_attrib.c 220srcs-$(CFG_SCPFW_MOD_SENSOR) += $(scpfw-path)/module/sensor/src/sensor_extended.c 221 222# Architecture arch/none/optee requires optee mbx header file 223incdirs_ext-y += $(scpfw-path)/module/optee/mbx/include 224# Some modules require header files from module that are not embedded 225ifneq (,$(filter y, $(CFG_SCPFW_MOD_DVFS) $(CFG_SCPFW_MOD_MOCK_PSU) $(CFG_SCPFW_MOD_SCMI_PERF))) 226incdirs_ext-y += $(scpfw-path)/module/timer/include 227endif 228incdirs_ext-$(CFG_SCPFW_MOD_OPTEE_MBX) += $(scpfw-path)/module/msg_smt/include 229incdirs_ext-$(CFG_SCPFW_MOD_SCMI) += $(scpfw-path)/module/power_domain/include 230 231include core/lib/scmi-server/sub-$(CFG_SCMI_SCPFW_PRODUCT).mk 232