1 /*
2  * Copyright 2020,2023 NXP
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #define DT_DRV_COMPAT	nxp_imx_flexspi_nor
8 
9 #include <zephyr/kernel.h>
10 #include <zephyr/drivers/flash.h>
11 #include <zephyr/irq.h>
12 #include <zephyr/logging/log.h>
13 #include <zephyr/sys/util.h>
14 #include "spi_nor.h"
15 #include "jesd216.h"
16 #include "memc_mcux_flexspi.h"
17 
18 #ifdef CONFIG_HAS_MCUX_CACHE
19 #include <fsl_cache.h>
20 #endif
21 
22 #define NOR_WRITE_SIZE	1
23 #define NOR_ERASE_VALUE	0xff
24 
25 #ifdef CONFIG_FLASH_MCUX_FLEXSPI_NOR_WRITE_BUFFER
26 static uint8_t nor_write_buf[SPI_NOR_PAGE_SIZE];
27 #endif
28 
29 /*
30  * NOTE: If CONFIG_FLASH_MCUX_FLEXSPI_XIP is selected, Any external functions
31  * called while interacting with the flexspi MUST be relocated to SRAM or ITCM
32  * at runtime, so that the chip does not access the flexspi to read program
33  * instructions while it is being written to
34  *
35  * Additionally, no data used by this driver should be stored in flash.
36  */
37 #if defined(CONFIG_FLASH_MCUX_FLEXSPI_XIP) && (CONFIG_FLASH_LOG_LEVEL > 0)
38 #warning "Enabling flash driver logging and XIP mode simultaneously can cause \
39 	read-while-write hazards. This configuration is not recommended."
40 #endif
41 
42 LOG_MODULE_REGISTER(flash_flexspi_nor, CONFIG_FLASH_LOG_LEVEL);
43 
44 enum {
45 	READ,
46 	PAGE_PROGRAM,
47 	READ_STATUS,
48 	WRITE_ENABLE,
49 	ERASE_SECTOR,
50 	ERASE_BLOCK,
51 	READ_ID,
52 	READ_STATUS_REG,
53 	ERASE_CHIP,
54 	READ_JESD216,
55 	/* Entries after this should be for scratch commands */
56 	FLEXSPI_INSTR_PROG_END,
57 	/* Used for temporary commands during initialization */
58 	SCRATCH_CMD = FLEXSPI_INSTR_PROG_END,
59 	SCRATCH_CMD2,
60 	/* Must be last entry */
61 	FLEXSPI_INSTR_END,
62 };
63 
64 struct flash_flexspi_nor_config {
65 	/* Note: don't use this controller reference in code. It is
66 	 * only used during init to copy the device structure from ROM
67 	 * into a RAM structure
68 	 */
69 	const struct device *controller;
70 };
71 
72 /* Device variables used in critical sections should be in this structure */
73 struct flash_flexspi_nor_data {
74 	struct device controller;
75 	flexspi_device_config_t config;
76 	flexspi_port_t port;
77 	bool legacy_poll;
78 	uint64_t size;
79 	struct flash_pages_layout layout;
80 	struct flash_parameters flash_parameters;
81 };
82 
83 /*
84  * FLEXSPI LUT buffer used during configuration. Stored in .data to avoid
85  * using too much stack
86  */
87 static uint32_t flexspi_probe_lut[FLEXSPI_INSTR_END][MEMC_FLEXSPI_CMD_PER_SEQ] = {0};
88 
89 /* Initial LUT table */
90 static const uint32_t flash_flexspi_nor_base_lut[][MEMC_FLEXSPI_CMD_PER_SEQ] = {
91 	/* 1S-1S-1S flash read command, should be compatible with all SPI nor flashes */
92 	[READ] = {
93 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_READ,
94 			kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 24),
95 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1,
96 			kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
97 	},
98 	[READ_JESD216] = {
99 		/* Install read SFDP command */
100 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, JESD216_CMD_READ_SFDP,
101 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 24),
102 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 8,
103 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x4),
104 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0,
105 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),
106 	},
107 	/* Standard 1S-1S-1S flash write command, can be switched to 1S-1S-4S when QE is set */
108 	[PAGE_PROGRAM] = {
109 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP,
110 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
111 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04,
112 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
113 	},
114 
115 	[WRITE_ENABLE] = {
116 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_WREN,
117 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
118 	},
119 
120 	[ERASE_SECTOR] = {
121 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_SE,
122 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
123 	},
124 
125 	[ERASE_BLOCK] = {
126 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE,
127 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
128 	},
129 
130 	[ERASE_CHIP] = {
131 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_CE,
132 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
133 	},
134 
135 	[READ_ID] = {
136 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDID,
137 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01),
138 	},
139 
140 	[READ_STATUS_REG] = {
141 		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
142 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01),
143 	},
144 };
145 
area_is_subregion(const struct device * dev,off_t offset,size_t size)146 static ALWAYS_INLINE bool area_is_subregion(const struct device *dev, off_t offset, size_t size)
147 {
148 	struct flash_flexspi_nor_data *data = dev->data;
149 
150 	return ((offset >= 0) && (offset < data->size) &&
151 		((data->size - offset) >= size));
152 }
153 
154 /* Helper so we can read flash ID without flash access for XIP */
flash_flexspi_nor_read_id_helper(struct flash_flexspi_nor_data * data,uint8_t * vendor_id)155 static int flash_flexspi_nor_read_id_helper(struct flash_flexspi_nor_data *data,
156 		uint8_t *vendor_id)
157 {
158 	uint32_t buffer = 0;
159 	int ret;
160 
161 	flexspi_transfer_t transfer = {
162 		.deviceAddress = 0,
163 		.port = data->port,
164 		.cmdType = kFLEXSPI_Read,
165 		.SeqNumber = 1,
166 		.seqIndex = READ_ID,
167 		.data = &buffer,
168 		.dataSize = 3,
169 	};
170 
171 	LOG_DBG("Reading id");
172 
173 	ret = memc_flexspi_transfer(&data->controller, &transfer);
174 	if (ret < 0) {
175 		return ret;
176 	}
177 
178 	memcpy(vendor_id, &buffer, 3);
179 
180 	return ret;
181 }
182 
flash_flexspi_nor_read_id(const struct device * dev,uint8_t * vendor_id)183 static int flash_flexspi_nor_read_id(const struct device *dev, uint8_t *vendor_id)
184 {
185 	struct flash_flexspi_nor_data *data = dev->data;
186 
187 	return flash_flexspi_nor_read_id_helper(data, vendor_id);
188 }
189 
flash_flexspi_nor_read_status(struct flash_flexspi_nor_data * data,uint32_t * status)190 static int flash_flexspi_nor_read_status(struct flash_flexspi_nor_data *data,
191 		uint32_t *status)
192 {
193 	flexspi_transfer_t transfer = {
194 		.deviceAddress = 0,
195 		.port = data->port,
196 		.cmdType = kFLEXSPI_Read,
197 		.SeqNumber = 1,
198 		.seqIndex = READ_STATUS_REG,
199 		.data = status,
200 		.dataSize = 1,
201 	};
202 
203 	LOG_DBG("Reading status register");
204 
205 	return memc_flexspi_transfer(&data->controller, &transfer);
206 }
207 
flash_flexspi_nor_write_enable(struct flash_flexspi_nor_data * data)208 static int flash_flexspi_nor_write_enable(struct flash_flexspi_nor_data *data)
209 {
210 	flexspi_transfer_t transfer = {
211 		.deviceAddress = 0,
212 		.port = data->port,
213 		.cmdType = kFLEXSPI_Command,
214 		.SeqNumber = 1,
215 		.seqIndex = WRITE_ENABLE,
216 		.data = NULL,
217 		.dataSize = 0,
218 	};
219 
220 	LOG_DBG("Enabling write");
221 
222 	return memc_flexspi_transfer(&data->controller, &transfer);
223 }
224 
flash_flexspi_nor_erase_sector(struct flash_flexspi_nor_data * data,off_t offset)225 static int flash_flexspi_nor_erase_sector(struct flash_flexspi_nor_data *data,
226 	off_t offset)
227 {
228 	flexspi_transfer_t transfer = {
229 		.deviceAddress = offset,
230 		.port = data->port,
231 		.cmdType = kFLEXSPI_Command,
232 		.SeqNumber = 1,
233 		.seqIndex = ERASE_SECTOR,
234 		.data = NULL,
235 		.dataSize = 0,
236 	};
237 
238 	LOG_DBG("Erasing sector at 0x%08zx", (ssize_t) offset);
239 
240 	return memc_flexspi_transfer(&data->controller, &transfer);
241 }
242 
flash_flexspi_nor_erase_block(struct flash_flexspi_nor_data * data,off_t offset)243 static int flash_flexspi_nor_erase_block(struct flash_flexspi_nor_data *data,
244 					  off_t offset)
245 {
246 	flexspi_transfer_t transfer = {
247 		.deviceAddress = offset,
248 		.port = data->port,
249 		.cmdType = kFLEXSPI_Command,
250 		.SeqNumber = 1,
251 		.seqIndex = ERASE_BLOCK,
252 		.data = NULL,
253 		.dataSize = 0,
254 	};
255 
256 	LOG_DBG("Erasing block at 0x%08zx", (ssize_t) offset);
257 
258 	return memc_flexspi_transfer(&data->controller, &transfer);
259 }
260 
flash_flexspi_nor_erase_chip(struct flash_flexspi_nor_data * data)261 static int flash_flexspi_nor_erase_chip(struct flash_flexspi_nor_data *data)
262 {
263 	flexspi_transfer_t transfer = {
264 		.deviceAddress = 0,
265 		.port = data->port,
266 		.cmdType = kFLEXSPI_Command,
267 		.SeqNumber = 1,
268 		.seqIndex = ERASE_CHIP,
269 		.data = NULL,
270 		.dataSize = 0,
271 	};
272 
273 	LOG_DBG("Erasing chip");
274 
275 	return memc_flexspi_transfer(&data->controller, &transfer);
276 }
277 
flash_flexspi_nor_page_program(struct flash_flexspi_nor_data * data,off_t offset,const void * buffer,size_t len)278 static int flash_flexspi_nor_page_program(struct flash_flexspi_nor_data *data,
279 		off_t offset, const void *buffer, size_t len)
280 {
281 	flexspi_transfer_t transfer = {
282 		.deviceAddress = offset,
283 		.port = data->port,
284 		.cmdType = kFLEXSPI_Write,
285 		.SeqNumber = 1,
286 		.seqIndex = PAGE_PROGRAM,
287 		.data = (uint32_t *) buffer,
288 		.dataSize = len,
289 	};
290 
291 	LOG_DBG("Page programming %d bytes to 0x%08zx", len, (ssize_t) offset);
292 
293 	return memc_flexspi_transfer(&data->controller, &transfer);
294 }
295 
flash_flexspi_nor_wait_bus_busy(struct flash_flexspi_nor_data * data)296 static int flash_flexspi_nor_wait_bus_busy(struct flash_flexspi_nor_data *data)
297 {
298 	uint32_t status = 0;
299 	int ret;
300 
301 	while (1) {
302 		ret = flash_flexspi_nor_read_status(data, &status);
303 		LOG_DBG("status: 0x%x", status);
304 		if (ret) {
305 			LOG_ERR("Could not read status");
306 			return ret;
307 		}
308 
309 		if (data->legacy_poll) {
310 			if ((status & BIT(0)) == 0) {
311 				break;
312 			}
313 		} else {
314 			if (status & BIT(7)) {
315 				break;
316 			}
317 		}
318 	}
319 
320 	return 0;
321 }
322 
flash_flexspi_nor_read(const struct device * dev,off_t offset,void * buffer,size_t len)323 static int flash_flexspi_nor_read(const struct device *dev, off_t offset,
324 		void *buffer, size_t len)
325 {
326 	struct flash_flexspi_nor_data *data = dev->data;
327 
328 	if (!buffer) {
329 		return -EINVAL;
330 	}
331 
332 	if (!area_is_subregion(dev, offset, len)) {
333 		return -EINVAL;
334 	}
335 
336 	uint8_t *src = memc_flexspi_get_ahb_address(&data->controller,
337 						    data->port,
338 						    offset);
339 
340 	memcpy(buffer, src, len);
341 
342 	return 0;
343 }
344 
flash_flexspi_nor_write(const struct device * dev,off_t offset,const void * buffer,size_t len)345 static int flash_flexspi_nor_write(const struct device *dev, off_t offset,
346 		const void *buffer, size_t len)
347 {
348 	struct flash_flexspi_nor_data *data = dev->data;
349 
350 	if (!buffer) {
351 		return -EINVAL;
352 	}
353 
354 	if (!area_is_subregion(dev, offset, len)) {
355 		return -EINVAL;
356 	}
357 
358 	size_t size = len;
359 	uint8_t *src = (uint8_t *) buffer;
360 	int i;
361 	unsigned int key = 0;
362 
363 	uint8_t *dst = memc_flexspi_get_ahb_address(&data->controller,
364 						    data->port,
365 						    offset);
366 
367 	if (memc_flexspi_is_running_xip(&data->controller)) {
368 		/*
369 		 * ==== ENTER CRITICAL SECTION ====
370 		 * No flash access should be performed in critical section. All
371 		 * code and data accessed must reside in ram.
372 		 */
373 		key = irq_lock();
374 		memc_flexspi_wait_bus_idle(&data->controller);
375 	}
376 
377 	while (len) {
378 		/* If the offset isn't a multiple of the NOR page size, we first need
379 		 * to write the remaining part that fits, otherwise the write could
380 		 * be wrapped around within the same page
381 		 */
382 		i = MIN(SPI_NOR_PAGE_SIZE - (offset % SPI_NOR_PAGE_SIZE), len);
383 #ifdef CONFIG_FLASH_MCUX_FLEXSPI_NOR_WRITE_BUFFER
384 		memcpy(nor_write_buf, src, i);
385 
386 		/* As memcpy could cause an XIP access,
387 		 * we need to wait for XIP prefetch to be finished again
388 		 */
389 		if (memc_flexspi_is_running_xip(&data->controller)) {
390 			memc_flexspi_wait_bus_idle(&data->controller);
391 		}
392 #endif
393 		flash_flexspi_nor_write_enable(data);
394 #ifdef CONFIG_FLASH_MCUX_FLEXSPI_NOR_WRITE_BUFFER
395 		flash_flexspi_nor_page_program(data, offset, nor_write_buf, i);
396 #else
397 		flash_flexspi_nor_page_program(data, offset, src, i);
398 #endif
399 		flash_flexspi_nor_wait_bus_busy(data);
400 		memc_flexspi_reset(&data->controller);
401 		src += i;
402 		offset += i;
403 		len -= i;
404 	}
405 
406 	if (memc_flexspi_is_running_xip(&data->controller)) {
407 		/* ==== EXIT CRITICAL SECTION ==== */
408 		irq_unlock(key);
409 	}
410 
411 #ifdef CONFIG_HAS_MCUX_CACHE
412 	DCACHE_InvalidateByRange((uint32_t) dst, size);
413 #endif
414 
415 	return 0;
416 }
417 
flash_flexspi_nor_erase(const struct device * dev,off_t offset,size_t size)418 static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
419 		size_t size)
420 {
421 	struct flash_flexspi_nor_data *data = dev->data;
422 
423 	if (!area_is_subregion(dev, offset, size)) {
424 		return -EINVAL;
425 	}
426 
427 	const size_t num_sectors = size / SPI_NOR_SECTOR_SIZE;
428 	const size_t num_blocks = size / SPI_NOR_BLOCK_SIZE;
429 
430 	int i;
431 	unsigned int key = 0;
432 
433 	uint8_t *dst = memc_flexspi_get_ahb_address(&data->controller,
434 						    data->port,
435 						    offset);
436 
437 	if (offset % SPI_NOR_SECTOR_SIZE) {
438 		LOG_ERR("Invalid offset");
439 		return -EINVAL;
440 	}
441 
442 	if (size % SPI_NOR_SECTOR_SIZE) {
443 		LOG_ERR("Invalid size");
444 		return -EINVAL;
445 	}
446 
447 	if (memc_flexspi_is_running_xip(&data->controller)) {
448 		/*
449 		 * ==== ENTER CRITICAL SECTION ====
450 		 * No flash access should be performed in critical section. All
451 		 * code and data accessed must reside in ram.
452 		 */
453 		key = irq_lock();
454 		memc_flexspi_wait_bus_idle(&data->controller);
455 	}
456 
457 	if ((offset == 0) && (size == data->config.flashSize * KB(1))) {
458 		flash_flexspi_nor_write_enable(data);
459 		flash_flexspi_nor_erase_chip(data);
460 		flash_flexspi_nor_wait_bus_busy(data);
461 		memc_flexspi_reset(&data->controller);
462 	} else if ((0 == (offset % SPI_NOR_BLOCK_SIZE)) && (0 == (size % SPI_NOR_BLOCK_SIZE))) {
463 		for (i = 0; i < num_blocks; i++) {
464 			flash_flexspi_nor_write_enable(data);
465 			flash_flexspi_nor_erase_block(data, offset);
466 			flash_flexspi_nor_wait_bus_busy(data);
467 			memc_flexspi_reset(&data->controller);
468 			offset += SPI_NOR_BLOCK_SIZE;
469 		}
470 	} else {
471 		for (i = 0; i < num_sectors; i++) {
472 			flash_flexspi_nor_write_enable(data);
473 			flash_flexspi_nor_erase_sector(data, offset);
474 			flash_flexspi_nor_wait_bus_busy(data);
475 			memc_flexspi_reset(&data->controller);
476 			offset += SPI_NOR_SECTOR_SIZE;
477 		}
478 	}
479 
480 	if (memc_flexspi_is_running_xip(&data->controller)) {
481 		/* ==== EXIT CRITICAL SECTION ==== */
482 		irq_unlock(key);
483 	}
484 
485 #ifdef CONFIG_HAS_MCUX_CACHE
486 	DCACHE_InvalidateByRange((uint32_t) dst, size);
487 #endif
488 
489 	return 0;
490 }
491 
flash_flexspi_nor_get_parameters(const struct device * dev)492 static const struct flash_parameters *flash_flexspi_nor_get_parameters(
493 		const struct device *dev)
494 {
495 	struct flash_flexspi_nor_data *data = dev->data;
496 
497 	return &data->flash_parameters;
498 }
499 
flash_flexspi_nor_get_size(const struct device * dev,uint64_t * size)500 static int flash_flexspi_nor_get_size(const struct device *dev, uint64_t *size)
501 {
502 	struct flash_flexspi_nor_data *data = dev->data;
503 
504 	*size = (uint64_t)data->size;
505 
506 	return 0;
507 }
508 
509 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
flash_flexspi_nor_pages_layout(const struct device * dev,const struct flash_pages_layout ** layout,size_t * layout_size)510 static void flash_flexspi_nor_pages_layout(const struct device *dev,
511 		const struct flash_pages_layout **layout, size_t *layout_size)
512 {
513 	struct flash_flexspi_nor_data *data = dev->data;
514 
515 	*layout = &data->layout;
516 	*layout_size = 1;
517 }
518 #endif /* CONFIG_FLASH_PAGE_LAYOUT */
519 
520 
521 /*
522  * This function enables quad mode, when supported. Otherwise it
523  * returns an error.
524  * @param dev: Flexspi device
525  * @param flexspi_lut: flexspi lut table, useful if instruction writes are needed
526  * @param qer: DW15 quad enable parameter
527  * @return 0 if quad mode was entered, or -ENOTSUP if quad mode is not supported
528  */
flash_flexspi_nor_quad_enable(struct flash_flexspi_nor_data * data,uint32_t (* flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ],uint8_t qer)529 static int flash_flexspi_nor_quad_enable(struct flash_flexspi_nor_data *data,
530 					uint32_t (*flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ],
531 					uint8_t qer)
532 {
533 	int ret;
534 	uint32_t buffer = 0;
535 	uint16_t bit = 0;
536 	uint8_t rd_size, wr_size;
537 	flexspi_transfer_t transfer = {
538 		.deviceAddress = 0,
539 		.port = data->port,
540 		.SeqNumber = 1,
541 		.data = &buffer,
542 	};
543 	flexspi_device_config_t config = {
544 		.flexspiRootClk = MHZ(50),
545 		.flashSize = FLEXSPI_FLSHCR0_FLSHSZ_MASK, /* Max flash size */
546 		.ARDSeqNumber = 1,
547 		.ARDSeqIndex = READ,
548 	};
549 
550 	switch (qer) {
551 	case JESD216_DW15_QER_VAL_NONE:
552 		/* No init needed */
553 		return 0;
554 	case JESD216_DW15_QER_VAL_S2B1v1:
555 	case JESD216_DW15_QER_VAL_S2B1v4:
556 		/* Install read and write status command */
557 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
558 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
559 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
560 		flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
561 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_WRSR,
562 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
563 
564 		/* Set bit 1 of status register 2 */
565 		bit = BIT(9);
566 		rd_size = 2;
567 		wr_size = 2;
568 		break;
569 	case JESD216_DW15_QER_VAL_S1B6:
570 		/* Install read and write status command */
571 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
572 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
573 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
574 		flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
575 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_WRSR,
576 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
577 
578 		/* Set bit 6 of status register 1 */
579 		bit = BIT(6);
580 		rd_size = 1;
581 		wr_size = 1;
582 		break;
583 	case JESD216_DW15_QER_VAL_S2B7:
584 		/* Install read and write status command */
585 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
586 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x3F,
587 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
588 		flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
589 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x3E,
590 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
591 
592 		/* Set bit 7 of status register 2 */
593 		bit = BIT(7);
594 		rd_size = 1;
595 		wr_size = 1;
596 		break;
597 	case JESD216_DW15_QER_VAL_S2B1v5:
598 		/* Install read and write status command */
599 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
600 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR2,
601 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
602 		flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
603 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_WRSR,
604 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
605 
606 		/* Set bit 1 of status register 2 */
607 		bit = BIT(9);
608 		rd_size = 1;
609 		wr_size = 2;
610 		break;
611 	case JESD216_DW15_QER_VAL_S2B1v6:
612 		/* Install read and write status command */
613 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
614 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR2,
615 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
616 		flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
617 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_WRSR2,
618 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
619 
620 		/* Set bit 7 of status register 2 */
621 		bit = BIT(7);
622 		rd_size = 1;
623 		wr_size = 1;
624 		break;
625 	default:
626 		return -ENOTSUP;
627 	}
628 	ret = memc_flexspi_set_device_config(&data->controller,
629 				&config,
630 				(uint32_t *)flexspi_lut,
631 				FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
632 				data->port);
633 	if (ret < 0) {
634 		return ret;
635 	}
636 	transfer.dataSize = rd_size;
637 	transfer.seqIndex = SCRATCH_CMD;
638 	transfer.cmdType = kFLEXSPI_Read;
639 	/* Read status register */
640 	ret = memc_flexspi_transfer(&data->controller, &transfer);
641 	if (ret < 0) {
642 		return ret;
643 	}
644 	/* Enable write */
645 	ret = flash_flexspi_nor_write_enable(data);
646 	if (ret < 0) {
647 		return ret;
648 	}
649 	if (qer == JESD216_DW15_QER_VAL_S2B1v5) {
650 		/* Left shift buffer by a byte */
651 		buffer = buffer << 8;
652 	}
653 	buffer |= bit;
654 	transfer.dataSize = wr_size;
655 	transfer.seqIndex = SCRATCH_CMD2;
656 	transfer.cmdType = kFLEXSPI_Write;
657 	ret = memc_flexspi_transfer(&data->controller, &transfer);
658 	if (ret < 0) {
659 		return ret;
660 	}
661 
662 	/* Wait for QE bit to complete programming */
663 	return flash_flexspi_nor_wait_bus_busy(data);
664 }
665 
666 /*
667  * This function enables 4 byte addressing, when supported. Otherwise it
668  * returns an error.
669  * @param dev: Flexspi device
670  * @param flexspi_lut: flexspi lut table, useful if instruction writes are needed
671  * @param en4b: DW16 enable 4 byte mode parameter
672  * @return 0 if 4 byte mode was entered, or -ENOTSUP if 4 byte mode was not supported
673  */
flash_flexspi_nor_4byte_enable(struct flash_flexspi_nor_data * data,uint32_t (* flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ],uint32_t en4b)674 static int flash_flexspi_nor_4byte_enable(struct flash_flexspi_nor_data *data,
675 					uint32_t (*flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ],
676 					uint32_t en4b)
677 {
678 	int ret;
679 	uint32_t buffer = 0;
680 	flexspi_transfer_t transfer = {
681 		.deviceAddress = 0,
682 		.port = data->port,
683 		.SeqNumber = 1,
684 		.data = &buffer,
685 	};
686 	flexspi_device_config_t config = {
687 		.flexspiRootClk = MHZ(50),
688 		.flashSize = FLEXSPI_FLSHCR0_FLSHSZ_MASK, /* Max flash size */
689 		.ARDSeqNumber = 1,
690 		.ARDSeqIndex = READ,
691 	};
692 	if (en4b & BIT(6)) {
693 		/* Flash is always in 4 byte mode. We just need to configure LUT */
694 		return 0;
695 	} else if (en4b & BIT(5)) {
696 		/* Dedicated vendor instruction set, which we don't support. Exit here */
697 		return -ENOTSUP;
698 	} else if (en4b & BIT(4)) {
699 		/* Set bit 0 of 16 bit configuration register */
700 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
701 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB5,
702 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x1);
703 		flexspi_lut[SCRATCH_CMD2][0] = FLEXSPI_LUT_SEQ(
704 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB1,
705 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
706 		ret = memc_flexspi_set_device_config(&data->controller,
707 					&config,
708 					(uint32_t *)flexspi_lut,
709 					FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
710 					data->port);
711 		if (ret < 0) {
712 			return ret;
713 		}
714 		transfer.dataSize = 2;
715 		transfer.seqIndex = SCRATCH_CMD;
716 		transfer.cmdType = kFLEXSPI_Read;
717 		/* Read config register */
718 		ret = memc_flexspi_transfer(&data->controller, &transfer);
719 		if (ret < 0) {
720 			return ret;
721 		}
722 		buffer |= BIT(0);
723 		/* Set config register */
724 		transfer.seqIndex = SCRATCH_CMD2;
725 		transfer.cmdType = kFLEXSPI_Read;
726 		return memc_flexspi_transfer(&data->controller, &transfer);
727 	} else if (en4b & BIT(1)) {
728 		/* Issue write enable, then instruction 0xB7 */
729 		flash_flexspi_nor_write_enable(data);
730 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
731 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB7,
732 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
733 		ret = memc_flexspi_set_device_config(&data->controller,
734 					&config,
735 					(uint32_t *)flexspi_lut,
736 					FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
737 					data->port);
738 		if (ret < 0) {
739 			return ret;
740 		}
741 		transfer.dataSize = 0;
742 		transfer.seqIndex = SCRATCH_CMD;
743 		transfer.cmdType = kFLEXSPI_Command;
744 		return memc_flexspi_transfer(&data->controller, &transfer);
745 	} else if (en4b & BIT(0)) {
746 		/* Issue instruction 0xB7 */
747 		flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
748 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xB7,
749 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
750 		ret = memc_flexspi_set_device_config(&data->controller,
751 					&config,
752 					(uint32_t *)flexspi_lut,
753 					FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
754 					data->port);
755 		if (ret < 0) {
756 			return ret;
757 		}
758 		transfer.dataSize = 0;
759 		transfer.seqIndex = SCRATCH_CMD;
760 		transfer.cmdType = kFLEXSPI_Command;
761 		return memc_flexspi_transfer(&data->controller, &transfer);
762 	}
763 	/* Other methods not supported */
764 	return -ENOTSUP;
765 }
766 
767 /*
768  * This function configures the FlexSPI to manage the flash device
769  * based on values in SFDP header
770  * @param data: Flexspi device data
771  * @param header: SFDP header for flash
772  * @param bfp: basic flash parameters for flash
773  * @param flexspi_lut: LUT table, filled with READ LUT command
774  * @return 0 on success, or negative value on error
775  */
flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data * data,struct jesd216_sfdp_header * header,struct jesd216_bfp * bfp,uint32_t (* flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ])776 static int flash_flexspi_nor_config_flash(struct flash_flexspi_nor_data *data,
777 			struct jesd216_sfdp_header *header,
778 			struct jesd216_bfp *bfp,
779 			uint32_t (*flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ])
780 {
781 	struct jesd216_instr instr;
782 	struct jesd216_bfp_dw16 dw16;
783 	struct jesd216_bfp_dw15 dw15;
784 	struct jesd216_bfp_dw14 dw14;
785 	uint8_t addr_width;
786 	uint8_t mode_cmd;
787 	int ret;
788 
789 	/* Read DW14 to determine the polling method we should use while programming */
790 	ret = jesd216_bfp_decode_dw14(&header->phdr[0], bfp, &dw14);
791 	if (ret < 0) {
792 		/* Default to legacy polling mode */
793 		dw14.poll_options = 0x0;
794 	}
795 	if (dw14.poll_options & BIT(1)) {
796 		/* Read instruction used for polling is 0x70 */
797 		data->legacy_poll = false;
798 		flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
799 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x70,
800 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
801 	} else {
802 		/* Read instruction used for polling is 0x05 */
803 		data->legacy_poll = true;
804 		flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
805 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
806 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
807 	}
808 
809 	addr_width = jesd216_bfp_addrbytes(bfp) ==
810 		JESD216_SFDP_BFP_DW1_ADDRBYTES_VAL_4B ? 32 : 24;
811 
812 	/* Check to see if we can enable 4 byte addressing */
813 	ret = jesd216_bfp_decode_dw16(&header->phdr[0], bfp, &dw16);
814 	if (ret == 0) {
815 		/* Attempt to enable 4 byte addressing */
816 		ret = flash_flexspi_nor_4byte_enable(data, flexspi_lut,
817 						     dw16.enter_4ba);
818 		if (ret == 0) {
819 			/* Use 4 byte address width */
820 			addr_width = 32;
821 			/* Update LUT for ERASE_SECTOR and ERASE_BLOCK to use 32 bit addr */
822 			flexspi_lut[ERASE_SECTOR][0] = FLEXSPI_LUT_SEQ(
823 					kFLEXSPI_Command_SDR, kFLEXSPI_1PAD,
824 					SPI_NOR_CMD_SE, kFLEXSPI_Command_RADDR_SDR,
825 					kFLEXSPI_1PAD, addr_width);
826 			flexspi_lut[ERASE_BLOCK][0] = FLEXSPI_LUT_SEQ(
827 					kFLEXSPI_Command_SDR, kFLEXSPI_1PAD,
828 					SPI_NOR_CMD_BE, kFLEXSPI_Command_RADDR_SDR,
829 					kFLEXSPI_1PAD, addr_width);
830 		}
831 	}
832 	/* Extract the read command.
833 	 * Note- enhanced XIP not currently supported, nor is 4-4-4 mode.
834 	 */
835 	if (jesd216_bfp_read_support(&header->phdr[0], bfp,
836 	    JESD216_MODE_144, &instr) > 0) {
837 		LOG_DBG("Enable 144 mode");
838 		/* Configure for 144 QUAD read mode */
839 		if (instr.mode_clocks == 2) {
840 			mode_cmd = kFLEXSPI_Command_MODE8_SDR;
841 		} else if (instr.mode_clocks == 1) {
842 			mode_cmd = kFLEXSPI_Command_MODE4_SDR;
843 		} else if (instr.mode_clocks == 0) {
844 			/* Just send dummy cycles during mode clock period */
845 			mode_cmd = kFLEXSPI_Command_DUMMY_SDR;
846 		} else {
847 			return -ENOTSUP;
848 		}
849 		flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
850 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, instr.instr,
851 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, addr_width);
852 		/* Note- we always set mode bits to 0x0 */
853 		flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
854 				mode_cmd, kFLEXSPI_4PAD, 0x00,
855 				kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, instr.wait_states);
856 		flexspi_lut[READ][2] = FLEXSPI_LUT_SEQ(
857 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04,
858 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
859 		/* Read 1S-4S-4S enable method */
860 		ret = jesd216_bfp_decode_dw15(&header->phdr[0], bfp, &dw15);
861 		if (ret == 0) {
862 			ret = flash_flexspi_nor_quad_enable(data, flexspi_lut,
863 							    dw15.qer);
864 			if (ret == 0) {
865 				/* Now, install 1S-1S-4S page program command */
866 				flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
867 						kFLEXSPI_Command_SDR, kFLEXSPI_1PAD,
868 						SPI_NOR_CMD_PP_1_1_4, kFLEXSPI_Command_RADDR_SDR,
869 						kFLEXSPI_1PAD, addr_width);
870 				flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
871 						kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD,
872 						0x4, kFLEXSPI_Command_STOP,
873 						kFLEXSPI_1PAD, 0x0);
874 			}
875 		}
876 
877 	} else if (jesd216_bfp_read_support(&header->phdr[0], bfp,
878 	    JESD216_MODE_122, &instr) > 0) {
879 		LOG_DBG("Enable 122 mode");
880 		if (instr.mode_clocks == 4) {
881 			mode_cmd = kFLEXSPI_Command_MODE8_SDR;
882 		} else if (instr.mode_clocks == 2) {
883 			mode_cmd = kFLEXSPI_Command_MODE4_SDR;
884 		} else if (instr.mode_clocks == 1) {
885 			mode_cmd = kFLEXSPI_Command_MODE2_SDR;
886 		} else if (instr.mode_clocks == 0) {
887 			/* Just send dummy cycles during mode clock period */
888 			mode_cmd = kFLEXSPI_Command_DUMMY_SDR;
889 		} else {
890 			return -ENOTSUP;
891 		}
892 		flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
893 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, instr.instr,
894 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_2PAD, addr_width);
895 		/* Note- we always set mode bits to 0x0 */
896 		flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
897 				mode_cmd, kFLEXSPI_2PAD, 0x0,
898 				kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_2PAD, instr.wait_states);
899 		flexspi_lut[READ][2] = FLEXSPI_LUT_SEQ(
900 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_2PAD, 0x02,
901 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
902 		/* Now, install 1S-1S-2S page program command */
903 		flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
904 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP_1_1_2,
905 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, addr_width);
906 		flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
907 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_2PAD, 0x4,
908 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
909 	}
910 	/* Default to 111 mode if no support exists, leave READ/WRITE untouched */
911 
912 	return 0;
913 }
914 
915 /* Helper so we can avoid flash access while performing SFDP probe */
flash_flexspi_nor_sfdp_read_helper(struct flash_flexspi_nor_data * dev_data,off_t offset,void * data,size_t len)916 static int flash_flexspi_nor_sfdp_read_helper(struct flash_flexspi_nor_data *dev_data,
917 		off_t offset, void *data, size_t len)
918 {
919 	flexspi_transfer_t transfer = {
920 		.deviceAddress = offset,
921 		.port = dev_data->port,
922 		.cmdType = kFLEXSPI_Read,
923 		.seqIndex = READ_JESD216,
924 		.SeqNumber = 1,
925 		.data = (uint32_t *)data,
926 		.dataSize = len,
927 	};
928 
929 	/* Get SFDP data */
930 	return memc_flexspi_transfer(&dev_data->controller, &transfer);
931 }
932 
933 
934 #if defined(CONFIG_FLASH_JESD216_API)
935 
flash_flexspi_nor_sfdp_read(const struct device * dev,off_t offset,void * data,size_t len)936 static int flash_flexspi_nor_sfdp_read(const struct device *dev,
937 		off_t offset, void *data, size_t len)
938 {
939 	struct flash_flexspi_nor_data *dev_data = dev->data;
940 
941 	return flash_flexspi_nor_sfdp_read_helper(dev_data, offset, data, len);
942 }
943 
944 #endif
945 
946 /* Helper to configure IS25 flash, by clearing read param bits */
flash_flexspi_nor_is25_clear_read_param(struct flash_flexspi_nor_data * data,uint32_t (* flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ],uint32_t * read_params)947 static int flash_flexspi_nor_is25_clear_read_param(struct flash_flexspi_nor_data *data,
948 			uint32_t (*flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ],
949 			uint32_t *read_params)
950 {
951 	int ret;
952 	/* Install Set Read Parameters (Volatile) command */
953 	flexspi_transfer_t transfer = {
954 		.deviceAddress = 0,
955 		.port = data->port,
956 		.seqIndex = SCRATCH_CMD,
957 		.SeqNumber = 1,
958 		.data = read_params,
959 		.dataSize = 1,
960 		.cmdType = kFLEXSPI_Write,
961 	};
962 	flexspi_device_config_t config = {
963 		.flexspiRootClk = MHZ(50),
964 		.flashSize = FLEXSPI_FLSHCR0_FLSHSZ_MASK, /* Max flash size */
965 		.ARDSeqNumber = 1,
966 		.ARDSeqIndex = READ,
967 	};
968 
969 	flexspi_lut[SCRATCH_CMD][0] = FLEXSPI_LUT_SEQ(
970 			kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC0,
971 			kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x1);
972 	ret = memc_flexspi_set_device_config(&data->controller,
973 				&config,
974 				(uint32_t *)flexspi_lut,
975 				FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
976 				data->port);
977 	if (ret < 0) {
978 		return ret;
979 	}
980 	return memc_flexspi_transfer(&data->controller, &transfer);
981 }
982 
983 /* Checks JEDEC ID of flash. If supported, installs custom LUT table */
flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data * data,uint32_t (* flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ])984 static int flash_flexspi_nor_check_jedec(struct flash_flexspi_nor_data *data,
985 			uint32_t (*flexspi_lut)[MEMC_FLEXSPI_CMD_PER_SEQ])
986 {
987 	int ret;
988 	uint32_t vendor_id;
989 	uint32_t read_params;
990 
991 	ret = flash_flexspi_nor_read_id_helper(data, (uint8_t *)&vendor_id);
992 	if (ret < 0) {
993 		return ret;
994 	}
995 
996 	/* Switch on manufacturer and vendor ID */
997 	switch (vendor_id & 0xFFFFFF) {
998 	case 0x16609d: /* IS25LP032 flash, needs P[4:3] cleared with same method as IS25WP */
999 	case 0x17609d: /* IS25LP064 */
1000 	case 0x18609d: /* IS25LP128 */
1001 		read_params = 0xE0U;
1002 		ret = flash_flexspi_nor_is25_clear_read_param(data, flexspi_lut, &read_params);
1003 		if (ret < 0) {
1004 			while (1) {
1005 				/*
1006 				 * Spin here, this flash won't configure correctly.
1007 				 * We can't print a warning, as we are unlikely to
1008 				 * be able to XIP at this point.
1009 				 */
1010 			}
1011 		}
1012 		/* Still return an error- we want the JEDEC configuration to run */
1013 		return -ENOTSUP;
1014 	case 0x16709d: /* IS25WP032 */
1015 	case 0x17709d: /* IS25WP064 */
1016 	case 0x18709d: /* IS25WP128 */
1017 		/*
1018 		 * IS25WP flash. We can support this flash with the JEDEC probe,
1019 		 * but we need to insure P[6:3] are at the default value
1020 		 */
1021 		read_params = 0;
1022 		ret = flash_flexspi_nor_is25_clear_read_param(data, flexspi_lut, &read_params);
1023 		if (ret < 0) {
1024 			while (1) {
1025 				/*
1026 				 * Spin here, this flash won't configure correctly.
1027 				 * We can't print a warning, as we are unlikely to
1028 				 * be able to XIP at this point.
1029 				 */
1030 			}
1031 		}
1032 		/* Still return an error- we want the JEDEC configuration to run */
1033 		return -ENOTSUP;
1034 	case 0x2040ef:
1035 		/* W25Q512JV-IQ/IN flash, use 4 byte read/write */
1036 		flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
1037 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_4READ_4B,
1038 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 32);
1039 		/* Flash needs 6 dummy cycles (at 104MHz) */
1040 		flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
1041 				kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 6,
1042 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04);
1043 		/* Only 1S-1S-4S page program supported */
1044 		flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
1045 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP_1_1_4_4B,
1046 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32);
1047 		flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
1048 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x4,
1049 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
1050 		/* Update ERASE commands for 4 byte mode */
1051 		flexspi_lut[ERASE_SECTOR][0] = FLEXSPI_LUT_SEQ(
1052 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_SE_4B,
1053 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32);
1054 		flexspi_lut[ERASE_BLOCK][0] = FLEXSPI_LUT_SEQ(
1055 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE_4B,
1056 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32),
1057 		/* Read instruction used for polling is 0x05 */
1058 		data->legacy_poll = true;
1059 		flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
1060 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
1061 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
1062 		/* Device uses bit 1 of status reg 2 for QE */
1063 		return flash_flexspi_nor_quad_enable(data, flexspi_lut,
1064 						     JESD216_DW15_QER_VAL_S2B1v5);
1065 	case 0x2060ef:
1066 		/* W25Q512NW-IQ/IN flash, use 4 byte read/write */
1067 		flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
1068 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_4READ_4B,
1069 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 32);
1070 		/* Flash needs 8 dummy cycles (at 133MHz) */
1071 		flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
1072 				kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 8,
1073 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04);
1074 		/* Only 1S-1S-4S page program supported */
1075 		flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
1076 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP_1_1_4_4B,
1077 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32);
1078 		flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
1079 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x4,
1080 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
1081 		/* Update ERASE commands for 4 byte mode */
1082 		flexspi_lut[ERASE_SECTOR][0] = FLEXSPI_LUT_SEQ(
1083 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_SE_4B,
1084 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32);
1085 		flexspi_lut[ERASE_BLOCK][0] = FLEXSPI_LUT_SEQ(
1086 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE_4B,
1087 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32),
1088 		/* Read instruction used for polling is 0x05 */
1089 		data->legacy_poll = true;
1090 		flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
1091 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
1092 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
1093 		/* Device uses bit 1 of status reg 2 for QE */
1094 		return flash_flexspi_nor_quad_enable(data, flexspi_lut,
1095 						     JESD216_DW15_QER_VAL_S2B1v5);
1096 	case 0x3A25C2:
1097 		/* MX25U51245G flash, use 4 byte read/write */
1098 		flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
1099 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_4READ_4B,
1100 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 32);
1101 		/* Flash needs 10 dummy cycles */
1102 		flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
1103 				kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 10,
1104 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04);
1105 		/* Only 1S-4S-4S page program supported */
1106 		flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
1107 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP_1_4_4_4B,
1108 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 32);
1109 		flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
1110 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x4,
1111 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
1112 		/* Update ERASE commands for 4 byte mode */
1113 		flexspi_lut[ERASE_SECTOR][0] = FLEXSPI_LUT_SEQ(
1114 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_SE_4B,
1115 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32);
1116 		flexspi_lut[ERASE_BLOCK][0] = FLEXSPI_LUT_SEQ(
1117 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE_4B,
1118 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32),
1119 		/* Read instruction used for polling is 0x05 */
1120 		data->legacy_poll = true;
1121 		flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
1122 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
1123 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
1124 		/* Device uses bit 6 of status reg 1 for QE */
1125 		return flash_flexspi_nor_quad_enable(data, flexspi_lut, JESD216_DW15_QER_VAL_S1B6);
1126 	case 0x19ba20: /* MT25QL256 */
1127 	case 0x20ba20: /* MT25QL512 */
1128 	case 0x21ba20: /* MT25QL01G */
1129 	case 0x22ba20: /* MT25QL02G */
1130 	case 0x19bb20: /* MT25QU256 */
1131 	case 0x20bb20: /* MT25QU512 */
1132 	case 0x21bb20: /* MT25QU01G */
1133 	case 0x22bb20: /* MT25QU02G */
1134 		/* MT25Q flash with more than 32MB, use 4 byte read/write */
1135 		flexspi_lut[READ][0] = FLEXSPI_LUT_SEQ(
1136 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_4READ_4B,
1137 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 32);
1138 		/* Flash needs 10 dummy cycles */
1139 		flexspi_lut[READ][1] = FLEXSPI_LUT_SEQ(
1140 				kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 10,
1141 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04);
1142 		/* Update PROGRAM commands for 4 byte 1S-4S-4S mode */
1143 		flexspi_lut[PAGE_PROGRAM][0] = FLEXSPI_LUT_SEQ(
1144 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_PP_1_4_4_4B,
1145 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 32);
1146 		flexspi_lut[PAGE_PROGRAM][1] = FLEXSPI_LUT_SEQ(
1147 				kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x4,
1148 				kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0);
1149 		/* Update ERASE commands for 4 byte mode */
1150 		flexspi_lut[ERASE_SECTOR][0] = FLEXSPI_LUT_SEQ(
1151 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_SE_4B,
1152 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32);
1153 		flexspi_lut[ERASE_BLOCK][0] = FLEXSPI_LUT_SEQ(
1154 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_BE_4B,
1155 				kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 32),
1156 		/* Read instruction used for polling is 0x05 */
1157 		data->legacy_poll = true;
1158 		flexspi_lut[READ_STATUS_REG][0] = FLEXSPI_LUT_SEQ(
1159 				kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, SPI_NOR_CMD_RDSR,
1160 				kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x01);
1161 		/* Device has no QE bit, 1-4-4 and 1-1-4 is always enabled */
1162 		return 0;
1163 	default:
1164 		return -ENOTSUP;
1165 	}
1166 }
1167 
1168 /* Probe parameters from flash SFDP header, and use them to configure the FlexSPI */
flash_flexspi_nor_probe(struct flash_flexspi_nor_data * data)1169 static int flash_flexspi_nor_probe(struct flash_flexspi_nor_data *data)
1170 {
1171 	/* JESD216B defines up to 23 basic flash parameters */
1172 	uint32_t param_buf[23];
1173 	/* Space to store SFDP header and first parameter header */
1174 	uint8_t sfdp_buf[JESD216_SFDP_SIZE(1)] __aligned(4);
1175 	struct jesd216_bfp *bfp = (struct jesd216_bfp *)param_buf;
1176 	struct jesd216_sfdp_header *header = (struct jesd216_sfdp_header *)sfdp_buf;
1177 	int ret;
1178 	unsigned int key = 0U;
1179 
1180 	flexspi_device_config_t config = {
1181 		.flexspiRootClk = MHZ(50),
1182 		.flashSize = FLEXSPI_FLSHCR0_FLSHSZ_MASK, /* Max flash size */
1183 		.ARDSeqNumber = 1,
1184 		.ARDSeqIndex = READ,
1185 	};
1186 
1187 	if (memc_flexspi_is_running_xip(&data->controller)) {
1188 		/*
1189 		 * ==== ENTER CRITICAL SECTION ====
1190 		 * No flash access should be performed in critical section. All
1191 		 * code and data accessed must reside in ram.
1192 		 */
1193 		key = irq_lock();
1194 		memc_flexspi_wait_bus_idle(&data->controller);
1195 	}
1196 
1197 	/* SFDP spec requires that we downclock the FlexSPI to 50MHz or less */
1198 	ret = memc_flexspi_update_clock(&data->controller, &config,
1199 					data->port, MHZ(50));
1200 	if (ret < 0) {
1201 		goto _exit;
1202 	}
1203 
1204 	/* Setup initial LUT table and FlexSPI configuration */
1205 	memcpy(flexspi_probe_lut, flash_flexspi_nor_base_lut,
1206 	       sizeof(flash_flexspi_nor_base_lut));
1207 
1208 	ret = memc_flexspi_set_device_config(&data->controller, &config,
1209 					(uint32_t *)flexspi_probe_lut,
1210 					FLEXSPI_INSTR_END * MEMC_FLEXSPI_CMD_PER_SEQ,
1211 					data->port);
1212 	if (ret < 0) {
1213 		goto _exit;
1214 	}
1215 
1216 	/* First, check if the JEDEC ID of this flash has explicit support
1217 	 * in this driver
1218 	 */
1219 	ret = flash_flexspi_nor_check_jedec(data, flexspi_probe_lut);
1220 	if (ret == 0) {
1221 		/* Flash was supported, SFDP probe not needed */
1222 		goto _program_lut;
1223 	}
1224 
1225 	ret = flash_flexspi_nor_sfdp_read_helper(data, 0, sfdp_buf, sizeof(sfdp_buf));
1226 	if (ret < 0) {
1227 		goto _exit;
1228 	}
1229 
1230 	LOG_DBG("SFDP header magic: 0x%x", header->magic);
1231 	if (jesd216_sfdp_magic(header) != JESD216_SFDP_MAGIC) {
1232 		/* Header was read incorrectly */
1233 		LOG_WRN("Invalid header, using legacy SPI mode");
1234 		data->legacy_poll = true;
1235 		goto _program_lut;
1236 	}
1237 
1238 	if (header->phdr[0].len_dw > ARRAY_SIZE(param_buf)) {
1239 		/* Not enough space to read parameter table */
1240 		ret = -ENOBUFS;
1241 		goto _exit;
1242 	}
1243 
1244 	/* Read basic flash parameter table */
1245 	ret = flash_flexspi_nor_sfdp_read_helper(data,
1246 			jesd216_param_addr(&header->phdr[0]),
1247 			param_buf,
1248 			sizeof(uint32_t) * header->phdr[0].len_dw);
1249 	if (ret < 0) {
1250 		goto _exit;
1251 	}
1252 
1253 	/* Configure flash */
1254 	ret = flash_flexspi_nor_config_flash(data, header, bfp,
1255 					     flexspi_probe_lut);
1256 	if (ret < 0) {
1257 		goto _exit;
1258 	}
1259 
1260 _program_lut:
1261 	/*
1262 	 * Update the FlexSPI with the config structure provided
1263 	 * from devicetree and the configured LUT
1264 	 */
1265 	ret = memc_flexspi_set_device_config(&data->controller, &data->config,
1266 					(uint32_t *)flexspi_probe_lut,
1267 					FLEXSPI_INSTR_PROG_END * MEMC_FLEXSPI_CMD_PER_SEQ,
1268 					data->port);
1269 	if (ret < 0) {
1270 		return ret;
1271 	}
1272 
1273 _exit:
1274 	memc_flexspi_reset(&data->controller);
1275 
1276 	if (memc_flexspi_is_running_xip(&data->controller)) {
1277 		/* ==== EXIT CRITICAL SECTION ==== */
1278 		irq_unlock(key);
1279 	}
1280 
1281 	return ret;
1282 }
1283 
flash_flexspi_nor_init(const struct device * dev)1284 static int flash_flexspi_nor_init(const struct device *dev)
1285 {
1286 	const struct flash_flexspi_nor_config *config = dev->config;
1287 	struct flash_flexspi_nor_data *data = dev->data;
1288 	uint32_t vendor_id;
1289 
1290 	/* First step- use ROM pointer to controller device to create
1291 	 * a copy of the device structure in RAM we can use while in
1292 	 * critical sections of code.
1293 	 */
1294 	memcpy(&data->controller, config->controller, sizeof(struct device));
1295 
1296 	if (!device_is_ready(&data->controller)) {
1297 		LOG_ERR("Controller device is not ready");
1298 		return -ENODEV;
1299 	}
1300 
1301 	if (flash_flexspi_nor_probe(data)) {
1302 		if (memc_flexspi_is_running_xip(&data->controller)) {
1303 			/* We can't continue from here- the LUT stored in
1304 			 * the FlexSPI will be invalid so we cannot XIP.
1305 			 * Instead, spin here
1306 			 */
1307 			while (1) {
1308 				/* Spin */
1309 			}
1310 		}
1311 		LOG_ERR("SFDP probe failed");
1312 		return -EIO;
1313 	}
1314 
1315 	/* Set the FlexSPI to full clock speed */
1316 	if (memc_flexspi_update_clock(&data->controller, &data->config,
1317 					data->port, data->config.flexspiRootClk)) {
1318 		LOG_ERR("Could not set flexspi clock speed");
1319 		return -ENOTSUP;
1320 	}
1321 
1322 
1323 	memc_flexspi_reset(&data->controller);
1324 
1325 	if (flash_flexspi_nor_read_id(dev, (uint8_t *)&vendor_id)) {
1326 		LOG_ERR("Could not read vendor id");
1327 		return -EIO;
1328 	}
1329 	LOG_DBG("Vendor id: 0x%0x", vendor_id);
1330 
1331 	return 0;
1332 }
1333 
1334 static DEVICE_API(flash, flash_flexspi_nor_api) = {
1335 	.erase = flash_flexspi_nor_erase,
1336 	.write = flash_flexspi_nor_write,
1337 	.read = flash_flexspi_nor_read,
1338 	.get_parameters = flash_flexspi_nor_get_parameters,
1339 	.get_size = flash_flexspi_nor_get_size,
1340 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
1341 	.page_layout = flash_flexspi_nor_pages_layout,
1342 #endif
1343 #if defined(CONFIG_FLASH_JESD216_API)
1344 	.sfdp_read = flash_flexspi_nor_sfdp_read,
1345 	.read_jedec_id = flash_flexspi_nor_read_id,
1346 #endif
1347 };
1348 
1349 #define CONCAT3(x, y, z) x ## y ## z
1350 
1351 #define CS_INTERVAL_UNIT(unit)						\
1352 	CONCAT3(kFLEXSPI_CsIntervalUnit, unit, SckCycle)
1353 
1354 #define AHB_WRITE_WAIT_UNIT(unit)					\
1355 	CONCAT3(kFLEXSPI_AhbWriteWaitUnit, unit, AhbCycle)
1356 
1357 #define FLASH_FLEXSPI_DEVICE_CONFIG(n)					\
1358 	{								\
1359 		.flexspiRootClk = DT_INST_PROP(n, spi_max_frequency),	\
1360 		.flashSize = DT_INST_PROP(n, size) / 8 / KB(1),		\
1361 		.CSIntervalUnit =					\
1362 			CS_INTERVAL_UNIT(				\
1363 				DT_INST_PROP(n, cs_interval_unit)),	\
1364 		.CSInterval = DT_INST_PROP(n, cs_interval),		\
1365 		.CSHoldTime = DT_INST_PROP(n, cs_hold_time),		\
1366 		.CSSetupTime = DT_INST_PROP(n, cs_setup_time),		\
1367 		.dataValidTime = DT_INST_PROP(n, data_valid_time),	\
1368 		.columnspace = DT_INST_PROP(n, column_space),		\
1369 		.enableWordAddress = DT_INST_PROP(n, word_addressable),	\
1370 		.AWRSeqIndex = 0,					\
1371 		.AWRSeqNumber = 0,					\
1372 		.ARDSeqIndex = READ,					\
1373 		.ARDSeqNumber = 1,					\
1374 		.AHBWriteWaitUnit =					\
1375 			AHB_WRITE_WAIT_UNIT(				\
1376 				DT_INST_PROP(n, ahb_write_wait_unit)),	\
1377 		.AHBWriteWaitInterval =					\
1378 			DT_INST_PROP(n, ahb_write_wait_interval),	\
1379 	}								\
1380 
1381 #define FLASH_FLEXSPI_NOR(n)						\
1382 	static const struct flash_flexspi_nor_config			\
1383 		flash_flexspi_nor_config_##n = {			\
1384 		.controller = DEVICE_DT_GET(DT_INST_BUS(n)),		\
1385 	};								\
1386 	static struct flash_flexspi_nor_data				\
1387 		flash_flexspi_nor_data_##n = {				\
1388 		.config = FLASH_FLEXSPI_DEVICE_CONFIG(n),		\
1389 		.port = DT_INST_REG_ADDR(n),				\
1390 		.size = DT_INST_PROP(n, size) / 8,			\
1391 		.layout = {						\
1392 			.pages_count = DT_INST_PROP(n, size) / 8	\
1393 				/ SPI_NOR_SECTOR_SIZE,			\
1394 			.pages_size = SPI_NOR_SECTOR_SIZE,		\
1395 		},							\
1396 		.flash_parameters = {					\
1397 			.write_block_size = NOR_WRITE_SIZE,		\
1398 			.erase_value = NOR_ERASE_VALUE,			\
1399 		},							\
1400 	};								\
1401 									\
1402 	DEVICE_DT_INST_DEFINE(n,					\
1403 			      flash_flexspi_nor_init,			\
1404 			      NULL,					\
1405 			      &flash_flexspi_nor_data_##n,		\
1406 			      &flash_flexspi_nor_config_##n,		\
1407 			      POST_KERNEL,				\
1408 			      CONFIG_FLASH_INIT_PRIORITY,		\
1409 			      &flash_flexspi_nor_api);
1410 
1411 DT_INST_FOREACH_STATUS_OKAY(FLASH_FLEXSPI_NOR)
1412