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) {