Detect SCP version incompatibility
authorSandrine Bailleux <sandrine.bailleux@arm.com>
Mon, 13 Apr 2015 10:47:48 +0000 (11:47 +0100)
committerDan Handley <dan.handley@arm.com>
Tue, 28 Apr 2015 18:50:57 +0000 (19:50 +0100)
There has been a breaking change in the communication protocols used
between the AP cores and the SCP on CSS based platforms like Juno.
This means both the AP Trusted Firmware and SCP firmware must be
updated at the same time.

In case the user forgets to update the SCP ROM firmware, this patch
detects when it still uses the previous version of the communication
protocol. It will then output a comprehensive error message that helps
trouble-shoot the issue.

Change-Id: I7baf8f05ec0b7d8df25e0ee53df61fe7be0207c2

docs/user-guide.md
plat/arm/css/common/css_common.mk
plat/arm/css/common/css_scp_bootloader.c

index f10a6f392564d0282a50d37471c2a7bcad3eb0aa..00feacc5d5fea73cdc5d1da9b53eeb22f6664813 100644 (file)
@@ -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
 
index edbfe1e409c551ab8b19667cd86630cec3d2b4c4..1b0404b761e6259512ad8174ac8d79ed7b7e365b 100644 (file)
@@ -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))
index c6d63f2958f1c5f5af195c98ad21b6b8fa83da3d..6cf1667c3e818d4054941a105aa2b3eed0b7c4a4 100644 (file)
@@ -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();