1 /*
2  * Copyright 2019-2020 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #ifndef _FSL_XECC_H_
10 #define _FSL_XECC_H_
11 
12 #include "fsl_common.h"
13 
14 /*!
15  * @addtogroup xecc
16  * @{
17  */
18 
19 /******************************************************************************
20  * Definitions.
21  *****************************************************************************/
22 
23 /*! @name Driver version */
24 /*@{*/
25 /*! @brief Driver version 2.0.0. */
26 #define FSL_XECC_DRIVER_VERSION (MAKE_VERSION(2U, 0U, 0U))
27 /*@}*/
28 
29 /*!
30  * @brief XECC interrupt configuration structure, , xecc_interrupt_enable_t.
31  *
32  * This structure contains the settings for all of the XECC interrupt configurations.
33  */
34 enum
35 {
36     kXECC_SingleErrorInterruptEnable = XECC_ERR_SIG_EN_SINGLE_ERR_SIG_EN_MASK, /*!< Single bit error interrupt enable*/
37     kXECC_MultiErrorInterruptEnable  = XECC_ERR_SIG_EN_MULTI_ERR_SIG_EN_MASK, /*!< Multiple bit error interrupt enable*/
38 
39     kXECC_AllInterruptsEnable =
40         XECC_ERR_SIG_EN_SINGLE_ERR_SIG_EN_MASK | XECC_ERR_SIG_EN_MULTI_ERR_SIG_EN_MASK, /*!< all interrupts enable */
41 };
42 
43 /*!
44  * @brief XECC interrupt status configuration structure, xecc_interrupt_status_enable_t.
45  *
46  * This structure contains the settings for all of the XECC interrupt status configurations.
47  */
48 enum
49 {
50     kXECC_SingleErrorInterruptStatusEnable =
51         XECC_ERR_STAT_EN_SINGLE_ERR_STAT_EN_MASK, /*!< Single bit error interrupt status enable*/
52     kXECC_MultiErrorInterruptStatusEnable =
53         XECC_ERR_STAT_EN_MULIT_ERR_STAT_EN_MASK, /*!< Multiple bits error interrupt status enable*/
54 
55     kXECC_AllInterruptsStatusEnable = XECC_ERR_STAT_EN_SINGLE_ERR_STAT_EN_MASK |
56                                       XECC_ERR_STAT_EN_MULIT_ERR_STAT_EN_MASK, /*!< all interrupts enable */
57 };
58 
59 /*!
60  * @brief XECC status flags, xecc_interrupt_status_t.
61  *
62  * This provides constants for the XECC status flags for use in the XECC functions.
63  */
64 enum
65 {
66     kXECC_SingleErrorInterruptFlag =
67         XECC_ERR_STATUS_SINGLE_ERR_MASK, /*!< Single bit error interrupt happens on read data*/
68     kXECC_MultiErrorInterruptFlag =
69         XECC_ERR_STATUS_MULTI_ERR_MASK, /*!< Multiple bits error interrupt happens on read data*/
70 
71     kXECC_AllInterruptsFlag =
72         XECC_ERR_STATUS_SINGLE_ERR_MASK | XECC_ERR_STATUS_MULTI_ERR_MASK, /*!< all interrupts happens on read data*/
73 };
74 
75 /*! @brief XECC user configuration.*/
76 typedef struct _xecc_config
77 {
78     bool enableXECC;     /*!< Enable the XECC function. */
79     bool enableWriteECC; /*!< Enable write ECC function. */
80     bool enableReadECC;  /*!< Enable read ECC function. */
81     bool enableSwap;     /*!< Enable swap function. */
82 
83     /*!< The minimum ECC region range is 4k, so the lower 12 bits of this register must be 0.*/
84     uint32_t Region0BaseAddress; /*!< ECC region 0 base address. */
85     uint32_t Region0EndAddress;  /*!< ECC region 0 end address. */
86     uint32_t Region1BaseAddress; /*!< ECC region 1 base address. */
87     uint32_t Region1EndAddress;  /*!< ECC region 1 end address. */
88     uint32_t Region2BaseAddress; /*!< ECC region 2 base address. */
89     uint32_t Region2EndAddress;  /*!< ECC region 2 end address. */
90     uint32_t Region3BaseAddress; /*!< ECC region 3 base address. */
91     uint32_t Region3EndAddress;  /*!< ECC region 3 end address. */
92 } xecc_config_t;
93 
94 /*! @brief XECC single error information, including single error address, ECC code, error data, error bit
95  * position and error bit field */
96 typedef struct _xecc_single_error_info
97 {
98     uint32_t singleErrorAddress;  /*!< Single error address */
99     uint32_t singleErrorData;     /*!< Single error read data */
100     uint32_t singleErrorEccCode;  /*!< Single error ECC code */
101     uint32_t singleErrorBitPos;   /*!< Single error bit postion */
102     uint32_t singleErrorBitField; /*!< Single error bit field */
103 } xecc_single_error_info_t;
104 
105 /*! @brief XECC multiple error information, including multiple error address, ECC code, error data and error bit field
106  */
107 typedef struct _xecc_multi_error_info
108 {
109     uint32_t multiErrorAddress;  /*!< Multiple error address */
110     uint32_t multiErrorData;     /*!< Multiple error read data */
111     uint32_t multiErrorEccCode;  /*!< Multiple error ECC code */
112     uint32_t multiErrorBitField; /*!< Single error bit field */
113 } xecc_multi_error_info_t;
114 
115 /*******************************************************************************
116  * APIs
117  ******************************************************************************/
118 
119 #if defined(__cplusplus)
120 extern "C" {
121 #endif
122 
123 /*!
124  * @name Initialization and deinitialization
125  * @{
126  */
127 
128 /*!
129  * @brief XECC module initialization function.
130  *
131  * @param base XECC base address.
132  * @param config pointer to the XECC configuration structure.
133  */
134 void XECC_Init(XECC_Type *base, const xecc_config_t *config);
135 
136 /*!
137  * @brief Deinitializes the XECC.
138  *
139  * @param base XECC base address.
140  */
141 void XECC_Deinit(XECC_Type *base);
142 
143 /*!
144  * @brief Sets the XECC configuration structure to default values.
145  *
146  * @param config pointer to the XECC configuration structure.
147  */
148 void XECC_GetDefaultConfig(xecc_config_t *config);
149 
150 /* @} */
151 
152 /*!
153  * @name Status
154  * @{
155  */
156 /*!
157  * @brief Gets XECC status flags.
158  *
159  * @param base XECC peripheral base address.
160  * @return XECC status flags.
161  */
XECC_GetStatusFlags(XECC_Type * base)162 static inline uint32_t XECC_GetStatusFlags(XECC_Type *base)
163 {
164     return base->ERR_STATUS & (uint32_t)kXECC_AllInterruptsFlag;
165 }
166 
167 /*!
168  * @brief XECC module clear interrupt status.
169  *
170  * @param base XECC base address.
171  * @param mask status to clear from xecc_interrupt_status_t.
172  */
XECC_ClearStatusFlags(XECC_Type * base,uint32_t mask)173 static inline void XECC_ClearStatusFlags(XECC_Type *base, uint32_t mask)
174 {
175     base->ERR_STATUS = mask;
176 }
177 
178 /*!
179  * @brief XECC module enable interrupt status.
180  *
181  * @param base XECC base address.
182  * @param mask status to enable from xecc_interrupt_status_enable_t.
183  */
XECC_EnableInterruptStatus(XECC_Type * base,uint32_t mask)184 static inline void XECC_EnableInterruptStatus(XECC_Type *base, uint32_t mask)
185 {
186     base->ERR_STAT_EN |= mask;
187 }
188 
189 /*!
190  * @brief XECC module disable interrupt status.
191  *
192  * @param base XECC base address.
193  * @param mask status to disable from xecc_interrupt_status_enable_t.
194  */
XECC_DisableInterruptStatus(XECC_Type * base,uint32_t mask)195 static inline void XECC_DisableInterruptStatus(XECC_Type *base, uint32_t mask)
196 {
197     base->ERR_STAT_EN &= ~mask;
198 }
199 
200 /* @} */
201 
202 /*!
203  * @name Interrupts
204  * @{
205  */
206 
207 /*!
208  * @brief XECC module enable interrupt.
209  *
210  * @param base XECC base address.
211  * @param mask The interrupts to enable from xecc_interrupt_enable_t.
212  */
XECC_EnableInterrupts(XECC_Type * base,uint32_t mask)213 static inline void XECC_EnableInterrupts(XECC_Type *base, uint32_t mask)
214 {
215     base->ERR_SIG_EN |= mask;
216 }
217 
218 /*!
219  * @brief XECC module disable interrupt.
220  *
221  * @param base XECC base address.
222  * @param mask The interrupts to disable from xecc_interrupt_enable_t.
223  */
XECC_DisableInterrupts(XECC_Type * base,uint32_t mask)224 static inline void XECC_DisableInterrupts(XECC_Type *base, uint32_t mask)
225 {
226     base->ERR_SIG_EN &= ~mask;
227 }
228 /* @} */
229 
230 /*!
231  * @name functional
232  * @{
233  */
234 /*!
235  * @brief XECC module write ECC function enable.
236  *
237  * @param base XECC base address.
238  * @param enable enable or disable.
239  */
XECC_WriteECCEnable(XECC_Type * base,bool enable)240 static inline void XECC_WriteECCEnable(XECC_Type *base, bool enable)
241 {
242     if (enable)
243     {
244         base->ECC_CTRL |= XECC_ECC_CTRL_WECC_EN(1);
245     }
246     else
247     {
248         base->ECC_CTRL |= XECC_ECC_CTRL_WECC_EN(0);
249     }
250 }
251 
252 /*!
253  * @brief XECC module read ECC function enable.
254  *
255  * @param base XECC base address.
256  * @param enable enable or disable.
257  */
XECC_ReadECCEnable(XECC_Type * base,bool enable)258 static inline void XECC_ReadECCEnable(XECC_Type *base, bool enable)
259 {
260     if (enable)
261     {
262         base->ECC_CTRL |= XECC_ECC_CTRL_RECC_EN(1);
263     }
264     else
265     {
266         base->ECC_CTRL |= XECC_ECC_CTRL_RECC_EN(0);
267     }
268 }
269 
270 /*!
271  * @brief XECC module swap data enable.
272  *
273  * @param base XECC base address.
274  * @param enable enable or disable.
275  */
XECC_SwapECCEnable(XECC_Type * base,bool enable)276 static inline void XECC_SwapECCEnable(XECC_Type *base, bool enable)
277 {
278     if (enable)
279     {
280         base->ECC_CTRL |= XECC_ECC_CTRL_SWAP_EN(1);
281     }
282     else
283     {
284         base->ECC_CTRL |= XECC_ECC_CTRL_SWAP_EN(0);
285     }
286 }
287 
288 /*!
289  * @brief XECC module error injection.
290  *
291  * @param base XECC base address.
292  * @param errordata error data.
293  * @param erroreccdata ecc code.
294  * @retval kStatus_Success.
295  */
296 status_t XECC_ErrorInjection(XECC_Type *base, uint32_t errordata, uint8_t erroreccdata);
297 
298 /*!
299  * @brief XECC module get single error information.
300  *
301  * @param base XECC base address.
302  * @param info single error information.
303  */
304 void XECC_GetSingleErrorInfo(XECC_Type *base, xecc_single_error_info_t *info);
305 
306 /*!
307  * @brief XECC module get multiple error information.
308  *
309  * @param base XECC base address.
310  * @param info multiple error information.
311  */
312 void XECC_GetMultiErrorInfo(XECC_Type *base, xecc_multi_error_info_t *info);
313 
314 /*! @}*/
315 
316 #if defined(__cplusplus)
317 }
318 #endif
319 
320 /*! @}*/
321 
322 #endif
323