You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by na...@apache.org on 2020/09/02 16:33:48 UTC

[mynewt-core] 01/01: Profile Enc Flash Writes

This is an automated email from the ASF dual-hosted git repository.

naveenkaje pushed a commit to branch ProfileEncFlashWrites
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 30e4624ff5c36231b0864ee14066bc57cb7f8be1
Author: Naveen Kaje <na...@juul.com>
AuthorDate: Wed Sep 2 06:48:48 2020 -0500

    Profile Enc Flash Writes
---
 .../crypto/crypto_da1469x/src/crypto_da1469x.c     |  8 +++++++
 hw/drivers/crypto/include/crypto/crypto.h          | 17 ++++++++++++++
 .../flash/enc_flash/ef_da1469x/src/hw_enc_flash.c  | 26 ++++++++++++++++++++++
 hw/mcu/dialog/da1469x/src/hal_flash.c              |  4 ++++
 4 files changed, 55 insertions(+)

diff --git a/hw/drivers/crypto/crypto_da1469x/src/crypto_da1469x.c b/hw/drivers/crypto/crypto_da1469x/src/crypto_da1469x.c
index f8d55b6..88371ec 100644
--- a/hw/drivers/crypto/crypto_da1469x/src/crypto_da1469x.c
+++ b/hw/drivers/crypto/crypto_da1469x/src/crypto_da1469x.c
@@ -26,6 +26,7 @@
 #include <mcu/da1469x_otp.h>
 #include <mcu/da1469x_dma.h>
 
+extern struct time_tracker g_tt;
 static struct os_mutex gmtx;
 
 #define VALID_AES_KEYLEN(x) (((x) == 128) || ((x) == 192) || ((x) == 256))
@@ -113,7 +114,9 @@ da1469x_crypto_op(struct crypto_dev *crypto, uint8_t op, uint16_t algo,
         memcpy(iv_save, &inbuf[len-AES_BLOCK_LEN], AES_BLOCK_LEN);
     }
 
+    g_tt.crypto_op_start = os_cputime_get32();
     os_mutex_pend(&gmtx, OS_TIMEOUT_NEVER);
+    g_tt.crypto_mutex_pend = os_cputime_get32();
     da1469x_clock_amba_enable(CRG_TOP_CLK_AMBA_REG_AES_CLK_ENABLE_Msk);
 
     /* enable AES / disable HASH */
