1 /* 2 * Copyright 2021 NXP 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 * 6 */ 7 8 #include <assert.h> 9 #include <errno.h> 10 #include <stddef.h> 11 #include <stdint.h> 12 #include <stdio.h> 13 #include <stdlib.h> 14 #include <string.h> 15 16 #include <platform_def.h> 17 #include <common/debug.h> 18 #ifndef NXP_COINED_BB 19 #include <flash_info.h> 20 #include <fspi.h> 21 #include <fspi_api.h> 22 #endif 23 #include <lib/mmio.h> 24 #ifdef NXP_COINED_BB 25 #include <snvs.h> 26 #else 27 #include <xspi_error_codes.h> 28 #endif 29 30 #include <plat_nv_storage.h> 31 32 /*This structure will be a static structure and 33 * will be populated as first step of BL2 booting-up. 34 * fspi_strorage.c . To be located in the fspi driver folder. 35 */ 36 37 static nv_app_data_t nv_app_data; 38 39 int read_nv_app_data(void) 40 { 41 int ret = 0; 42 43 #ifdef NXP_COINED_BB 44 uint8_t *nv_app_data_array = (uint8_t *) &nv_app_data; 45 uint8_t offset = 0U; 46 47 ret = snvs_read_app_data(); 48 do { 49 nv_app_data_array[offset] = snvs_read_app_data_bit(offset); 50 offset++; 51 52 } while (offset < APP_DATA_MAX_OFFSET); 53 snvs_clear_app_data(); 54 #else 55 uintptr_t nv_base_addr = NV_STORAGE_BASE_ADDR; 56 57 ret = fspi_init(NXP_FLEXSPI_ADDR, NXP_FLEXSPI_FLASH_ADDR); 58 59 if (ret != XSPI_SUCCESS) { 60 ERROR("Failed to initialized driver flexspi-nor.\n"); 61 ERROR("exiting warm-reset request.\n"); 62 return -ENODEV; 63 } 64 65 xspi_read(nv_base_addr, 66 (uint32_t *)&nv_app_data, sizeof(nv_app_data_t)); 67 xspi_sector_erase((uint32_t) nv_base_addr, 68 F_SECTOR_ERASE_SZ); 69 #endif 70 return ret; 71 } 72 73 int wr_nv_app_data(int data_offset, 74 uint8_t *data, 75 int data_size) 76 { 77 int ret = 0; 78 #ifdef NXP_COINED_BB 79 #if !TRUSTED_BOARD_BOOT 80 snvs_disable_zeroize_lp_gpr(); 81 #endif 82 /* In case LP SecMon General purpose register, 83 * only 1 bit flags can be saved. 84 */ 85 if ((data_size > 1) || (*data != DEFAULT_SET_VALUE)) { 86 ERROR("Only binary value is allowed to be written.\n"); 87 ERROR("Use flash instead of SNVS GPR as NV location.\n"); 88 return -ENODEV; 89 } 90 snvs_write_app_data_bit(data_offset); 91 #else 92 uint8_t read_val[sizeof(nv_app_data_t)]; 93 uint8_t ready_to_write_val[sizeof(nv_app_data_t)]; 94 uintptr_t nv_base_addr = NV_STORAGE_BASE_ADDR; 95 96 assert((nv_base_addr + data_offset + data_size) <= (nv_base_addr + F_SECTOR_ERASE_SZ)); 97 98 ret = fspi_init(NXP_FLEXSPI_ADDR, NXP_FLEXSPI_FLASH_ADDR); 99 100 if (ret != XSPI_SUCCESS) { 101 ERROR("Failed to initialized driver flexspi-nor.\n"); 102 ERROR("exiting warm-reset request.\n"); 103 return -ENODEV; 104 } 105 106 ret = xspi_read(nv_base_addr + data_offset, (uint32_t *)read_val, data_size); 107 108 memset(ready_to_write_val, READY_TO_WRITE_VALUE, ARRAY_SIZE(ready_to_write_val)); 109 110 if (memcmp(read_val, ready_to_write_val, data_size) == 0) { 111 xspi_write(nv_base_addr + data_offset, data, data_size); 112 } 113 #endif 114 115 return ret; 116 } 117 118 const nv_app_data_t *get_nv_data(void) 119 { 120 return (const nv_app_data_t *) &nv_app_data; 121 } 122