fsl_flexram.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*
  2. * Copyright 2017-2021 NXP
  3. * All rights reserved.
  4. *
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #include "fsl_flexram.h"
  9. /*******************************************************************************
  10. * Definitions
  11. ******************************************************************************/
  12. /* Component ID definition, used by tools. */
  13. #ifndef FSL_COMPONENT_ID
  14. #define FSL_COMPONENT_ID "platform.drivers.flexram"
  15. #endif
  16. /*******************************************************************************
  17. * Prototypes
  18. ******************************************************************************/
  19. /*!
  20. * @brief Gets the instance from the base address to be used to gate or ungate the module clock
  21. *
  22. * @param base FLEXRAM base address
  23. *
  24. * @return The FLEXRAM instance
  25. */
  26. static uint32_t FLEXRAM_GetInstance(FLEXRAM_Type *base);
  27. /*******************************************************************************
  28. * Variables
  29. ******************************************************************************/
  30. /*! @brief Pointers to FLEXRAM bases for each instance. */
  31. static FLEXRAM_Type *const s_flexramBases[] = FLEXRAM_BASE_PTRS;
  32. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  33. /*! @brief Pointers to FLEXRAM clocks for each instance. */
  34. static const clock_ip_name_t s_flexramClocks[] = FLEXRAM_CLOCKS;
  35. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  36. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  37. /*! Look-up table to calculate single-bit error bit position for ITCM. */
  38. static const uint8_t ItcmLookUpTable[64] = {
  39. 0xC1, 0x43, 0x9E, 0x83, 0x15, 0x4C, 0x4A, 0x8C, 0x31, 0x1C, 0xA2, 0xE0, 0x51, 0x2C, 0xC2, 0xD0,
  40. 0x19, 0x1A, 0x26, 0xEA, 0x29, 0x94, 0x16, 0x64, 0x37, 0xA4, 0x0D, 0xC4, 0x75, 0x38, 0x4F, 0x58,
  41. 0x46, 0x91, 0x86, 0x61, 0x49, 0x98, 0x89, 0x68, 0x32, 0x34, 0x07, 0xC8, 0x92, 0xA8, 0xA7, 0x54,
  42. 0xA1, 0xD9, 0x25, 0xF8, 0x0E, 0x0B, 0x8A, 0x2A, 0x52, 0x45, 0x13, 0x85, 0x62, 0x70, 0x23, 0xB0};
  43. /*! Look-up table to calculate single-bit error bit position for DTCM. */
  44. static const uint8_t DtcmLookUpTable[32] = {0x61, 0x51, 0x19, 0x45, 0x43, 0x31, 0x29, 0x13, 0x62, 0x52, 0x4A,
  45. 0x46, 0x32, 0x2A, 0x23, 0x1A, 0x2C, 0x64, 0x26, 0x25, 0x34, 0x16,
  46. 0x15, 0x54, 0x0B, 0x58, 0x1C, 0x4C, 0x38, 0x0E, 0x0D, 0x49};
  47. #endif /* FLEXRAM_ECC_ERROR_DETAILED_INFO */
  48. /*******************************************************************************
  49. * Code
  50. ******************************************************************************/
  51. static uint32_t FLEXRAM_GetInstance(FLEXRAM_Type *base)
  52. {
  53. uint32_t instance;
  54. /* Find the instance index from base address mappings. */
  55. for (instance = 0; instance < ARRAY_SIZE(s_flexramBases); instance++)
  56. {
  57. if (s_flexramBases[instance] == base)
  58. {
  59. break;
  60. }
  61. }
  62. assert(instance < ARRAY_SIZE(s_flexramBases));
  63. return instance;
  64. }
  65. /*!
  66. * brief FLEXRAM module initialization function.
  67. *
  68. * param base FLEXRAM base address.
  69. */
  70. void FLEXRAM_Init(FLEXRAM_Type *base)
  71. {
  72. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  73. /* Ungate ENET clock. */
  74. CLOCK_EnableClock(s_flexramClocks[FLEXRAM_GetInstance(base)]);
  75. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  76. /* enable all the interrupt status */
  77. base->INT_STAT_EN |= (uint32_t)kFLEXRAM_InterruptStatusAll;
  78. /* clear all the interrupt status */
  79. base->INT_STATUS |= (uint32_t)kFLEXRAM_InterruptStatusAll;
  80. /* disable all the interrpt */
  81. base->INT_SIG_EN = 0U;
  82. }
  83. /*!
  84. * brief Deinitializes the FLEXRAM.
  85. *
  86. */
  87. void FLEXRAM_Deinit(FLEXRAM_Type *base)
  88. {
  89. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  90. /* Ungate ENET clock. */
  91. CLOCK_DisableClock(s_flexramClocks[FLEXRAM_GetInstance(base)]);
  92. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  93. }
  94. #if (defined(FSL_FEATURE_FLEXRAM_HAS_ECC) && FSL_FEATURE_FLEXRAM_HAS_ECC)
  95. void FLEXRAM_EnableECC(FLEXRAM_Type *base, bool OcramECCEnable, bool TcmECCEnable)
  96. {
  97. if (true == OcramECCEnable)
  98. {
  99. base->FLEXRAM_CTRL |= FLEXRAM_FLEXRAM_CTRL_OCRAM_ECC_EN_MASK;
  100. }
  101. else
  102. {
  103. base->FLEXRAM_CTRL &= ~FLEXRAM_FLEXRAM_CTRL_OCRAM_ECC_EN_MASK;
  104. }
  105. if (true == TcmECCEnable)
  106. {
  107. base->FLEXRAM_CTRL |= FLEXRAM_FLEXRAM_CTRL_TCM_ECC_EN_MASK;
  108. }
  109. else
  110. {
  111. base->FLEXRAM_CTRL &= ~FLEXRAM_FLEXRAM_CTRL_TCM_ECC_EN_MASK;
  112. }
  113. }
  114. void FLEXRAM_GetOcramSingleErroInfo(FLEXRAM_Type *base, flexram_ocram_ecc_single_error_info_t *info)
  115. {
  116. assert(NULL != info);
  117. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  118. info->OcramSingleErrorECCCipher =
  119. (uint8_t)((base->OCRAM_ECC_SINGLE_ERROR_INFO & FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_ECC_MASK) >>
  120. FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_ECC_SHIFT);
  121. info->OcramSingleErrorECCSyndrome =
  122. (uint8_t)((base->OCRAM_ECC_SINGLE_ERROR_INFO & FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_SYN_MASK) >>
  123. FLEXRAM_OCRAM_ECC_SINGLE_ERROR_INFO_OCRAM_ECCS_ERRED_SYN_SHIFT);
  124. #else
  125. info->OcramSingleErrorInfo = base->OCRAM_ECC_SINGLE_ERROR_INFO;
  126. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  127. info->OcramSingleErrorAddr = base->OCRAM_ECC_SINGLE_ERROR_ADDR;
  128. info->OcramSingleErrorDataLSB = base->OCRAM_ECC_SINGLE_ERROR_DATA_LSB;
  129. info->OcramSingleErrorDataMSB = base->OCRAM_ECC_SINGLE_ERROR_DATA_MSB;
  130. }
  131. void FLEXRAM_GetOcramMultiErroInfo(FLEXRAM_Type *base, flexram_ocram_ecc_multi_error_info_t *info)
  132. {
  133. assert(NULL != info);
  134. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  135. info->OcramMultiErrorECCCipher =
  136. (uint8_t)((base->OCRAM_ECC_MULTI_ERROR_INFO & FLEXRAM_OCRAM_ECC_MULTI_ERROR_INFO_OCRAM_ECCM_ERRED_ECC_MASK) >>
  137. FLEXRAM_OCRAM_ECC_MULTI_ERROR_INFO_OCRAM_ECCM_ERRED_ECC_SHIFT);
  138. #else
  139. info->OcramMultiErrorInfo = base->OCRAM_ECC_MULTI_ERROR_INFO;
  140. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  141. info->OcramMultiErrorAddr = base->OCRAM_ECC_MULTI_ERROR_ADDR;
  142. info->OcramMultiErrorDataLSB = base->OCRAM_ECC_MULTI_ERROR_DATA_LSB;
  143. info->OcramMultiErrorDataMSB = base->OCRAM_ECC_MULTI_ERROR_DATA_MSB;
  144. }
  145. void FLEXRAM_GetItcmSingleErroInfo(FLEXRAM_Type *base, flexram_itcm_ecc_single_error_info_t *info)
  146. {
  147. assert(NULL != info);
  148. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  149. /* ECC error corresponding syndrome, which can be used to locate the Error bit using a look-up table. */
  150. uint8_t singleErrorECCSyndrome = 0x00U;
  151. info->ItcmSingleErrorTCMWriteRead =
  152. (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFW_MASK) >>
  153. FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFW_SHIFT);
  154. info->ItcmSingleErrorTCMAccessSize =
  155. (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSIZ_MASK) >>
  156. FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSIZ_SHIFT);
  157. info->ItcmSingleErrorTCMMaster =
  158. (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFMST_MASK) >>
  159. FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFMST_SHIFT);
  160. info->ItcmSingleErrorTCMPrivilege =
  161. (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFPRT_MASK) >>
  162. FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFPRT_SHIFT);
  163. singleErrorECCSyndrome =
  164. (uint8_t)((base->ITCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSYN_MASK) >>
  165. FLEXRAM_ITCM_ECC_SINGLE_ERROR_INFO_ITCM_ECCS_EFSYN_SHIFT);
  166. for (uint8_t i = 0x00U; i < sizeof(ItcmLookUpTable) / sizeof(ItcmLookUpTable[0]); i++)
  167. {
  168. if (singleErrorECCSyndrome == ItcmLookUpTable[i])
  169. {
  170. info->ItcmSingleErrorBitPostion = i;
  171. break;
  172. }
  173. }
  174. #else
  175. info->ItcmSingleErrorInfo = base->ITCM_ECC_SINGLE_ERROR_INFO;
  176. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  177. info->ItcmSingleErrorAddr = base->ITCM_ECC_SINGLE_ERROR_ADDR;
  178. info->ItcmSingleErrorDataLSB = base->ITCM_ECC_SINGLE_ERROR_DATA_LSB;
  179. info->ItcmSingleErrorDataMSB = base->ITCM_ECC_SINGLE_ERROR_DATA_MSB;
  180. }
  181. void FLEXRAM_GetItcmMultiErroInfo(FLEXRAM_Type *base, flexram_itcm_ecc_multi_error_info_t *info)
  182. {
  183. assert(NULL != info);
  184. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  185. info->ItcmMultiErrorTCMWriteRead =
  186. (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFW_MASK) >>
  187. FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFW_SHIFT);
  188. info->ItcmMultiErrorTCMAccessSize =
  189. (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSIZ_MASK) >>
  190. FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSIZ_SHIFT);
  191. info->ItcmMultiErrorTCMMaster =
  192. (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFMST_MASK) >>
  193. FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFMST_SHIFT);
  194. info->ItcmMultiErrorTCMPrivilege =
  195. (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFPRT_MASK) >>
  196. FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFPRT_SHIFT);
  197. info->ItcmMultiErrorECCSyndrome =
  198. (uint8_t)((base->ITCM_ECC_MULTI_ERROR_INFO & FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSYN_MASK) >>
  199. FLEXRAM_ITCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSYN_SHIFT);
  200. #else
  201. info->ItcmMultiErrorInfo = base->ITCM_ECC_MULTI_ERROR_INFO;
  202. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  203. info->ItcmMultiErrorAddr = base->ITCM_ECC_MULTI_ERROR_ADDR;
  204. info->ItcmMultiErrorDataLSB = base->ITCM_ECC_MULTI_ERROR_DATA_LSB;
  205. info->ItcmMultiErrorDataMSB = base->ITCM_ECC_MULTI_ERROR_DATA_MSB;
  206. }
  207. void FLEXRAM_GetDtcmSingleErroInfo(FLEXRAM_Type *base, flexram_dtcm_ecc_single_error_info_t *info, uint8_t bank)
  208. {
  209. assert(NULL != info);
  210. assert((0x00U == bank) || (0x01U == bank));
  211. if (0x00U == bank)
  212. {
  213. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  214. /* ECC error corresponding syndrome, which can be used to locate the Error bit using a look-up table. */
  215. uint8_t singleErrorECCSyndrome = 0x00U;
  216. info->DtcmSingleErrorTCMWriteRead =
  217. (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFW_MASK) >>
  218. FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFW_SHIFT);
  219. info->DtcmSingleErrorTCMAccessSize =
  220. (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSIZ_MASK) >>
  221. FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSIZ_SHIFT);
  222. info->DtcmSingleErrorTCMMaster =
  223. (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFMST_MASK) >>
  224. FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFMST_SHIFT);
  225. info->DtcmSingleErrorTCMPrivilege =
  226. (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFPRT_MASK) >>
  227. FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFPRT_SHIFT);
  228. singleErrorECCSyndrome =
  229. (uint8_t)((base->D0TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSYN_MASK) >>
  230. FLEXRAM_D0TCM_ECC_SINGLE_ERROR_INFO_D0TCM_ECCS_EFSYN_SHIFT);
  231. for (uint8_t i = 0x00U; i < sizeof(ItcmLookUpTable) / sizeof(ItcmLookUpTable[0]); i++)
  232. {
  233. if (singleErrorECCSyndrome == ItcmLookUpTable[i])
  234. {
  235. info->DtcmSingleErrorBitPostion = i;
  236. break;
  237. }
  238. }
  239. #else
  240. info->DtcmSingleErrorInfo = base->D0TCM_ECC_SINGLE_ERROR_INFO;
  241. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  242. info->DtcmSingleErrorAddr = base->D0TCM_ECC_SINGLE_ERROR_ADDR;
  243. info->DtcmSingleErrorData = base->D0TCM_ECC_SINGLE_ERROR_DATA;
  244. }
  245. else
  246. {
  247. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  248. /* ECC error corresponding syndrome, which can be used to locate the Error bit using a look-up table. */
  249. uint8_t singleErrorECCSyndrome = 0x00U;
  250. info->DtcmSingleErrorTCMWriteRead =
  251. (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFW_MASK) >>
  252. FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFW_SHIFT);
  253. info->DtcmSingleErrorTCMAccessSize =
  254. (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSIZ_MASK) >>
  255. FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSIZ_SHIFT);
  256. info->DtcmSingleErrorTCMMaster =
  257. (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFMST_MASK) >>
  258. FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFMST_SHIFT);
  259. info->DtcmSingleErrorTCMPrivilege =
  260. (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFPRT_MASK) >>
  261. FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFPRT_SHIFT);
  262. singleErrorECCSyndrome =
  263. (uint8_t)((base->D1TCM_ECC_SINGLE_ERROR_INFO & FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSYN_MASK) >>
  264. FLEXRAM_D1TCM_ECC_SINGLE_ERROR_INFO_D1TCM_ECCS_EFSYN_SHIFT);
  265. for (uint8_t i = 0x00U; i < sizeof(DtcmLookUpTable) / sizeof(DtcmLookUpTable[0]); i++)
  266. {
  267. if (singleErrorECCSyndrome == DtcmLookUpTable[i])
  268. {
  269. info->DtcmSingleErrorBitPostion = i;
  270. break;
  271. }
  272. }
  273. #else
  274. info->DtcmSingleErrorInfo = base->D1TCM_ECC_SINGLE_ERROR_INFO;
  275. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  276. info->DtcmSingleErrorAddr = base->D1TCM_ECC_SINGLE_ERROR_ADDR;
  277. info->DtcmSingleErrorData = base->D1TCM_ECC_SINGLE_ERROR_DATA;
  278. }
  279. }
  280. void FLEXRAM_GetDtcmMultiErroInfo(FLEXRAM_Type *base, flexram_dtcm_ecc_multi_error_info_t *info, uint8_t bank)
  281. {
  282. assert(NULL != info);
  283. assert((0x00U == bank) || (0x01U == bank));
  284. if (0x00U == bank)
  285. {
  286. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  287. info->DtcmMultiErrorTCMWriteRead =
  288. (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFW_MASK) >>
  289. FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFW_SHIFT);
  290. info->DtcmMultiErrorTCMAccessSize =
  291. (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSIZ_MASK) >>
  292. FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSIZ_SHIFT);
  293. info->DtcmMultiErrorTCMMaster =
  294. (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFMST_MASK) >>
  295. FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFMST_SHIFT);
  296. info->DtcmMultiErrorTCMPrivilege =
  297. (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFPRT_MASK) >>
  298. FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFPRT_SHIFT);
  299. info->DtcmMultiErrorECCSyndrome =
  300. (uint8_t)((base->D0TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSYN_MASK) >>
  301. FLEXRAM_D0TCM_ECC_MULTI_ERROR_INFO_D0TCM_ECCS_EFSYN_SHIFT);
  302. #else
  303. info->DtcmMultiErrorInfo = base->D0TCM_ECC_MULTI_ERROR_INFO;
  304. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  305. info->DtcmMultiErrorAddr = base->D0TCM_ECC_MULTI_ERROR_ADDR;
  306. info->DtcmMultiErrorData = base->D0TCM_ECC_MULTI_ERROR_DATA;
  307. }
  308. else
  309. {
  310. #if defined(FLEXRAM_ECC_ERROR_DETAILED_INFO) && FLEXRAM_ECC_ERROR_DETAILED_INFO
  311. info->DtcmMultiErrorTCMWriteRead =
  312. (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFW_MASK) >>
  313. FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFW_SHIFT);
  314. info->DtcmMultiErrorTCMAccessSize =
  315. (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSIZ_MASK) >>
  316. FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFSIZ_SHIFT);
  317. info->DtcmMultiErrorTCMMaster =
  318. (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFMST_MASK) >>
  319. FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFMST_SHIFT);
  320. info->DtcmMultiErrorTCMPrivilege =
  321. (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFPRT_MASK) >>
  322. FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFPRT_SHIFT);
  323. info->DtcmMultiErrorECCSyndrome =
  324. (uint8_t)((base->D1TCM_ECC_MULTI_ERROR_INFO & FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_ITCM_ECCS_EFSYN_MASK) >>
  325. FLEXRAM_D1TCM_ECC_MULTI_ERROR_INFO_D1TCM_ECCS_EFSYN_SHIFT);
  326. #else
  327. info->DtcmMultiErrorInfo = base->D1TCM_ECC_MULTI_ERROR_INFO;
  328. #endif /*FLEXRAM_ECC_ERROR_DETAILED_INFO*/
  329. info->DtcmMultiErrorAddr = base->D1TCM_ECC_MULTI_ERROR_ADDR;
  330. info->DtcmMultiErrorData = base->D1TCM_ECC_MULTI_ERROR_DATA;
  331. }
  332. }
  333. #endif /* FSL_FEATURE_FLEXRAM_HAS_ECC */