@@ -185,7 +188,9 @@ da1469x_crypto_op(struct crypto_dev *crypto, uint8_t op, uint16_t algo,
     }
 
     if (OTP_ADDRESS_RANGE_USER_DATA_KEYS(key)) {
+        g_tt.crypto_dma_tx_begin = os_cputime_get32();
         do_dma_key_tx(key, keylen);
+        g_tt.crypto_dma_tx_end = os_cputime_get32();
     } else {
         keyreg = (uint32_t *)&AES_HASH->CRYPTO_KEYS_START;
         keyp32 = (uint32_t *)key;
@@ -226,6 +231,7 @@ da1469x_crypto_op(struct crypto_dev *crypto, uint8_t op, uint16_t algo,
     /* start encryption/decryption */
     AES_HASH->CRYPTO_START_REG |= AES_HASH_CRYPTO_START_REG_CRYPTO_START_Msk;
 
+    g_tt.crypto_wtf = os_cputime_get32();
     /*
      * Wait to finish.
      *
@@ -234,8 +240,10 @@ da1469x_crypto_op(struct crypto_dev *crypto, uint8_t op, uint16_t algo,
     while (!(AES_HASH->CRYPTO_STATUS_REG &
              AES_HASH_CRYPTO_STATUS_REG_CRYPTO_INACTIVE_Msk));
 
+    g_tt.crypto_tx_done = os_cputime_get32();
     da1469x_clock_amba_disable(CRG_TOP_CLK_AMBA_REG_AES_CLK_ENABLE_Msk);
     os_mutex_release(&gmtx);
+    g_tt.crypto_mutex_rel = os_cputime_get32();
 
     /*
      * Update crypto framework internals
diff --git a/hw/drivers/crypto/include/crypto/crypto.h b/hw/drivers/crypto/include/crypto/crypto.h
index ad93a00..d548ff5 100644
--- a/hw/drivers/crypto/include/crypto/crypto.h
+++ b/hw/drivers/crypto/include/crypto/crypto.h
@@ -99,6 +99,23 @@ struct crypto_iovec {
     size_t iov_len;
 };
 
+struct time_tracker {
+    uint32_t start;
+    uint32_t ef_sem_pend;
+    uint32_t co_done;
+    uint32_t end;
+
+    uint32_t crypto_op_start;
+    uint32_t crypto_mutex_pend;
+    uint32_t crypto_dma_tx_begin;
+    uint32_t crypto_dma_tx_end;
+    uint32_t crypto_wtf;
+    uint32_t crypto_tx_done;
+    uint32_t crypto_mutex_rel;
+
+    bool hff_write;
+};
+
 /**
  * Encrypt a buffer using custom parameters
  *
diff --git a/hw/drivers/flash/enc_flash/ef_da1469x/src/hw_enc_flash.c b/hw/drivers/flash/enc_flash/ef_da1469x/src/hw_enc_flash.c
index 44a0c15..4a0bd76 100644
--- a/hw/drivers/flash/enc_flash/ef_da1469x/src/hw_enc_flash.c
+++ b/hw/drivers/flash/enc_flash/ef_da1469x/src/hw_enc_flash.c
@@ -29,10 +29,13 @@
 #include <mcu/da1469x_dma.h>
 #include <mcu/da1469x_otp.h>
 #include <crypto/crypto.h>
+#include "console/console.h"
 
 #define EDEV_TO_DA1469X(dev)   (struct eflash_da1469x_dev *)dev
 #define DA1469X_AES_KEYSIZE 256
 
+struct time_tracker g_tt;
+
 void
 enc_flash_crypt_arch(struct enc_flash_dev *edev, uint32_t blk_addr,
                      const uint8_t *src, uint8_t *tgt, int off, int cnt)
@@ -43,15 +46,38 @@ enc_flash_crypt_arch(struct enc_flash_dev *edev, uint32_t blk_addr,
     uint8_t blk[ENC_FLASH_BLK] = {0};
     const void *key = (void *)MCU_OTPM_BASE + OTP_SEGMENT_USER_DATA_KEYS +
                       (AES_MAX_KEY_LEN * (MYNEWT_VAL(USER_AES_SLOT)));
+    uint32_t diff;
+
+    g_tt.start = os_cputime_get32();
 
     ctr[0] = (uint32_t) ((blk_addr - h_dev->hf_base_addr) / ENC_FLASH_BLK);
 
     memcpy(blk + off, src, cnt);
     os_sem_pend(&dev->ef_sem, OS_TIMEOUT_NEVER);
+    g_tt.ef_sem_pend = os_cputime_get32();
     crypto_encrypt_aes_ctr(dev->ecd_crypto, key, DA1469X_AES_KEYSIZE, ctr,
                             blk, blk, AES_BLOCK_LEN);
+    g_tt.co_done = os_cputime_get32();
     os_sem_release(&dev->ef_sem);
+    g_tt.end = os_cputime_get32();
     memcpy(tgt, blk + off, cnt);
+    diff = g_tt.end - g_tt.start;
+    if (diff > 1000) {
+        console_printf("#enc: hff_write %d, cnt %d total %ld, efsp_s %ld, cod_efsp %ld, end_cod %ld\n\
+            cmp_cos %ld, cdtb_cmp %ld, cdte_cdtb %ld, cwtf_cdte %ld, ctd_cwtf %ld, cmr_ctd %ld\n",
+            g_tt.hff_write,
+            cnt,
+            diff,
+            g_tt.ef_sem_pend - g_tt.start,
+            g_tt.co_done - g_tt.ef_sem_pend,
+            g_tt.end - g_tt.co_done,
+            g_tt.crypto_mutex_pend - g_tt.crypto_op_start,
+            g_tt.crypto_dma_tx_begin - g_tt.crypto_mutex_pend,
+            g_tt.crypto_dma_tx_end - g_tt.crypto_dma_tx_begin,
+            g_tt.crypto_wtf - g_tt.crypto_dma_tx_end,
+            g_tt.crypto_tx_done - g_tt.crypto_wtf,
+            g_tt.crypto_mutex_rel - g_tt.crypto_tx_done);
+    }
 }
 
 /* Key is securely DMA transferred from OTP user data key slot */
diff --git a/hw/mcu/dialog/da1469x/src/hal_flash.c b/hw/mcu/dialog/da1469x/src/hal_flash.c
index 5d19908..b3c5fd9 100644
--- a/hw/mcu/dialog/da1469x/src/hal_flash.c
+++ b/hw/mcu/dialog/da1469x/src/hal_flash.c
@@ -25,7 +25,9 @@
 #include "hal/hal_flash_int.h"
 #include "mcu/mcu.h"
 #include <stdbool.h>
+#include "crypto/crypto.h"
 
+extern struct time_tracker g_tt;
 #define CODE_QSPI_INLINE    __attribute__((always_inline)) inline
 
 union da1469x_qspi_data_reg {
@@ -347,6 +349,7 @@ da1469x_hff_write(const struct hal_flash *dev, uint32_t address,
     uint8_t buf[ MYNEWT_VAL(QSPI_FLASH_READ_BUFFER_SIZE) ];
     uint32_t chunk_len;
 
+    g_tt.hff_write = true;
     /* We can write directly if 'src' is outside flash memory, otherwise we
      * need to read data to RAM first and then write to flash.
      */
@@ -373,6 +376,7 @@ da1469x_hff_write(const struct hal_flash *dev, uint32_t address,
         num_bytes -= chunk_len;
     }
 
+    g_tt.hff_write = false;
     return 0;
 }