summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/user-guide.md9
-rw-r--r--plat/arm/css/common/css_common.mk8
-rw-r--r--plat/arm/css/common/css_scp_bootloader.c18
3 files changed, 35 insertions, 0 deletions
diff --git a/docs/user-guide.md b/docs/user-guide.md
index f10a6f39..00feacc5 100644
--- a/docs/user-guide.md
+++ b/docs/user-guide.md
@@ -330,6 +330,15 @@ performed.
For a better understanding of these options, the ARM development platform memory
map is explained in the [Firmware Design].
+#### ARM CSS platform specific build options
+
+* `CSS_DETECT_PRE_1_7_0_SCP`: Boolean flag to detect SCP version
+ incompatibility. Version 1.7.0 of the SCP firmware made a non-backwards
+ compatible change to the MTL protocol, used for AP/SCP communication.
+ Trusted Firmware no longer supports earlier SCP versions. If this option is
+ set to 1 then Trusted Firmware will detect if an earlier version is in use.
+ Default is 1.
+
### Creating a Firmware Image Package
diff --git a/plat/arm/css/common/css_common.mk b/plat/arm/css/common/css_common.mk
index edbfe1e4..1b0404b7 100644
--- a/plat/arm/css/common/css_common.mk
+++ b/plat/arm/css/common/css_common.mk
@@ -53,3 +53,11 @@ ifneq (${RESET_TO_BL31},0)
endif
NEED_BL30 := yes
+
+# Enable option to detect whether the SCP ROM firmware in use predates version
+# 1.7.0 and therefore, is incompatible.
+CSS_DETECT_PRE_1_7_0_SCP := 1
+
+# Process CSS_DETECT_PRE_1_7_0_SCP flag
+$(eval $(call assert_boolean,CSS_DETECT_PRE_1_7_0_SCP))
+$(eval $(call add_define,CSS_DETECT_PRE_1_7_0_SCP))
diff --git a/plat/arm/css/common/css_scp_bootloader.c b/plat/arm/css/common/css_scp_bootloader.c
index c6d63f29..6cf1667c 100644
--- a/plat/arm/css/common/css_scp_bootloader.c
+++ b/plat/arm/css/common/css_scp_bootloader.c
@@ -148,6 +148,24 @@ int scp_bootloader_transfer(void *image, unsigned int image_size)
cmd_info_payload->checksum = checksum;
scp_boot_message_send(sizeof(*cmd_info_payload));
+#if CSS_DETECT_PRE_1_7_0_SCP
+ {
+ const uint32_t deprecated_scp_nack_cmd = 0x404;
+ uint32_t mhu_status;
+
+ VERBOSE("Detecting SCP version incompatibility\n");
+
+ mhu_status = mhu_secure_message_wait();
+ if (mhu_status == deprecated_scp_nack_cmd) {
+ ERROR("Detected an incompatible version of the SCP firmware.\n");
+ ERROR("Only versions from v1.7.0 onwards are supported.\n");
+ ERROR("Please update the SCP firmware.\n");
+ return -1;
+ }
+
+ VERBOSE("SCP version looks OK\n");
+ }
+#endif /* CSS_DETECT_PRE_1_7_0_SCP */
response = scp_boot_message_wait(sizeof(response));
scp_boot_message_end();