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