1 /*
2  * Copyright (c) 2022 STMicroelectronics
3  * Copyright (c) 2022 Georgij Cernysiov
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #define DT_DRV_COMPAT st_stm32_ospi_nor
9 
10 #include <errno.h>
11 #include <zephyr/kernel.h>
12 #include <zephyr/toolchain.h>
13 #include <zephyr/arch/common/ffs.h>
14 #include <zephyr/sys/util.h>
15 #include <soc.h>
16 #include <zephyr/drivers/pinctrl.h>
17 #include <zephyr/drivers/clock_control/stm32_clock_control.h>
18 #include <zephyr/drivers/clock_control.h>
19 #include <zephyr/drivers/flash.h>
20 #include <zephyr/dt-bindings/flash_controller/ospi.h>
21 #include <zephyr/drivers/gpio.h>
22 #include <zephyr/irq.h>
23 
24 #include "spi_nor.h"
25 #include "jesd216.h"
26 
27 #include "flash_stm32_ospi.h"
28 
29 #include <zephyr/logging/log.h>
30 LOG_MODULE_REGISTER(flash_stm32_ospi, CONFIG_FLASH_LOG_LEVEL);
31 
32 #define STM32_OSPI_NODE DT_INST_PARENT(0)
33 
34 #define DT_OSPI_IO_PORT_PROP_OR(prop, default_value)					\
35 	COND_CODE_1(DT_NODE_HAS_PROP(STM32_OSPI_NODE, prop),				\
36 		    (_CONCAT(HAL_OSPIM_, DT_STRING_TOKEN(STM32_OSPI_NODE, prop))),	\
37 		    ((default_value)))
38 
39 #define DT_OSPI_PROP_OR(prop, default_value) \
40 	DT_PROP_OR(STM32_OSPI_NODE, prop, default_value)
41 
42 /* Get the base address of the flash from the DTS node */
43 #define STM32_OSPI_BASE_ADDRESS DT_INST_REG_ADDR(0)
44 
45 #define STM32_OSPI_RESET_GPIO DT_INST_NODE_HAS_PROP(0, reset_gpios)
46 
47 #define STM32_OSPI_DLYB_BYPASSED DT_PROP(STM32_OSPI_NODE, dlyb_bypass)
48 
49 #define STM32_OSPI_USE_DMA DT_NODE_HAS_PROP(STM32_OSPI_NODE, dmas)
50 
51 #if STM32_OSPI_USE_DMA
52 #include <zephyr/drivers/dma/dma_stm32.h>
53 #include <zephyr/drivers/dma.h>
54 #include <stm32_ll_dma.h>
55 #endif /* STM32_OSPI_USE_DMA */
56 
57 #define STM32_OSPI_FIFO_THRESHOLD         4
58 
59 #if defined(CONFIG_SOC_SERIES_STM32H5X)
60 /* Valid range is [0, 255] */
61 #define STM32_OSPI_CLOCK_PRESCALER_MIN  0U
62 #define STM32_OSPI_CLOCK_PRESCALER_MAX  255U
63 #define STM32_OSPI_CLOCK_COMPUTE(bus_freq, prescaler) ((bus_freq) / ((prescaler) + 1U))
64 #else
65 /* Valid range is [1, 256] */
66 #define STM32_OSPI_CLOCK_PRESCALER_MIN  1U
67 #define STM32_OSPI_CLOCK_PRESCALER_MAX  256U
68 #define STM32_OSPI_CLOCK_COMPUTE(bus_freq, prescaler) ((bus_freq) / (prescaler))
69 #endif
70 
71 /* Max Time value during reset or erase operation */
72 #define STM32_OSPI_RESET_MAX_TIME               100U
73 #define STM32_OSPI_BULK_ERASE_MAX_TIME          460000U
74 #define STM32_OSPI_SECTOR_ERASE_MAX_TIME        1000U
75 #define STM32_OSPI_SUBSECTOR_4K_ERASE_MAX_TIME  400U
76 #define STM32_OSPI_WRITE_REG_MAX_TIME           40U
77 
78 /* used as default value for DTS writeoc */
79 #define SPI_NOR_WRITEOC_NONE 0xFF
80 
81 #if STM32_OSPI_USE_DMA
82 #if CONFIG_DMA_STM32U5
83 static const uint32_t table_src_size[] = {
84 	LL_DMA_SRC_DATAWIDTH_BYTE,
85 	LL_DMA_SRC_DATAWIDTH_HALFWORD,
86 	LL_DMA_SRC_DATAWIDTH_WORD,
87 };
88 
89 static const uint32_t table_dest_size[] = {
90 	LL_DMA_DEST_DATAWIDTH_BYTE,
91 	LL_DMA_DEST_DATAWIDTH_HALFWORD,
92 	LL_DMA_DEST_DATAWIDTH_WORD,
93 };
94 
95 /* Lookup table to set dma priority from the DTS */
96 static const uint32_t table_priority[] = {
97 	LL_DMA_LOW_PRIORITY_LOW_WEIGHT,
98 	LL_DMA_LOW_PRIORITY_MID_WEIGHT,
99 	LL_DMA_LOW_PRIORITY_HIGH_WEIGHT,
100 	LL_DMA_HIGH_PRIORITY,
101 };
102 #else
103 static const uint32_t table_m_size[] = {
104 	LL_DMA_MDATAALIGN_BYTE,
105 	LL_DMA_MDATAALIGN_HALFWORD,
106 	LL_DMA_MDATAALIGN_WORD,
107 };
108 
109 static const uint32_t table_p_size[] = {
110 	LL_DMA_PDATAALIGN_BYTE,
111 	LL_DMA_PDATAALIGN_HALFWORD,
112 	LL_DMA_PDATAALIGN_WORD,
113 };
114 
115 /* Lookup table to set dma priority from the DTS */
116 static const uint32_t table_priority[] = {
117 	DMA_PRIORITY_LOW,
118 	DMA_PRIORITY_MEDIUM,
119 	DMA_PRIORITY_HIGH,
120 	DMA_PRIORITY_VERY_HIGH,
121 };
122 #endif /* CONFIG_DMA_STM32U5 */
123 
124 struct stream {
125 	DMA_TypeDef *reg;
126 	const struct device *dev;
127 	uint32_t channel;
128 	struct dma_config cfg;
129 };
130 #endif /* STM32_OSPI_USE_DMA */
131 
132 typedef void (*irq_config_func_t)(const struct device *dev);
133 
134 struct flash_stm32_ospi_config {
135 	OCTOSPI_TypeDef *regs;
136 	const struct stm32_pclken pclken; /* clock subsystem */
137 #if DT_CLOCKS_HAS_NAME(STM32_OSPI_NODE, ospi_ker)
138 	const struct stm32_pclken pclken_ker; /* clock subsystem */
139 #endif
140 #if DT_CLOCKS_HAS_NAME(STM32_OSPI_NODE, ospi_mgr)
141 	const struct stm32_pclken pclken_mgr; /* clock subsystem */
142 #endif
143 	irq_config_func_t irq_config;
144 	size_t flash_size;
145 	uint32_t max_frequency;
146 	int data_mode; /* SPI or QSPI or OSPI */
147 	int data_rate; /* DTR or STR */
148 	const struct pinctrl_dev_config *pcfg;
149 #if STM32_OSPI_RESET_GPIO
150 	const struct gpio_dt_spec reset;
151 #endif /* STM32_OSPI_RESET_GPIO */
152 #if DT_NODE_HAS_PROP(DT_INST(0, st_stm32_ospi_nor), sfdp_bfp)
153 	uint8_t sfdp_bfp[DT_INST_PROP_LEN(0, sfdp_bfp)];
154 #endif /* sfdp_bfp */
155 };
156 
157 struct flash_stm32_ospi_data {
158 	OSPI_HandleTypeDef hospi;
159 	struct k_sem sem;
160 	struct k_sem sync;
161 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
162 	struct flash_pages_layout layout;
163 #endif
164 	struct jesd216_erase_type erase_types[JESD216_NUM_ERASE_TYPES];
165 	/* Number of bytes per page */
166 	uint16_t page_size;
167 	/* Address width in bytes */
168 	uint8_t address_width;
169 	/* Read operation dummy cycles */
170 	uint8_t read_dummy;
171 	uint32_t read_opcode;
172 	uint32_t write_opcode;
173 	enum jesd216_mode_type read_mode;
174 	enum jesd216_dw15_qer_type qer_type;
175 #if defined(CONFIG_FLASH_JESD216_API)
176 	/* Table to hold the jedec Read ID given by the octoFlash or the DTS */
177 	uint8_t jedec_id[JESD216_READ_ID_LEN];
178 #endif /* CONFIG_FLASH_JESD216_API */
179 	int cmd_status;
180 #if STM32_OSPI_USE_DMA
181 	struct stream dma;
182 #endif /* STM32_OSPI_USE_DMA */
183 };
184 
ospi_lock_thread(const struct device * dev)185 static inline void ospi_lock_thread(const struct device *dev)
186 {
187 	struct flash_stm32_ospi_data *dev_data = dev->data;
188 
189 	k_sem_take(&dev_data->sem, K_FOREVER);
190 }
191 
ospi_unlock_thread(const struct device * dev)192 static inline void ospi_unlock_thread(const struct device *dev)
193 {
194 	struct flash_stm32_ospi_data *dev_data = dev->data;
195 
196 	k_sem_give(&dev_data->sem);
197 }
198 
ospi_send_cmd(const struct device * dev,OSPI_RegularCmdTypeDef * cmd)199 static int ospi_send_cmd(const struct device *dev, OSPI_RegularCmdTypeDef *cmd)
200 {
201 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
202 	struct flash_stm32_ospi_data *dev_data = dev->data;
203 	HAL_StatusTypeDef hal_ret;
204 
205 	LOG_DBG("Instruction 0x%x", cmd->Instruction);
206 
207 	dev_data->cmd_status = 0;
208 
209 	hal_ret = HAL_OSPI_Command(&dev_data->hospi, cmd, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
210 	if (hal_ret != HAL_OK) {
211 		LOG_ERR("%d: Failed to send OSPI instruction", hal_ret);
212 		return -EIO;
213 	}
214 	LOG_DBG("CCR 0x%x", dev_cfg->regs->CCR);
215 
216 	return dev_data->cmd_status;
217 }
218 
ospi_read_access(const struct device * dev,OSPI_RegularCmdTypeDef * cmd,uint8_t * data,size_t size)219 static int ospi_read_access(const struct device *dev, OSPI_RegularCmdTypeDef *cmd,
220 			    uint8_t *data, size_t size)
221 {
222 	struct flash_stm32_ospi_data *dev_data = dev->data;
223 	HAL_StatusTypeDef hal_ret;
224 
225 	LOG_DBG("Instruction 0x%x", cmd->Instruction);
226 
227 	cmd->NbData = size;
228 
229 	dev_data->cmd_status = 0;
230 
231 	hal_ret = HAL_OSPI_Command(&dev_data->hospi, cmd, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
232 	if (hal_ret != HAL_OK) {
233 		LOG_ERR("%d: Failed to send OSPI instruction", hal_ret);
234 		return -EIO;
235 	}
236 
237 #if STM32_OSPI_USE_DMA
238 	hal_ret = HAL_OSPI_Receive_DMA(&dev_data->hospi, data);
239 #else
240 	hal_ret = HAL_OSPI_Receive_IT(&dev_data->hospi, data);
241 #endif
242 	if (hal_ret != HAL_OK) {
243 		LOG_ERR("%d: Failed to read data", hal_ret);
244 		return -EIO;
245 	}
246 
247 	k_sem_take(&dev_data->sync, K_FOREVER);
248 
249 	return dev_data->cmd_status;
250 }
251 
ospi_write_access(const struct device * dev,OSPI_RegularCmdTypeDef * cmd,const uint8_t * data,size_t size)252 static int ospi_write_access(const struct device *dev, OSPI_RegularCmdTypeDef *cmd,
253 			     const uint8_t *data, size_t size)
254 {
255 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
256 	struct flash_stm32_ospi_data *dev_data = dev->data;
257 	HAL_StatusTypeDef hal_ret;
258 
259 	LOG_DBG("Instruction 0x%x", cmd->Instruction);
260 
261 	cmd->NbData = size;
262 
263 	dev_data->cmd_status = 0;
264 
265 	/* in OPI/STR the 3-byte AddressSize is not supported by the NOR flash */
266 	if ((dev_cfg->data_mode == OSPI_OPI_MODE) &&
267 		(cmd->AddressSize != HAL_OSPI_ADDRESS_32_BITS)) {
268 		LOG_ERR("OSPI wr in OPI/STR mode is for 32bit address only");
269 		return -EIO;
270 	}
271 
272 	hal_ret = HAL_OSPI_Command(&dev_data->hospi, cmd, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
273 	if (hal_ret != HAL_OK) {
274 		LOG_ERR("%d: Failed to send OSPI instruction", hal_ret);
275 		return -EIO;
276 	}
277 
278 #if STM32_OSPI_USE_DMA
279 	hal_ret = HAL_OSPI_Transmit_DMA(&dev_data->hospi, (uint8_t *)data);
280 #else
281 	hal_ret = HAL_OSPI_Transmit_IT(&dev_data->hospi, (uint8_t *)data);
282 #endif
283 
284 	if (hal_ret != HAL_OK) {
285 		LOG_ERR("%d: Failed to write data", hal_ret);
286 		return -EIO;
287 	}
288 
289 	k_sem_take(&dev_data->sync, K_FOREVER);
290 
291 	return dev_data->cmd_status;
292 }
293 
294 /*
295  * Gives a OSPI_RegularCmdTypeDef with all parameters set
296  * except Instruction, Address, DummyCycles, NbData
297  */
ospi_prepare_cmd(uint8_t transfer_mode,uint8_t transfer_rate)298 static OSPI_RegularCmdTypeDef ospi_prepare_cmd(uint8_t transfer_mode, uint8_t transfer_rate)
299 {
300 	OSPI_RegularCmdTypeDef cmd_tmp = {
301 		.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG,
302 		.FlashId = HAL_OSPI_FLASH_ID_1,
303 		.InstructionSize = ((transfer_mode == OSPI_OPI_MODE)
304 				? HAL_OSPI_INSTRUCTION_16_BITS
305 				: HAL_OSPI_INSTRUCTION_8_BITS),
306 		.InstructionDtrMode = ((transfer_rate == OSPI_DTR_TRANSFER)
307 				? HAL_OSPI_INSTRUCTION_DTR_ENABLE
308 				: HAL_OSPI_INSTRUCTION_DTR_DISABLE),
309 		.AddressDtrMode = ((transfer_rate == OSPI_DTR_TRANSFER)
310 				? HAL_OSPI_ADDRESS_DTR_ENABLE
311 				: HAL_OSPI_ADDRESS_DTR_DISABLE),
312 		/* AddressSize must be set to 32bits for init and mem config phase */
313 		.AddressSize = HAL_OSPI_ADDRESS_32_BITS,
314 		.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE,
315 		.DataDtrMode = ((transfer_rate == OSPI_DTR_TRANSFER)
316 				? HAL_OSPI_DATA_DTR_ENABLE
317 				: HAL_OSPI_DATA_DTR_DISABLE),
318 		.DQSMode = (transfer_rate == OSPI_DTR_TRANSFER)
319 				? HAL_OSPI_DQS_ENABLE
320 				: HAL_OSPI_DQS_DISABLE,
321 		.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD,
322 	};
323 
324 	switch (transfer_mode) {
325 	case OSPI_OPI_MODE: {
326 		cmd_tmp.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;
327 		cmd_tmp.AddressMode = HAL_OSPI_ADDRESS_8_LINES;
328 		cmd_tmp.DataMode = HAL_OSPI_DATA_8_LINES;
329 		break;
330 	}
331 	case OSPI_QUAD_MODE: {
332 		cmd_tmp.InstructionMode = HAL_OSPI_INSTRUCTION_4_LINES;
333 		cmd_tmp.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
334 		cmd_tmp.DataMode = HAL_OSPI_DATA_4_LINES;
335 		break;
336 	}
337 	case OSPI_DUAL_MODE: {
338 		cmd_tmp.InstructionMode = HAL_OSPI_INSTRUCTION_2_LINES;
339 		cmd_tmp.AddressMode = HAL_OSPI_ADDRESS_2_LINES;
340 		cmd_tmp.DataMode = HAL_OSPI_DATA_2_LINES;
341 		break;
342 	}
343 	default: {
344 		cmd_tmp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
345 		cmd_tmp.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
346 		cmd_tmp.DataMode = HAL_OSPI_DATA_1_LINE;
347 		break;
348 	}
349 	}
350 
351 	return cmd_tmp;
352 }
353 
stm32_ospi_hal_address_size(const struct device * dev)354 static uint32_t stm32_ospi_hal_address_size(const struct device *dev)
355 {
356 	struct flash_stm32_ospi_data *dev_data = dev->data;
357 
358 	if (dev_data->address_width == 4U) {
359 		return HAL_OSPI_ADDRESS_32_BITS;
360 	}
361 
362 	return HAL_OSPI_ADDRESS_24_BITS;
363 }
364 
365 #if defined(CONFIG_FLASH_JESD216_API)
366 /*
367  * Read the JEDEC ID data from the octoFlash at init or DTS
368  * and store in the jedec_id Table of the flash_stm32_ospi_data
369  */
stm32_ospi_read_jedec_id(const struct device * dev)370 static int stm32_ospi_read_jedec_id(const struct device *dev)
371 {
372 	struct flash_stm32_ospi_data *dev_data = dev->data;
373 
374 #if DT_NODE_HAS_PROP(DT_INST(0, st_stm32_ospi_nor), jedec_id)
375 	/* If DTS has the jedec_id property, check its length */
376 	if (DT_INST_PROP_LEN(0, jedec_id) != JESD216_READ_ID_LEN) {
377 		LOG_ERR("Read ID length is wrong (%d)", DT_INST_PROP_LEN(0, jedec_id));
378 		return -EIO;
379 	}
380 
381 	/* The dev_data->jedec_id if filled from the DTS property */
382 #else
383 	/* This is a SPI/STR command to issue to the octoFlash device */
384 	OSPI_RegularCmdTypeDef cmd = ospi_prepare_cmd(OSPI_SPI_MODE, OSPI_STR_TRANSFER);
385 
386 	cmd.Instruction = JESD216_CMD_READ_ID;
387 	cmd.AddressSize = stm32_ospi_hal_address_size(dev);
388 	cmd.AddressMode = HAL_OSPI_ADDRESS_NONE;
389 	cmd.NbData = JESD216_READ_ID_LEN; /* 3 bytes in the READ ID */
390 
391 	HAL_StatusTypeDef hal_ret;
392 
393 	hal_ret = HAL_OSPI_Command(&dev_data->hospi, &cmd,
394 				   HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
395 
396 	if (hal_ret != HAL_OK) {
397 		LOG_ERR("%d: Failed to send OSPI instruction", hal_ret);
398 		return -EIO;
399 	}
400 
401 	/* Place the received data directly into the jedec Table */
402 	hal_ret = HAL_OSPI_Receive(&dev_data->hospi, dev_data->jedec_id,
403 				   HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
404 	if (hal_ret != HAL_OK) {
405 		LOG_ERR("%d: Failed to read data", hal_ret);
406 		return -EIO;
407 	}
408 #endif /* jedec_id */
409 	LOG_DBG("Jedec ID = [%02x %02x %02x]",
410 		dev_data->jedec_id[0], dev_data->jedec_id[1], dev_data->jedec_id[2]);
411 
412 	dev_data->cmd_status = 0;
413 
414 	return 0;
415 }
416 
417 /*
418  * Read Serial Flash ID :
419  * just gives the values received by the octoFlash or from the DTS
420  */
ospi_read_jedec_id(const struct device * dev,uint8_t * id)421 static int ospi_read_jedec_id(const struct device *dev,  uint8_t *id)
422 {
423 	struct flash_stm32_ospi_data *dev_data = dev->data;
424 
425 	/* Take jedec Id values from the table (issued from the octoFlash) */
426 	memcpy(id, dev_data->jedec_id, JESD216_READ_ID_LEN);
427 
428 	LOG_INF("Manuf ID = %02x   Memory Type = %02x   Memory Density = %02x",
429 		id[0], id[1], id[2]);
430 
431 	return 0;
432 }
433 #endif /* CONFIG_FLASH_JESD216_API */
434 
435 #if !DT_NODE_HAS_PROP(DT_INST(0, st_stm32_ospi_nor), sfdp_bfp)
436 /*
437  * Read Serial Flash Discovery Parameter from the octoFlash at init :
438  * perform a read access over SPI bus for SDFP (DataMode is already set)
439  */
stm32_ospi_read_sfdp(const struct device * dev,off_t addr,void * data,size_t size)440 static int stm32_ospi_read_sfdp(const struct device *dev, off_t addr,
441 				void *data,
442 				size_t size)
443 {
444 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
445 	struct flash_stm32_ospi_data *dev_data = dev->data;
446 
447 	OSPI_RegularCmdTypeDef cmd = ospi_prepare_cmd(dev_cfg->data_mode,
448 						      dev_cfg->data_rate);
449 	if (dev_cfg->data_mode == OSPI_OPI_MODE) {
450 		cmd.Instruction = JESD216_OCMD_READ_SFDP;
451 		cmd.DummyCycles = 20U;
452 		cmd.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
453 	} else {
454 		cmd.Instruction = JESD216_CMD_READ_SFDP;
455 		cmd.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
456 		cmd.DataMode = HAL_OSPI_DATA_1_LINE;
457 		cmd.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
458 		cmd.DummyCycles = 8U;
459 		cmd.AddressSize = HAL_OSPI_ADDRESS_24_BITS;
460 	}
461 	cmd.Address = addr;
462 	cmd.NbData = size;
463 
464 	HAL_StatusTypeDef hal_ret;
465 
466 	hal_ret = HAL_OSPI_Command(&dev_data->hospi, &cmd, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
467 	if (hal_ret != HAL_OK) {
468 		LOG_ERR("%d: Failed to send OSPI instruction", hal_ret);
469 		return -EIO;
470 	}
471 
472 	hal_ret = HAL_OSPI_Receive(&dev_data->hospi, (uint8_t *)data,
473 				   HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
474 	if (hal_ret != HAL_OK) {
475 		LOG_ERR("%d: Failed to read data", hal_ret);
476 		return -EIO;
477 	}
478 
479 	dev_data->cmd_status = 0;
480 
481 	return 0;
482 }
483 #endif /* ! sfdp_bfp */
484 
485 /*
486  * Read Serial Flash Discovery Parameter :
487  * perform a read access over SPI bus for SDFP (DataMode is already set)
488  * or get it from the sdfp table (in the DTS)
489  */
ospi_read_sfdp(const struct device * dev,off_t addr,void * data,size_t size)490 static int ospi_read_sfdp(const struct device *dev, off_t addr, void *data,
491 			  size_t size)
492 {
493 #if DT_NODE_HAS_PROP(DT_INST(0, st_stm32_ospi_nor), sfdp_bfp)
494 	/* There is a sfdp-bfp property in the deviceTree : do not read the flash */
495 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
496 
497 	LOG_INF("Read SFDP from DTS property");
498 	/* If DTS has the sdfp table property, check its length */
499 	if (size > DT_INST_PROP_LEN(0, sfdp_bfp)) {
500 		LOG_ERR("SDFP bdfp length is wrong (%d)", DT_INST_PROP_LEN(0, sfdp_bfp));
501 		return -EIO;
502 	}
503 	/* The dev_cfg->sfdp_bfp if filled from the DTS property */
504 	memcpy(data, dev_cfg->sfdp_bfp + addr, size);
505 
506 	return 0;
507 #else
508 	LOG_INF("Read SFDP from octoFlash");
509 	/* Get the SFDP from the octoFlash (no sfdp-bfp table in the DeviceTree) */
510 	if (stm32_ospi_read_sfdp(dev, addr, data, size) == 0) {
511 		/* If valid, then ignore any table from the DTS */
512 		return 0;
513 	}
514 	LOG_INF("Error reading SFDP from octoFlash and none in the DTS");
515 	return -EINVAL;
516 #endif /* sfdp_bfp */
517 }
518 
ospi_address_is_valid(const struct device * dev,off_t addr,size_t size)519 static bool ospi_address_is_valid(const struct device *dev, off_t addr,
520 				  size_t size)
521 {
522 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
523 	size_t flash_size = dev_cfg->flash_size;
524 
525 	return (addr >= 0) && ((uint64_t)addr + (uint64_t)size <= flash_size);
526 }
527 
stm32_ospi_wait_auto_polling(struct flash_stm32_ospi_data * dev_data,OSPI_AutoPollingTypeDef * s_config,uint32_t timeout_ms)528 static int stm32_ospi_wait_auto_polling(struct flash_stm32_ospi_data *dev_data,
529 		OSPI_AutoPollingTypeDef *s_config, uint32_t timeout_ms)
530 {
531 	dev_data->cmd_status = 0;
532 	if (HAL_OSPI_AutoPolling_IT(&dev_data->hospi, s_config) != HAL_OK) {
533 		LOG_ERR("OSPI AutoPoll failed");
534 		return -EIO;
535 	}
536 
537 	if (k_sem_take(&dev_data->sync, K_MSEC(timeout_ms)) != 0) {
538 		LOG_ERR("OSPI AutoPoll wait failed");
539 		HAL_OSPI_Abort(&dev_data->hospi);
540 		k_sem_reset(&dev_data->sync);
541 		return -EIO;
542 	}
543 
544 	/* HAL_OSPI_AutoPolling_IT enables transfer error interrupt which sets
545 	 * cmd_status.
546 	 */
547 	return dev_data->cmd_status;
548 }
549 
550 /*
551  * This function Polls the WEL (write enable latch) bit to become to 0
552  * When the Chip Erase Cycle is completed, the Write Enable Latch (WEL) bit is cleared.
553  * in nor_mode SPI/OPI OSPI_SPI_MODE or OSPI_OPI_MODE
554  * and nor_rate transfer STR/DTR OSPI_STR_TRANSFER or OSPI_DTR_TRANSFER
555  */
stm32_ospi_mem_erased(const struct device * dev)556 static int stm32_ospi_mem_erased(const struct device *dev)
557 {
558 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
559 	struct flash_stm32_ospi_data *dev_data = dev->data;
560 	uint8_t nor_mode = dev_cfg->data_mode;
561 	uint8_t nor_rate = dev_cfg->data_rate;
562 	OSPI_HandleTypeDef *hospi = &dev_data->hospi;
563 	OSPI_AutoPollingTypeDef s_config = {0};
564 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(nor_mode, nor_rate);
565 
566 	/* Configure automatic polling mode command to wait for memory ready */
567 	if (nor_mode == OSPI_OPI_MODE) {
568 		s_command.Instruction = SPI_NOR_OCMD_RDSR;
569 		s_command.DummyCycles = (nor_rate == OSPI_DTR_TRANSFER)
570 					? SPI_NOR_DUMMY_REG_OCTAL_DTR
571 					: SPI_NOR_DUMMY_REG_OCTAL;
572 	} else {
573 		s_command.Instruction = SPI_NOR_CMD_RDSR;
574 		/* force 1-line InstructionMode for any non-OSPI transfer */
575 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
576 		s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
577 		/* force 1-line DataMode for any non-OSPI transfer */
578 		s_command.DataMode = HAL_OSPI_DATA_1_LINE;
579 		s_command.DummyCycles = 0;
580 	}
581 	s_command.NbData = ((nor_rate == OSPI_DTR_TRANSFER) ? 2U : 1U);
582 	s_command.Address = 0U;
583 
584 	/* Set the mask to  0x02 to mask all Status REG bits except WEL */
585 	/* Set the match to 0x00 to check if the WEL bit is Reset */
586 	s_config.Match              = SPI_NOR_WEL_MATCH;
587 	s_config.Mask               = SPI_NOR_WEL_MASK; /* Write Enable Latch */
588 
589 	s_config.MatchMode          = HAL_OSPI_MATCH_MODE_AND;
590 	s_config.Interval           = SPI_NOR_AUTO_POLLING_INTERVAL;
591 	s_config.AutomaticStop      = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
592 
593 	if (HAL_OSPI_Command(hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
594 		LOG_ERR("OSPI AutoPoll command (WEL) failed");
595 		return -EIO;
596 	}
597 
598 	/* Start Automatic-Polling mode to wait until the memory is totally erased */
599 	return stm32_ospi_wait_auto_polling(dev_data,
600 			&s_config, STM32_OSPI_BULK_ERASE_MAX_TIME);
601 }
602 
603 /*
604  * This function Polls the WIP(Write In Progress) bit to become to 0
605  * in nor_mode SPI/OPI OSPI_SPI_MODE or OSPI_OPI_MODE
606  * and nor_rate transfer STR/DTR OSPI_STR_TRANSFER or OSPI_DTR_TRANSFER
607  */
stm32_ospi_mem_ready(struct flash_stm32_ospi_data * dev_data,uint8_t nor_mode,uint8_t nor_rate)608 static int stm32_ospi_mem_ready(struct flash_stm32_ospi_data *dev_data, uint8_t nor_mode,
609 		uint8_t nor_rate)
610 {
611 	OSPI_HandleTypeDef *hospi = &dev_data->hospi;
612 	OSPI_AutoPollingTypeDef s_config = {0};
613 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(nor_mode, nor_rate);
614 
615 	/* Configure automatic polling mode command to wait for memory ready */
616 	if (nor_mode == OSPI_OPI_MODE) {
617 		s_command.Instruction = SPI_NOR_OCMD_RDSR;
618 		s_command.DummyCycles = (nor_rate == OSPI_DTR_TRANSFER)
619 					? SPI_NOR_DUMMY_REG_OCTAL_DTR
620 					: SPI_NOR_DUMMY_REG_OCTAL;
621 	} else {
622 		s_command.Instruction = SPI_NOR_CMD_RDSR;
623 		/* force 1-line InstructionMode for any non-OSPI transfer */
624 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
625 		s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
626 		/* force 1-line DataMode for any non-OSPI transfer */
627 		s_command.DataMode = HAL_OSPI_DATA_1_LINE;
628 		s_command.DummyCycles = 0;
629 	}
630 	s_command.NbData = ((nor_rate == OSPI_DTR_TRANSFER) ? 2U : 1U);
631 	s_command.Address = 0U;
632 
633 	/* Set the mask to  0x01 to mask all Status REG bits except WIP */
634 	/* Set the match to 0x00 to check if the WIP bit is Reset */
635 	s_config.Match              = SPI_NOR_MEM_RDY_MATCH;
636 	s_config.Mask               = SPI_NOR_MEM_RDY_MASK; /* Write in progress */
637 	s_config.MatchMode          = HAL_OSPI_MATCH_MODE_AND;
638 	s_config.Interval           = SPI_NOR_AUTO_POLLING_INTERVAL;
639 	s_config.AutomaticStop      = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
640 
641 	if (HAL_OSPI_Command(hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
642 		LOG_ERR("OSPI AutoPoll command failed");
643 		return -EIO;
644 	}
645 
646 	/* Start Automatic-Polling mode to wait until the memory is ready WIP=0 */
647 	return stm32_ospi_wait_auto_polling(dev_data, &s_config, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
648 }
649 
650 /* Enables writing to the memory sending a Write Enable and wait it is effective */
stm32_ospi_write_enable(struct flash_stm32_ospi_data * dev_data,uint8_t nor_mode,uint8_t nor_rate)651 static int stm32_ospi_write_enable(struct flash_stm32_ospi_data *dev_data,
652 		uint8_t nor_mode, uint8_t nor_rate)
653 {
654 	OSPI_HandleTypeDef *hospi = &dev_data->hospi;
655 	OSPI_AutoPollingTypeDef s_config = {0};
656 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(nor_mode, nor_rate);
657 
658 	/* Initialize the write enable command */
659 	if (nor_mode == OSPI_OPI_MODE) {
660 		s_command.Instruction = SPI_NOR_OCMD_WREN;
661 	} else {
662 		s_command.Instruction = SPI_NOR_CMD_WREN;
663 		/* force 1-line InstructionMode for any non-OSPI transfer */
664 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
665 	}
666 	s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
667 	s_command.DataMode    = HAL_OSPI_DATA_NONE;
668 	s_command.DummyCycles = 0U;
669 
670 	if (HAL_OSPI_Command(hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
671 		LOG_ERR("OSPI flash write enable cmd failed");
672 		return -EIO;
673 	}
674 
675 	/* New command to Configure automatic polling mode to wait for write enabling */
676 	if (nor_mode == OSPI_OPI_MODE) {
677 		s_command.Instruction = SPI_NOR_OCMD_RDSR;
678 		s_command.AddressMode = HAL_OSPI_ADDRESS_8_LINES;
679 		s_command.DataMode = HAL_OSPI_DATA_8_LINES;
680 		s_command.DummyCycles = (nor_rate == OSPI_DTR_TRANSFER)
681 				? SPI_NOR_DUMMY_REG_OCTAL_DTR
682 						: SPI_NOR_DUMMY_REG_OCTAL;
683 	} else {
684 		s_command.Instruction = SPI_NOR_CMD_RDSR;
685 		/* force 1-line DataMode for any non-OSPI transfer */
686 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
687 		s_command.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
688 		s_command.DataMode = HAL_OSPI_DATA_1_LINE;
689 		s_command.DummyCycles = 0;
690 
691 		/* DummyCycles remains 0 */
692 	}
693 	s_command.NbData = (nor_rate == OSPI_DTR_TRANSFER) ? 2U : 1U;
694 	s_command.Address = 0U;
695 
696 	if (HAL_OSPI_Command(hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
697 		LOG_ERR("OSPI config auto polling cmd failed");
698 		return -EIO;
699 	}
700 
701 	s_config.Match           = SPI_NOR_WREN_MATCH;
702 	s_config.Mask            = SPI_NOR_WREN_MASK;
703 	s_config.MatchMode       = HAL_OSPI_MATCH_MODE_AND;
704 	s_config.Interval        = SPI_NOR_AUTO_POLLING_INTERVAL;
705 	s_config.AutomaticStop   = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
706 
707 	return stm32_ospi_wait_auto_polling(dev_data, &s_config, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
708 }
709 
710 /* Write Flash configuration register 2 with new dummy cycles */
stm32_ospi_write_cfg2reg_dummy(OSPI_HandleTypeDef * hospi,uint8_t nor_mode,uint8_t nor_rate)711 static int stm32_ospi_write_cfg2reg_dummy(OSPI_HandleTypeDef *hospi,
712 					uint8_t nor_mode, uint8_t nor_rate)
713 {
714 	uint8_t transmit_data = SPI_NOR_CR2_DUMMY_CYCLES_66MHZ;
715 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(nor_mode, nor_rate);
716 
717 	/* Initialize the writing of configuration register 2 */
718 	s_command.Instruction = (nor_mode == OSPI_SPI_MODE)
719 				? SPI_NOR_CMD_WR_CFGREG2
720 				: SPI_NOR_OCMD_WR_CFGREG2;
721 	s_command.Address = SPI_NOR_REG2_ADDR3;
722 	s_command.DummyCycles = 0U;
723 	s_command.NbData = (nor_mode == OSPI_SPI_MODE) ? 1U
724 			: ((nor_rate == OSPI_DTR_TRANSFER) ? 2U : 1U);
725 
726 	if (HAL_OSPI_Command(hospi, &s_command,
727 		HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
728 		LOG_ERR("OSPI transmit ");
729 		return -EIO;
730 	}
731 
732 	if (HAL_OSPI_Transmit(hospi, &transmit_data,
733 		HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
734 		LOG_ERR("OSPI transmit ");
735 		return -EIO;
736 	}
737 
738 	return 0;
739 }
740 
741 /* Write Flash configuration register 2 with new single or octal SPI protocol */
stm32_ospi_write_cfg2reg_io(OSPI_HandleTypeDef * hospi,uint8_t nor_mode,uint8_t nor_rate,uint8_t op_enable)742 static int stm32_ospi_write_cfg2reg_io(OSPI_HandleTypeDef *hospi,
743 				       uint8_t nor_mode, uint8_t nor_rate, uint8_t op_enable)
744 {
745 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(nor_mode, nor_rate);
746 
747 	/* Initialize the writing of configuration register 2 */
748 	s_command.Instruction = (nor_mode == OSPI_SPI_MODE)
749 				? SPI_NOR_CMD_WR_CFGREG2
750 				: SPI_NOR_OCMD_WR_CFGREG2;
751 	s_command.Address = SPI_NOR_REG2_ADDR1;
752 	s_command.DummyCycles = 0U;
753 	s_command.NbData = (nor_mode == OSPI_SPI_MODE) ? 1U
754 			: ((nor_rate == OSPI_DTR_TRANSFER) ? 2U : 1U);
755 
756 	if (HAL_OSPI_Command(hospi, &s_command,
757 		HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
758 		LOG_ERR("Write Flash configuration reg2 failed");
759 		return -EIO;
760 	}
761 
762 	if (HAL_OSPI_Transmit(hospi, &op_enable,
763 		HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
764 		LOG_ERR("Write Flash configuration reg2 failed");
765 		return -EIO;
766 	}
767 
768 	return 0;
769 }
770 
771 /* Read Flash configuration register 2 with new single or octal SPI protocol */
stm32_ospi_read_cfg2reg(OSPI_HandleTypeDef * hospi,uint8_t nor_mode,uint8_t nor_rate,uint8_t * value)772 static int stm32_ospi_read_cfg2reg(OSPI_HandleTypeDef *hospi,
773 				   uint8_t nor_mode, uint8_t nor_rate, uint8_t *value)
774 {
775 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(nor_mode, nor_rate);
776 
777 	/* Initialize the writing of configuration register 2 */
778 	s_command.Instruction = (nor_mode == OSPI_SPI_MODE)
779 				? SPI_NOR_CMD_RD_CFGREG2
780 				: SPI_NOR_OCMD_RD_CFGREG2;
781 	s_command.Address = SPI_NOR_REG2_ADDR1;
782 	s_command.DummyCycles = (nor_mode == OSPI_SPI_MODE)
783 				? 0U
784 				: ((nor_rate == OSPI_DTR_TRANSFER)
785 					? SPI_NOR_DUMMY_REG_OCTAL_DTR
786 					: SPI_NOR_DUMMY_REG_OCTAL);
787 	s_command.NbData = (nor_rate == OSPI_DTR_TRANSFER) ? 2U : 1U;
788 
789 	if (HAL_OSPI_Command(hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
790 		LOG_ERR("Write Flash configuration reg2 failed");
791 		return -EIO;
792 	}
793 
794 	if (HAL_OSPI_Receive(hospi, value, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
795 		LOG_ERR("Write Flash configuration reg2 failed");
796 		return -EIO;
797 	}
798 
799 	return 0;
800 }
801 
802 /* Set the NOR Flash to desired Interface mode : SPI/OSPI and STR/DTR according to the DTS */
stm32_ospi_config_mem(const struct device * dev)803 static int stm32_ospi_config_mem(const struct device *dev)
804 {
805 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
806 	struct flash_stm32_ospi_data *dev_data = dev->data;
807 	uint8_t reg[2];
808 
809 	/* Going to set the SPI mode and STR transfer rate : done */
810 	if ((dev_cfg->data_mode != OSPI_OPI_MODE)
811 		&& (dev_cfg->data_rate == OSPI_STR_TRANSFER)) {
812 		LOG_INF("OSPI flash config is SPI|DUAL|QUAD / STR");
813 		return 0;
814 	}
815 
816 	/* Going to set the OPI mode (STR or DTR transfer rate) */
817 	LOG_DBG("OSPI configuring OctoSPI mode");
818 
819 	if (stm32_ospi_write_enable(dev_data,
820 		OSPI_SPI_MODE, OSPI_STR_TRANSFER) != 0) {
821 		LOG_ERR("OSPI write Enable failed");
822 		return -EIO;
823 	}
824 
825 	/* Write Configuration register 2 (with new dummy cycles) */
826 	if (stm32_ospi_write_cfg2reg_dummy(&dev_data->hospi,
827 		OSPI_SPI_MODE, OSPI_STR_TRANSFER) != 0) {
828 		LOG_ERR("OSPI write CFGR2 failed");
829 		return -EIO;
830 	}
831 	if (stm32_ospi_mem_ready(dev_data,
832 		OSPI_SPI_MODE, OSPI_STR_TRANSFER) != 0) {
833 		LOG_ERR("OSPI autopolling failed");
834 		return -EIO;
835 	}
836 	if (stm32_ospi_write_enable(dev_data,
837 		OSPI_SPI_MODE, OSPI_STR_TRANSFER) != 0) {
838 		LOG_ERR("OSPI write Enable 2 failed");
839 		return -EIO;
840 	}
841 
842 	/* Write Configuration register 2 (with Octal I/O SPI protocol : choose STR or DTR) */
843 	uint8_t mode_enable = ((dev_cfg->data_rate == OSPI_DTR_TRANSFER)
844 				? SPI_NOR_CR2_DTR_OPI_EN
845 				: SPI_NOR_CR2_STR_OPI_EN);
846 	if (stm32_ospi_write_cfg2reg_io(&dev_data->hospi,
847 		OSPI_SPI_MODE, OSPI_STR_TRANSFER, mode_enable) != 0) {
848 		LOG_ERR("OSPI write CFGR2 failed");
849 		return -EIO;
850 	}
851 
852 	/* Wait that the configuration is effective and check that memory is ready */
853 	k_busy_wait(STM32_OSPI_WRITE_REG_MAX_TIME * USEC_PER_MSEC);
854 
855 	/* Reconfigure the memory type of the peripheral */
856 	dev_data->hospi.Init.MemoryType            = HAL_OSPI_MEMTYPE_MACRONIX;
857 	dev_data->hospi.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE;
858 	if (HAL_OSPI_Init(&dev_data->hospi) != HAL_OK) {
859 		LOG_ERR("OSPI mem type MACRONIX failed");
860 		return -EIO;
861 	}
862 
863 	if (dev_cfg->data_rate == OSPI_STR_TRANSFER) {
864 		if (stm32_ospi_mem_ready(dev_data,
865 			OSPI_OPI_MODE, OSPI_STR_TRANSFER) != 0) {
866 			/* Check Flash busy ? */
867 			LOG_ERR("OSPI flash busy failed");
868 			return -EIO;
869 		}
870 
871 		if (stm32_ospi_read_cfg2reg(&dev_data->hospi,
872 			OSPI_OPI_MODE, OSPI_STR_TRANSFER, reg) != 0) {
873 			/* Check the configuration has been correctly done on SPI_NOR_REG2_ADDR1 */
874 			LOG_ERR("OSPI flash config read failed");
875 			return -EIO;
876 		}
877 
878 		LOG_INF("OSPI flash config is OPI / STR");
879 	}
880 
881 	if (dev_cfg->data_rate == OSPI_DTR_TRANSFER) {
882 		if (stm32_ospi_mem_ready(dev_data,
883 			OSPI_OPI_MODE, OSPI_DTR_TRANSFER) != 0) {
884 			/* Check Flash busy ? */
885 			LOG_ERR("OSPI flash busy failed");
886 			return -EIO;
887 		}
888 
889 		LOG_INF("OSPI flash config is OPI / DTR");
890 	}
891 
892 	return 0;
893 }
894 
895 /* gpio or send the different reset command to the NOR flash in SPI/OSPI and STR/DTR */
stm32_ospi_mem_reset(const struct device * dev)896 static int stm32_ospi_mem_reset(const struct device *dev)
897 {
898 	struct flash_stm32_ospi_data *dev_data = dev->data;
899 
900 #if STM32_OSPI_RESET_GPIO
901 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
902 
903 	/* Generate RESETn pulse for the flash memory */
904 	gpio_pin_configure_dt(&dev_cfg->reset, GPIO_OUTPUT_ACTIVE);
905 	k_msleep(DT_INST_PROP(0, reset_gpios_duration));
906 	gpio_pin_set_dt(&dev_cfg->reset, 0);
907 #else
908 
909 	/* Reset command sent sucessively for each mode SPI/OPS & STR/DTR */
910 	OSPI_RegularCmdTypeDef s_command = {
911 		.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG,
912 		.FlashId = HAL_OSPI_FLASH_ID_1,
913 		.AddressMode = HAL_OSPI_ADDRESS_NONE,
914 		.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE,
915 		.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE,
916 		.Instruction = SPI_NOR_CMD_RESET_EN,
917 		.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS,
918 		.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE,
919 		.DataMode = HAL_OSPI_DATA_NONE,
920 		.DummyCycles = 0U,
921 		.DQSMode = HAL_OSPI_DQS_DISABLE,
922 		.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD,
923 	};
924 
925 	/* Reset enable in SPI mode and STR transfer mode */
926 	if (HAL_OSPI_Command(&dev_data->hospi,
927 		&s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
928 		LOG_ERR("OSPI reset enable (SPI/STR) failed");
929 		return -EIO;
930 	}
931 
932 	/* Reset memory in SPI mode and STR transfer mode */
933 	s_command.Instruction = SPI_NOR_CMD_RESET_MEM;
934 	if (HAL_OSPI_Command(&dev_data->hospi,
935 		&s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
936 		LOG_ERR("OSPI reset memory (SPI/STR) failed");
937 		return -EIO;
938 	}
939 
940 	/* Reset enable in OPI mode and STR transfer mode */
941 	s_command.InstructionMode    = HAL_OSPI_INSTRUCTION_8_LINES;
942 	s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
943 	s_command.Instruction = SPI_NOR_OCMD_RESET_EN;
944 	s_command.InstructionSize = HAL_OSPI_INSTRUCTION_16_BITS;
945 	if (HAL_OSPI_Command(&dev_data->hospi,
946 		&s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
947 		LOG_ERR("OSPI reset enable (OPI/STR) failed");
948 		return -EIO;
949 	}
950 
951 	/* Reset memory in OPI mode and STR transfer mode */
952 	s_command.Instruction = SPI_NOR_OCMD_RESET_MEM;
953 	if (HAL_OSPI_Command(&dev_data->hospi,
954 		&s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
955 		LOG_ERR("OSPI reset memory (OPI/STR) failed");
956 		return -EIO;
957 	}
958 
959 	/* Reset enable in OPI mode and DTR transfer mode */
960 	s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
961 	s_command.Instruction = SPI_NOR_OCMD_RESET_EN;
962 	if (HAL_OSPI_Command(&dev_data->hospi,
963 		&s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
964 		LOG_ERR("OSPI reset enable (OPI/DTR) failed");
965 		return -EIO;
966 	}
967 
968 	/* Reset memory in OPI mode and DTR transfer mode */
969 	s_command.Instruction = SPI_NOR_OCMD_RESET_MEM;
970 	if (HAL_OSPI_Command(&dev_data->hospi,
971 		&s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
972 		LOG_ERR("OSPI reset memory (OPI/DTR) failed");
973 		return -EIO;
974 	}
975 
976 #endif
977 	/* Wait after SWreset CMD, in case SWReset occurred during erase operation */
978 	k_busy_wait(STM32_OSPI_RESET_MAX_TIME * USEC_PER_MSEC);
979 
980 	return 0;
981 }
982 
983 #ifdef CONFIG_STM32_MEMMAP
984 /* Function to configure the octoflash in MemoryMapped mode */
stm32_ospi_set_memorymap(const struct device * dev)985 static int stm32_ospi_set_memorymap(const struct device *dev)
986 {
987 	HAL_StatusTypeDef ret;
988 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
989 	struct flash_stm32_ospi_data *dev_data = dev->data;
990 	OSPI_RegularCmdTypeDef s_command = ospi_prepare_cmd(dev_cfg->data_mode, dev_cfg->data_rate);
991 	OSPI_MemoryMappedTypeDef s_MemMappedCfg;
992 
993 	/* Configure octoflash in MemoryMapped mode */
994 	if ((dev_cfg->data_mode == OSPI_SPI_MODE) &&
995 		(stm32_ospi_hal_address_size(dev) == HAL_OSPI_ADDRESS_24_BITS)) {
996 		/* OPI mode and 3-bytes address size not supported by memory */
997 		LOG_ERR("OSPI_SPI_MODE in 3Bytes addressing is not supported");
998 		return -ENOTSUP;
999 	}
1000 
1001 	/* Initialize the read command */
1002 	s_command.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
1003 	s_command.AddressSize = (dev_cfg->data_rate == OSPI_STR_TRANSFER)
1004 				? stm32_ospi_hal_address_size(dev)
1005 				: HAL_OSPI_ADDRESS_32_BITS;
1006 	/* Adapt lines based on read_mode */
1007 	if (dev_cfg->data_mode != OSPI_OPI_MODE) {
1008 		switch (dev_data->read_mode) {
1009 		case JESD216_MODE_112:
1010 			s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1011 			s_command.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1012 			s_command.DataMode = HAL_OSPI_DATA_2_LINES;
1013 			break;
1014 		case JESD216_MODE_122:
1015 			s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1016 			s_command.AddressMode = HAL_OSPI_ADDRESS_2_LINES;
1017 			s_command.DataMode = HAL_OSPI_DATA_2_LINES;
1018 			break;
1019 		case JESD216_MODE_114:
1020 			s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1021 			s_command.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1022 			s_command.DataMode = HAL_OSPI_DATA_4_LINES;
1023 			break;
1024 		case JESD216_MODE_144:
1025 			s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1026 			s_command.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
1027 			s_command.DataMode = HAL_OSPI_DATA_4_LINES;
1028 			break;
1029 		default:
1030 			/* Use lines based on data_mode set in ospi_prepare_cmd */
1031 			break;
1032 		}
1033 	}
1034 	/* Set instruction and dummy cycles parameters */
1035 	if (dev_cfg->data_rate == OSPI_DTR_TRANSFER) {
1036 		/* DTR transfer rate (==> Octal mode) */
1037 		s_command.Instruction = SPI_NOR_OCMD_DTR_RD;
1038 		s_command.DummyCycles = SPI_NOR_DUMMY_RD_OCTAL_DTR;
1039 	} else {
1040 		/* STR transfer rate */
1041 		if (dev_cfg->data_mode == OSPI_OPI_MODE) {
1042 			/* OPI and STR */
1043 			s_command.Instruction = SPI_NOR_OCMD_RD;
1044 			s_command.DummyCycles = SPI_NOR_DUMMY_RD_OCTAL;
1045 		} else {
1046 			/* use SFDP:BFP read instruction */
1047 			s_command.Instruction = dev_data->read_opcode;
1048 			s_command.DummyCycles = dev_data->read_dummy;
1049 		}
1050 	}
1051 
1052 	ret = HAL_OSPI_Command(&dev_data->hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
1053 	if (ret != HAL_OK) {
1054 		LOG_ERR("%d: Failed to set memory map read cmd", ret);
1055 		return -EIO;
1056 	}
1057 
1058 	/* Initialize the program command */
1059 	s_command.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
1060 	s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
1061 
1062 	s_command.Instruction = dev_data->write_opcode;
1063 	s_command.DummyCycles = 0U;
1064 	/* Adapt lines based on write opcode */
1065 	switch (s_command.Instruction) {
1066 	case SPI_NOR_CMD_PP_4B:
1067 		__fallthrough;
1068 	case SPI_NOR_CMD_PP:
1069 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1070 		s_command.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1071 		s_command.DataMode = HAL_OSPI_DATA_1_LINE;
1072 		break;
1073 	case SPI_NOR_CMD_PP_1_1_2:
1074 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1075 		s_command.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1076 		s_command.DataMode = HAL_OSPI_DATA_2_LINES;
1077 		break;
1078 	case SPI_NOR_CMD_PP_1_1_4_4B:
1079 		__fallthrough;
1080 	case SPI_NOR_CMD_PP_1_1_4:
1081 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1082 		s_command.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1083 		s_command.DataMode = HAL_OSPI_DATA_4_LINES;
1084 		break;
1085 	case SPI_NOR_CMD_PP_1_4_4_4B:
1086 		__fallthrough;
1087 	case SPI_NOR_CMD_PP_1_4_4:
1088 		s_command.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1089 		s_command.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
1090 		s_command.DataMode = HAL_OSPI_DATA_4_LINES;
1091 		break;
1092 	default:
1093 		/* Use lines based on data_mode set in ospi_prepare_cmd */
1094 		break;
1095 	}
1096 
1097 	ret = HAL_OSPI_Command(&dev_data->hospi, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE);
1098 	if (ret != HAL_OK) {
1099 		LOG_ERR("%d: Failed to set memory map write cmd", ret);
1100 		return -EIO;
1101 	}
1102 
1103 	/* Enable the memory-mapping */
1104 	s_MemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
1105 
1106 	ret = HAL_OSPI_MemoryMapped(&dev_data->hospi, &s_MemMappedCfg);
1107 	if (ret != HAL_OK) {
1108 		LOG_ERR("%d: Failed to enable memory map", ret);
1109 		return -EIO;
1110 	}
1111 
1112 	LOG_DBG("MemoryMap mode enabled");
1113 	return 0;
1114 }
1115 
1116 /* Function to return true if the octoflash is in MemoryMapped else false */
stm32_ospi_is_memorymap(const struct device * dev)1117 static bool stm32_ospi_is_memorymap(const struct device *dev)
1118 {
1119 	struct flash_stm32_ospi_data *dev_data = dev->data;
1120 
1121 	return ((READ_BIT(dev_data->hospi.Instance->CR,
1122 			  OCTOSPI_CR_FMODE) == OCTOSPI_CR_FMODE) ?
1123 			  true : false);
1124 }
1125 
stm32_ospi_abort(const struct device * dev)1126 static int stm32_ospi_abort(const struct device *dev)
1127 {
1128 	struct flash_stm32_ospi_data *dev_data = dev->data;
1129 	HAL_StatusTypeDef hal_ret;
1130 
1131 	hal_ret = HAL_OSPI_Abort(&dev_data->hospi);
1132 	if (hal_ret != HAL_OK) {
1133 		LOG_ERR("%d: OSPI abort failed", hal_ret);
1134 		return -EIO;
1135 	}
1136 
1137 	return 0;
1138 }
1139 #endif /* CONFIG_STM32_MEMMAP */
1140 
1141 /*
1142  * Function to erase the flash : chip or sector with possible OSPI/SPI and STR/DTR
1143  * to erase the complete chip (using dedicated command) :
1144  *   set size >= flash size
1145  *   set addr = 0
1146  * NOTE: cannot erase in MemoryMapped mode
1147  */
flash_stm32_ospi_erase(const struct device * dev,off_t addr,size_t size)1148 static int flash_stm32_ospi_erase(const struct device *dev, off_t addr,
1149 				  size_t size)
1150 {
1151 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
1152 	struct flash_stm32_ospi_data *dev_data = dev->data;
1153 	int ret = 0;
1154 
1155 	/* Ignore zero size erase */
1156 	if (size == 0) {
1157 		return 0;
1158 	}
1159 
1160 	/* Maximise erase size : means the complete chip */
1161 	if (size > dev_cfg->flash_size) {
1162 		size = dev_cfg->flash_size;
1163 	}
1164 
1165 	if (!ospi_address_is_valid(dev, addr, size)) {
1166 		LOG_ERR("Error: address or size exceeds expected values: "
1167 			"addr 0x%lx, size %zu", (long)addr, size);
1168 		return -EINVAL;
1169 	}
1170 
1171 	if (((size % SPI_NOR_SECTOR_SIZE) != 0) && (size < dev_cfg->flash_size)) {
1172 		LOG_ERR("Error: wrong sector size 0x%x", size);
1173 		return -ENOTSUP;
1174 	}
1175 
1176 	ospi_lock_thread(dev);
1177 
1178 #ifdef CONFIG_STM32_MEMMAP
1179 	if (stm32_ospi_is_memorymap(dev)) {
1180 		/* Abort ongoing transfer to force CS high/BUSY deasserted */
1181 		ret = stm32_ospi_abort(dev);
1182 		if (ret != 0) {
1183 			LOG_ERR("Failed to abort memory-mapped access before erase");
1184 			goto end_erase;
1185 		}
1186 	}
1187 	/* Continue with Indirect Mode */
1188 #endif /* CONFIG_STM32_MEMMAP */
1189 
1190 	OSPI_RegularCmdTypeDef cmd_erase = {
1191 		.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG,
1192 		.FlashId = HAL_OSPI_FLASH_ID_1,
1193 		.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE,
1194 		.DataMode = HAL_OSPI_DATA_NONE,
1195 		.DummyCycles = 0U,
1196 		.DQSMode = HAL_OSPI_DQS_DISABLE,
1197 		.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD,
1198 	};
1199 
1200 	if (stm32_ospi_mem_ready(dev_data,
1201 		dev_cfg->data_mode, dev_cfg->data_rate) != 0) {
1202 		LOG_ERR("Erase failed : flash busy");
1203 		ret = -EBUSY;
1204 		goto end_erase;
1205 	}
1206 
1207 	cmd_erase.InstructionMode    = (dev_cfg->data_mode == OSPI_OPI_MODE)
1208 					? HAL_OSPI_INSTRUCTION_8_LINES
1209 					: HAL_OSPI_INSTRUCTION_1_LINE;
1210 	cmd_erase.InstructionDtrMode = (dev_cfg->data_rate == OSPI_DTR_TRANSFER)
1211 					? HAL_OSPI_INSTRUCTION_DTR_ENABLE
1212 					: HAL_OSPI_INSTRUCTION_DTR_DISABLE;
1213 	cmd_erase.InstructionSize    = (dev_cfg->data_mode == OSPI_OPI_MODE)
1214 					? HAL_OSPI_INSTRUCTION_16_BITS
1215 					: HAL_OSPI_INSTRUCTION_8_BITS;
1216 
1217 	while ((size > 0) && (ret == 0)) {
1218 
1219 		ret = stm32_ospi_write_enable(dev_data,
1220 			dev_cfg->data_mode, dev_cfg->data_rate);
1221 		if (ret != 0) {
1222 			LOG_ERR("Erase failed : write enable");
1223 			break;
1224 		}
1225 
1226 		if (size == dev_cfg->flash_size) {
1227 			/* Chip erase */
1228 			LOG_DBG("Chip Erase");
1229 
1230 			cmd_erase.Address = 0;
1231 			cmd_erase.Instruction = (dev_cfg->data_mode == OSPI_OPI_MODE)
1232 					? SPI_NOR_OCMD_BULKE
1233 					: SPI_NOR_CMD_BULKE;
1234 			cmd_erase.AddressMode = HAL_OSPI_ADDRESS_NONE;
1235 			/* Full chip erase (Bulk) command */
1236 			ospi_send_cmd(dev, &cmd_erase);
1237 
1238 			size -= dev_cfg->flash_size;
1239 			/* Chip (Bulk) erase started, wait until WEL becomes 0 */
1240 			ret = stm32_ospi_mem_erased(dev);
1241 			if (ret != 0) {
1242 				LOG_ERR("Chip Erase failed");
1243 				break;
1244 			}
1245 		} else {
1246 			/* Sector or Block erase depending on the size */
1247 			LOG_DBG("Sector/Block Erase");
1248 
1249 			cmd_erase.AddressMode =
1250 				(dev_cfg->data_mode == OSPI_OPI_MODE)
1251 				? HAL_OSPI_ADDRESS_8_LINES
1252 				: HAL_OSPI_ADDRESS_1_LINE;
1253 			cmd_erase.AddressDtrMode =
1254 				(dev_cfg->data_rate == OSPI_DTR_TRANSFER)
1255 				? HAL_OSPI_ADDRESS_DTR_ENABLE
1256 				: HAL_OSPI_ADDRESS_DTR_DISABLE;
1257 			cmd_erase.AddressSize = stm32_ospi_hal_address_size(dev);
1258 			cmd_erase.Address = addr;
1259 
1260 			const struct jesd216_erase_type *erase_types =
1261 							dev_data->erase_types;
1262 			const struct jesd216_erase_type *bet = NULL;
1263 
1264 			for (uint8_t ei = 0;
1265 				ei < JESD216_NUM_ERASE_TYPES; ++ei) {
1266 				const struct jesd216_erase_type *etp =
1267 							&erase_types[ei];
1268 
1269 				if ((etp->exp != 0)
1270 				    && SPI_NOR_IS_ALIGNED(addr, etp->exp)
1271 				    && (size >= BIT(etp->exp))
1272 				    && ((bet == NULL)
1273 					|| (etp->exp > bet->exp))) {
1274 					bet = etp;
1275 					cmd_erase.Instruction = bet->cmd;
1276 				} else if (bet == NULL) {
1277 					/* Use the default sector erase cmd */
1278 					if (dev_cfg->data_mode == OSPI_OPI_MODE) {
1279 						cmd_erase.Instruction = SPI_NOR_OCMD_SE;
1280 					} else {
1281 						cmd_erase.Instruction =
1282 							(stm32_ospi_hal_address_size(dev) ==
1283 							HAL_OSPI_ADDRESS_32_BITS)
1284 							? SPI_NOR_CMD_SE_4B
1285 							: SPI_NOR_CMD_SE;
1286 					}
1287 				}
1288 				/* Avoid using wrong erase type,
1289 				 * if zero entries are found in erase_types
1290 				 */
1291 				bet = NULL;
1292 			}
1293 			LOG_DBG("Sector/Block Erase addr 0x%x, asize 0x%x amode 0x%x  instr 0x%x",
1294 				cmd_erase.Address, cmd_erase.AddressSize,
1295 				cmd_erase.AddressMode, cmd_erase.Instruction);
1296 
1297 			ospi_send_cmd(dev, &cmd_erase);
1298 
1299 			if (bet != NULL) {
1300 				addr += BIT(bet->exp);
1301 				size -= BIT(bet->exp);
1302 			} else {
1303 				addr += SPI_NOR_SECTOR_SIZE;
1304 				size -= SPI_NOR_SECTOR_SIZE;
1305 			}
1306 
1307 			ret = stm32_ospi_mem_ready(dev_data, dev_cfg->data_mode,
1308 						dev_cfg->data_rate);
1309 		}
1310 	}
1311 	goto end_erase;
1312 
1313 end_erase:
1314 	ospi_unlock_thread(dev);
1315 
1316 	return ret;
1317 }
1318 
1319 /* Function to read the flash with possible OSPI/SPI and STR/DTR */
flash_stm32_ospi_read(const struct device * dev,off_t addr,void * data,size_t size)1320 static int flash_stm32_ospi_read(const struct device *dev, off_t addr,
1321 				 void *data, size_t size)
1322 {
1323 	int ret = 0;
1324 
1325 	if (!ospi_address_is_valid(dev, addr, size)) {
1326 		LOG_ERR("Error: address or size exceeds expected values: "
1327 			"addr 0x%lx, size %zu", (long)addr, size);
1328 		return -EINVAL;
1329 	}
1330 
1331 	/* Ignore zero size read */
1332 	if (size == 0) {
1333 		return 0;
1334 	}
1335 
1336 #ifdef CONFIG_STM32_MEMMAP
1337 	/* If not MemMapped then configure it */
1338 	if (!stm32_ospi_is_memorymap(dev)) {
1339 		if (stm32_ospi_set_memorymap(dev) != 0) {
1340 			LOG_ERR("READ failed: cannot enable MemoryMap");
1341 			return -EIO;
1342 		}
1343 	}
1344 	/* Now in MemMapped mode : read with memcopy */
1345 	LOG_DBG("MemoryMapped Read offset: 0x%lx, len: %zu",
1346 		(long)(STM32_OSPI_BASE_ADDRESS + addr),
1347 		size);
1348 	memcpy(data, (uint8_t *)STM32_OSPI_BASE_ADDRESS + addr, size);
1349 
1350 #else /* CONFIG_STM32_MEMMAP */
1351 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
1352 	struct flash_stm32_ospi_data *dev_data = dev->data;
1353 
1354 
1355 	OSPI_RegularCmdTypeDef cmd = ospi_prepare_cmd(dev_cfg->data_mode, dev_cfg->data_rate);
1356 
1357 	if (dev_cfg->data_mode != OSPI_OPI_MODE) {
1358 		switch (dev_data->read_mode) {
1359 		case JESD216_MODE_112: {
1360 			cmd.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1361 			cmd.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1362 			cmd.DataMode = HAL_OSPI_DATA_2_LINES;
1363 			break;
1364 		}
1365 		case JESD216_MODE_122: {
1366 			cmd.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1367 			cmd.AddressMode = HAL_OSPI_ADDRESS_2_LINES;
1368 			cmd.DataMode = HAL_OSPI_DATA_2_LINES;
1369 			break;
1370 		}
1371 		case JESD216_MODE_114: {
1372 			cmd.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1373 			cmd.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1374 			cmd.DataMode = HAL_OSPI_DATA_4_LINES;
1375 			break;
1376 		}
1377 		case JESD216_MODE_144: {
1378 			cmd.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1379 			cmd.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
1380 			cmd.DataMode = HAL_OSPI_DATA_4_LINES;
1381 			break;
1382 		}
1383 		default:
1384 			/* use the mode from ospi_prepare_cmd */
1385 			break;
1386 		}
1387 	}
1388 
1389 	/* Instruction and DummyCycles are set below */
1390 	cmd.Address = addr; /* AddressSize is 32bits in OPSI mode */
1391 	cmd.AddressSize = stm32_ospi_hal_address_size(dev);
1392 	/* DataSize is set by the read cmd */
1393 
1394 	/* Configure other parameters */
1395 	if (dev_cfg->data_rate == OSPI_DTR_TRANSFER) {
1396 		/* DTR transfer rate (==> Octal mode) */
1397 		cmd.Instruction = SPI_NOR_OCMD_DTR_RD;
1398 		cmd.DummyCycles = SPI_NOR_DUMMY_RD_OCTAL_DTR;
1399 	} else {
1400 		/* STR transfer rate */
1401 		if (dev_cfg->data_mode == OSPI_OPI_MODE) {
1402 			/* OPI and STR */
1403 			cmd.Instruction = SPI_NOR_OCMD_RD;
1404 			cmd.DummyCycles = SPI_NOR_DUMMY_RD_OCTAL;
1405 		} else {
1406 			/* use SFDP:BFP read instruction */
1407 			cmd.Instruction = dev_data->read_opcode;
1408 			cmd.DummyCycles = dev_data->read_dummy;
1409 			/* in SPI and STR : expecting SPI_NOR_CMD_READ_FAST_4B */
1410 		}
1411 	}
1412 
1413 	LOG_DBG("OSPI: read %zu data", size);
1414 	ospi_lock_thread(dev);
1415 
1416 	ret = ospi_read_access(dev, &cmd, data, size);
1417 
1418 	ospi_unlock_thread(dev);
1419 
1420 #endif /* CONFIG_STM32_MEMMAP */
1421 	return ret;
1422 }
1423 
1424 /*
1425  * Function to write the flash (page program) : with possible OSPI/SPI and STR/DTR
1426  * NOTE: writing  in MemoryMapped mode is not guaranted
1427  */
flash_stm32_ospi_write(const struct device * dev,off_t addr,const void * data,size_t size)1428 static int flash_stm32_ospi_write(const struct device *dev, off_t addr,
1429 				  const void *data, size_t size)
1430 {
1431 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
1432 	struct flash_stm32_ospi_data *dev_data = dev->data;
1433 	size_t to_write;
1434 	int ret = 0;
1435 
1436 	if (!ospi_address_is_valid(dev, addr, size)) {
1437 		LOG_ERR("Error: address or size exceeds expected values: "
1438 			"addr 0x%lx, size %zu", (long)addr, size);
1439 		return -EINVAL;
1440 	}
1441 
1442 	/* Ignore zero size write */
1443 	if (size == 0) {
1444 		return 0;
1445 	}
1446 
1447 	ospi_lock_thread(dev);
1448 
1449 #ifdef CONFIG_STM32_MEMMAP
1450 	if (stm32_ospi_is_memorymap(dev)) {
1451 		/* Abort ongoing transfer to force CS high/BUSY deasserted */
1452 		ret = stm32_ospi_abort(dev);
1453 		if (ret != 0) {
1454 			LOG_ERR("Failed to abort memory-mapped access before write");
1455 			goto end_write;
1456 		}
1457 	}
1458 	/* Continue with Indirect Mode */
1459 #endif /* CONFIG_STM32_MEMMAP */
1460 	/* page program for STR or DTR mode */
1461 	OSPI_RegularCmdTypeDef cmd_pp = ospi_prepare_cmd(dev_cfg->data_mode, dev_cfg->data_rate);
1462 
1463 	/* using 32bits address also in SPI/STR mode */
1464 	cmd_pp.Instruction = dev_data->write_opcode;
1465 
1466 	/* Adapt lines based on write_opcode */
1467 	switch (cmd_pp.Instruction) {
1468 	case SPI_NOR_CMD_PP_4B:
1469 		__fallthrough;
1470 	case SPI_NOR_CMD_PP:
1471 		cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1472 		cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1473 		cmd_pp.DataMode = HAL_OSPI_DATA_1_LINE;
1474 		break;
1475 	case SPI_NOR_CMD_PP_1_1_2:
1476 		cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1477 		cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1478 		cmd_pp.DataMode = HAL_OSPI_DATA_2_LINES;
1479 		break;
1480 	case SPI_NOR_CMD_PP_1_1_4_4B:
1481 		__fallthrough;
1482 	case SPI_NOR_CMD_PP_1_1_4:
1483 		cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1484 		cmd_pp.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
1485 		cmd_pp.DataMode = HAL_OSPI_DATA_4_LINES;
1486 		break;
1487 	case SPI_NOR_CMD_PP_1_4_4_4B:
1488 		__fallthrough;
1489 	case SPI_NOR_CMD_PP_1_4_4:
1490 		cmd_pp.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
1491 		cmd_pp.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
1492 		cmd_pp.DataMode = HAL_OSPI_DATA_4_LINES;
1493 		break;
1494 	default:
1495 		/* Use lines based on data mode set in ospi_prepare_cmd */
1496 		break;
1497 	}
1498 
1499 	cmd_pp.Address = addr;
1500 	cmd_pp.AddressSize = stm32_ospi_hal_address_size(dev);
1501 	cmd_pp.DummyCycles = 0U;
1502 
1503 	LOG_DBG("OSPI: write %zu data", size);
1504 
1505 	ret = stm32_ospi_mem_ready(dev_data,
1506 				   dev_cfg->data_mode, dev_cfg->data_rate);
1507 	if (ret != 0) {
1508 		ospi_unlock_thread(dev);
1509 		LOG_ERR("OSPI: write not ready");
1510 		return -EIO;
1511 	}
1512 
1513 	while ((size > 0) && (ret == 0)) {
1514 		to_write = size;
1515 		ret = stm32_ospi_write_enable(dev_data,
1516 						    dev_cfg->data_mode, dev_cfg->data_rate);
1517 		if (ret != 0) {
1518 			LOG_ERR("OSPI: write not enabled");
1519 			break;
1520 		}
1521 		/* Don't write more than a page. */
1522 		if (to_write >= SPI_NOR_PAGE_SIZE) {
1523 			to_write = SPI_NOR_PAGE_SIZE;
1524 		}
1525 
1526 		/* Don't write across a page boundary */
1527 		if (((addr + to_write - 1U) / SPI_NOR_PAGE_SIZE)
1528 		    != (addr / SPI_NOR_PAGE_SIZE)) {
1529 			to_write = SPI_NOR_PAGE_SIZE -
1530 						(addr % SPI_NOR_PAGE_SIZE);
1531 		}
1532 		cmd_pp.Address = addr;
1533 
1534 		ret = ospi_write_access(dev, &cmd_pp, data, to_write);
1535 		if (ret != 0) {
1536 			LOG_ERR("OSPI: write not access");
1537 			break;
1538 		}
1539 
1540 		size -= to_write;
1541 		data = (const uint8_t *)data + to_write;
1542 		addr += to_write;
1543 
1544 		/* Configure automatic polling mode to wait for end of program */
1545 		ret = stm32_ospi_mem_ready(dev_data,
1546 						 dev_cfg->data_mode, dev_cfg->data_rate);
1547 		if (ret != 0) {
1548 			LOG_ERR("OSPI: write PP not ready");
1549 			break;
1550 		}
1551 	}
1552 	goto end_write;
1553 
1554 end_write:
1555 	ospi_unlock_thread(dev);
1556 
1557 	return ret;
1558 }
1559 
1560 static const struct flash_parameters flash_stm32_ospi_parameters = {
1561 	.write_block_size = 1,
1562 	.erase_value = 0xff
1563 };
1564 
1565 static const struct flash_parameters *
flash_stm32_ospi_get_parameters(const struct device * dev)1566 flash_stm32_ospi_get_parameters(const struct device *dev)
1567 {
1568 	ARG_UNUSED(dev);
1569 
1570 	return &flash_stm32_ospi_parameters;
1571 }
1572 
flash_stm32_ospi_isr(const struct device * dev)1573 static void flash_stm32_ospi_isr(const struct device *dev)
1574 {
1575 	struct flash_stm32_ospi_data *dev_data = dev->data;
1576 
1577 	HAL_OSPI_IRQHandler(&dev_data->hospi);
1578 }
1579 
1580 #if !defined(CONFIG_SOC_SERIES_STM32H7X)
1581 /* weak function required for HAL compilation */
HAL_DMA_Abort_IT(DMA_HandleTypeDef * hdma)1582 __weak HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
1583 {
1584 	return HAL_OK;
1585 }
1586 
1587 /* weak function required for HAL compilation */
HAL_DMA_Abort(DMA_HandleTypeDef * hdma)1588 __weak HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
1589 {
1590 	return HAL_OK;
1591 }
1592 #endif /* !CONFIG_SOC_SERIES_STM32H7X */
1593 
1594 /* This function is executed in the interrupt context */
1595 #if STM32_OSPI_USE_DMA
ospi_dma_callback(const struct device * dev,void * arg,uint32_t channel,int status)1596 static void ospi_dma_callback(const struct device *dev, void *arg,
1597 			 uint32_t channel, int status)
1598 {
1599 	DMA_HandleTypeDef *hdma = arg;
1600 
1601 	ARG_UNUSED(dev);
1602 
1603 	if (status < 0) {
1604 		LOG_ERR("DMA callback error with channel %d.", channel);
1605 	}
1606 
1607 	HAL_DMA_IRQHandler(hdma);
1608 }
1609 #endif
1610 
1611 /*
1612  * Transfer Error callback.
1613  */
HAL_OSPI_ErrorCallback(OSPI_HandleTypeDef * hospi)1614 void HAL_OSPI_ErrorCallback(OSPI_HandleTypeDef *hospi)
1615 {
1616 	struct flash_stm32_ospi_data *dev_data =
1617 		CONTAINER_OF(hospi, struct flash_stm32_ospi_data, hospi);
1618 
1619 	LOG_DBG("Error cb");
1620 
1621 	dev_data->cmd_status = -EIO;
1622 
1623 	k_sem_give(&dev_data->sync);
1624 }
1625 
1626 /*
1627  * Command completed callback.
1628  */
HAL_OSPI_CmdCpltCallback(OSPI_HandleTypeDef * hospi)1629 void HAL_OSPI_CmdCpltCallback(OSPI_HandleTypeDef *hospi)
1630 {
1631 	struct flash_stm32_ospi_data *dev_data =
1632 		CONTAINER_OF(hospi, struct flash_stm32_ospi_data, hospi);
1633 
1634 	LOG_DBG("Cmd Cplt cb");
1635 
1636 	k_sem_give(&dev_data->sync);
1637 }
1638 
1639 /*
1640  * Rx Transfer completed callback.
1641  */
HAL_OSPI_RxCpltCallback(OSPI_HandleTypeDef * hospi)1642 void HAL_OSPI_RxCpltCallback(OSPI_HandleTypeDef *hospi)
1643 {
1644 	struct flash_stm32_ospi_data *dev_data =
1645 		CONTAINER_OF(hospi, struct flash_stm32_ospi_data, hospi);
1646 
1647 	LOG_DBG("Rx Cplt cb");
1648 
1649 	k_sem_give(&dev_data->sync);
1650 }
1651 
1652 /*
1653  * Tx Transfer completed callback.
1654  */
HAL_OSPI_TxCpltCallback(OSPI_HandleTypeDef * hospi)1655 void HAL_OSPI_TxCpltCallback(OSPI_HandleTypeDef *hospi)
1656 {
1657 	struct flash_stm32_ospi_data *dev_data =
1658 		CONTAINER_OF(hospi, struct flash_stm32_ospi_data, hospi);
1659 
1660 	LOG_DBG("Tx Cplt cb");
1661 
1662 	k_sem_give(&dev_data->sync);
1663 }
1664 
1665 /*
1666  * Status Match callback.
1667  */
HAL_OSPI_StatusMatchCallback(OSPI_HandleTypeDef * hospi)1668 void HAL_OSPI_StatusMatchCallback(OSPI_HandleTypeDef *hospi)
1669 {
1670 	struct flash_stm32_ospi_data *dev_data =
1671 		CONTAINER_OF(hospi, struct flash_stm32_ospi_data, hospi);
1672 
1673 	LOG_DBG("Status Match cb");
1674 
1675 	k_sem_give(&dev_data->sync);
1676 }
1677 
1678 /*
1679  * Timeout callback.
1680  */
HAL_OSPI_TimeOutCallback(OSPI_HandleTypeDef * hospi)1681 void HAL_OSPI_TimeOutCallback(OSPI_HandleTypeDef *hospi)
1682 {
1683 	struct flash_stm32_ospi_data *dev_data =
1684 		CONTAINER_OF(hospi, struct flash_stm32_ospi_data, hospi);
1685 
1686 	LOG_DBG("Timeout cb");
1687 
1688 	dev_data->cmd_status = -EIO;
1689 
1690 	k_sem_give(&dev_data->sync);
1691 }
1692 
1693 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
flash_stm32_ospi_pages_layout(const struct device * dev,const struct flash_pages_layout ** layout,size_t * layout_size)1694 static void flash_stm32_ospi_pages_layout(const struct device *dev,
1695 				const struct flash_pages_layout **layout,
1696 				size_t *layout_size)
1697 {
1698 	struct flash_stm32_ospi_data *dev_data = dev->data;
1699 
1700 	*layout = &dev_data->layout;
1701 	*layout_size = 1;
1702 }
1703 #endif
1704 
1705 static DEVICE_API(flash, flash_stm32_ospi_driver_api) = {
1706 	.read = flash_stm32_ospi_read,
1707 	.write = flash_stm32_ospi_write,
1708 	.erase = flash_stm32_ospi_erase,
1709 	.get_parameters = flash_stm32_ospi_get_parameters,
1710 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
1711 	.page_layout = flash_stm32_ospi_pages_layout,
1712 #endif
1713 #if defined(CONFIG_FLASH_JESD216_API)
1714 	.sfdp_read = ospi_read_sfdp,
1715 	.read_jedec_id = ospi_read_jedec_id,
1716 #endif /* CONFIG_FLASH_JESD216_API */
1717 };
1718 
1719 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
setup_pages_layout(const struct device * dev)1720 static int setup_pages_layout(const struct device *dev)
1721 {
1722 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
1723 	struct flash_stm32_ospi_data *data = dev->data;
1724 	const size_t flash_size = dev_cfg->flash_size;
1725 	uint32_t layout_page_size = data->page_size;
1726 	uint8_t value = 0;
1727 	int rv = 0;
1728 
1729 	/* Find the smallest erase size. */
1730 	for (size_t i = 0; i < ARRAY_SIZE(data->erase_types); ++i) {
1731 		const struct jesd216_erase_type *etp = &data->erase_types[i];
1732 
1733 		if ((etp->cmd != 0)
1734 		    && ((value == 0) || (etp->exp < value))) {
1735 			value = etp->exp;
1736 		}
1737 	}
1738 
1739 	uint32_t erase_size = BIT(value);
1740 
1741 	if (erase_size == 0) {
1742 		erase_size = SPI_NOR_SECTOR_SIZE;
1743 	}
1744 
1745 	/* We need layout page size to be compatible with erase size */
1746 	if ((layout_page_size % erase_size) != 0) {
1747 		LOG_DBG("layout page %u not compatible with erase size %u",
1748 			layout_page_size, erase_size);
1749 		LOG_DBG("erase size will be used as layout page size");
1750 		layout_page_size = erase_size;
1751 	}
1752 
1753 	/* Warn but accept layout page sizes that leave inaccessible
1754 	 * space.
1755 	 */
1756 	if ((flash_size % layout_page_size) != 0) {
1757 		LOG_DBG("layout page %u wastes space with device size %zu",
1758 			layout_page_size, flash_size);
1759 	}
1760 
1761 	data->layout.pages_size = layout_page_size;
1762 	data->layout.pages_count = flash_size / layout_page_size;
1763 	LOG_DBG("layout %u x %u By pages", data->layout.pages_count,
1764 					   data->layout.pages_size);
1765 
1766 	return rv;
1767 }
1768 #endif /* CONFIG_FLASH_PAGE_LAYOUT */
1769 
stm32_ospi_read_status_register(const struct device * dev,uint8_t reg_num,uint8_t * reg)1770 static int stm32_ospi_read_status_register(const struct device *dev, uint8_t reg_num, uint8_t *reg)
1771 {
1772 	OSPI_RegularCmdTypeDef s_command = {
1773 		.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE,
1774 		.DataMode = HAL_OSPI_DATA_1_LINE,
1775 	};
1776 
1777 	switch (reg_num) {
1778 	case 1U:
1779 		s_command.Instruction = SPI_NOR_CMD_RDSR;
1780 		break;
1781 	case 2U:
1782 		s_command.Instruction = SPI_NOR_CMD_RDSR2;
1783 		break;
1784 	case 3U:
1785 		s_command.Instruction = SPI_NOR_CMD_RDSR3;
1786 		break;
1787 	default:
1788 		return -EINVAL;
1789 	}
1790 
1791 	return ospi_read_access(dev, &s_command, reg, sizeof(*reg));
1792 }
1793 
stm32_ospi_write_status_register(const struct device * dev,uint8_t reg_num,uint8_t reg)1794 static int stm32_ospi_write_status_register(const struct device *dev, uint8_t reg_num, uint8_t reg)
1795 {
1796 	struct flash_stm32_ospi_data *data = dev->data;
1797 	OSPI_RegularCmdTypeDef s_command = {
1798 		.Instruction = SPI_NOR_CMD_WRSR,
1799 		.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE,
1800 		.DataMode = HAL_OSPI_DATA_1_LINE
1801 	};
1802 	size_t size;
1803 	uint8_t regs[4] = { 0 };
1804 	uint8_t *regs_p;
1805 	int ret;
1806 
1807 	if (reg_num == 1U) {
1808 		size = 1U;
1809 		regs[0] = reg;
1810 		regs_p = &regs[0];
1811 		/* 1 byte write clears SR2, write SR2 as well */
1812 		if (data->qer_type == JESD216_DW15_QER_S2B1v1) {
1813 			ret = stm32_ospi_read_status_register(dev, 2, &regs[1]);
1814 			if (ret < 0) {
1815 				return ret;
1816 			}
1817 			size = 2U;
1818 		}
1819 	} else if (reg_num == 2U) {
1820 		s_command.Instruction = SPI_NOR_CMD_WRSR2;
1821 		size = 1U;
1822 		regs[1] = reg;
1823 		regs_p = &regs[1];
1824 		/* if SR2 write needs SR1 */
1825 		if ((data->qer_type == JESD216_DW15_QER_VAL_S2B1v1) ||
1826 		    (data->qer_type == JESD216_DW15_QER_VAL_S2B1v4) ||
1827 		    (data->qer_type == JESD216_DW15_QER_VAL_S2B1v5)) {
1828 			ret = stm32_ospi_read_status_register(dev, 1, &regs[0]);
1829 			if (ret < 0) {
1830 				return ret;
1831 			}
1832 			s_command.Instruction = SPI_NOR_CMD_WRSR;
1833 			size = 2U;
1834 			regs_p = &regs[0];
1835 		}
1836 	} else if (reg_num == 3U) {
1837 		s_command.Instruction = SPI_NOR_CMD_WRSR3;
1838 		size = 1U;
1839 		regs[2] = reg;
1840 		regs_p = &regs[2];
1841 	} else {
1842 		return -EINVAL;
1843 	}
1844 
1845 	return ospi_write_access(dev, &s_command, regs_p, size);
1846 }
1847 
stm32_ospi_enable_qe(const struct device * dev)1848 static int stm32_ospi_enable_qe(const struct device *dev)
1849 {
1850 	struct flash_stm32_ospi_data *data = dev->data;
1851 	uint8_t qe_reg_num;
1852 	uint8_t qe_bit;
1853 	uint8_t reg;
1854 	int ret;
1855 
1856 	switch (data->qer_type) {
1857 	case JESD216_DW15_QER_NONE:
1858 		/* no QE bit, device detects reads based on opcode */
1859 		return 0;
1860 	case JESD216_DW15_QER_S1B6:
1861 		qe_reg_num = 1U;
1862 		qe_bit = BIT(6U);
1863 		break;
1864 	case JESD216_DW15_QER_S2B7:
1865 		qe_reg_num = 2U;
1866 		qe_bit = BIT(7U);
1867 		break;
1868 	case JESD216_DW15_QER_S2B1v1:
1869 		__fallthrough;
1870 	case JESD216_DW15_QER_S2B1v4:
1871 		__fallthrough;
1872 	case JESD216_DW15_QER_S2B1v5:
1873 		__fallthrough;
1874 	case JESD216_DW15_QER_S2B1v6:
1875 		qe_reg_num = 2U;
1876 		qe_bit = BIT(1U);
1877 		break;
1878 	default:
1879 		return -ENOTSUP;
1880 	}
1881 
1882 	ret = stm32_ospi_read_status_register(dev, qe_reg_num, &reg);
1883 	if (ret < 0) {
1884 		return ret;
1885 	}
1886 
1887 	/* exit early if QE bit is already set */
1888 	if ((reg & qe_bit) != 0U) {
1889 		return 0;
1890 	}
1891 
1892 	ret = stm32_ospi_write_enable(data, OSPI_SPI_MODE, OSPI_STR_TRANSFER);
1893 	if (ret < 0) {
1894 		return ret;
1895 	}
1896 
1897 	reg |= qe_bit;
1898 
1899 	ret = stm32_ospi_write_status_register(dev, qe_reg_num, reg);
1900 	if (ret < 0) {
1901 		return ret;
1902 	}
1903 
1904 	ret = stm32_ospi_mem_ready(data, OSPI_SPI_MODE, OSPI_STR_TRANSFER);
1905 	if (ret < 0) {
1906 		return ret;
1907 	}
1908 
1909 	/* validate that QE bit is set */
1910 	ret = stm32_ospi_read_status_register(dev, qe_reg_num, &reg);
1911 	if (ret < 0) {
1912 		return ret;
1913 	}
1914 
1915 	if ((reg & qe_bit) == 0U) {
1916 		LOG_ERR("Status Register %u [0x%02x] not set", qe_reg_num, reg);
1917 		ret = -EIO;
1918 	}
1919 
1920 	return ret;
1921 }
1922 
spi_nor_process_bfp_addrbytes(const struct device * dev,const uint8_t jesd216_bfp_addrbytes)1923 static void spi_nor_process_bfp_addrbytes(const struct device *dev,
1924 					  const uint8_t jesd216_bfp_addrbytes)
1925 {
1926 	struct flash_stm32_ospi_data *data = dev->data;
1927 
1928 	if ((jesd216_bfp_addrbytes == JESD216_SFDP_BFP_DW1_ADDRBYTES_VAL_4B) ||
1929 	    (jesd216_bfp_addrbytes == JESD216_SFDP_BFP_DW1_ADDRBYTES_VAL_3B4B)) {
1930 		data->address_width = 4U;
1931 	} else {
1932 		data->address_width = 3U;
1933 	}
1934 }
1935 
spi_nor_convert_read_to_4b(const uint8_t opcode)1936 static inline uint8_t spi_nor_convert_read_to_4b(const uint8_t opcode)
1937 {
1938 	switch (opcode) {
1939 	case SPI_NOR_CMD_READ:
1940 		return SPI_NOR_CMD_READ_4B;
1941 	case SPI_NOR_CMD_DREAD:
1942 		return SPI_NOR_CMD_DREAD_4B;
1943 	case SPI_NOR_CMD_2READ:
1944 		return SPI_NOR_CMD_2READ_4B;
1945 	case SPI_NOR_CMD_QREAD:
1946 		return SPI_NOR_CMD_QREAD_4B;
1947 	case SPI_NOR_CMD_4READ:
1948 		return SPI_NOR_CMD_4READ_4B;
1949 	default:
1950 		/* use provided */
1951 		return opcode;
1952 	}
1953 }
1954 
spi_nor_convert_write_to_4b(const uint8_t opcode)1955 static inline uint8_t spi_nor_convert_write_to_4b(const uint8_t opcode)
1956 {
1957 	switch (opcode) {
1958 	case SPI_NOR_CMD_PP:
1959 		return SPI_NOR_CMD_PP_4B;
1960 	case SPI_NOR_CMD_PP_1_1_4:
1961 		return SPI_NOR_CMD_PP_1_1_4_4B;
1962 	case SPI_NOR_CMD_PP_1_4_4:
1963 		return SPI_NOR_CMD_PP_1_4_4_4B;
1964 	default:
1965 		/* use provided */
1966 		return opcode;
1967 	}
1968 }
1969 
spi_nor_process_bfp(const struct device * dev,const struct jesd216_param_header * php,const struct jesd216_bfp * bfp)1970 static int spi_nor_process_bfp(const struct device *dev,
1971 			       const struct jesd216_param_header *php,
1972 			       const struct jesd216_bfp *bfp)
1973 {
1974 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
1975 	struct flash_stm32_ospi_data *data = dev->data;
1976 	/* must be kept in data mode order, ignore 1-1-1 (always supported) */
1977 	const enum jesd216_mode_type supported_read_modes[] = { JESD216_MODE_112, JESD216_MODE_122,
1978 								JESD216_MODE_114,
1979 								JESD216_MODE_144 };
1980 	size_t supported_read_modes_max_idx;
1981 	struct jesd216_erase_type *etp = data->erase_types;
1982 	size_t idx;
1983 	const size_t flash_size = jesd216_bfp_density(bfp) / 8U;
1984 	struct jesd216_instr read_instr = { 0 };
1985 	struct jesd216_bfp_dw15 dw15;
1986 
1987 	if (flash_size != dev_cfg->flash_size) {
1988 		LOG_DBG("Unexpected flash size: %u", flash_size);
1989 	}
1990 
1991 	LOG_DBG("%s: %u MiBy flash", dev->name, (uint32_t)(flash_size >> 20));
1992 
1993 	/* Copy over the erase types, preserving their order.  (The
1994 	 * Sector Map Parameter table references them by index.)
1995 	 */
1996 	memset(data->erase_types, 0, sizeof(data->erase_types));
1997 	for (idx = 1U; idx <= ARRAY_SIZE(data->erase_types); ++idx) {
1998 		if (jesd216_bfp_erase(bfp, idx, etp) == 0) {
1999 			LOG_DBG("Erase %u with %02x",
2000 					(uint32_t)BIT(etp->exp), etp->cmd);
2001 		}
2002 		++etp;
2003 	}
2004 
2005 	spi_nor_process_bfp_addrbytes(dev, jesd216_bfp_addrbytes(bfp));
2006 	LOG_DBG("Address width: %u Bytes", data->address_width);
2007 
2008 	/* use PP opcode based on configured data mode if nothing is set in DTS */
2009 	if (data->write_opcode == SPI_NOR_WRITEOC_NONE) {
2010 		switch (dev_cfg->data_mode) {
2011 		case OSPI_OPI_MODE:
2012 			data->write_opcode = SPI_NOR_OCMD_PAGE_PRG;
2013 			break;
2014 		case OSPI_QUAD_MODE:
2015 			data->write_opcode = SPI_NOR_CMD_PP_1_4_4;
2016 			break;
2017 		case OSPI_DUAL_MODE:
2018 			data->write_opcode = SPI_NOR_CMD_PP_1_1_2;
2019 			break;
2020 		default:
2021 			data->write_opcode = SPI_NOR_CMD_PP;
2022 			break;
2023 		}
2024 	}
2025 
2026 	if (dev_cfg->data_mode != OSPI_OPI_MODE) {
2027 		/* determine supported read modes, begin from the slowest */
2028 		data->read_mode = JESD216_MODE_111;
2029 		data->read_opcode = SPI_NOR_CMD_READ;
2030 		data->read_dummy = 0U;
2031 
2032 		if (dev_cfg->data_mode != OSPI_SPI_MODE) {
2033 			if (dev_cfg->data_mode == OSPI_DUAL_MODE) {
2034 				/* the index of JESD216_MODE_114 in supported_read_modes */
2035 				supported_read_modes_max_idx = 2U;
2036 			} else {
2037 				supported_read_modes_max_idx = ARRAY_SIZE(supported_read_modes);
2038 			}
2039 
2040 			for (idx = 0U; idx < supported_read_modes_max_idx; ++idx) {
2041 				if (jesd216_bfp_read_support(php, bfp, supported_read_modes[idx],
2042 							     &read_instr) < 0) {
2043 					/* not supported */
2044 					continue;
2045 				}
2046 
2047 				LOG_DBG("Supports read mode: %d, instr: 0x%X",
2048 					supported_read_modes[idx], read_instr.instr);
2049 				data->read_mode = supported_read_modes[idx];
2050 				data->read_opcode = read_instr.instr;
2051 				data->read_dummy =
2052 					(read_instr.wait_states + read_instr.mode_clocks);
2053 			}
2054 		}
2055 
2056 		/* convert 3-Byte opcodes to 4-Byte (if required) */
2057 		if (IS_ENABLED(DT_INST_PROP(0, four_byte_opcodes))) {
2058 			if (data->address_width != 4U) {
2059 				LOG_DBG("4-Byte opcodes require 4-Byte address width");
2060 				return -ENOTSUP;
2061 			}
2062 			data->read_opcode = spi_nor_convert_read_to_4b(data->read_opcode);
2063 			data->write_opcode = spi_nor_convert_write_to_4b(data->write_opcode);
2064 		}
2065 
2066 		/* enable quad mode (if required) */
2067 		if (dev_cfg->data_mode == OSPI_QUAD_MODE) {
2068 			if (jesd216_bfp_decode_dw15(php, bfp, &dw15) < 0) {
2069 				/* will use QER from DTS or default (refer to device data) */
2070 				LOG_WRN("Unable to decode QE requirement [DW15]");
2071 			} else {
2072 				/* bypass DTS QER value */
2073 				data->qer_type = dw15.qer;
2074 			}
2075 
2076 			LOG_DBG("QE requirement mode: %x", data->qer_type);
2077 
2078 			if (stm32_ospi_enable_qe(dev) < 0) {
2079 				LOG_ERR("Failed to enable QUAD mode");
2080 				return -EIO;
2081 			}
2082 
2083 			LOG_DBG("QUAD mode enabled");
2084 		}
2085 	}
2086 
2087 	data->page_size = jesd216_bfp_page_size(php, bfp);
2088 
2089 	LOG_DBG("Page size %u bytes", data->page_size);
2090 	LOG_DBG("Flash size %zu bytes", flash_size);
2091 	LOG_DBG("Using read mode: %d, instr: 0x%X, dummy cycles: %u",
2092 		data->read_mode, data->read_opcode, data->read_dummy);
2093 	LOG_DBG("Using write instr: 0x%X", data->write_opcode);
2094 
2095 	return 0;
2096 }
2097 
flash_stm32_ospi_init(const struct device * dev)2098 static int flash_stm32_ospi_init(const struct device *dev)
2099 {
2100 	const struct flash_stm32_ospi_config *dev_cfg = dev->config;
2101 	struct flash_stm32_ospi_data *dev_data = dev->data;
2102 	uint32_t ahb_clock_freq;
2103 	uint32_t prescaler = STM32_OSPI_CLOCK_PRESCALER_MIN;
2104 	int ret;
2105 
2106 	/* The SPI/DTR is not a valid config of data_mode/data_rate according to the DTS */
2107 	if ((dev_cfg->data_mode != OSPI_OPI_MODE)
2108 		&& (dev_cfg->data_rate == OSPI_DTR_TRANSFER)) {
2109 		/* already the right config, continue */
2110 		LOG_ERR("OSPI mode SPI|DUAL|QUAD/DTR is not valid");
2111 		return -ENOTSUP;
2112 	}
2113 
2114 	/* Signals configuration */
2115 	ret = pinctrl_apply_state(dev_cfg->pcfg, PINCTRL_STATE_DEFAULT);
2116 	if (ret < 0) {
2117 		LOG_ERR("OSPI pinctrl setup failed (%d)", ret);
2118 		return ret;
2119 	}
2120 
2121 	if (!device_is_ready(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE))) {
2122 		LOG_ERR("clock control device not ready");
2123 		return -ENODEV;
2124 	}
2125 
2126 #ifdef CONFIG_STM32_MEMMAP
2127 	/* If MemoryMapped then configure skip init */
2128 	if (stm32_ospi_is_memorymap(dev)) {
2129 		LOG_DBG("NOR init'd in MemMapped mode\n");
2130 		/* Force HAL instance in correct state */
2131 		dev_data->hospi.State = HAL_OSPI_STATE_BUSY_MEM_MAPPED;
2132 		return 0;
2133 	}
2134 #endif /* CONFIG_STM32_MEMMAP */
2135 
2136 #if STM32_OSPI_USE_DMA
2137 	/*
2138 	 * DMA configuration
2139 	 * Due to use of OSPI HAL API in current driver,
2140 	 * both HAL and Zephyr DMA drivers should be configured.
2141 	 * The required configuration for Zephyr DMA driver should only provide
2142 	 * the minimum information to inform the DMA slot will be in used and
2143 	 * how to route callbacks.
2144 	 */
2145 	struct dma_config dma_cfg = dev_data->dma.cfg;
2146 	static DMA_HandleTypeDef hdma;
2147 
2148 	if (!device_is_ready(dev_data->dma.dev)) {
2149 		LOG_ERR("%s device not ready", dev_data->dma.dev->name);
2150 		return -ENODEV;
2151 	}
2152 
2153 	/* Proceed to the minimum Zephyr DMA driver init */
2154 	dma_cfg.user_data = &hdma;
2155 	/* HACK: This field is used to inform driver that it is overridden */
2156 	dma_cfg.linked_channel = STM32_DMA_HAL_OVERRIDE;
2157 	/* Because of the STREAM OFFSET, the DMA channel given here is from 1 - 8 */
2158 	ret = dma_config(dev_data->dma.dev,
2159 			 (dev_data->dma.channel + STM32_DMA_STREAM_OFFSET), &dma_cfg);
2160 	if (ret != 0) {
2161 		LOG_ERR("Failed to configure DMA channel %d",
2162 			dev_data->dma.channel + STM32_DMA_STREAM_OFFSET);
2163 		return ret;
2164 	}
2165 
2166 	/* Proceed to the HAL DMA driver init */
2167 	if (dma_cfg.source_data_size != dma_cfg.dest_data_size) {
2168 		LOG_ERR("Source and destination data sizes not aligned");
2169 		return -EINVAL;
2170 	}
2171 
2172 	int index = find_lsb_set(dma_cfg.source_data_size) - 1;
2173 
2174 #if CONFIG_DMA_STM32U5
2175 	/* Fill the structure for dma init */
2176 	hdma.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
2177 	hdma.Init.SrcInc = DMA_SINC_FIXED;
2178 	hdma.Init.DestInc = DMA_DINC_INCREMENTED;
2179 	hdma.Init.SrcDataWidth = table_src_size[index];
2180 	hdma.Init.DestDataWidth = table_dest_size[index];
2181 	hdma.Init.SrcBurstLength = 4;
2182 	hdma.Init.DestBurstLength = 4;
2183 	hdma.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0 | DMA_DEST_ALLOCATED_PORT1;
2184 	hdma.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
2185 #else
2186 	hdma.Init.PeriphDataAlignment = table_p_size[index];
2187 	hdma.Init.MemDataAlignment = table_m_size[index];
2188 	hdma.Init.PeriphInc = DMA_PINC_DISABLE;
2189 	hdma.Init.MemInc = DMA_MINC_ENABLE;
2190 #endif /* CONFIG_DMA_STM32U5 */
2191 	hdma.Init.Mode = DMA_NORMAL;
2192 	hdma.Init.Priority = table_priority[dma_cfg.channel_priority];
2193 	hdma.Init.Direction = DMA_PERIPH_TO_MEMORY;
2194 #ifdef CONFIG_DMA_STM32_V1
2195 	/* TODO: Not tested in this configuration */
2196 	hdma.Init.Channel = dma_cfg.dma_slot;
2197 	hdma.Instance = __LL_DMA_GET_STREAM_INSTANCE(dev_data->dma.reg,
2198 						     dev_data->dma.channel);
2199 #else
2200 	hdma.Init.Request = dma_cfg.dma_slot;
2201 #if CONFIG_DMA_STM32U5
2202 	hdma.Instance = LL_DMA_GET_CHANNEL_INSTANCE(dev_data->dma.reg,
2203 						      dev_data->dma.channel);
2204 #elif defined(CONFIG_DMAMUX_STM32)
2205 	/*
2206 	 * HAL expects a valid DMA channel (not DMAMUX).
2207 	 * The channel is from 0 to 7 because of the STM32_DMA_STREAM_OFFSET in the dma_stm32 driver
2208 	 */
2209 	hdma.Instance = __LL_DMA_GET_CHANNEL_INSTANCE(dev_data->dma.reg,
2210 						      dev_data->dma.channel);
2211 #else
2212 	hdma.Instance = __LL_DMA_GET_CHANNEL_INSTANCE(dev_data->dma.reg,
2213 						      dev_data->dma.channel-1);
2214 #endif /* CONFIG_DMA_STM32U5 */
2215 #endif /* CONFIG_DMA_STM32_V1 */
2216 
2217 	/* Initialize DMA HAL */
2218 	__HAL_LINKDMA(&dev_data->hospi, hdma, hdma);
2219 	if (HAL_DMA_Init(&hdma) != HAL_OK) {
2220 		LOG_ERR("OSPI DMA Init failed");
2221 		return -EIO;
2222 	}
2223 	LOG_INF("OSPI with DMA transfer");
2224 
2225 #endif /* STM32_OSPI_USE_DMA */
2226 
2227 	/* Clock configuration */
2228 	if (clock_control_on(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
2229 			     (clock_control_subsys_t) &dev_cfg->pclken) != 0) {
2230 		LOG_ERR("Could not enable OSPI clock");
2231 		return -EIO;
2232 	}
2233 	/* Alternate clock config for peripheral if any */
2234 #if DT_CLOCKS_HAS_NAME(STM32_OSPI_NODE, ospi_ker)
2235 	if (clock_control_configure(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
2236 				(clock_control_subsys_t) &dev_cfg->pclken_ker,
2237 				NULL) != 0) {
2238 		LOG_ERR("Could not select OSPI domain clock");
2239 		return -EIO;
2240 	}
2241 	if (clock_control_get_rate(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
2242 					(clock_control_subsys_t) &dev_cfg->pclken_ker,
2243 					&ahb_clock_freq) < 0) {
2244 		LOG_ERR("Failed call clock_control_get_rate(pclken_ker)");
2245 		return -EIO;
2246 	}
2247 #else
2248 	if (clock_control_get_rate(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
2249 					(clock_control_subsys_t) &dev_cfg->pclken,
2250 					&ahb_clock_freq) < 0) {
2251 		LOG_ERR("Failed call clock_control_get_rate(pclken)");
2252 		return -EIO;
2253 	}
2254 #endif
2255 #if DT_CLOCKS_HAS_NAME(STM32_OSPI_NODE, ospi_mgr)
2256 	if (clock_control_on(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE),
2257 			     (clock_control_subsys_t) &dev_cfg->pclken_mgr) != 0) {
2258 		LOG_ERR("Could not enable OSPI Manager clock");
2259 		return -EIO;
2260 	}
2261 #endif
2262 
2263 	for (; prescaler <= STM32_OSPI_CLOCK_PRESCALER_MAX; prescaler++) {
2264 		uint32_t clk = STM32_OSPI_CLOCK_COMPUTE(ahb_clock_freq, prescaler);
2265 
2266 		if (clk <= dev_cfg->max_frequency) {
2267 			break;
2268 		}
2269 	}
2270 	__ASSERT_NO_MSG(prescaler >= STM32_OSPI_CLOCK_PRESCALER_MIN &&
2271 			prescaler <= STM32_OSPI_CLOCK_PRESCALER_MAX);
2272 
2273 	/* Initialize OSPI HAL structure completely */
2274 	dev_data->hospi.Init.FifoThreshold = 4;
2275 	dev_data->hospi.Init.ClockPrescaler = prescaler;
2276 #if defined(CONFIG_SOC_SERIES_STM32H5X)
2277 	/* The stm32h5xx_hal_xspi does not reduce DEVSIZE before writing the DCR1 */
2278 	dev_data->hospi.Init.DeviceSize = find_lsb_set(dev_cfg->flash_size) - 2;
2279 #else
2280 	/* Give a bit position from 0 to 31 to the HAL init for the DCR1 reg */
2281 	dev_data->hospi.Init.DeviceSize = find_lsb_set(dev_cfg->flash_size) - 1;
2282 #endif /* CONFIG_SOC_SERIES_STM32U5X */
2283 	dev_data->hospi.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;
2284 	dev_data->hospi.Init.ChipSelectHighTime = 2;
2285 	dev_data->hospi.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;
2286 	dev_data->hospi.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;
2287 #if defined(OCTOSPI_DCR2_WRAPSIZE)
2288 	dev_data->hospi.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;
2289 #endif /* OCTOSPI_DCR2_WRAPSIZE */
2290 	/* STR mode else Macronix for DTR mode */
2291 	if (dev_cfg->data_rate == OSPI_DTR_TRANSFER) {
2292 		dev_data->hospi.Init.MemoryType = HAL_OSPI_MEMTYPE_MACRONIX;
2293 		dev_data->hospi.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE;
2294 	} else {
2295 		dev_data->hospi.Init.MemoryType = HAL_OSPI_MEMTYPE_MICRON;
2296 		dev_data->hospi.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;
2297 	}
2298 	dev_data->hospi.Init.ChipSelectBoundary = 0;
2299 #if STM32_OSPI_DLYB_BYPASSED
2300 	dev_data->hospi.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_BYPASSED;
2301 #else
2302 	dev_data->hospi.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_USED;
2303 #endif /* STM32_OSPI_DLYB_BYPASSED */
2304 #if defined(OCTOSPI_DCR4_REFRESH)
2305 	dev_data->hospi.Init.Refresh = 0;
2306 #endif /* OCTOSPI_DCR4_REFRESH */
2307 
2308 	if (HAL_OSPI_Init(&dev_data->hospi) != HAL_OK) {
2309 		LOG_ERR("OSPI Init failed");
2310 		return -EIO;
2311 	}
2312 
2313 	LOG_DBG("OSPI Init'd");
2314 
2315 #if defined(OCTOSPIM)
2316 	/* OCTOSPI I/O manager init Function */
2317 	OSPIM_CfgTypeDef ospi_mgr_cfg = {0};
2318 
2319 	if (dev_data->hospi.Instance == OCTOSPI1) {
2320 		ospi_mgr_cfg.ClkPort = DT_OSPI_PROP_OR(clk_port, 1);
2321 		ospi_mgr_cfg.DQSPort = DT_OSPI_PROP_OR(dqs_port, 1);
2322 		ospi_mgr_cfg.NCSPort = DT_OSPI_PROP_OR(ncs_port, 1);
2323 		ospi_mgr_cfg.IOLowPort = DT_OSPI_IO_PORT_PROP_OR(io_low_port,
2324 								 HAL_OSPIM_IOPORT_1_LOW);
2325 		ospi_mgr_cfg.IOHighPort = DT_OSPI_IO_PORT_PROP_OR(io_high_port,
2326 								  HAL_OSPIM_IOPORT_1_HIGH);
2327 	} else if (dev_data->hospi.Instance == OCTOSPI2) {
2328 		ospi_mgr_cfg.ClkPort = DT_OSPI_PROP_OR(clk_port, 2);
2329 		ospi_mgr_cfg.DQSPort = DT_OSPI_PROP_OR(dqs_port, 2);
2330 		ospi_mgr_cfg.NCSPort = DT_OSPI_PROP_OR(ncs_port, 2);
2331 		ospi_mgr_cfg.IOLowPort = DT_OSPI_IO_PORT_PROP_OR(io_low_port,
2332 								 HAL_OSPIM_IOPORT_2_LOW);
2333 		ospi_mgr_cfg.IOHighPort = DT_OSPI_IO_PORT_PROP_OR(io_high_port,
2334 								  HAL_OSPIM_IOPORT_2_HIGH);
2335 	}
2336 #if defined(OCTOSPIM_CR_MUXEN)
2337 	ospi_mgr_cfg.Req2AckTime = 1;
2338 #endif /* OCTOSPIM_CR_MUXEN */
2339 	if (HAL_OSPIM_Config(&dev_data->hospi, &ospi_mgr_cfg,
2340 		HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
2341 		LOG_ERR("OSPI M config failed");
2342 		return -EIO;
2343 	}
2344 #if defined(CONFIG_SOC_SERIES_STM32U5X)
2345 	/* OCTOSPI2 delay block init Function */
2346 	HAL_OSPI_DLYB_CfgTypeDef ospi_delay_block_cfg = {0};
2347 
2348 	ospi_delay_block_cfg.Units = 56;
2349 	ospi_delay_block_cfg.PhaseSel = 2;
2350 	if (HAL_OSPI_DLYB_SetConfig(&dev_data->hospi, &ospi_delay_block_cfg) != HAL_OK) {
2351 		LOG_ERR("OSPI DelayBlock failed");
2352 		return -EIO;
2353 	}
2354 #endif /* CONFIG_SOC_SERIES_STM32U5X */
2355 
2356 #endif /* OCTOSPIM */
2357 
2358 #if defined(CONFIG_SOC_SERIES_STM32H5X)
2359 	/* OCTOSPI1 delay block init Function */
2360 	HAL_XSPI_DLYB_CfgTypeDef xspi_delay_block_cfg = {0};
2361 
2362 	(void)HAL_XSPI_DLYB_GetClockPeriod(&dev_data->hospi, &xspi_delay_block_cfg);
2363 	/*  with DTR, set the PhaseSel/4 (empiric value from stm32Cube) */
2364 	xspi_delay_block_cfg.PhaseSel /= 4;
2365 
2366 	if (HAL_XSPI_DLYB_SetConfig(&dev_data->hospi, &xspi_delay_block_cfg) != HAL_OK) {
2367 		LOG_ERR("XSPI DelayBlock failed");
2368 		return -EIO;
2369 	}
2370 
2371 	LOG_DBG("Delay Block Init");
2372 
2373 #endif /* CONFIG_SOC_SERIES_STM32H5X */
2374 
2375 	/* Initialize semaphores */
2376 	k_sem_init(&dev_data->sem, 1, 1);
2377 	k_sem_init(&dev_data->sync, 0, 1);
2378 
2379 	/* Run IRQ init */
2380 	dev_cfg->irq_config(dev);
2381 
2382 	/* Reset NOR flash memory : still with the SPI/STR config for the NOR */
2383 	if (stm32_ospi_mem_reset(dev) != 0) {
2384 		LOG_ERR("OSPI reset failed");
2385 		return -EIO;
2386 	}
2387 
2388 	LOG_DBG("Reset Mem (SPI/STR)");
2389 
2390 	/* Check if memory is ready in the SPI/STR mode */
2391 	if (stm32_ospi_mem_ready(dev_data,
2392 		OSPI_SPI_MODE, OSPI_STR_TRANSFER) != 0) {
2393 		LOG_ERR("OSPI memory not ready");
2394 		return -EIO;
2395 	}
2396 
2397 	LOG_DBG("Mem Ready (SPI/STR)");
2398 
2399 #if defined(CONFIG_FLASH_JESD216_API)
2400 	/* Process with the RDID (jedec read ID) instruction at init and fill jedec_id Table */
2401 	ret = stm32_ospi_read_jedec_id(dev);
2402 	if (ret != 0) {
2403 		LOG_ERR("Read ID failed: %d", ret);
2404 		return ret;
2405 	}
2406 #endif /* CONFIG_FLASH_JESD216_API */
2407 
2408 	if (stm32_ospi_config_mem(dev) != 0) {
2409 		LOG_ERR("OSPI mode not config'd (%u rate %u)",
2410 			dev_cfg->data_mode, dev_cfg->data_rate);
2411 		return -EIO;
2412 	}
2413 
2414 
2415 
2416 	/* Send the instruction to read the SFDP  */
2417 	const uint8_t decl_nph = 2;
2418 	union {
2419 		/* We only process BFP so use one parameter block */
2420 		uint8_t raw[JESD216_SFDP_SIZE(decl_nph)];
2421 		struct jesd216_sfdp_header sfdp;
2422 	} u;
2423 	const struct jesd216_sfdp_header *hp = &u.sfdp;
2424 
2425 	ret = ospi_read_sfdp(dev, 0, u.raw, sizeof(u.raw));
2426 	if (ret != 0) {
2427 		LOG_ERR("SFDP read failed: %d", ret);
2428 		return ret;
2429 	}
2430 
2431 	uint32_t magic = jesd216_sfdp_magic(hp);
2432 
2433 	if (magic != JESD216_SFDP_MAGIC) {
2434 		LOG_ERR("SFDP magic %08x invalid", magic);
2435 		return -EINVAL;
2436 	}
2437 
2438 	LOG_DBG("%s: SFDP v %u.%u AP %x with %u PH", dev->name,
2439 		hp->rev_major, hp->rev_minor, hp->access, 1 + hp->nph);
2440 
2441 	const struct jesd216_param_header *php = hp->phdr;
2442 	const struct jesd216_param_header *phpe = php +
2443 						     MIN(decl_nph, 1 + hp->nph);
2444 
2445 	while (php != phpe) {
2446 		uint16_t id = jesd216_param_id(php);
2447 
2448 		LOG_DBG("PH%u: %04x rev %u.%u: %u DW @ %x",
2449 			(php - hp->phdr), id, php->rev_major, php->rev_minor,
2450 			php->len_dw, jesd216_param_addr(php));
2451 
2452 		if (id == JESD216_SFDP_PARAM_ID_BFP) {
2453 			union {
2454 				uint32_t dw[20];
2455 				struct jesd216_bfp bfp;
2456 			} u2;
2457 			const struct jesd216_bfp *bfp = &u2.bfp;
2458 
2459 			ret = ospi_read_sfdp(dev, jesd216_param_addr(php),
2460 					     (uint8_t *)u2.dw,
2461 					     MIN(sizeof(uint32_t) * php->len_dw, sizeof(u2.dw)));
2462 			if (ret == 0) {
2463 				ret = spi_nor_process_bfp(dev, php, bfp);
2464 			}
2465 
2466 			if (ret != 0) {
2467 				LOG_ERR("SFDP BFP failed: %d", ret);
2468 				break;
2469 			}
2470 		}
2471 		if (id == JESD216_SFDP_PARAM_ID_4B_ADDR_INSTR) {
2472 
2473 			if (dev_data->address_width == 4U) {
2474 				/*
2475 				 * Check table 4 byte address instruction table to get supported
2476 				 * erase opcodes when running in 4 byte address mode
2477 				 */
2478 				union {
2479 					uint32_t dw[2];
2480 					struct {
2481 						uint32_t dummy;
2482 						uint8_t type[4];
2483 					} types;
2484 				} u2;
2485 				ret = ospi_read_sfdp(dev, jesd216_param_addr(php),
2486 					     (uint8_t *)u2.dw,
2487 					     MIN(sizeof(uint32_t) * php->len_dw, sizeof(u2.dw)));
2488 				if (ret != 0) {
2489 					break;
2490 				}
2491 				for (uint8_t ei = 0; ei < JESD216_NUM_ERASE_TYPES; ++ei) {
2492 					struct jesd216_erase_type *etp = &dev_data->erase_types[ei];
2493 					const uint8_t cmd = u2.types.type[ei];
2494 					/* 0xff means not supported */
2495 					if (cmd == 0xff) {
2496 						etp->exp = 0;
2497 						etp->cmd = 0;
2498 					} else {
2499 						etp->cmd = cmd;
2500 					};
2501 				}
2502 			}
2503 		}
2504 		++php;
2505 	}
2506 
2507 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
2508 	ret = setup_pages_layout(dev);
2509 	if (ret != 0) {
2510 		LOG_ERR("layout setup failed: %d", ret);
2511 		return -ENODEV;
2512 	}
2513 #endif /* CONFIG_FLASH_PAGE_LAYOUT */
2514 
2515 #ifdef CONFIG_STM32_MEMMAP
2516 	/* Now configure the octo Flash in MemoryMapped (access by address) */
2517 	ret = stm32_ospi_set_memorymap(dev);
2518 	if (ret != 0) {
2519 		LOG_ERR("Error (%d): setting NOR in MemoryMapped mode", ret);
2520 		return -EINVAL;
2521 	}
2522 	LOG_DBG("NOR octo-flash in MemoryMapped mode at 0x%lx (0x%x bytes)",
2523 		(long)(STM32_OSPI_BASE_ADDRESS),
2524 		dev_cfg->flash_size);
2525 #else
2526 	LOG_DBG("NOR octo-flash at 0x%lx (0x%x bytes)",
2527 		(long)(STM32_OSPI_BASE_ADDRESS),
2528 		dev_cfg->flash_size);
2529 #endif /* CONFIG_STM32_MEMMAP */
2530 
2531 	return 0;
2532 }
2533 
2534 #if STM32_OSPI_USE_DMA
2535 #define DMA_CHANNEL_CONFIG(node, dir)					\
2536 		DT_DMAS_CELL_BY_NAME(node, dir, channel_config)
2537 
2538 #define OSPI_DMA_CHANNEL_INIT(node, dir)				\
2539 	.dev = DEVICE_DT_GET(DT_DMAS_CTLR(node)),			\
2540 	.channel = DT_DMAS_CELL_BY_NAME(node, dir, channel),		\
2541 	.reg = (DMA_TypeDef *)DT_REG_ADDR(				\
2542 				   DT_PHANDLE_BY_NAME(node, dmas, dir)),\
2543 	.cfg = {							\
2544 		.dma_slot = DT_DMAS_CELL_BY_NAME(node, dir, slot),	\
2545 		.source_data_size = STM32_DMA_CONFIG_PERIPHERAL_DATA_SIZE( \
2546 					DMA_CHANNEL_CONFIG(node, dir)), \
2547 		.dest_data_size = STM32_DMA_CONFIG_MEMORY_DATA_SIZE(    \
2548 					DMA_CHANNEL_CONFIG(node, dir)), \
2549 		.channel_priority = STM32_DMA_CONFIG_PRIORITY(		\
2550 					DMA_CHANNEL_CONFIG(node, dir)), \
2551 		.dma_callback = ospi_dma_callback,			\
2552 	},								\
2553 
2554 #define OSPI_DMA_CHANNEL(node, dir)					\
2555 	.dma = {							\
2556 		COND_CODE_1(DT_DMAS_HAS_NAME(node, dir),		\
2557 			(OSPI_DMA_CHANNEL_INIT(node, dir)),		\
2558 			(NULL))						\
2559 		},
2560 
2561 #else
2562 #define OSPI_DMA_CHANNEL(node, dir)
2563 #endif /* CONFIG_USE_STM32_HAL_DMA */
2564 
2565 #define OSPI_FLASH_MODULE(drv_id, flash_id)				\
2566 		(DT_DRV_INST(drv_id), ospi_nor_flash_##flash_id)
2567 
2568 #define DT_WRITEOC_PROP_OR(inst, default_value)							\
2569 	COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, writeoc),					\
2570 		    (_CONCAT(SPI_NOR_CMD_, DT_STRING_TOKEN(DT_DRV_INST(inst), writeoc))),	\
2571 		    ((default_value)))
2572 
2573 #define DT_QER_PROP_OR(inst, default_value)							\
2574 	COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, quad_enable_requirements),			\
2575 		    (_CONCAT(JESD216_DW15_QER_VAL_,						\
2576 			     DT_STRING_TOKEN(DT_DRV_INST(inst), quad_enable_requirements))),	\
2577 		    ((default_value)))
2578 
2579 static void flash_stm32_ospi_irq_config_func(const struct device *dev);
2580 
2581 PINCTRL_DT_DEFINE(STM32_OSPI_NODE);
2582 
2583 static const struct flash_stm32_ospi_config flash_stm32_ospi_cfg = {
2584 	.regs = (OCTOSPI_TypeDef *)DT_REG_ADDR(STM32_OSPI_NODE),
2585 	.pclken = {.bus = DT_CLOCKS_CELL_BY_NAME(STM32_OSPI_NODE, ospix, bus),
2586 		   .enr = DT_CLOCKS_CELL_BY_NAME(STM32_OSPI_NODE, ospix, bits)},
2587 #if DT_CLOCKS_HAS_NAME(STM32_OSPI_NODE, ospi_ker)
2588 	.pclken_ker = {.bus = DT_CLOCKS_CELL_BY_NAME(STM32_OSPI_NODE, ospi_ker, bus),
2589 		       .enr = DT_CLOCKS_CELL_BY_NAME(STM32_OSPI_NODE, ospi_ker, bits)},
2590 #endif
2591 #if DT_CLOCKS_HAS_NAME(STM32_OSPI_NODE, ospi_mgr)
2592 	.pclken_mgr = {.bus = DT_CLOCKS_CELL_BY_NAME(STM32_OSPI_NODE, ospi_mgr, bus),
2593 		       .enr = DT_CLOCKS_CELL_BY_NAME(STM32_OSPI_NODE, ospi_mgr, bits)},
2594 #endif
2595 	.irq_config = flash_stm32_ospi_irq_config_func,
2596 	.flash_size = DT_INST_REG_ADDR_BY_IDX(0, 1),
2597 	.max_frequency = DT_INST_PROP(0, ospi_max_frequency),
2598 	.data_mode = DT_INST_PROP(0, spi_bus_width), /* SPI or OPI */
2599 	.data_rate = DT_INST_PROP(0, data_rate), /* DTR or STR */
2600 	.pcfg = PINCTRL_DT_DEV_CONFIG_GET(STM32_OSPI_NODE),
2601 #if STM32_OSPI_RESET_GPIO
2602 	.reset = GPIO_DT_SPEC_INST_GET(0, reset_gpios),
2603 #endif /* STM32_OSPI_RESET_GPIO */
2604 #if DT_NODE_HAS_PROP(DT_INST(0, st_stm32_ospi_nor), sfdp_bfp)
2605 	.sfdp_bfp = DT_INST_PROP(0, sfdp_bfp),
2606 #endif /* sfdp_bfp */
2607 };
2608 
2609 static struct flash_stm32_ospi_data flash_stm32_ospi_dev_data = {
2610 	.hospi = {
2611 		.Instance = (OCTOSPI_TypeDef *)DT_REG_ADDR(STM32_OSPI_NODE),
2612 		.Init = {
2613 			.FifoThreshold = STM32_OSPI_FIFO_THRESHOLD,
2614 			.SampleShifting = (DT_PROP(STM32_OSPI_NODE, ssht_enable)
2615 					? HAL_OSPI_SAMPLE_SHIFTING_HALFCYCLE
2616 					: HAL_OSPI_SAMPLE_SHIFTING_NONE),
2617 			.ChipSelectHighTime = 1,
2618 			.ClockMode = HAL_OSPI_CLOCK_MODE_0,
2619 			},
2620 	},
2621 	.qer_type = DT_QER_PROP_OR(0, JESD216_DW15_QER_VAL_S1B6),
2622 	.write_opcode = DT_WRITEOC_PROP_OR(0, SPI_NOR_WRITEOC_NONE),
2623 	.page_size = SPI_NOR_PAGE_SIZE, /* by default, to be updated by sfdp */
2624 #if DT_NODE_HAS_PROP(DT_INST(0, st_stm32_ospi_nor), jedec_id)
2625 	.jedec_id = DT_INST_PROP(0, jedec_id),
2626 #endif /* jedec_id */
2627 	OSPI_DMA_CHANNEL(STM32_OSPI_NODE, tx_rx)
2628 };
2629 
2630 DEVICE_DT_INST_DEFINE(0, &flash_stm32_ospi_init, NULL,
2631 		      &flash_stm32_ospi_dev_data, &flash_stm32_ospi_cfg,
2632 		      POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
2633 		      &flash_stm32_ospi_driver_api);
2634 
flash_stm32_ospi_irq_config_func(const struct device * dev)2635 static void flash_stm32_ospi_irq_config_func(const struct device *dev)
2636 {
2637 	IRQ_CONNECT(DT_IRQN(STM32_OSPI_NODE), DT_IRQ(STM32_OSPI_NODE, priority),
2638 		    flash_stm32_ospi_isr, DEVICE_DT_INST_GET(0), 0);
2639 	irq_enable(DT_IRQN(STM32_OSPI_NODE));
2640 }
2641