1 /*
2  * Copyright 2024 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_xspi_nor_flash.h"
10 #include "fsl_nor_flash.h"
11 
12 /*******************************************************************************
13  * Definitions
14  ******************************************************************************/
15 #define XSPI_INSTR_CMD_IDX   (0U)
16 #define XSPI_INSTR_RADDR_IDX (1U)
17 #define XSPI_INSTR_CADDR_IDX (2U)
18 #define XSPI_INSTR_READ_IDX  (3U)
19 #define XSPI_INSTR_WRITE_IDX (4U)
20 #define XSPI_INSTR_MODE_IDX  (5U)
21 #define XSPI_INSTR_MODE2_IDX (6U)
22 #define XSPI_INSTR_MODE4_IDX (7U)
23 
24 const xspi_lut_instr_t g_xspiCommonInstr[2][8] = {
25     {kXSPI_Command_SDR, kXSPI_Command_RADDR_SDR, kXSPI_Command_CADDR_SDR, kXSPI_Command_READ_SDR,
26      kXSPI_Command_WRITE_SDR, kXSPI_Command_MODE_SDR, kXSPI_Command_MODE2_SDR, kXSPI_Command_MODE4_SDR},
27     {kXSPI_Command_DDR, kXSPI_Command_RADDR_DDR, kXSPI_Command_CADDR_DDR, kXSPI_Command_READ_DDR,
28      kXSPI_Command_WRITE_DDR, kXSPI_Command_MODE_DDR, kXSPI_Command_MODE2_DDR, kXSPI_Command_MODE4_DDR}};
29 
30 /*******************************************************************************
31  * Prototypes
32  ******************************************************************************/
33 typedef struct _lut_seq_entry
34 {
35     uint32_t insrOperandPair1;
36     uint32_t insrOperandPair2;
37     uint32_t insrOperandPair3;
38     uint32_t insrOperandPair4;
39     uint32_t insrOperandPair5;
40 } lut_seq_entry_t;
41 
42 typedef struct _lut_seq_instr_operand
43 {
44     uint16_t operand : 8U;
45     uint16_t padNum : 2U;
46     uint16_t instr : 6U;
47 } lut_seq_instr_operand_t;
48 /*******************************************************************************
49  * Variables
50  ******************************************************************************/
51 
52 XSPI_Type *curXSPIBase = NULL;
53 xspi_mem_nor_handle_t xspiMemNorHandle;
54 
55 static uint32_t s_socXspiAmbaBase[] = XSPI_AMBA_BASES;
56 
57 lut_seq_entry_t g_xspiLut[16] = {0UL};
58 /*******************************************************************************
59  * Code
60  ******************************************************************************/
61 
XSPI_NOR_ReadSFDP(uint32_t address,uint32_t * buffer,uint32_t bytes)62 static status_t XSPI_NOR_ReadSFDP(uint32_t address, uint32_t *buffer, uint32_t bytes)
63 {
64     xspi_transfer_t flashXfer;
65     status_t status = kStatus_InvalidArgument;
66 
67     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
68 
69     flashXfer.deviceAddress = s_socXspiAmbaBase[xspiInstanceId] + address;
70     flashXfer.cmdType       = kXSPI_Read;
71     flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_READ_SFDP;
72     flashXfer.data          = (uint32_t *)(void *)buffer;
73     flashXfer.dataSize      = bytes;
74     flashXfer.targetGroup   = xspiMemNorHandle.selectedTg; /* Target group selection is from application. */
75 
76     status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
77 
78     return status;
79 }
80 
XSPI_NOR_ProbeNorFlashSfdpHeader(void)81 static status_t XSPI_NOR_ProbeNorFlashSfdpHeader(void)
82 {
83     uint8_t sfdpLutIndex = 0U;
84     xspi_device_config_t tmpNorFlashConfig;
85     sfdp_protocol_type_t tmpProtocol = kSFDP_Protocol_1s1s1s;
86     /* Data strobe used for 4s-4d-4d and 8D-8D-8D. */
87     xspi_device_ddr_config_t tmpDeviceDDRConfig;
88 
89     struct _probedInfo
90     {
91         sfdp_protocol_type_t protocolMode;
92         uint8_t addrWidth;
93     } probedInfo[12] = {
94         {kSFDP_Protocol_1s1s1s, 24U}, {kSFDP_Protocol_2s2s2s, 24U}, {kSFDP_Protocol_4s4s4s, 24U},
95         {kSFDP_Protocol_4s4d4d, 24U}, {kSFDP_Protocol_8d8d8d, 32U}, {kSFDP_Protocol_8d8d8d, 32U},
96         {kSFDP_Protocol_8d8d8d, 24U}, {kSFDP_Protocol_8d8d8d, 24U}, {kSFDP_Protocol_8s8s8s, 32U},
97         {kSFDP_Protocol_8s8s8s, 32U}, {kSFDP_Protocol_8s8s8s, 24U}, {kSFDP_Protocol_8s8s8s, 24U},
98     };
99     /* Read SFDP command can be used with device supported mode if (1s-1s-1s), (2s-2s-2s),
100           (4s-4s-4s), (4s-4d-4d) and (8D-8D-8D). For the (8D-8D-8D) mode, the instruction 5Ah and 50 MHz requirements
101           remain the same, while 24 or 32 address bit, and a variable number of wait states may be used. */
102     lut_seq_entry_t sfdp_lut[12] = {
103         /* Read SFDP in 1s-1s-1s mode. */
104         {
105             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x5A, kXSPI_Command_RADDR_SDR, kXSPI_1PAD, 24),
106             XSPI_LUT_SEQ(kXSPI_Command_DUMMY_SDR, kXSPI_1PAD, 8, kXSPI_Command_READ_SDR, kXSPI_1PAD, 0xFF),
107             0UL,
108             0UL,
109             0UL,
110         },
111 
112         /* Read SFDP in 2s-2s-2s mode. */
113         {
114             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_2PAD, 0x5A, kXSPI_Command_RADDR_SDR, kXSPI_2PAD, 24),
115             XSPI_LUT_SEQ(kXSPI_Command_DUMMY_SDR, kXSPI_2PAD, 8, kXSPI_Command_READ_SDR, kXSPI_2PAD, 0xFF),
116             0UL,
117             0UL,
118             0UL,
119         },
120         /* Read SFDP in 4s-4s-4s mode. */
121         {
122             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_4PAD, 0x5A, kXSPI_Command_RADDR_SDR, kXSPI_4PAD, 24),
123             XSPI_LUT_SEQ(kXSPI_Command_DUMMY_SDR, kXSPI_4PAD, 8, kXSPI_Command_READ_SDR, kXSPI_4PAD, 0xFF),
124             0UL,
125             0UL,
126             0UL,
127         },
128         /* Read SFDP in 4s-4d-4d mode. */
129         {
130             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_4PAD, 0x5A, kXSPI_Command_RADDR_DDR, kXSPI_4PAD, 24),
131             XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_4PAD, 0xFF, 0U, 0U, 0U),
132             0UL,
133             0UL,
134             0UL,
135         },
136         /* Read SFDP in 8D-8D-8D mode, with extension is the inverse of the command and 32 bit address */
137         {
138             XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x5AU, kXSPI_Command_DDR, kXSPI_8PAD, 0xA5U),
139             XSPI_LUT_SEQ(kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 32U, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
140             XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0xFFU, 0U, 0U, 0U),
141             0UL,
142             0UL,
143         },
144         /* Read SFDP in 8D-8D-8D mode, with same extension cmd and 32 bit address */
145         {
146             XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x5A, kXSPI_Command_DDR, kXSPI_8PAD, 0x5A),
147             XSPI_LUT_SEQ(kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 32, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
148             XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0xFF, 0U, 0U, 0U),
149             0UL,
150             0UL,
151         },
152         /* Read SFDP in 8D-8D-8D mode, with same extension cmd and 24 bit address */
153         {
154             XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x5A, kXSPI_Command_DDR, kXSPI_8PAD, 0x5A),
155             XSPI_LUT_SEQ(kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 24, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
156             XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0xFF, 0U, 0U, 0U),
157             0UL,
158             0UL,
159         },
160 
161         /* Read SFDP in 8D-8D-8D mode, with extension is the inverse of the command and 24 bit address */
162         {
163             XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x5A, kXSPI_Command_DDR, kXSPI_8PAD, 0xA5),
164             XSPI_LUT_SEQ(kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 24, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
165             XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0xFF, 0U, 0U, 0U),
166             0UL,
167             0UL,
168         },
169         /* Read SFDP in 8S-8S-8S mode, with extension is the inverse of the command and 32 bit address */
170         {
171             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_8PAD, 0x5AU, kXSPI_Command_SDR, kXSPI_8PAD, 0xA5U),
172             XSPI_LUT_SEQ(kXSPI_Command_RADDR_SDR, kXSPI_8PAD, 32U, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
173             XSPI_LUT_SEQ(kXSPI_Command_READ_SDR, kXSPI_8PAD, 0xFFU, 0U, 0U, 0U),
174             0UL,
175             0UL,
176         },
177         /* Read SFDP in 8S-8S-8S mode, with same extension cmd and 32 bit address */
178         {
179             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_8PAD, 0x5A, kXSPI_Command_SDR, kXSPI_8PAD, 0x5A),
180             XSPI_LUT_SEQ(kXSPI_Command_RADDR_SDR, kXSPI_8PAD, 32, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
181             XSPI_LUT_SEQ(kXSPI_Command_READ_SDR, kXSPI_8PAD, 0xFF, 0U, 0U, 0U),
182             0UL,
183             0UL,
184         },
185         /* Read SFDP in 8S-8S-8S mode, with same extension cmd and 24 bit address */
186         {
187             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_8PAD, 0x5A, kXSPI_Command_SDR, kXSPI_8PAD, 0x5A),
188             XSPI_LUT_SEQ(kXSPI_Command_RADDR_SDR, kXSPI_8PAD, 24, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
189             XSPI_LUT_SEQ(kXSPI_Command_READ_SDR, kXSPI_8PAD, 0xFF, 0U, 0U, 0U),
190             0UL,
191             0UL,
192         },
193 
194         /* Read SFDP in 8S-8S-8S mode, with extension is the inverse of the command and 24 bit address */
195         {
196             XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_8PAD, 0x5A, kXSPI_Command_SDR, kXSPI_8PAD, 0xA5),
197             XSPI_LUT_SEQ(kXSPI_Command_RADDR_SDR, kXSPI_8PAD, 24, kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 20U),
198             XSPI_LUT_SEQ(kXSPI_Command_READ_SDR, kXSPI_8PAD, 0xFF, 0U, 0U, 0U),
199             0UL,
200             0UL,
201         },
202     };
203 
204     for (sfdpLutIndex = 0U; sfdpLutIndex < ARRAY_SIZE(sfdp_lut); sfdpLutIndex++)
205     {
206         tmpNorFlashConfig.addrMode                                                = kXSPI_DeviceByteAddressable;
207         tmpNorFlashConfig.columnAddrWidth                                         = 0U;
208         tmpNorFlashConfig.CSHoldTime                                              = 3U;
209         tmpNorFlashConfig.CSSetupTime                                             = 3U;
210         tmpNorFlashConfig.deviceInterface                                         = kXSPI_StrandardExtendedSPI;
211         tmpNorFlashConfig.enableCASInterleaving                                   = false;
212         tmpNorFlashConfig.enableCknPad                                            = false;
213         tmpNorFlashConfig.interfaceSettings.strandardExtendedSPISettings.pageSize = 256U;
214         tmpNorFlashConfig.ptrDeviceDdrConfig                                      = NULL;
215         tmpNorFlashConfig.ptrDeviceRegInfo                                        = NULL;
216         tmpNorFlashConfig.sampleClkConfig.dllConfig.dllMode                       = kXSPI_AutoUpdateMode;
217         tmpNorFlashConfig.sampleClkConfig.dllConfig.useRefValue                   = true;
218         tmpNorFlashConfig.sampleClkConfig.enableDQSLatency                        = false;
219         tmpNorFlashConfig.sampleClkConfig.sampleClkSource                         = kXSPI_SampleClkFromDqsPadLoopback;
220         tmpNorFlashConfig.deviceSize[0]                                           = 0x40;
221         tmpNorFlashConfig.deviceSize[1]                                           = 0x40;
222         tmpNorFlashConfig.xspiRootClk = xspiMemNorHandle.clkFreq; /* Set as 50MHz to read SFDP. */
223 
224         tmpProtocol = probedInfo[sfdpLutIndex].protocolMode;
225 
226         if (((uint32_t)tmpProtocol & 0x100UL) != 0UL)
227         {
228             tmpDeviceDDRConfig.enableDdr = true;
229         }
230         else
231         {
232             tmpDeviceDDRConfig.enableDdr = false;
233         }
234 
235         if (sfdpLutIndex >= 3U)
236         {
237             tmpDeviceDDRConfig.enableByteSwapInOctalMode      = false;
238             tmpDeviceDDRConfig.ddrDataAlignedClk              = kXSPI_DDRDataAlignedWith2xInternalRefClk;
239             tmpNorFlashConfig.sampleClkConfig.sampleClkSource = kXSPI_SampleClkFromExternalDQS;
240             tmpNorFlashConfig.ptrDeviceDdrConfig              = &tmpDeviceDDRConfig;
241         }
242 
243         XSPI_SetDeviceConfig(curXSPIBase, &tmpNorFlashConfig);
244         XSPI_EnableModule(curXSPIBase, true);
245 
246         XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_READ_SFDP * 5U, &(sfdp_lut[sfdpLutIndex].insrOperandPair1), 5U);
247 
248         sfdp_ret_type_t ret;
249         ret = SFDP_ReadSFDPHeader(xspiMemNorHandle.ptrSfdpHandle, XSPI_NOR_ReadSFDP);
250 
251         if ((ret == kSFDP_RET_Success) && (sfdpLutIndex < ARRAY_SIZE(sfdp_lut)))
252         {
253             /* successfully to read SFDP header from external device. */
254 
255             /* recode current protocol type and address width. */
256             xspiMemNorHandle.curProtocolType = probedInfo[sfdpLutIndex].protocolMode;
257             xspiMemNorHandle.addrSize        = probedInfo[sfdpLutIndex].addrWidth;
258             break;
259         }
260         else if ((sfdpLutIndex == (ARRAY_SIZE(sfdp_lut) - 1U)) && (ret != kSFDP_RET_Success))
261         {
262             return kStatus_Fail;
263         }
264         else
265         {
266         }
267     }
268 
269     return kStatus_Success;
270 }
271 
XSPI_NOR_Enter4ByteMode(void)272 static status_t XSPI_NOR_Enter4ByteMode(void)
273 {
274     status_t status                             = kStatus_Success;
275     sfdp_4_byte_addr_enter_method_t enterMethod = SFDP_Get4ByteAddrModeEnterMethod(xspiMemNorHandle.ptrSfdpHandle);
276     uint32_t xspiInstanceId                     = XSPI_GetInstance(curXSPIBase);
277     xspi_transfer_t flashXfer;
278 
279     switch (enterMethod)
280     {
281         case kSFDP_4ByteAddrEnterMethod0:
282         {
283             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
284             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
285                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0xB7U, kXSPI_Command_STOP, kXSPI_1PAD, 0U);
286 
287             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
288                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
289 
290             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
291             flashXfer.cmdType         = kXSPI_Command;
292             flashXfer.data            = NULL;
293             flashXfer.dataSize        = 0U;
294             flashXfer.lockArbitration = false;
295             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
296             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
297 
298             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
299             if (status != kStatus_Success)
300             {
301                 return status;
302             }
303             break;
304         }
305         case kSFDP_4ByteAddrEnterMethod1:
306         {
307             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
308             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
309                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x06U, kXSPI_Command_SDR, kXSPI_1PAD, 0xB7U);
310 
311             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
312                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
313 
314             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
315             flashXfer.cmdType         = kXSPI_Command;
316             flashXfer.data            = NULL;
317             flashXfer.dataSize        = 0U;
318             flashXfer.lockArbitration = false;
319             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
320             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
321 
322             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
323             break;
324         }
325         case kSFDP_4ByteAddrEnterMethod2:
326         {
327             break;
328         }
329         case kSFDP_4ByteAddrEnterMethod3:
330         {
331             break;
332         }
333         case kSFDP_4ByteAddrEnterMethod4:
334         {
335             break;
336         }
337         case kSFDP_4ByteAddrEnterMethod5:
338         {
339             /* The flash device support dedicated 4-byte address instruction set, no actions to do. */
340             break;
341         }
342         case kSFDP_4ByteAddrEnterMethod6:
343         {
344             /* Always operats in 4-byte address mode, no action to do. */
345             break;
346         }
347         default:
348         {
349             assert(false);
350         }
351     }
352 
353     return status;
354 }
355 
XSPI_NOR_SetNorFlashDeviceConfig(xspi_memory_config_t * ptrUserInputMemConfig)356 static status_t XSPI_NOR_SetNorFlashDeviceConfig(xspi_memory_config_t *ptrUserInputMemConfig)
357 {
358     xspi_device_ddr_config_t externalDeviceDdrConfig;
359     xspi_device_status_reg_info_t norFlashStatusRegInfo;
360     xspi_device_config_t externNorFlashConfig;
361     status_t status;
362 
363     externalDeviceDdrConfig.enableDdr                 = SFDP_CheckDTRSupported(xspiMemNorHandle.ptrSfdpHandle);
364     externalDeviceDdrConfig.enableByteSwapInOctalMode = SFDP_CheckByteSwapInOctalMode(xspiMemNorHandle.ptrSfdpHandle);
365     externalDeviceDdrConfig.ddrDataAlignedClk         = kXSPI_DDRDataAlignedWith2xInternalRefClk;
366 
367     sfdp_wip_bit_info_t wipInfo;
368     SFDP_GetBusyBitInfo(xspiMemNorHandle.ptrSfdpHandle, (sfdp_flash_pad_num_t)ptrUserInputMemConfig->numPadUsed,
369                         &wipInfo);
370 
371     norFlashStatusRegInfo.wipLocation           = wipInfo.location;
372     norFlashStatusRegInfo.value1Expired         = wipInfo.polarity;
373     norFlashStatusRegInfo.upperHalfWordSelected = wipInfo.upperHalfWordSelected;
374 
375     (void)memset((void *)(uint32_t)&externNorFlashConfig, 0UL, sizeof(externNorFlashConfig));
376 
377     externNorFlashConfig.ptrDeviceRegInfo   = &norFlashStatusRegInfo;
378     externNorFlashConfig.deviceSize[0]      = SFDP_GetFlashDensity(xspiMemNorHandle.ptrSfdpHandle);
379     externNorFlashConfig.deviceSize[1]      = externNorFlashConfig.deviceSize[0];
380     externNorFlashConfig.ptrDeviceDdrConfig = &externalDeviceDdrConfig;
381     externNorFlashConfig.enableCknPad       = ptrUserInputMemConfig->enableClknPad;
382     externNorFlashConfig.deviceInterface    = kXSPI_StrandardExtendedSPI;
383     externNorFlashConfig.interfaceSettings.strandardExtendedSPISettings.pageSize =
384         SFDP_GetPageSize(xspiMemNorHandle.ptrSfdpHandle);
385     externNorFlashConfig.addrMode              = ptrUserInputMemConfig->addrMode;
386     externNorFlashConfig.columnAddrWidth       = 0U;
387     externNorFlashConfig.CSHoldTime            = 3U;
388     externNorFlashConfig.CSSetupTime           = 3U;
389     externNorFlashConfig.enableCASInterleaving = false;
390     externNorFlashConfig.sampleClkConfig       = ptrUserInputMemConfig->sampleClkConfig;
391     externNorFlashConfig.xspiRootClk           = ptrUserInputMemConfig->xspiRootClk;
392 
393     status = XSPI_SetDeviceConfig(curXSPIBase, &externNorFlashConfig);
394 
395     xspiMemNorHandle.memSizeInByte         = externNorFlashConfig.deviceSize[0] * 1024UL;
396     xspiMemNorHandle.norFlashStatusRegInfo = norFlashStatusRegInfo;
397 
398     return status;
399 }
400 
XSPI_NOR_FillPageProgramLutSeq(void)401 static void XSPI_NOR_FillPageProgramLutSeq(void)
402 {
403     xspi_lut_instr_t cmdInstr;
404     xspi_lut_instr_t raddrInstr;
405     xspi_lut_instr_t writeInstr;
406 
407     sfdp_flash_pad_num_t instrPad;
408     uint8_t instrDDR;
409     sfdp_flash_pad_num_t addrPad;
410     uint8_t addrDDR;
411     sfdp_flash_pad_num_t dataPad;
412     uint8_t dataDDR;
413 
414     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
415 
416     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
417     raddrInstr = g_xspiCommonInstr[addrDDR][XSPI_INSTR_RADDR_IDX];
418     writeInstr = g_xspiCommonInstr[dataDDR][XSPI_INSTR_WRITE_IDX];
419 
420     sfdp_page_program_cmd_info_t pageProgramCmdInfo;
421 
422     SFDP_GetPageProgramCmdInfo(xspiMemNorHandle.ptrSfdpHandle, xspiMemNorHandle.curProtocolType, &pageProgramCmdInfo);
423 
424     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
425     {
426         uint8_t cmdInstrExtension =
427             SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, pageProgramCmdInfo.instruction);
428 
429         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM].insrOperandPair1 =
430             XSPI_LUT_SEQ(cmdInstr, (xspi_pad_t)instrPad, pageProgramCmdInfo.instruction, cmdInstr, (xspi_pad_t)instrPad,
431                          cmdInstrExtension);
432         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM].insrOperandPair2 = XSPI_LUT_SEQ(
433             raddrInstr, (xspi_pad_t)addrPad, xspiMemNorHandle.addrSize, writeInstr, (xspi_pad_t)dataPad, 0x8U);
434     }
435     else
436     {
437         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM].insrOperandPair1 =
438             XSPI_LUT_SEQ(cmdInstr, (xspi_pad_t)instrPad, pageProgramCmdInfo.instruction, raddrInstr,
439                          (xspi_pad_t)addrPad, xspiMemNorHandle.addrSize);
440         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM].insrOperandPair2 =
441             XSPI_LUT_SEQ(writeInstr, (xspi_pad_t)dataPad, 0x8U, 0x0U, 0x0U, 0x0U);
442     }
443 }
444 
XSPI_NOR_FillSectorEraseLutSeq(void)445 static void XSPI_NOR_FillSectorEraseLutSeq(void)
446 {
447     xspi_lut_instr_t cmdInstr;
448     xspi_lut_instr_t raddrInstr;
449     sfdp_flash_pad_num_t instrPad;
450     uint8_t instrDDR;
451     sfdp_flash_pad_num_t addrPad;
452     uint8_t addrDDR;
453     sfdp_flash_pad_num_t dataPad;
454     uint8_t dataDDR;
455 
456     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
457 
458     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
459     raddrInstr = g_xspiCommonInstr[addrDDR][XSPI_INSTR_RADDR_IDX];
460 
461     sfdp_erase_cmd_info_t sectorEraseCmdInfo;
462 
463     if (SFDP_GetSectorEraseCmdInfo(xspiMemNorHandle.ptrSfdpHandle, kSFDP_EraseCmdType1, &sectorEraseCmdInfo) ==
464         kSFDP_RET_Success)
465     {
466         if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
467         {
468             uint8_t cmdInstrExtension =
469                 SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, sectorEraseCmdInfo.instruction);
470 
471             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASESECTOR].insrOperandPair1 =
472                 XSPI_LUT_SEQ(cmdInstr, instrPad, sectorEraseCmdInfo.instruction, cmdInstr, instrPad, cmdInstrExtension);
473             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASESECTOR].insrOperandPair2 =
474                 XSPI_LUT_SEQ(raddrInstr, addrPad, xspiMemNorHandle.addrSize, kXSPI_Command_STOP, instrPad, 0U);
475         }
476         else
477         {
478             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASESECTOR].insrOperandPair1 = XSPI_LUT_SEQ(
479                 cmdInstr, instrPad, sectorEraseCmdInfo.instruction, raddrInstr, addrPad, xspiMemNorHandle.addrSize);
480             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASESECTOR].insrOperandPair2 =
481                 XSPI_LUT_SEQ(kXSPI_Command_STOP, instrPad, 0x0U, 0x0U, 0x0U, 0x0U);
482         }
483     }
484 
485     xspiMemNorHandle.sectorSizeInByte = sectorEraseCmdInfo.eraseSize;
486     (void)dataPad;
487     (void)dataDDR;
488 }
489 
XSPI_NOR_FillBlockEraseLutSeq(void)490 static void XSPI_NOR_FillBlockEraseLutSeq(void)
491 {
492     xspi_lut_instr_t cmdInstr;
493     xspi_lut_instr_t raddrInstr;
494     sfdp_flash_pad_num_t instrPad;
495     uint8_t instrDDR;
496     sfdp_flash_pad_num_t addrPad;
497     uint8_t addrDDR;
498     sfdp_flash_pad_num_t dataPad;
499     uint8_t dataDDR;
500 
501     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
502 
503     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
504     raddrInstr = g_xspiCommonInstr[addrDDR][XSPI_INSTR_RADDR_IDX];
505 
506     sfdp_erase_cmd_info_t sectorEraseCmdInfo;
507 
508     if (SFDP_GetSectorEraseCmdInfo(xspiMemNorHandle.ptrSfdpHandle, kSFDP_EraseCmdType2, &sectorEraseCmdInfo) ==
509         kSFDP_RET_Success)
510     {
511         if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
512         {
513             uint8_t cmdInstrExtension =
514                 SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, sectorEraseCmdInfo.instruction);
515             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK].insrOperandPair1 =
516                 XSPI_LUT_SEQ(cmdInstr, instrPad, sectorEraseCmdInfo.instruction, cmdInstr, instrPad, cmdInstrExtension);
517             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK].insrOperandPair2 =
518                 XSPI_LUT_SEQ(raddrInstr, addrPad, xspiMemNorHandle.addrSize, kXSPI_Command_STOP, instrPad, 0U);
519         }
520         else
521         {
522             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK].insrOperandPair1 = XSPI_LUT_SEQ(
523                 cmdInstr, instrPad, sectorEraseCmdInfo.instruction, raddrInstr, addrPad, xspiMemNorHandle.addrSize);
524 
525             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK].insrOperandPair2 =
526                 XSPI_LUT_SEQ(kXSPI_Command_STOP, instrPad, 0x0U, 0x0U, 0x0U, 0x0U);
527         }
528     }
529 
530     (void)dataPad;
531     (void)dataDDR;
532 }
533 
XSPI_NOR_FillWriteEnableLutSeq(void)534 static void XSPI_NOR_FillWriteEnableLutSeq(void)
535 {
536     xspi_lut_instr_t cmdInstr;
537     sfdp_flash_pad_num_t instrPad;
538     uint8_t instrDDR;
539     sfdp_flash_pad_num_t addrPad;
540     uint8_t addrDDR;
541     sfdp_flash_pad_num_t dataPad;
542     uint8_t dataDDR;
543 
544     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
545     (void)addrPad;
546     (void)addrDDR;
547     (void)dataPad;
548     (void)dataDDR;
549 
550     cmdInstr = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
551 
552     uint8_t wrenInstr = 0x06U;
553     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
554     {
555         uint8_t wrenInstrExtension = SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, wrenInstr);
556 
557         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_WRITEENABLE].insrOperandPair1 =
558             XSPI_LUT_SEQ(cmdInstr, instrPad, wrenInstr, cmdInstr, instrPad, wrenInstrExtension);
559         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_WRITEENABLE].insrOperandPair2 =
560             XSPI_LUT_SEQ(kXSPI_Command_STOP, instrPad, 0x0U, 0x0U, 0x0U, 0x0U);
561     }
562     else
563     {
564         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_WRITEENABLE].insrOperandPair1 =
565             XSPI_LUT_SEQ(cmdInstr, instrPad, wrenInstr, kXSPI_Command_STOP, instrPad, 0x0U);
566     }
567 }
568 
XSPI_NOR_FillReadIdLutSeq(void)569 static void XSPI_NOR_FillReadIdLutSeq(void)
570 {
571     uint8_t readIdInstr = 0x9F;
572     xspi_lut_instr_t cmdInstr;
573     xspi_lut_instr_t readInstr;
574     xspi_lut_instr_t raddrInstr;
575 
576     sfdp_flash_pad_num_t instrPad;
577     uint8_t instrDDR;
578     sfdp_flash_pad_num_t addrPad;
579     uint8_t addrDDR;
580     sfdp_flash_pad_num_t dataPad;
581     uint8_t dataDDR;
582 
583     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
584 
585     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
586     readInstr  = g_xspiCommonInstr[dataDDR][XSPI_INSTR_READ_IDX];
587     raddrInstr = g_xspiCommonInstr[addrDDR][XSPI_INSTR_RADDR_IDX];
588 
589     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
590     {
591         uint8_t instrExtension = SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, readIdInstr);
592         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READID].insrOperandPair1 =
593             XSPI_LUT_SEQ(cmdInstr, instrPad, readIdInstr, cmdInstr, instrPad, instrExtension);
594         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READID].insrOperandPair2 =
595             XSPI_LUT_SEQ(raddrInstr, addrPad, xspiMemNorHandle.addrSize, kXSPI_Command_DUMMY_SDR, instrPad, 0x4U);
596         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READID].insrOperandPair3 =
597             XSPI_LUT_SEQ(readInstr, dataPad, 0x08U, kXSPI_Command_STOP, kXSPI_1PAD, 0x0U);
598     }
599     else
600     {
601         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READID].insrOperandPair1 =
602             XSPI_LUT_SEQ(cmdInstr, instrPad, readIdInstr, raddrInstr, addrPad, xspiMemNorHandle.addrSize);
603         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READID].insrOperandPair2 =
604             XSPI_LUT_SEQ(kXSPI_Command_DUMMY_SDR, instrPad, 0x4U, readInstr, dataPad, 0x08U);
605         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READID].insrOperandPair3 =
606             XSPI_LUT_SEQ(kXSPI_Command_STOP, kXSPI_1PAD, 0x0U, 0x0U, 0x0U, 0x0U);
607     }
608 }
609 
XSPI_NOR_FillReadDataLutSeq(void)610 static void XSPI_NOR_FillReadDataLutSeq(void)
611 {
612     xspi_lut_instr_t cmdInstr;
613     xspi_lut_instr_t readInstr;
614     xspi_lut_instr_t raddrInstr;
615 
616     sfdp_flash_pad_num_t instrPad;
617     uint8_t instrDDR;
618     sfdp_flash_pad_num_t addrPad;
619     uint8_t addrDDR;
620     sfdp_flash_pad_num_t dataPad;
621     uint8_t dataDDR;
622 
623     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
624 
625     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
626     readInstr  = g_xspiCommonInstr[dataDDR][XSPI_INSTR_READ_IDX];
627     raddrInstr = g_xspiCommonInstr[addrDDR][XSPI_INSTR_RADDR_IDX];
628 
629     sfdp_read_cmd_info_t readCmdInfo;
630     uint32_t clkFreq = xspiMemNorHandle.clkFreq;
631 
632     if (SFDP_CheckDTRSupported(xspiMemNorHandle.ptrSfdpHandle) == true)
633     {
634         clkFreq /= 2UL;
635     }
636 
637     SFDP_GetReadCmdInfo(xspiMemNorHandle.ptrSfdpHandle, xspiMemNorHandle.curProtocolType, clkFreq, &readCmdInfo);
638 
639     /* @TODO: In case of dummy cycle is updated in ROM, read register to check current dummy cycle value. */
640 
641     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
642     {
643         uint8_t instrExtension = SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, readCmdInfo.instruction);
644 
645         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READ].insrOperandPair1 =
646             XSPI_LUT_SEQ(cmdInstr, instrPad, readCmdInfo.instruction, cmdInstr, instrPad, instrExtension);
647         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READ].insrOperandPair2 = XSPI_LUT_SEQ(
648             raddrInstr, addrPad, xspiMemNorHandle.addrSize, kXSPI_Command_DUMMY_SDR, instrPad, readCmdInfo.dummyCycle);
649         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READ].insrOperandPair3 =
650             XSPI_LUT_SEQ(readInstr, dataPad, 0x8U, kXSPI_Command_STOP, instrPad, 0U);
651     }
652     else
653     {
654         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READ].insrOperandPair1 =
655             XSPI_LUT_SEQ(cmdInstr, instrPad, readCmdInfo.instruction, raddrInstr, addrPad, xspiMemNorHandle.addrSize);
656         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READ].insrOperandPair2 =
657             XSPI_LUT_SEQ(kXSPI_Command_DUMMY_SDR, instrPad, readCmdInfo.dummyCycle, readInstr, dataPad, 0x8U);
658         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READ].insrOperandPair3 =
659             XSPI_LUT_SEQ(kXSPI_Command_STOP, instrPad, 0U, 0U, 0U, 0U);
660     }
661 }
662 
XSPI_NOR_FillChipEraseLutSeq(void)663 static void XSPI_NOR_FillChipEraseLutSeq(void)
664 {
665     xspi_lut_instr_t cmdInstr;
666 
667     sfdp_flash_pad_num_t instrPad;
668     uint8_t instrDDR;
669     sfdp_flash_pad_num_t addrPad;
670     uint8_t addrDDR;
671     sfdp_flash_pad_num_t dataPad;
672     uint8_t dataDDR;
673 
674     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
675     (void)addrDDR;
676     (void)addrPad;
677     (void)dataPad;
678     (void)dataDDR;
679 
680     cmdInstr = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
681     sfdp_chip_erase_cmd_info_t chipEraseCmdInfo;
682 
683     SFDP_GetChipEraseCmdInfo(xspiMemNorHandle.ptrSfdpHandle, &chipEraseCmdInfo);
684     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
685     {
686         uint8_t instrExtension =
687             SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, chipEraseCmdInfo.instruction);
688 
689         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_CHIPERASE].insrOperandPair1 =
690             XSPI_LUT_SEQ(cmdInstr, instrPad, chipEraseCmdInfo.instruction, cmdInstr, instrPad, instrExtension);
691         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_CHIPERASE].insrOperandPair2 =
692             XSPI_LUT_SEQ(kXSPI_Command_STOP, instrPad, 0U, 0U, 0U, 0U);
693     }
694     else
695     {
696         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_CHIPERASE].insrOperandPair1 =
697             XSPI_LUT_SEQ(cmdInstr, instrPad, chipEraseCmdInfo.instruction, kXSPI_Command_STOP, instrPad, 0U);
698     }
699 }
700 
XSPI_NOR_FillReadStatusLutSeq(void)701 static void XSPI_NOR_FillReadStatusLutSeq(void)
702 {
703     xspi_lut_instr_t cmdInstr;
704     xspi_lut_instr_t raddrInstr;
705     xspi_lut_instr_t readInstr;
706 
707     sfdp_flash_pad_num_t instrPad;
708     uint8_t instrDDR;
709     sfdp_flash_pad_num_t addrPad;
710     uint8_t addrDDR;
711     sfdp_flash_pad_num_t dataPad;
712     uint8_t dataDDR;
713 
714     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
715 
716     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
717     raddrInstr = g_xspiCommonInstr[addrDDR][XSPI_INSTR_RADDR_IDX];
718     readInstr  = g_xspiCommonInstr[dataDDR][XSPI_INSTR_READ_IDX];
719 
720     sfdp_read_status_cmd_info_t readStatusCmdInfo;
721     SFDP_GetReadStatusCmdInfo(xspiMemNorHandle.ptrSfdpHandle, xspiMemNorHandle.curProtocolType, &readStatusCmdInfo);
722 
723     /* @TODO: In case of dummy cycle is updated. */
724 
725     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
726     {
727         uint8_t instrExtension =
728             SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, readStatusCmdInfo.instruction);
729 
730         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair1 =
731             XSPI_LUT_SEQ(cmdInstr, instrPad, readStatusCmdInfo.instruction, cmdInstr, instrPad, instrExtension);
732         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair2 =
733             XSPI_LUT_SEQ(raddrInstr, addrPad, readStatusCmdInfo.addrSize, kXSPI_Command_DUMMY_SDR, instrPad,
734                          readStatusCmdInfo.dummyCycle);
735         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair3 =
736             XSPI_LUT_SEQ(readInstr, dataPad, 0x4, kXSPI_Command_STOP, instrPad, 0x0U);
737     }
738     else if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_1s1s1s)
739     {
740         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair1 =
741             XSPI_LUT_SEQ(cmdInstr, instrPad, readStatusCmdInfo.instruction, readInstr, dataPad, 0x8);
742     }
743     else
744     {
745         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair1 = XSPI_LUT_SEQ(
746             cmdInstr, instrPad, readStatusCmdInfo.instruction, raddrInstr, addrPad, readStatusCmdInfo.addrSize);
747         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair2 =
748             XSPI_LUT_SEQ(kXSPI_Command_DUMMY_SDR, instrPad, readStatusCmdInfo.dummyCycle, readInstr, dataPad, 0x8);
749         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_READSTATUS].insrOperandPair3 =
750             XSPI_LUT_SEQ(kXSPI_Command_STOP, instrPad, 0x0U, 0x0U, 0x0U, 0x0U);
751     }
752 }
753 
XSPI_NOR_FillWriteStatusLutSeq(void)754 static void XSPI_NOR_FillWriteStatusLutSeq(void)
755 {
756     xspi_lut_instr_t cmdInstr;
757     xspi_lut_instr_t writeInstr;
758 
759     sfdp_flash_pad_num_t instrPad;
760     uint8_t instrDDR;
761     sfdp_flash_pad_num_t addrPad;
762     uint8_t addrDDR;
763     sfdp_flash_pad_num_t dataPad;
764     uint8_t dataDDR;
765 
766     SFDP_DECODE_PROTOCOL_TYPE(xspiMemNorHandle.curProtocolType);
767 
768     cmdInstr   = g_xspiCommonInstr[instrDDR][XSPI_INSTR_CMD_IDX];
769     writeInstr = g_xspiCommonInstr[dataDDR][XSPI_INSTR_WRITE_IDX];
770 
771     (void)addrPad;
772     (void)addrDDR;
773 
774     sfdp_write_status_cmd_info_t writeStatusCmdInfo;
775     SFDP_GetWriteStatusCmdInfo(xspiMemNorHandle.ptrSfdpHandle, &writeStatusCmdInfo);
776 
777     if (xspiMemNorHandle.curProtocolType == kSFDP_Protocol_8d8d8d)
778     {
779         uint8_t instrExtension =
780             SFDP_GetOctalDTRCmdExtension(xspiMemNorHandle.ptrSfdpHandle, writeStatusCmdInfo.instruction);
781         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_WRITESTATUS].insrOperandPair1 =
782             XSPI_LUT_SEQ(cmdInstr, instrPad, writeStatusCmdInfo.instruction, cmdInstr, instrPad, instrExtension);
783         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_WRITESTATUS].insrOperandPair2 =
784             XSPI_LUT_SEQ(writeInstr, dataPad, 0x4U, kXSPI_Command_STOP, instrPad, 0x0U);
785     }
786     else
787     {
788         g_xspiLut[NOR_CMD_LUT_SEQ_IDX_WRITESTATUS].insrOperandPair1 =
789             XSPI_LUT_SEQ(cmdInstr, instrPad, writeStatusCmdInfo.instruction, writeInstr, dataPad, 0x4U);
790     }
791 }
792 
XSPI_NOR_UpdateLut(nor_handle_t * handle,xspi_memory_config_t * ptrUserInputMemConfig)793 static status_t XSPI_NOR_UpdateLut(nor_handle_t *handle, xspi_memory_config_t *ptrUserInputMemConfig)
794 {
795     /* If user input customized LUT use directly, else fill LUT from SFDP. */
796     if (ptrUserInputMemConfig->ptrCustomLut == NULL)
797     {
798         XSPI_NOR_FillReadDataLutSeq();
799         XSPI_NOR_FillReadStatusLutSeq();
800         XSPI_NOR_FillWriteStatusLutSeq();
801         XSPI_NOR_FillWriteEnableLutSeq();
802         XSPI_NOR_FillSectorEraseLutSeq();
803         XSPI_NOR_FillReadIdLutSeq();
804         XSPI_NOR_FillPageProgramLutSeq();
805         XSPI_NOR_FillChipEraseLutSeq();
806         XSPI_NOR_FillBlockEraseLutSeq();
807     }
808     else
809     {
810         memcpy((void *)g_xspiLut, (void *)(ptrUserInputMemConfig->ptrCustomLut), 80U * 4U);
811     }
812 
813     XSPI_UpdateLUT(curXSPIBase, 0U, (uint32_t const *)&g_xspiLut, 80U);
814 
815     return kStatus_Success;
816 }
817 
XSPI_NOR_WriteEnable(nor_handle_t * handle,uint32_t address)818 static status_t XSPI_NOR_WriteEnable(nor_handle_t *handle, uint32_t address)
819 {
820     xspi_transfer_t flashXfer;
821     status_t status = kStatus_InvalidArgument;
822 
823     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
824 
825     if (address >= s_socXspiAmbaBase[xspiInstanceId])
826     {
827         flashXfer.deviceAddress = address;
828     }
829     else
830     {
831         flashXfer.deviceAddress = s_socXspiAmbaBase[xspiInstanceId] + address;
832     }
833     flashXfer.cmdType         = kXSPI_Command;
834     flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE;
835     flashXfer.data            = NULL;
836     flashXfer.dataSize        = 0UL;
837     flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
838     flashXfer.lockArbitration = false;
839 
840     status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
841 
842     return status;
843 }
844 
XSPI_NOR_FindProtocolType(xspi_memory_config_t * ptrXspiMemConfig)845 sfdp_protocol_type_t XSPI_NOR_FindProtocolType(xspi_memory_config_t *ptrXspiMemConfig)
846 {
847     sfdp_protocol_type_t calculatedProtocolType;
848     sfdp_cmd_policy_t policy           = kSFDP_CmdPolicy_HighestThroughput;
849     sfdp_ret_type_t ret                = kSFDP_RET_Success;
850     sfdp_xspi_profile_opi_cmd_t opiCmd = kSFDP_OPICmd_Erase4K;
851 
852     while ((uint8_t)policy < SFDP_CMD_POLICY_COUNT)
853     {
854         calculatedProtocolType = SFDP_GetFlashProtocolType(xspiMemNorHandle.ptrSfdpHandle, policy,
855                                                            (sfdp_flash_pad_num_t)(ptrXspiMemConfig->numPadUsed));
856 
857         if (calculatedProtocolType == kSFDP_Protocol_8d8d8d)
858         {
859             do
860             {
861                 ret = SFDP_CheckOPICmdSupported(xspiMemNorHandle.ptrSfdpHandle, opiCmd);
862                 opiCmd++;
863             } while ((ret == kSFDP_RET_Success) && ((uint8_t)opiCmd < SFDP_XSPI_PROFILE_OPI_CMD_COUNT));
864 
865             if (ret != kSFDP_RET_Success)
866             {
867                 policy++;
868             }
869             else
870             {
871                 break;
872             }
873         }
874         else
875         {
876             break;
877         }
878     }
879 
880     return calculatedProtocolType;
881 }
882 
XSPI_NOR_QuadEnable(void)883 static status_t XSPI_NOR_QuadEnable(void)
884 {
885     status_t status                            = kStatus_Success;
886     sfdp_quad_enable_method_t quadEnableMethod = SFDP_GetQuadEnableMethod(xspiMemNorHandle.ptrSfdpHandle);
887 
888     switch (quadEnableMethod)
889     {
890         case kSFDP_QuadEnableNotSupported:
891         {
892             /*Device doest not have a QE bit, device detects 1s-1s-4s and 1s-4s-4s reads based on instruction.  */
893             break;
894         }
895         case kSFDP_QuadEnableMethod1:
896         {
897             break;
898         }
899         case kSFDP_QuadEnableMethod2:
900         {
901             break;
902         }
903         case kSFDP_QuadEnableMethod3:
904         {
905             break;
906         }
907         case kSFDP_QuadEnableMethod4:
908         {
909             break;
910         }
911         case kSFDP_QuadEnableMethod5:
912         {
913             break;
914         }
915         case kSFDP_QuadEnableMethod6:
916         {
917             break;
918         }
919         default:
920         {
921             assert(false);
922         }
923     }
924 
925     return status;
926 }
927 
XSPI_NOR_EnterQuadSSRMode(void)928 static status_t XSPI_NOR_EnterQuadSSRMode(void)
929 {
930     status_t status                               = kStatus_Success;
931     sfdp_4s4s4s_mode_enable_method_t enableMethod = SFDP_Get4s4s4sModeEnableMethod(xspiMemNorHandle.ptrSfdpHandle);
932     uint32_t xspiInstanceId                       = XSPI_GetInstance(curXSPIBase);
933     xspi_transfer_t flashXfer;
934 
935     switch (enableMethod)
936     {
937         case kSFDP_4s4s4sModeEnableMethod0:
938         {
939             XSPI_NOR_QuadEnable();
940 
941             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
942             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
943                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x38U, kXSPI_Command_STOP, kXSPI_1PAD, 0U);
944 
945             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
946                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
947 
948             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
949             flashXfer.cmdType         = kXSPI_Command;
950             flashXfer.data            = NULL;
951             flashXfer.dataSize        = 0U;
952             flashXfer.lockArbitration = false;
953             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
954             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
955 
956             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
957             if (status != kStatus_Success)
958             {
959                 return status;
960             }
961             break;
962         }
963         case kSFDP_4s4s4sModeEnableMethod1:
964         {
965             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
966                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x38U, kXSPI_Command_STOP, kXSPI_1PAD, 0U);
967 
968             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
969                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
970 
971             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
972             flashXfer.cmdType         = kXSPI_Command;
973             flashXfer.data            = NULL;
974             flashXfer.dataSize        = 0U;
975             flashXfer.lockArbitration = false;
976             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
977             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
978 
979             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
980             if (status != kStatus_Success)
981             {
982                 return status;
983             }
984             break;
985         }
986         case kSFDP_4s4s4sModeEnableMethod2:
987         {
988             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
989                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x35U, kXSPI_Command_STOP, kXSPI_1PAD, 0U);
990 
991             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
992                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
993 
994             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
995             flashXfer.cmdType         = kXSPI_Command;
996             flashXfer.data            = NULL;
997             flashXfer.dataSize        = 0U;
998             flashXfer.lockArbitration = false;
999             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
1000             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1001 
1002             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
1003             if (status != kStatus_Success)
1004             {
1005                 return status;
1006             }
1007             break;
1008         }
1009         case kSFDP_4s4s4sModeEnableMethod3:
1010         {
1011             /*!< Read configuration using instruction 65h followed by address 800003h,
1012                 set bit 6, write configuration using instruction 71h followed by
1013                 address 800003h. */
1014             break;
1015         }
1016         case kSFDP_4s4s4sModeEnableMethod4:
1017         {
1018             /*!< Read volatile enhanced configuration using instruction 65h, no
1019                 address is required, set bit 7 to 1, write volatile enhanced
1020                 configuration using instruction 61h, no address is required. */
1021             break;
1022         }
1023     }
1024 
1025     return status;
1026 }
1027 
XSPI_NOR_EnterQuadDDRMode(void)1028 static status_t XSPI_NOR_EnterQuadDDRMode(void)
1029 {
1030     status_t status = kStatus_Success;
1031     sfdp_4s4d4d_entry_seq_t quadEntrySeq;
1032 
1033     if (SFDP_Get4s4d4dEntrySeq(xspiMemNorHandle.ptrSfdpHandle, &quadEntrySeq) != kSFDP_RET_Success)
1034     {
1035         return kStatus_Fail;
1036     }
1037 
1038     uint8_t seqLength = 0U;
1039     uint32_t i        = 0U;
1040     lut_seq_instr_operand_t altSeq[10];
1041     xspi_transfer_t flashXfer;
1042     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1043     uint32_t delayCount     = 0UL;
1044 
1045     sfdp_entry_seq_format_t *ptrSeq = &(quadEntrySeq.seq1);
1046     for (uint8_t seqId = 0U; seqId < 4U; seqId++)
1047     {
1048         if (ptrSeq->seqStruct.length != 0U)
1049         {
1050             seqLength = ptrSeq->seqStruct.length;
1051             memset(altSeq, 0UL, sizeof(altSeq));
1052             for (i = 0U; i < seqLength; i++)
1053             {
1054                 altSeq[i].operand = SFDP_GET_SEQ_CMD((*ptrSeq), i + 1U);
1055                 altSeq[i].instr   = kXSPI_Command_SDR;
1056                 altSeq[i].padNum  = kXSPI_1PAD;
1057             }
1058             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
1059             memcpy((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, (void *)&altSeq[0],
1060                    seqLength * sizeof(altSeq));
1061 
1062             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
1063                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
1064 
1065             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
1066             flashXfer.cmdType         = kXSPI_Command;
1067             flashXfer.data            = NULL;
1068             flashXfer.dataSize        = 0U;
1069             flashXfer.lockArbitration = false;
1070             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
1071             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1072 
1073             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
1074             __ISB();
1075             __DSB();
1076             for (delayCount = 0U; delayCount < 2000U; delayCount++)
1077             {
1078                 /* Delay to make sure command effect. */
1079                 __NOP();
1080             }
1081         }
1082         if (status != kStatus_Success)
1083         {
1084             break;
1085         }
1086         ptrSeq++;
1087     }
1088 
1089     return status;
1090 }
1091 
XSPI_NOR_OctalEnable(void)1092 static status_t XSPI_NOR_OctalEnable(void)
1093 {
1094     status_t status                              = kStatus_Success;
1095     sfdp_octal_enable_method_t octalEnableMethod = SFDP_GetOctalEnableMethod(xspiMemNorHandle.ptrSfdpHandle);
1096 
1097     switch (octalEnableMethod)
1098     {
1099         case kSFDP_OctalEnableNotSupported:
1100         {
1101             /* Not supported. */
1102             break;
1103         }
1104         case kSFDP_OctalEnableMethod1:
1105         {
1106             /*!< Octal enable is bit 3 of status register, it is set via write status register2
1107             instruction 31h with one data byte where bit 3 is one, it is cleared via write
1108             register instruction 3Eh with one data byte where bit 3 is zero, the status
1109             register 2 is read using instruction 65h with address byte 02h and one dummy
1110             cycle. */
1111             break;
1112         }
1113         default:
1114         {
1115             assert(false);
1116         }
1117     }
1118 
1119     return status;
1120 }
1121 
XSPI_NOR_EnterOctalSSRMode(void)1122 static status_t XSPI_NOR_EnterOctalSSRMode(void)
1123 {
1124     status_t status                               = kStatus_Success;
1125     sfdp_8s8s8s_mode_enable_method_t enableMethod = SFDP_Get8s8s8sModeEnableMethod(xspiMemNorHandle.ptrSfdpHandle);
1126     uint32_t xspiInstanceId                       = XSPI_GetInstance(curXSPIBase);
1127     xspi_transfer_t flashXfer;
1128 
1129     switch (enableMethod)
1130     {
1131         case kSFDP_8s8s8sModeEnableMethod0:
1132         {
1133             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
1134             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
1135                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x06U, kXSPI_Command_SDR, kXSPI_1PAD, 0xE8U);
1136 
1137             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
1138                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
1139 
1140             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
1141             flashXfer.cmdType         = kXSPI_Command;
1142             flashXfer.data            = NULL;
1143             flashXfer.dataSize        = 0U;
1144             flashXfer.lockArbitration = false;
1145             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
1146             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1147 
1148             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
1149             break;
1150         }
1151         case kSFDP_8s8s8sModeEnableMethod1:
1152         {
1153             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
1154             g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1 =
1155                 XSPI_LUT_SEQ(kXSPI_Command_SDR, kXSPI_1PAD, 0x06U, kXSPI_Command_SDR, kXSPI_1PAD, 0x72U);
1156 
1157             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
1158                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
1159 
1160             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
1161             flashXfer.cmdType         = kXSPI_Command;
1162             flashXfer.data            = NULL;
1163             flashXfer.dataSize        = 0U;
1164             flashXfer.lockArbitration = false;
1165             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
1166             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1167 
1168             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
1169             break;
1170         }
1171         default:
1172         {
1173             assert(false);
1174         }
1175     }
1176 
1177     return status;
1178 }
1179 
XSPI_NOR_EnterOctalDDRMode(void)1180 static status_t XSPI_NOR_EnterOctalDDRMode(void)
1181 {
1182     sfdp_8d8d8d_entry_seq_t octalEntrySeq;
1183     status_t status = kStatus_Success;
1184 
1185     if (SFDP_Get8d8d8dEntrySeq(xspiMemNorHandle.ptrSfdpHandle, &octalEntrySeq) != kSFDP_RET_Success)
1186     {
1187         return kStatus_Fail;
1188     }
1189     uint8_t seqLength = 0U;
1190     uint32_t i        = 0U;
1191     lut_seq_instr_operand_t altSeq[10];
1192     xspi_transfer_t flashXfer;
1193     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1194     uint32_t delayCount     = 0UL;
1195 
1196     sfdp_entry_seq_format_t *ptrSeq = &(octalEntrySeq.seq1);
1197     for (uint8_t seqId = 0U; seqId < 4U; seqId++)
1198     {
1199         if (ptrSeq->seqStruct.length != 0U)
1200         {
1201             seqLength = ptrSeq->seqStruct.length;
1202             memset(altSeq, 0UL, sizeof(altSeq));
1203             for (i = 0U; i < seqLength; i++)
1204             {
1205                 altSeq[i].operand = SFDP_GET_SEQ_CMD((*ptrSeq), i + 1U);
1206                 altSeq[i].instr   = kXSPI_Command_SDR;
1207                 altSeq[i].padNum  = kXSPI_1PAD;
1208             }
1209             memset((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, 0UL, sizeof(lut_seq_entry_t));
1210             memcpy((void *)&g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1, (void *)&altSeq[0], sizeof(altSeq));
1211 
1212             XSPI_UpdateLUT(curXSPIBase, NOR_CMD_LUT_SEQ_IDX_ALT * 5U,
1213                            &(g_xspiLut[NOR_CMD_LUT_SEQ_IDX_ALT].insrOperandPair1), 5U);
1214 
1215             flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
1216             flashXfer.cmdType         = kXSPI_Command;
1217             flashXfer.data            = NULL;
1218             flashXfer.dataSize        = 0U;
1219             flashXfer.lockArbitration = false;
1220             flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ALT;
1221             flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1222 
1223             status = XSPI_TransferBlocking(curXSPIBase, &flashXfer);
1224             __ISB();
1225             __DSB();
1226             for (delayCount = 0U; delayCount < 2000U; delayCount++)
1227             {
1228                 /* Delay to make sure command effect. */
1229                 __NOP();
1230             }
1231         }
1232         if (status != kStatus_Success)
1233         {
1234             break;
1235         }
1236         ptrSeq++;
1237     }
1238 
1239     return status;
1240 }
1241 
Nor_Flash_Init(nor_config_t * config,nor_handle_t * handle)1242 status_t Nor_Flash_Init(nor_config_t *config, nor_handle_t *handle)
1243 {
1244     assert(config != NULL);
1245 
1246     xspi_memory_config_t xspiNorMemConfig = *(xspi_memory_config_t *)(config->memControlConfig);
1247 
1248     xspiMemNorHandle.selectedTg = xspiNorMemConfig.tgId;
1249     xspiMemNorHandle.clkFreq    = xspiNorMemConfig.xspiRootClk;
1250 
1251     xspi_ahb_write_config_t xspiAhbWriteConfig;
1252     xspi_ahb_access_config_t xspiAhbAccessConfig;
1253     xspi_ip_access_config_t xspiIpAccessConfig;
1254     xspi_config_t xspiConfig;
1255 
1256     curXSPIBase = (XSPI_Type *)(uint32_t)(config->driverBaseAddr);
1257     XSPI_ResetSfmAndAhbDomain(curXSPIBase);
1258 
1259     XSPI_UpdateByteOrder(curXSPIBase, kXSPI_32BitLE);
1260 
1261     sfdp_handle_t sfdpHandle;
1262     (void)memset((void *)&sfdpHandle, 0UL, sizeof(sfdpHandle));
1263 
1264     xspiMemNorHandle.ptrSfdpHandle = &sfdpHandle;
1265 
1266     xspiConfig.enableDoze         = xspiNorMemConfig.enableXspiDoze;
1267     xspiConfig.ptrAhbAccessConfig = &xspiAhbAccessConfig;
1268     xspiConfig.ptrIpAccessConfig  = &xspiIpAccessConfig;
1269     XSPI_GetDefaultConfig(&xspiConfig);
1270 
1271     if (xspiNorMemConfig.ptrXspiNorAhbAccessConfig != NULL)
1272     {
1273         /* In case of user customized AHB access configurations, overwrite the default settings.  */
1274         xspiAhbAccessConfig.buffer[0]         = xspiNorMemConfig.ptrXspiNorAhbAccessConfig->ahbBuffer0Config;
1275         xspiAhbAccessConfig.buffer[1]         = xspiNorMemConfig.ptrXspiNorAhbAccessConfig->ahbBuffer1Config;
1276         xspiAhbAccessConfig.buffer[2]         = xspiNorMemConfig.ptrXspiNorAhbAccessConfig->ahbBuffer2Config;
1277         xspiAhbAccessConfig.buffer[3]         = xspiNorMemConfig.ptrXspiNorAhbAccessConfig->ahbBuffer3Config;
1278         xspiAhbAccessConfig.enableAHBPrefetch = xspiNorMemConfig.ptrXspiNorAhbAccessConfig->enablePrefetch;
1279         if (xspiNorMemConfig.ptrXspiNorAhbAccessConfig->enableAhbWrite)
1280         {
1281             xspiAhbAccessConfig.ptrAhbWriteConfig = &xspiAhbWriteConfig;
1282         }
1283         else
1284         {
1285             xspiAhbAccessConfig.ptrAhbWriteConfig = NULL;
1286         }
1287     }
1288 
1289     xspiAhbAccessConfig.ahbAlignment                = kXSPI_AhbAlignmentNoLimit;
1290     xspiAhbAccessConfig.ahbErrorPayload.highPayload = 0x5A5A5A5AUL; /* hard code in component. */
1291     xspiAhbAccessConfig.ahbErrorPayload.lowPayload  = 0x5A5A5A5AUL; /* hard code in component. */
1292     xspiAhbAccessConfig.ahbSplitSize                = kXSPI_AhbSplitSizeDisabled;
1293     xspiAhbAccessConfig.ARDSeqIndex                 = NOR_CMD_LUT_SEQ_IDX_READ;
1294 
1295     xspiAhbAccessConfig.enableAHBBufferWriteFlush = true;
1296 
1297     if (xspiNorMemConfig.ptrXspiNorIPAccessConfig != NULL)
1298     {
1299         /* In case of user customized IP access configurations, overwrite the default settings.  */
1300         xspiIpAccessConfig.ipAccessTimeoutValue = xspiNorMemConfig.ptrXspiNorIPAccessConfig->ipAccessTimeoutValue;
1301         xspiIpAccessConfig.ptrSfpFradConfig     = xspiNorMemConfig.ptrXspiNorIPAccessConfig->ptrSfpFradConfig;
1302         xspiIpAccessConfig.ptrSfpMdadConfig     = xspiNorMemConfig.ptrXspiNorIPAccessConfig->ptrSfpMdadConfig;
1303         xspiIpAccessConfig.sfpArbitrationLockTimeoutValue =
1304             xspiNorMemConfig.ptrXspiNorIPAccessConfig->sfpArbitrationLockTimeoutValue;
1305     }
1306 
1307     /* initialize host controller. */
1308     XSPI_Init(curXSPIBase, &xspiConfig);
1309 
1310     if (XSPI_NOR_ProbeNorFlashSfdpHeader() != kStatus_Success)
1311     {
1312         return kStatus_Fail;
1313     }
1314 
1315     if (SFDP_ReadAllSupportedTable(&sfdpHandle) != kSFDP_RET_Success)
1316     {
1317         return kStatus_Fail;
1318     }
1319 
1320     if ((SFDP_GetAddressBytes(&sfdpHandle) != kSFDP_AddrMode_3ByteOnly) && (xspiMemNorHandle.addrSize != 32U))
1321     {
1322         XSPI_NOR_Enter4ByteMode();
1323         xspiMemNorHandle.addrSize = 32U;
1324     }
1325 
1326     sfdp_protocol_type_t targetProtocolType = XSPI_NOR_FindProtocolType(&xspiNorMemConfig);
1327 
1328     if ((targetProtocolType >= kSFDP_Protocol_1s1s4s) && (targetProtocolType <= kSFDP_Protocol_4s4d4d))
1329     {
1330         if (targetProtocolType <= kSFDP_Protocol_1s4d4d)
1331         {
1332             if (XSPI_NOR_QuadEnable() != kStatus_Success)
1333             {
1334                 return kStatus_Fail;
1335             }
1336         }
1337         else if (targetProtocolType == kSFDP_Protocol_4s4s4s)
1338         {
1339             if (XSPI_NOR_EnterQuadSSRMode() != kStatus_Success)
1340             {
1341                 return kStatus_Fail;
1342             }
1343         }
1344         else
1345         {
1346             if (XSPI_NOR_EnterQuadDDRMode() != kStatus_Success)
1347             {
1348                 return kStatus_Fail;
1349             }
1350         }
1351     }
1352     if (targetProtocolType >= kSFDP_Protocol_1s1s8s)
1353     {
1354         if (targetProtocolType <= kSFDP_Protocol_1s8d8d)
1355         {
1356             if (XSPI_NOR_OctalEnable() != kStatus_Success)
1357             {
1358                 return kStatus_Fail;
1359             }
1360         }
1361         else if (targetProtocolType == kSFDP_Protocol_8s8s8s)
1362         {
1363             if (XSPI_NOR_EnterOctalSSRMode() != kStatus_Success)
1364             {
1365                 return kStatus_Fail;
1366             }
1367         }
1368         else
1369         {
1370             if (XSPI_NOR_EnterOctalDDRMode() != kStatus_Success)
1371             {
1372                 return kStatus_Fail;
1373             }
1374         }
1375     }
1376 
1377     xspiMemNorHandle.curProtocolType = targetProtocolType;
1378 
1379     if (XSPI_NOR_SetNorFlashDeviceConfig(&xspiNorMemConfig) != kStatus_Success)
1380     {
1381         return kStatus_Fail;
1382     }
1383 
1384     if (XSPI_NOR_UpdateLut(handle, &xspiNorMemConfig) != kStatus_Success)
1385     {
1386         return kStatus_Fail;
1387     }
1388     /* Update handle for other interfaces. */
1389     handle->driverBaseAddr    = config->driverBaseAddr;
1390     handle->deviceSpecific    = (void *)(uint32_t)(&xspiMemNorHandle);
1391     handle->bytesInSectorSize = xspiMemNorHandle.sectorSizeInByte;
1392     handle->bytesInMemorySize = xspiMemNorHandle.memSizeInByte;
1393     handle->bytesInPageSize   = SFDP_GetPageSize(&sfdpHandle);
1394 
1395     return kStatus_Success;
1396 }
1397 
Nor_Flash_Read(nor_handle_t * handle,uint32_t address,uint8_t * buffer,uint32_t length)1398 status_t Nor_Flash_Read(nor_handle_t *handle, uint32_t address, uint8_t *buffer, uint32_t length)
1399 {
1400     assert(handle != NULL);
1401     assert(buffer != NULL);
1402 
1403     xspi_transfer_t flashXfer;
1404     status_t status                            = kStatus_Success;
1405     xspi_mem_nor_handle_t *ptrXspiMemNorHandle = (xspi_mem_nor_handle_t *)(uint32_t)(handle->deviceSpecific);
1406 
1407     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1408 
1409     if (address >= s_socXspiAmbaBase[xspiInstanceId])
1410     {
1411         flashXfer.deviceAddress = address;
1412     }
1413     else
1414     {
1415         flashXfer.deviceAddress = s_socXspiAmbaBase[xspiInstanceId] + address;
1416     }
1417     flashXfer.cmdType  = kXSPI_Read;
1418     flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_READ; /* Hard code as 0, the first sequence of LUT is used to read
1419                                                    data from Flash device. */
1420     flashXfer.data            = (uint32_t *)(void *)buffer;
1421     flashXfer.dataSize        = length;
1422     flashXfer.targetGroup     = ptrXspiMemNorHandle->selectedTg; /* Target group selection is from application. */
1423     flashXfer.lockArbitration = false;
1424 
1425     status = XSPI_TransferBlocking((XSPI_Type *)handle->driverBaseAddr, &flashXfer);
1426 
1427     return status;
1428 }
1429 
Nor_Flash_Page_Program(nor_handle_t * handle,uint32_t address,uint8_t * buffer)1430 status_t Nor_Flash_Page_Program(nor_handle_t *handle, uint32_t address, uint8_t *buffer)
1431 {
1432     assert(handle != NULL);
1433     assert(buffer != NULL);
1434 
1435     xspi_transfer_t flashXfer;
1436     status_t status = kStatus_Success;
1437     bool isBusy     = true;
1438 
1439     /* Write Enable. */
1440     if (XSPI_NOR_WriteEnable(handle, address) != kStatus_Success)
1441     {
1442         return kStatus_Fail;
1443     }
1444 
1445     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1446 
1447     if (address >= s_socXspiAmbaBase[xspiInstanceId])
1448     {
1449         flashXfer.deviceAddress = address;
1450     }
1451     else
1452     {
1453         flashXfer.deviceAddress = s_socXspiAmbaBase[xspiInstanceId] + address;
1454     }
1455     flashXfer.cmdType         = kXSPI_Write;
1456     flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM;
1457     flashXfer.data            = (uint32_t *)(void *)buffer;
1458     flashXfer.dataSize        = handle->bytesInPageSize;
1459     flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1460     flashXfer.lockArbitration = true;
1461 
1462     status = XSPI_TransferBlocking((XSPI_Type *)handle->driverBaseAddr, &flashXfer);
1463 
1464     if (status == kStatus_Success)
1465     {
1466         /* Loop until WIP is cleared  */
1467         do
1468         {
1469             (void)Nor_Flash_Is_Busy(handle, &isBusy);
1470         } while (isBusy == true);
1471     }
1472 
1473     return status;
1474 }
1475 
Nor_Flash_Program(nor_handle_t * handle,uint32_t address,uint8_t * buffer,uint32_t length)1476 status_t Nor_Flash_Program(nor_handle_t *handle, uint32_t address, uint8_t *buffer, uint32_t length)
1477 {
1478     assert(handle != NULL);
1479     assert(buffer != NULL);
1480 
1481     assert(handle != NULL);
1482     assert(buffer != NULL);
1483     uint32_t startAddress = address;
1484     status_t status       = kStatus_Success;
1485 
1486     for (uint32_t i = 0x00U; i <= (length / handle->bytesInPageSize); i++)
1487     {
1488         status = Nor_Flash_Page_Program(handle, startAddress, buffer);
1489         /* Avoid buffer overflow. */
1490         if (length >= handle->bytesInPageSize)
1491         {
1492             buffer += handle->bytesInPageSize;
1493             startAddress += handle->bytesInPageSize;
1494         }
1495     }
1496 
1497     return status;
1498 }
1499 
Nor_Flash_Erase_Sector(nor_handle_t * handle,uint32_t address)1500 status_t Nor_Flash_Erase_Sector(nor_handle_t *handle, uint32_t address)
1501 {
1502     assert(handle != NULL);
1503 
1504     xspi_transfer_t flashXfer;
1505     bool isBusy     = true;
1506     status_t status = kStatus_Success;
1507 
1508     /* Write Enable. */
1509     if (XSPI_NOR_WriteEnable(handle, address) != kStatus_Success)
1510     {
1511         return kStatus_Fail;
1512     }
1513 
1514     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1515 
1516     if (address >= s_socXspiAmbaBase[xspiInstanceId])
1517     {
1518         flashXfer.deviceAddress = address;
1519     }
1520     else
1521     {
1522         flashXfer.deviceAddress = s_socXspiAmbaBase[xspiInstanceId] + address;
1523     }
1524     flashXfer.cmdType         = kXSPI_Command;
1525     flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ERASESECTOR;
1526     flashXfer.data            = NULL;
1527     flashXfer.dataSize        = 0UL;
1528     flashXfer.targetGroup     = xspiMemNorHandle.selectedTg;
1529     flashXfer.lockArbitration = false;
1530 
1531     status = XSPI_TransferBlocking((XSPI_Type *)handle->driverBaseAddr, &flashXfer);
1532 
1533     if (status == kStatus_Success)
1534     {
1535         /* Loop until WIP is cleared  */
1536         do
1537         {
1538             (void)Nor_Flash_Is_Busy(handle, &isBusy);
1539         } while (isBusy == true);
1540     }
1541 
1542     return status;
1543 }
1544 
Nor_Flash_Erase_Block(nor_handle_t * handle,uint32_t address)1545 status_t Nor_Flash_Erase_Block(nor_handle_t *handle, uint32_t address)
1546 {
1547     assert(handle != NULL);
1548 
1549     xspi_transfer_t flashXfer;
1550     status_t status                            = kStatus_Success;
1551     xspi_mem_nor_handle_t *ptrXspiMemNorHandle = (xspi_mem_nor_handle_t *)(uint32_t)(handle->deviceSpecific);
1552     bool isBusy                                = false;
1553 
1554     /* Write Enable. */
1555     if (XSPI_NOR_WriteEnable(handle, address) != kStatus_Success)
1556     {
1557         return kStatus_Fail;
1558     }
1559 
1560     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1561 
1562     if (address >= s_socXspiAmbaBase[xspiInstanceId])
1563     {
1564         flashXfer.deviceAddress = address;
1565     }
1566     else
1567     {
1568         flashXfer.deviceAddress = s_socXspiAmbaBase[xspiInstanceId] + address;
1569     }
1570     flashXfer.cmdType         = kXSPI_Command;
1571     flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK;
1572     flashXfer.data            = NULL;
1573     flashXfer.dataSize        = 0UL;
1574     flashXfer.targetGroup     = ptrXspiMemNorHandle->selectedTg;
1575     flashXfer.lockArbitration = false;
1576 
1577     status = XSPI_TransferBlocking((XSPI_Type *)handle->driverBaseAddr, &flashXfer);
1578 
1579     if (status == kStatus_Success)
1580     {
1581         /* Loop until WIP is cleared  */
1582         do
1583         {
1584             (void)Nor_Flash_Is_Busy(handle, &isBusy);
1585         } while (isBusy == false);
1586     }
1587 
1588     return status;
1589 }
1590 
Nor_Flash_Erase(nor_handle_t * handle,uint32_t address,uint32_t size_Byte)1591 status_t Nor_Flash_Erase(nor_handle_t *handle, uint32_t address, uint32_t size_Byte)
1592 {
1593     assert(handle != NULL);
1594     assert(size_Byte > 0x00U);
1595     uint32_t startAddress = address;
1596     status_t status       = kStatus_Success;
1597 
1598     for (uint32_t i = 0x00U; i <= (size_Byte / handle->bytesInSectorSize); i++)
1599     {
1600         status = Nor_Flash_Erase_Sector(handle, startAddress);
1601         startAddress += handle->bytesInSectorSize;
1602     }
1603 
1604     return status;
1605 }
1606 
Nor_Flash_Erase_Chip(nor_handle_t * handle)1607 status_t Nor_Flash_Erase_Chip(nor_handle_t *handle)
1608 {
1609     assert(handle != NULL);
1610 
1611     xspi_transfer_t flashXfer;
1612     status_t status                            = kStatus_Success;
1613     xspi_mem_nor_handle_t *ptrXspiMemNorHandle = (xspi_mem_nor_handle_t *)(uint32_t)(handle->deviceSpecific);
1614     bool isBusy                                = false;
1615 
1616     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1617 
1618     /* Write Enable. */
1619     if (XSPI_NOR_WriteEnable(handle, s_socXspiAmbaBase[xspiInstanceId]) != kStatus_Success)
1620     {
1621         return kStatus_Fail;
1622     }
1623 
1624     flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
1625     flashXfer.cmdType         = kXSPI_Command;
1626     flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_CHIPERASE;
1627     flashXfer.data            = NULL;
1628     flashXfer.dataSize        = 0UL;
1629     flashXfer.targetGroup     = ptrXspiMemNorHandle->selectedTg;
1630     flashXfer.lockArbitration = false;
1631 
1632     status = XSPI_TransferBlocking((XSPI_Type *)handle->driverBaseAddr, &flashXfer);
1633 
1634     if (status == kStatus_Success)
1635     {
1636         /* Loop until WIP is cleared  */
1637         do
1638         {
1639             (void)Nor_Flash_Is_Busy(handle, &isBusy);
1640         } while (isBusy == false);
1641     }
1642 
1643     return status;
1644 }
1645 
Nor_Flash_Is_Busy(nor_handle_t * handle,bool * isBusy)1646 status_t Nor_Flash_Is_Busy(nor_handle_t *handle, bool *isBusy)
1647 {
1648     assert(handle != NULL);
1649 
1650     xspi_transfer_t flashXfer;
1651     status_t status                            = kStatus_Success;
1652     xspi_mem_nor_handle_t *ptrXspiMemNorHandle = (xspi_mem_nor_handle_t *)(uint32_t)(handle->deviceSpecific);
1653     uint32_t readBuffer                        = 0UL;
1654     bool wip                                   = true;
1655 
1656     uint32_t xspiInstanceId = XSPI_GetInstance(curXSPIBase);
1657 
1658     flashXfer.deviceAddress   = s_socXspiAmbaBase[xspiInstanceId];
1659     flashXfer.cmdType         = kXSPI_Read;
1660     flashXfer.seqIndex        = NOR_CMD_LUT_SEQ_IDX_READSTATUS;
1661     flashXfer.data            = &readBuffer;
1662     flashXfer.dataSize        = 2UL;
1663     flashXfer.targetGroup     = ptrXspiMemNorHandle->selectedTg;
1664     flashXfer.lockArbitration = false;
1665 
1666     status = XSPI_TransferBlocking((XSPI_Type *)handle->driverBaseAddr, &flashXfer);
1667 
1668     if (status == kStatus_Success)
1669     {
1670         /* Check if WIP is cleared. */
1671         if (ptrXspiMemNorHandle->norFlashStatusRegInfo.value1Expired)
1672         {
1673             wip =
1674                 (((1U << ptrXspiMemNorHandle->norFlashStatusRegInfo.wipLocation) & readBuffer) != 0x0U) ? false : true;
1675         }
1676         else
1677         {
1678             wip =
1679                 (((1U << ptrXspiMemNorHandle->norFlashStatusRegInfo.wipLocation) & readBuffer) != 0x0U) ? true : false;
1680         }
1681 
1682         *isBusy = wip;
1683     }
1684 
1685     return status;
1686 }
1687 
Nor_Flash_DeInit(nor_handle_t * handle)1688 status_t Nor_Flash_DeInit(nor_handle_t *handle)
1689 {
1690     XSPI_Deinit((XSPI_Type *)handle->driverBaseAddr);
1691 
1692     return kStatus_Success;
1693 }
1694