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 858518b6a2ce0a2208475caa11e5f5302bbca1aa Author: Naveen Kaje <[email protected]> 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/drivers/flash/enc_flash/src/enc_flash.c | 6 +++++ hw/mcu/dialog/da1469x/src/hal_flash.c | 9 +++++++- sys/config/src/config_store.c | 5 +++++ sys/log/full/src/log.c | 7 ++++++ 7 files changed, 77 insertions(+), 1 deletion(-) diff --git a/hw/drivers/crypto/crypto_da1469x/src/crypto_da1469x.c b/hw/drivers/crypto/crypto_da1469x/src/crypto_da1469x.c index f8d55b6..c64dcd5 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_wtf_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..4fe1f08 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_wtf_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..fc8bf60 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, cwtfd_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_wtf_done - g_tt.crypto_wtf, + g_tt.crypto_mutex_rel - g_tt.crypto_wtf_done); + } } /* Key is securely DMA transferred from OTP user data key slot */ diff --git a/hw/drivers/flash/enc_flash/src/enc_flash.c b/hw/drivers/flash/enc_flash/src/enc_flash.c index d2ac9af..257187d 100644 --- a/hw/drivers/flash/enc_flash/src/enc_flash.c +++ b/hw/drivers/flash/enc_flash/src/enc_flash.c @@ -48,6 +48,8 @@ const struct hal_flash_funcs enc_flash_funcs = { .hff_init = enc_flash_init, }; +extern int g_log_walk_ctr; +extern int g_save_one_ctr; /* * Read first all the data in to provided memory area, then apply the * cipher -> text conversion. @@ -64,6 +66,10 @@ enc_flash_read(const struct hal_flash *h_dev, uint32_t addr, void *buf, h_dev = dev->efd_hwdev; + if (g_log_walk_ctr > 0) + g_log_walk_ctr++; + if(g_save_one_ctr > 0) + g_save_one_ctr++; rc = h_dev->hf_itf->hff_read(h_dev, addr, buf, len); if (rc) { return rc; diff --git a/hw/mcu/dialog/da1469x/src/hal_flash.c b/hw/mcu/dialog/da1469x/src/hal_flash.c index 5d19908..3045687 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 { @@ -346,12 +348,16 @@ 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; + int ret; + 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. */ if (da1469x_hff_in_flash_addr_space(src) == false) { - return da1469x_qspi_write(dev, address, src, num_bytes); + ret = da1469x_qspi_write(dev, address, src, num_bytes); + g_tt.hff_write = false; + return ret; } while (num_bytes) { @@ -373,6 +379,7 @@ da1469x_hff_write(const struct hal_flash *dev, uint32_t address, num_bytes -= chunk_len; } + g_tt.hff_write = false; return 0; } diff --git a/sys/config/src/config_store.c b/sys/config/src/config_store.c index 07b94d7..d488d90 100644 --- a/sys/config/src/config_store.c +++ b/sys/config/src/config_store.c @@ -24,6 +24,7 @@ #include "config/config.h" #include "config/config_store.h" #include "config_priv.h" +#include "console/console.h" struct conf_dup_check_arg { const char *name; @@ -212,6 +213,7 @@ conf_dup_check_cb(char *name, char *val, void *cb_arg) /* * Append a single value to persisted config. Don't store duplicate value. */ +int g_save_one_ctr; int conf_save_one(const char *name, char *value) { @@ -239,7 +241,10 @@ conf_save_one(const char *name, char *value) goto out; } cs = conf_save_dst; + g_save_one_ctr = 1; rc = cs->cs_itf->csi_save(cs, name, value); + console_printf("g_save_one_ctr %d\n", g_save_one_ctr); + g_save_one_ctr = 0; out: conf_unlock(); return rc; diff --git a/sys/log/full/src/log.c b/sys/log/full/src/log.c index 473618e..3b77d2b 100644 --- a/sys/log/full/src/log.c +++ b/sys/log/full/src/log.c @@ -37,6 +37,8 @@ #include "shell/shell.h" #endif +#include "console/console.h" + struct log_module_entry { int16_t id; const char *name; @@ -893,6 +895,8 @@ log_walk_body_fn(struct log *log, struct log_offset *log_offset, const void *dpt return 0; } +int g_log_walk_ctr; + int log_walk_body(struct log *log, log_walk_body_func_t walk_body_func, struct log_offset *log_offset) @@ -904,7 +908,10 @@ log_walk_body(struct log *log, log_walk_body_func_t walk_body_func, int rc; log_offset->lo_arg = &lwba; + g_log_walk_ctr = 1; rc = log->l_log->log_walk(log, log_walk_body_fn, log_offset); + console_printf("g_log_walk_ctr %d\n", g_log_walk_ctr); + g_log_walk_ctr = 0; log_offset->lo_arg = lwba.arg; return rc;
