RSE: Use a bit in DCU lock register to identify if reset is required
DCU_en signal has associated corresponding DCU_Lock signal.
It is of RW1S type. Use these bits to identify if a reset is required.
It is assumed that for the regions/domains which will require reset,
their corresponding dcu_en signals will be locked during the initial
boot.
Signed-off-by: Maulik Patel <maulik.patel@arm.com>
Change-Id: Iccac2354bf6c4acf8cb69da890a330dc1deaf2c8
diff --git a/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c b/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c
index 2174521..ccd1beb 100644
--- a/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c
+++ b/target/trusted-firmware-m/platform/arm/rse/common/psa_adac_platform.c
@@ -15,12 +15,14 @@
* TF-M specific crypto_hw.h header
*/
#include "crypto_hw.h"
-
+#include <assert.h>
#include <string.h>
#include <stdbool.h>
#include "rse_debug_after_reset.h"
-
+#include "lcm_drv.h"
+#include "device_definition.h"
#define ROTPK_ANCHOR_ALG PSA_ALG_SHA_512
+#define UINT8_SIZE_IN_BITS 8
void psa_adac_platform_init(void)
{
@@ -73,11 +75,31 @@
return 0;
}
-static bool check_if_debug_requires_reset(uint8_t *permissions_mask,
- size_t mask_len)
+static int check_if_debug_requires_reset(uint8_t *permissions_mask,
+ size_t mask_len,
+ bool *reset_required)
{
- //TODO: To be implemented;
- return true;
+ enum lcm_error_t lcm_err;
+ uint32_t dcu_lock_reg_val[LCM_DCU_WIDTH_IN_BYTES / sizeof(uint32_t)];
+ int i;
+ uint8_t *dcu_lock_status = (uint8_t *)dcu_lock_reg_val;
+
+ assert(mask_len == sizeof(dcu_lock_reg_val));
+ *reset_required = false;
+
+ lcm_err = lcm_dcu_get_locked(&LCM_DEV_S, (uint8_t *)dcu_lock_reg_val);
+ if (lcm_err != LCM_ERROR_NONE) {
+ return -1;
+ }
+
+ for (i = 0; i < mask_len; i++) {
+ if (dcu_lock_status[i] & permissions_mask[i]) {
+ *reset_required = true;
+ break;
+ }
+ }
+
+ return 0;
}
int psa_adac_apply_permissions(uint8_t permissions_mask[16])
@@ -86,7 +108,12 @@
int rc;
bool reset_required;
- reset_required = check_if_debug_requires_reset(permissions_mask, 16);
+ rc = check_if_debug_requires_reset(permissions_mask, 16, &reset_required);
+ if (rc != 0) {
+ PSA_ADAC_LOG_ERR("platform", "psa_adac_to_tfm_apply_permissions "
+ "failed\r\n");
+ return rc;
+ }
if (reset_required) {