1 /*
2  * Copyright (c) 2024 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @brief File containing QSPI device interface specific definitions for the
9  * Zephyr OS layer of the Wi-Fi driver.
10  */
11 
12 #include <errno.h>
13 #include <string.h>
14 
15 #include <zephyr/init.h>
16 #include <zephyr/logging/log.h>
17 #include <zephyr/drivers/pinctrl.h>
18 #include <zephyr/drivers/wifi/nrf_wifi/bus/qspi_if.h>
19 
20 #include <soc.h>
21 #include <nrf_erratas.h>
22 #include <nrfx_qspi.h>
23 #include <hal/nrf_clock.h>
24 #include <hal/nrf_gpio.h>
25 
26 #include "spi_nor.h"
27 #include "osal_api.h"
28 
29 /* The QSPI bus node which the NRF70 is on */
30 #define QSPI_IF_BUS_NODE DT_NODELABEL(qspi)
31 
32 /* QSPI bus properties from the devicetree */
33 #define QSPI_IF_BUS_IRQN      DT_IRQN(QSPI_IF_BUS_NODE)
34 #define QSPI_IF_BUS_IRQ_PRIO  DT_IRQ(QSPI_IF_BUS_NODE, priority)
35 #define QSPI_IF_BUS_SCK_PIN   DT_PROP(QSPI_IF_BUS_NODE, sck_pin)
36 #define QSPI_IF_BUS_CSN_PIN   DT_PROP(QSPI_IF_BUS_NODE, csn_pins)
37 #define QSPI_IF_BUS_IO0_PIN   DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 0)
38 #define QSPI_IF_BUS_IO1_PIN   DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 1)
39 #define QSPI_IF_BUS_IO2_PIN   DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 2)
40 #define QSPI_IF_BUS_IO3_PIN   DT_PROP_BY_IDX(QSPI_IF_BUS_NODE, io_pins, 3)
41 
42 #define QSPI_IF_BUS_HAS_4_IO_PINS \
43 	(DT_PROP_LEN(QSPI_IF_BUS_NODE, io_pins) == 4)
44 
45 #define QSPI_IF_BUS_PINCTRL_DT_DEV_CONFIG_GET \
46 	PINCTRL_DT_DEV_CONFIG_GET(QSPI_IF_BUS_NODE)
47 
48 /* The NRF70 device node which is on the QSPI bus */
49 #define QSPI_IF_DEVICE_NODE DT_NODELABEL(nrf70)
50 
51 /* NRF70 device QSPI properties */
52 #define QSPI_IF_DEVICE_FREQUENCY DT_PROP(QSPI_IF_DEVICE_NODE, qspi_frequency)
53 #define QSPI_IF_DEVICE_CPHA      DT_PROP(QSPI_IF_DEVICE_NODE, qspi_cpha)
54 #define QSPI_IF_DEVICE_CPOL      DT_PROP(QSPI_IF_DEVICE_NODE, qspi_cpol)
55 #define QSPI_IF_DEVICE_QUAD_MODE DT_PROP(QSPI_IF_DEVICE_NODE, qspi_quad_mode)
56 #define QSPI_IF_DEVICE_RX_DELAY  DT_PROP(QSPI_IF_DEVICE_NODE, qspi_rx_delay)
57 
58 static struct qspi_config *qspi_cfg;
59 #if NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC
60 static unsigned int nonce_last_addr;
61 static unsigned int nonce_cnt;
62 #endif /*NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC*/
63 
64 /* Main config structure */
65 static nrfx_qspi_config_t QSPIconfig;
66 
67 /*
68  * According to the respective specifications, the nRF52 QSPI supports clock
69  * frequencies 2 - 32 MHz and the nRF53 one supports 6 - 96 MHz.
70  */
71 BUILD_ASSERT(QSPI_IF_DEVICE_FREQUENCY >= (NRF_QSPI_BASE_CLOCK_FREQ / 16),
72 	     "Unsupported SCK frequency.");
73 
74 /*
75  * Determine a configuration value (INST_0_SCK_CFG) and, if needed, a divider
76  * (BASE_CLOCK_DIV) for the clock from which the SCK frequency is derived that
77  * need to be used to achieve the SCK frequency as close as possible (but not
78  * higher) to the one specified in DT.
79  */
80 #if defined(CONFIG_SOC_SERIES_NRF53X)
81 /*
82  * On nRF53 Series SoCs, the default /4 divider for the HFCLK192M clock can
83  * only be used when the QSPI peripheral is idle. When a QSPI operation is
84  * performed, the divider needs to be changed to /1 or /2 (particularly,
85  * the specification says that the peripheral "supports 192 MHz and 96 MHz
86  * PCLK192M frequency"), but after that operation is complete, the default
87  * divider needs to be restored to avoid increased current consumption.
88  */
89 #if (QSPI_IF_DEVICE_FREQUENCY >= NRF_QSPI_BASE_CLOCK_FREQ)
90 /* For requested SCK >= 96 MHz, use HFCLK192M / 1 / (2*1) = 96 MHz */
91 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_1
92 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV1
93 /* If anomaly 159 is to be prevented, only /1 divider can be used. */
94 #elif NRF53_ERRATA_159_ENABLE_WORKAROUND
95 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_1
96 #define INST_0_SCK_CFG (DIV_ROUND_UP(NRF_QSPI_BASE_CLOCK_FREQ, \
97 				     QSPI_IF_DEVICE_FREQUENCY) - 1)
98 #elif (QSPI_IF_DEVICE_FREQUENCY >= (NRF_QSPI_BASE_CLOCK_FREQ / 2))
99 /* For 96 MHz > SCK >= 48 MHz, use HFCLK192M / 2 / (2*1) = 48 MHz */
100 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_2
101 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV1
102 #elif (QSPI_IF_DEVICE_FREQUENCY >= (NRF_QSPI_BASE_CLOCK_FREQ / 3))
103 /* For 48 MHz > SCK >= 32 MHz, use HFCLK192M / 1 / (2*3) = 32 MHz */
104 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_1
105 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV3
106 #else
107 /* For requested SCK < 32 MHz, use divider /2 for HFCLK192M. */
108 #define BASE_CLOCK_DIV NRF_CLOCK_HFCLK_DIV_2
109 #define INST_0_SCK_CFG (DIV_ROUND_UP(NRF_QSPI_BASE_CLOCK_FREQ / 2, \
110 				     QSPI_IF_DEVICE_FREQUENCY) - 1)
111 #endif
112 
113 #if BASE_CLOCK_DIV == NRF_CLOCK_HFCLK_DIV_1
114 /* For 8 MHz, use HFCLK192M / 1 / (2*12) */
115 #define INST_0_SCK_CFG_WAKE NRF_QSPI_FREQ_DIV12
116 #elif BASE_CLOCK_DIV == NRF_CLOCK_HFCLK_DIV_2
117 /* For 8 MHz, use HFCLK192M / 2 / (2*6) */
118 #define INST_0_SCK_CFG_WAKE NRF_QSPI_FREQ_DIV6
119 #else
120 #error "Unsupported base clock divider for wake-up frequency."
121 #endif
122 
123 /* After the base clock divider is changed, some time is needed for the new
124  * setting to take effect. This value specifies the delay (in microseconds)
125  * to be applied to ensure that the clock is ready when the QSPI operation
126  * starts. It was measured with a logic analyzer (unfortunately, the nRF5340
127  * specification does not provide any numbers in this regard).
128  */
129 /* FIXME: This has adverse impact on performance, ~3Mbps, so, for now, it is
130  * disabled till further investigation.
131  */
132 #define BASE_CLOCK_SWITCH_DELAY_US 0
133 
134 #else
135 /*
136  * On nRF52 Series SoCs, the base clock divider is not configurable,
137  * so BASE_CLOCK_DIV is not defined.
138  */
139 #if (QSPI_IF_DEVICE_FREQUENCY >= NRF_QSPI_BASE_CLOCK_FREQ)
140 #define INST_0_SCK_CFG NRF_QSPI_FREQ_DIV1
141 #else
142 #define INST_0_SCK_CFG (DIV_ROUND_UP(NRF_QSPI_BASE_CLOCK_FREQ, \
143 					 QSPI_IF_DEVICE_FREQUENCY) - 1)
144 #endif
145 
146 /* For 8 MHz, use PCLK32M / 4 */
147 #define INST_0_SCK_CFG_WAKE NRF_QSPI_FREQ_DIV4
148 
149 #endif /* defined(CONFIG_SOC_SERIES_NRF53X) */
150 
151 static int qspi_device_init(const struct device *dev);
152 static void qspi_device_uninit(const struct device *dev);
153 
154 #define WORD_SIZE 4
155 
156 LOG_MODULE_DECLARE(wifi_nrf_bus, CONFIG_WIFI_NRF70_BUSLIB_LOG_LEVEL);
157 
158 /**
159  * @brief QSPI buffer structure
160  * Structure used both for TX and RX purposes.
161  *
162  * @param buf is a valid pointer to a data buffer.
163  * Can not be NULL.
164  * @param len is the length of the data to be handled.
165  * If no data to transmit/receive - pass 0.
166  */
167 struct qspi_buf {
168 	uint8_t *buf;
169 	size_t len;
170 };
171 
172 /**
173  * @brief QSPI command structure
174  * Structure used for custom command usage.
175  *
176  * @param op_code is a command value (i.e 0x9F - get Jedec ID)
177  * @param tx_buf structure used for TX purposes. Can be NULL if not used.
178  * @param rx_buf structure used for RX purposes. Can be NULL if not used.
179  */
180 struct qspi_cmd {
181 	uint8_t op_code;
182 	const struct qspi_buf *tx_buf;
183 	const struct qspi_buf *rx_buf;
184 };
185 
186 /**
187  * @brief Structure for defining the QSPI NOR access
188  */
189 struct qspi_nor_data {
190 #ifdef CONFIG_MULTITHREADING
191 	/* The semaphore to control exclusive access on write/erase. */
192 	struct k_sem trans;
193 	/* The semaphore to control exclusive access to the device. */
194 	struct k_sem sem;
195 	/* The semaphore to indicate that transfer has completed. */
196 	struct k_sem sync;
197 	/* The semaphore to control driver init/uninit. */
198 	struct k_sem count;
199 #else /* CONFIG_MULTITHREADING */
200 	/* A flag that signals completed transfer when threads are
201 	 * not enabled.
202 	 */
203 	volatile bool ready;
204 #endif /* CONFIG_MULTITHREADING */
205 };
206 
qspi_get_mode(bool cpol,bool cpha)207 static inline int qspi_get_mode(bool cpol, bool cpha)
208 {
209 	register int ret = -EINVAL;
210 
211 	if ((!cpol) && (!cpha)) {
212 		ret = 0;
213 	} else if (cpol && cpha) {
214 		ret = 1;
215 	}
216 
217 	__ASSERT(ret != -EINVAL, "Invalid QSPI mode");
218 
219 	return ret;
220 }
221 
qspi_write_is_quad(nrf_qspi_writeoc_t lines)222 static inline bool qspi_write_is_quad(nrf_qspi_writeoc_t lines)
223 {
224 	switch (lines) {
225 	case NRF_QSPI_WRITEOC_PP4IO:
226 	case NRF_QSPI_WRITEOC_PP4O:
227 		return true;
228 	default:
229 		return false;
230 	}
231 }
232 
qspi_read_is_quad(nrf_qspi_readoc_t lines)233 static inline bool qspi_read_is_quad(nrf_qspi_readoc_t lines)
234 {
235 	switch (lines) {
236 	case NRF_QSPI_READOC_READ4IO:
237 	case NRF_QSPI_READOC_READ4O:
238 		return true;
239 	default:
240 		return false;
241 	}
242 }
243 
qspi_get_lines_write(uint8_t lines)244 static inline int qspi_get_lines_write(uint8_t lines)
245 {
246 	register int ret = -EINVAL;
247 
248 	switch (lines) {
249 	case 3:
250 		ret = NRF_QSPI_WRITEOC_PP4IO;
251 		break;
252 	case 2:
253 		ret = NRF_QSPI_WRITEOC_PP4O;
254 		break;
255 	case 1:
256 		ret = NRF_QSPI_WRITEOC_PP2O;
257 		break;
258 	case 0:
259 		ret = NRF_QSPI_WRITEOC_PP;
260 		break;
261 	default:
262 		break;
263 	}
264 
265 	__ASSERT(ret != -EINVAL, "Invalid QSPI write line");
266 
267 	return ret;
268 }
269 
qspi_get_lines_read(uint8_t lines)270 static inline int qspi_get_lines_read(uint8_t lines)
271 {
272 	register int ret = -EINVAL;
273 
274 	switch (lines) {
275 	case 4:
276 		ret = NRF_QSPI_READOC_READ4IO;
277 		break;
278 	case 3:
279 		ret = NRF_QSPI_READOC_READ4O;
280 		break;
281 	case 2:
282 		ret = NRF_QSPI_READOC_READ2IO;
283 		break;
284 	case 1:
285 		ret = NRF_QSPI_READOC_READ2O;
286 		break;
287 	case 0:
288 		ret = NRF_QSPI_READOC_FASTREAD;
289 		break;
290 	default:
291 		break;
292 	}
293 
294 	__ASSERT(ret != -EINVAL, "Invalid QSPI read line");
295 
296 	return ret;
297 }
298 
_nrfx_qspi_read(void * p_rx_buffer,size_t rx_buffer_length,uint32_t src_address)299 nrfx_err_t _nrfx_qspi_read(void *p_rx_buffer, size_t rx_buffer_length, uint32_t src_address)
300 {
301 	return nrfx_qspi_read(p_rx_buffer, rx_buffer_length, src_address);
302 }
303 
_nrfx_qspi_write(void const * p_tx_buffer,size_t tx_buffer_length,uint32_t dst_address)304 nrfx_err_t _nrfx_qspi_write(void const *p_tx_buffer, size_t tx_buffer_length, uint32_t dst_address)
305 {
306 	return nrfx_qspi_write(p_tx_buffer, tx_buffer_length, dst_address);
307 }
308 
_nrfx_qspi_init(nrfx_qspi_config_t const * p_config,nrfx_qspi_handler_t handler,void * p_context)309 nrfx_err_t _nrfx_qspi_init(nrfx_qspi_config_t const *p_config, nrfx_qspi_handler_t handler,
310 			   void *p_context)
311 {
312 	NRF_QSPI_Type *p_reg = NRF_QSPI;
313 
314 	nrfx_qspi_init(p_config, handler, p_context);
315 
316 	/* RDC4IO = 4'hA (register IFTIMING), which means 10 Dummy Cycles for READ4. */
317 	p_reg->IFTIMING |= qspi_cfg->RDC4IO;
318 
319 	/* LOG_DBG("%04x : IFTIMING", p_reg->IFTIMING & qspi_cfg->RDC4IO); */
320 
321 	/* ACTIVATE task fails for slave bitfile so ignore it */
322 	return NRFX_SUCCESS;
323 }
324 
325 
326 /**
327  * @brief Main configuration structure
328  */
329 static struct qspi_nor_data qspi_nor_memory_data = {
330 #ifdef CONFIG_MULTITHREADING
331 	.trans = Z_SEM_INITIALIZER(qspi_nor_memory_data.trans, 1, 1),
332 	.sem = Z_SEM_INITIALIZER(qspi_nor_memory_data.sem, 1, 1),
333 	.sync = Z_SEM_INITIALIZER(qspi_nor_memory_data.sync, 0, 1),
334 	.count = Z_SEM_INITIALIZER(qspi_nor_memory_data.count, 0, K_SEM_MAX_LIMIT),
335 #endif /* CONFIG_MULTITHREADING */
336 };
337 
338 NRF_DT_CHECK_NODE_HAS_PINCTRL_SLEEP(QSPI_IF_BUS_NODE);
339 
340 IF_ENABLED(CONFIG_PINCTRL, (PINCTRL_DT_DEFINE(QSPI_IF_BUS_NODE)));
341 
342 /**
343  * @brief Converts NRFX return codes to the zephyr ones
344  */
qspi_get_zephyr_ret_code(nrfx_err_t res)345 static inline int qspi_get_zephyr_ret_code(nrfx_err_t res)
346 {
347 	switch (res) {
348 	case NRFX_SUCCESS:
349 		return 0;
350 	case NRFX_ERROR_INVALID_PARAM:
351 	case NRFX_ERROR_INVALID_ADDR:
352 		return -EINVAL;
353 	case NRFX_ERROR_INVALID_STATE:
354 		return -ECANCELED;
355 #if NRF53_ERRATA_159_ENABLE_WORKAROUND
356 	case NRFX_ERROR_FORBIDDEN:
357 		LOG_ERR("nRF5340 anomaly 159 conditions detected");
358 		LOG_ERR("Set the CPU clock to 64 MHz before starting QSPI operation");
359 		return -ECANCELED;
360 #endif
361 	case NRFX_ERROR_BUSY:
362 	case NRFX_ERROR_TIMEOUT:
363 	default:
364 		return -EBUSY;
365 	}
366 }
367 
get_dev_data(const struct device * dev)368 static inline struct qspi_nor_data *get_dev_data(const struct device *dev)
369 {
370 	return dev->data;
371 }
372 
qspi_lock(const struct device * dev)373 static inline void qspi_lock(const struct device *dev)
374 {
375 #ifdef CONFIG_MULTITHREADING
376 	struct qspi_nor_data *dev_data = get_dev_data(dev);
377 
378 	k_sem_take(&dev_data->sem, K_FOREVER);
379 #else /* CONFIG_MULTITHREADING */
380 	ARG_UNUSED(dev);
381 #endif /* CONFIG_MULTITHREADING */
382 
383 	/*
384 	 * Change the base clock divider only for the time the driver is locked
385 	 * to perform a QSPI operation, otherwise the power consumption would be
386 	 * increased also when the QSPI peripheral is idle.
387 	 */
388 #if defined(CONFIG_SOC_SERIES_NRF53X)
389 	nrf_clock_hfclk192m_div_set(NRF_CLOCK, BASE_CLOCK_DIV);
390 	k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
391 #endif
392 }
393 
qspi_unlock(const struct device * dev)394 static inline void qspi_unlock(const struct device *dev)
395 {
396 #if defined(CONFIG_SOC_SERIES_NRF53X)
397 	/* Restore the default base clock divider to reduce power consumption.
398 	 */
399 	nrf_clock_hfclk192m_div_set(NRF_CLOCK, NRF_CLOCK_HFCLK_DIV_4);
400 	k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
401 #endif
402 
403 #ifdef CONFIG_MULTITHREADING
404 	struct qspi_nor_data *dev_data = get_dev_data(dev);
405 
406 	k_sem_give(&dev_data->sem);
407 #else /* CONFIG_MULTITHREADING */
408 	ARG_UNUSED(dev);
409 #endif /* CONFIG_MULTITHREADING */
410 }
411 
qspi_trans_lock(const struct device * dev)412 static inline void qspi_trans_lock(const struct device *dev)
413 {
414 #ifdef CONFIG_MULTITHREADING
415 	struct qspi_nor_data *dev_data = get_dev_data(dev);
416 
417 	k_sem_take(&dev_data->trans, K_FOREVER);
418 #else /* CONFIG_MULTITHREADING */
419 	ARG_UNUSED(dev);
420 #endif /* CONFIG_MULTITHREADING */
421 }
422 
qspi_trans_unlock(const struct device * dev)423 static inline void qspi_trans_unlock(const struct device *dev)
424 {
425 #ifdef CONFIG_MULTITHREADING
426 	struct qspi_nor_data *dev_data = get_dev_data(dev);
427 
428 	k_sem_give(&dev_data->trans);
429 #else /* CONFIG_MULTITHREADING */
430 	ARG_UNUSED(dev);
431 #endif /* CONFIG_MULTITHREADING */
432 }
433 
qspi_wait_for_completion(const struct device * dev,nrfx_err_t res)434 static inline void qspi_wait_for_completion(const struct device *dev, nrfx_err_t res)
435 {
436 	struct qspi_nor_data *dev_data = get_dev_data(dev);
437 
438 	if (res == NRFX_SUCCESS) {
439 #ifdef CONFIG_MULTITHREADING
440 		k_sem_take(&dev_data->sync, K_FOREVER);
441 #else /* CONFIG_MULTITHREADING */
442 		unsigned int key = irq_lock();
443 
444 		while (!dev_data->ready) {
445 			k_cpu_atomic_idle(key);
446 			key = irq_lock();
447 		}
448 
449 		dev_data->ready = false;
450 		irq_unlock(key);
451 #endif /* CONFIG_MULTITHREADING */
452 	}
453 }
454 
qspi_complete(struct qspi_nor_data * dev_data)455 static inline void qspi_complete(struct qspi_nor_data *dev_data)
456 {
457 #ifdef CONFIG_MULTITHREADING
458 	k_sem_give(&dev_data->sync);
459 #else /* CONFIG_MULTITHREADING */
460 	dev_data->ready = true;
461 #endif /* CONFIG_MULTITHREADING */
462 }
463 
_qspi_complete(struct qspi_nor_data * dev_data)464 static inline void _qspi_complete(struct qspi_nor_data *dev_data)
465 {
466 	if (!qspi_cfg->easydma) {
467 		return;
468 	}
469 
470 	qspi_complete(dev_data);
471 }
_qspi_wait_for_completion(const struct device * dev,nrfx_err_t res)472 static inline void _qspi_wait_for_completion(const struct device *dev, nrfx_err_t res)
473 {
474 	if (!qspi_cfg->easydma) {
475 		return;
476 	}
477 
478 	qspi_wait_for_completion(dev, res);
479 }
480 
481 /**
482  * @brief QSPI handler
483  *
484  * @param event Driver event type
485  * @param p_context Pointer to context. Use in interrupt handler.
486  * @retval None
487  */
qspi_handler(nrfx_qspi_evt_t event,void * p_context)488 static void qspi_handler(nrfx_qspi_evt_t event, void *p_context)
489 {
490 	struct qspi_nor_data *dev_data = p_context;
491 
492 	if (event == NRFX_QSPI_EVENT_DONE) {
493 		_qspi_complete(dev_data);
494 	}
495 }
496 
497 static bool qspi_initialized;
498 
qspi_device_init(const struct device * dev)499 static int qspi_device_init(const struct device *dev)
500 {
501 	struct qspi_nor_data *dev_data = get_dev_data(dev);
502 	nrfx_err_t res;
503 	int ret = 0;
504 
505 	if (!IS_ENABLED(CONFIG_NRF70_QSPI_LOW_POWER)) {
506 		return 0;
507 	}
508 
509 	qspi_lock(dev);
510 
511 	/* In multithreading, driver can call qspi_device_init more than once
512 	 * before calling qspi_device_uninit. Keepping count, so QSPI is
513 	 * uninitialized only at the last call (count == 0).
514 	 */
515 #ifdef CONFIG_MULTITHREADING
516 	k_sem_give(&dev_data->count);
517 #endif
518 
519 	if (!qspi_initialized) {
520 		res = nrfx_qspi_init(&QSPIconfig, qspi_handler, dev_data);
521 		ret = qspi_get_zephyr_ret_code(res);
522 		NRF_QSPI->IFTIMING |= qspi_cfg->RDC4IO;
523 		qspi_initialized = (ret == 0);
524 	}
525 
526 	qspi_unlock(dev);
527 
528 	return ret;
529 }
530 
qspi_device_uninit(const struct device * dev)531 static void qspi_device_uninit(const struct device *dev)
532 {
533 	bool last = true;
534 
535 	if (!IS_ENABLED(CONFIG_NRF70_QSPI_LOW_POWER)) {
536 		return;
537 	}
538 
539 	qspi_lock(dev);
540 
541 #ifdef CONFIG_MULTITHREADING
542 	struct qspi_nor_data *dev_data = get_dev_data(dev);
543 
544 	/* The last thread to finish using the driver uninit the QSPI */
545 	(void)k_sem_take(&dev_data->count, K_NO_WAIT);
546 	last = (k_sem_count_get(&dev_data->count) == 0);
547 #endif
548 
549 	if (last) {
550 		while (nrfx_qspi_mem_busy_check() != NRFX_SUCCESS) {
551 			if (IS_ENABLED(CONFIG_MULTITHREADING)) {
552 				k_msleep(50);
553 			} else {
554 				k_busy_wait(50000);
555 			}
556 		}
557 
558 		nrfx_qspi_uninit();
559 
560 #ifndef CONFIG_PINCTRL
561 		nrf_gpio_cfg_output(QSPI_PROP_AT(csn_pins, 0));
562 		nrf_gpio_pin_set(QSPI_PROP_AT(csn_pins, 0));
563 #endif
564 
565 		qspi_initialized = false;
566 	}
567 
568 	qspi_unlock(dev);
569 }
570 
571 /* QSPI send custom command.
572  *
573  * If this is used for both send and receive the buffer sizes must be
574  * equal and cover the whole transaction.
575  */
qspi_send_cmd(const struct device * dev,const struct qspi_cmd * cmd,bool wren)576 static int qspi_send_cmd(const struct device *dev, const struct qspi_cmd *cmd, bool wren)
577 {
578 	/* Check input parameters */
579 	if (!cmd) {
580 		return -EINVAL;
581 	}
582 
583 	const void *tx_buf = NULL;
584 	size_t tx_len = 0;
585 	void *rx_buf = NULL;
586 	size_t rx_len = 0;
587 	size_t xfer_len = sizeof(cmd->op_code);
588 
589 	if (cmd->tx_buf) {
590 		tx_buf = cmd->tx_buf->buf;
591 		tx_len = cmd->tx_buf->len;
592 	}
593 
594 	if (cmd->rx_buf) {
595 		rx_buf = cmd->rx_buf->buf;
596 		rx_len = cmd->rx_buf->len;
597 	}
598 
599 	if ((rx_len != 0) && (tx_len != 0)) {
600 		if (rx_len != tx_len) {
601 			return -EINVAL;
602 		}
603 
604 		xfer_len += tx_len;
605 	} else {
606 		/* At least one of these is zero. */
607 		xfer_len += tx_len + rx_len;
608 	}
609 
610 	if (xfer_len > NRF_QSPI_CINSTR_LEN_9B) {
611 		LOG_WRN("cinstr %02x transfer too long: %zu", cmd->op_code, xfer_len);
612 
613 		return -EINVAL;
614 	}
615 
616 	nrf_qspi_cinstr_conf_t cinstr_cfg = {
617 		.opcode = cmd->op_code,
618 		.length = xfer_len,
619 		.io2_level = true,
620 		.io3_level = true,
621 		.wipwait = false,
622 		.wren = wren,
623 	};
624 
625 	qspi_lock(dev);
626 
627 	int res = nrfx_qspi_cinstr_xfer(&cinstr_cfg, tx_buf, rx_buf);
628 
629 	qspi_unlock(dev);
630 	return qspi_get_zephyr_ret_code(res);
631 }
632 
633 /* RDSR wrapper.  Negative value is error. */
qspi_rdsr(const struct device * dev)634 static int qspi_rdsr(const struct device *dev)
635 {
636 	uint8_t sr = -1;
637 	const struct qspi_buf sr_buf = {
638 		.buf = &sr,
639 		.len = sizeof(sr),
640 	};
641 	struct qspi_cmd cmd = {
642 		.op_code = SPI_NOR_CMD_RDSR,
643 		.rx_buf = &sr_buf,
644 	};
645 	int ret = qspi_send_cmd(dev, &cmd, false);
646 
647 	return (ret < 0) ? ret : sr;
648 }
649 
650 /* Wait until RDSR confirms write is not in progress. */
qspi_wait_while_writing(const struct device * dev)651 static int qspi_wait_while_writing(const struct device *dev)
652 {
653 	int ret;
654 
655 	do {
656 		ret = qspi_rdsr(dev);
657 	} while ((ret >= 0) && ((ret & SPI_NOR_WIP_BIT) != 0U));
658 
659 	return (ret < 0) ? ret : 0;
660 }
661 
662 /**
663  * @brief Fills init struct
664  *
665  * @param config Pointer to the config struct provided by user
666  * @param initstruct Pointer to the configuration struct
667  * @retval None
668  */
qspi_fill_init_struct(nrfx_qspi_config_t * initstruct)669 static inline void qspi_fill_init_struct(nrfx_qspi_config_t *initstruct)
670 {
671 	/* Configure XIP offset */
672 	initstruct->xip_offset = 0;
673 
674 #ifdef CONFIG_PINCTRL
675 	initstruct->skip_gpio_cfg = true,
676 	initstruct->skip_psel_cfg = true,
677 #else
678 	/* Configure pins */
679 	initstruct->pins.sck_pin = QSPI_IF_BUS_SCK_PIN;
680 	initstruct->pins.csn_pin = QSPI_IF_BUS_CSN_PIN;
681 	initstruct->pins.io0_pin = QSPI_IF_BUS_IO0_PIN;
682 	initstruct->pins.io1_pin = QSPI_IF_BUS_IO1_PIN;
683 #if QSPI_IF_BUS_HAS_4_IO_PINS
684 	initstruct->pins.io2_pin = QSPI_IF_BUS_IO2_PIN;
685 	initstruct->pins.io3_pin = QSPI_IF_BUS_IO3_PIN;
686 #else
687 	initstruct->pins.io2_pin = NRF_QSPI_PIN_NOT_CONNECTED;
688 	initstruct->pins.io3_pin = NRF_QSPI_PIN_NOT_CONNECTED;
689 #endif
690 #endif /* CONFIG_PINCTRL */
691 	/* Configure Protocol interface */
692 	initstruct->prot_if.addrmode = NRF_QSPI_ADDRMODE_24BIT;
693 
694 	initstruct->prot_if.dpmconfig = false;
695 
696 	/* Configure physical interface */
697 	initstruct->phy_if.sck_freq = INST_0_SCK_CFG;
698 
699 	/* Using MHZ fails checkpatch constant check */
700 	if (QSPI_IF_DEVICE_FREQUENCY >= 16000000) {
701 		qspi_cfg->qspi_slave_latency = 1;
702 	}
703 	initstruct->phy_if.sck_delay = QSPI_IF_DEVICE_RX_DELAY;
704 	initstruct->phy_if.spi_mode = qspi_get_mode(QSPI_IF_DEVICE_CPOL, QSPI_IF_DEVICE_CPHA);
705 
706 	if (QSPI_IF_DEVICE_QUAD_MODE) {
707 		initstruct->prot_if.readoc = NRF_QSPI_READOC_READ4IO;
708 		initstruct->prot_if.writeoc = NRF_QSPI_WRITEOC_PP4IO;
709 	} else {
710 		initstruct->prot_if.readoc = NRF_QSPI_READOC_FASTREAD;
711 		initstruct->prot_if.writeoc = NRF_QSPI_WRITEOC_PP;
712 	}
713 
714 	initstruct->phy_if.dpmen = false;
715 }
716 
717 /* Configures QSPI memory for the transfer */
qspi_nrfx_configure(const struct device * dev)718 static int qspi_nrfx_configure(const struct device *dev)
719 {
720 	if (!dev) {
721 		return -ENXIO;
722 	}
723 
724 	struct qspi_nor_data *dev_data = dev->data;
725 
726 	qspi_fill_init_struct(&QSPIconfig);
727 
728 #if defined(CONFIG_SOC_SERIES_NRF53X)
729 	/* When the QSPI peripheral is activated, during the nrfx_qspi driver
730 	 * initialization, it reads the status of the connected flash chip.
731 	 * Make sure this transaction is performed with a valid base clock
732 	 * divider.
733 	 */
734 	nrf_clock_hfclk192m_div_set(NRF_CLOCK, BASE_CLOCK_DIV);
735 	k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
736 #endif
737 
738 	nrfx_err_t res = _nrfx_qspi_init(&QSPIconfig, qspi_handler, dev_data);
739 
740 #if defined(CONFIG_SOC_SERIES_NRF53X)
741 	/* Restore the default /4 divider after the QSPI initialization. */
742 	nrf_clock_hfclk192m_div_set(NRF_CLOCK, NRF_CLOCK_HFCLK_DIV_4);
743 	k_busy_wait(BASE_CLOCK_SWITCH_DELAY_US);
744 #endif
745 
746 	int ret = qspi_get_zephyr_ret_code(res);
747 
748 	if (ret == 0) {
749 		/* Set QE to match transfer mode. If not using quad
750 		 * it's OK to leave QE set, but doing so prevents use
751 		 * of WP#/RESET#/HOLD# which might be useful.
752 		 *
753 		 * Note build assert above ensures QER is S1B6.  Other
754 		 * options require more logic.
755 		 */
756 		ret = qspi_rdsr(dev);
757 
758 		if (ret < 0) {
759 			LOG_ERR("RDSR failed: %d", ret);
760 			return ret;
761 		}
762 
763 		uint8_t sr = (uint8_t)ret;
764 		bool qe_value = (qspi_write_is_quad(QSPIconfig.prot_if.writeoc)) ||
765 				(qspi_read_is_quad(QSPIconfig.prot_if.readoc));
766 		const uint8_t qe_mask = BIT(6); /* only S1B6 */
767 		bool qe_state = ((sr & qe_mask) != 0U);
768 
769 		LOG_DBG("RDSR %02x QE %d need %d: %s", sr, qe_state, qe_value,
770 			(qe_state != qe_value) ? "updating" : "no-change");
771 
772 		ret = 0;
773 
774 		if (qe_state != qe_value) {
775 			const struct qspi_buf sr_buf = {
776 				.buf = &sr,
777 				.len = sizeof(sr),
778 			};
779 			struct qspi_cmd cmd = {
780 				.op_code = SPI_NOR_CMD_WRSR,
781 				.tx_buf = &sr_buf,
782 			};
783 
784 			sr ^= qe_mask;
785 			ret = qspi_send_cmd(dev, &cmd, true);
786 
787 			/* Writing SR can take some time, and further
788 			 * commands sent while it's happening can be
789 			 * corrupted.  Wait.
790 			 */
791 			if (ret == 0) {
792 				ret = qspi_wait_while_writing(dev);
793 			}
794 		}
795 
796 		if (ret < 0) {
797 			LOG_ERR("QE %s failed: %d", qe_value ? "set" : "clear", ret);
798 		}
799 	}
800 
801 	return ret;
802 }
803 
read_non_aligned(const struct device * dev,int addr,void * dest,size_t size)804 static inline nrfx_err_t read_non_aligned(const struct device *dev, int addr, void *dest,
805 					  size_t size)
806 {
807 	uint8_t __aligned(WORD_SIZE) buf[WORD_SIZE * 2];
808 	uint8_t *dptr = dest;
809 
810 	int flash_prefix = (WORD_SIZE - (addr % WORD_SIZE)) % WORD_SIZE;
811 
812 	if (flash_prefix > size) {
813 		flash_prefix = size;
814 	}
815 
816 	int dest_prefix = (WORD_SIZE - (int)dptr % WORD_SIZE) % WORD_SIZE;
817 
818 	if (dest_prefix > size) {
819 		dest_prefix = size;
820 	}
821 
822 	int flash_suffix = (size - flash_prefix) % WORD_SIZE;
823 	int flash_middle = size - flash_prefix - flash_suffix;
824 	int dest_middle = size - dest_prefix - (size - dest_prefix) % WORD_SIZE;
825 
826 	if (flash_middle > dest_middle) {
827 		flash_middle = dest_middle;
828 		flash_suffix = size - flash_prefix - flash_middle;
829 	}
830 
831 	nrfx_err_t res = NRFX_SUCCESS;
832 
833 	/* read from aligned flash to aligned memory */
834 	if (flash_middle != 0) {
835 		res = _nrfx_qspi_read(dptr + dest_prefix, flash_middle, addr + flash_prefix);
836 
837 		_qspi_wait_for_completion(dev, res);
838 
839 		if (res != NRFX_SUCCESS) {
840 			return res;
841 		}
842 
843 		/* perform shift in RAM */
844 		if (flash_prefix != dest_prefix) {
845 			memmove(dptr + flash_prefix, dptr + dest_prefix, flash_middle);
846 		}
847 	}
848 
849 	/* read prefix */
850 	if (flash_prefix != 0) {
851 		res = _nrfx_qspi_read(buf, WORD_SIZE, addr - (WORD_SIZE - flash_prefix));
852 
853 		_qspi_wait_for_completion(dev, res);
854 
855 		if (res != NRFX_SUCCESS) {
856 			return res;
857 		}
858 
859 		memcpy(dptr, buf + WORD_SIZE - flash_prefix, flash_prefix);
860 	}
861 
862 	/* read suffix */
863 	if (flash_suffix != 0) {
864 		res = _nrfx_qspi_read(buf, WORD_SIZE * 2, addr + flash_prefix + flash_middle);
865 
866 		_qspi_wait_for_completion(dev, res);
867 
868 		if (res != NRFX_SUCCESS) {
869 			return res;
870 		}
871 
872 		memcpy(dptr + flash_prefix + flash_middle, buf, flash_suffix);
873 	}
874 
875 	return res;
876 }
877 
qspi_nor_read(const struct device * dev,int addr,void * dest,size_t size)878 static int qspi_nor_read(const struct device *dev, int addr, void *dest, size_t size)
879 {
880 	if (!dest) {
881 		return -EINVAL;
882 	}
883 
884 	/* read size must be non-zero */
885 	if (!size) {
886 		return 0;
887 	}
888 
889 	int rc = qspi_device_init(dev);
890 
891 	if (rc != 0) {
892 		goto out;
893 	}
894 
895 	qspi_lock(dev);
896 
897 	nrfx_err_t res = read_non_aligned(dev, addr, dest, size);
898 
899 	qspi_unlock(dev);
900 
901 	rc = qspi_get_zephyr_ret_code(res);
902 
903 out:
904 	qspi_device_uninit(dev);
905 	return rc;
906 }
907 
908 /* addr aligned, sptr not null, slen less than 4 */
write_sub_word(const struct device * dev,int addr,const void * sptr,size_t slen)909 static inline nrfx_err_t write_sub_word(const struct device *dev, int addr, const void *sptr,
910 					size_t slen)
911 {
912 	uint8_t __aligned(4) buf[4];
913 	nrfx_err_t res;
914 
915 	/* read out the whole word so that unchanged data can be
916 	 * written back
917 	 */
918 	res = _nrfx_qspi_read(buf, sizeof(buf), addr);
919 	_qspi_wait_for_completion(dev, res);
920 
921 	if (res == NRFX_SUCCESS) {
922 		memcpy(buf, sptr, slen);
923 		res = _nrfx_qspi_write(buf, sizeof(buf), addr);
924 		_qspi_wait_for_completion(dev, res);
925 	}
926 
927 	return res;
928 }
929 
qspi_nor_write(const struct device * dev,int addr,const void * src,size_t size)930 static int qspi_nor_write(const struct device *dev, int addr, const void *src, size_t size)
931 {
932 	if (!src) {
933 		return -EINVAL;
934 	}
935 
936 	/* write size must be non-zero, less than 4, or a multiple of 4 */
937 	if ((size == 0) || ((size > 4) && ((size % 4U) != 0))) {
938 		return -EINVAL;
939 	}
940 
941 	/* address must be 4-byte aligned */
942 	if ((addr % 4U) != 0) {
943 		return -EINVAL;
944 	}
945 
946 	nrfx_err_t res = NRFX_SUCCESS;
947 
948 	int rc = qspi_device_init(dev);
949 
950 	if (rc != 0) {
951 		goto out;
952 	}
953 
954 	qspi_trans_lock(dev);
955 
956 	qspi_lock(dev);
957 
958 	if (size < 4U) {
959 		res = write_sub_word(dev, addr, src, size);
960 	} else {
961 		res = _nrfx_qspi_write(src, size, addr);
962 		_qspi_wait_for_completion(dev, res);
963 	}
964 
965 	qspi_unlock(dev);
966 
967 	qspi_trans_unlock(dev);
968 
969 	rc = qspi_get_zephyr_ret_code(res);
970 out:
971 	qspi_device_uninit(dev);
972 	return rc;
973 }
974 
975 /**
976  * @brief Configure the flash
977  *
978  * @param dev The flash device structure
979  * @param info The flash info structure
980  * @return 0 on success, negative errno code otherwise
981  */
qspi_nor_configure(const struct device * dev)982 static int qspi_nor_configure(const struct device *dev)
983 {
984 	int ret = qspi_nrfx_configure(dev);
985 
986 	if (ret != 0) {
987 		return ret;
988 	}
989 
990 	qspi_device_uninit(dev);
991 
992 	return 0;
993 }
994 
995 /**
996  * @brief Initialize and configure the flash
997  *
998  * @param name The flash name
999  * @return 0 on success, negative errno code otherwise
1000  */
qspi_nor_init(const struct device * dev)1001 static int qspi_nor_init(const struct device *dev)
1002 {
1003 #ifdef CONFIG_PINCTRL
1004 	int ret = pinctrl_apply_state(QSPI_IF_BUS_PINCTRL_DT_DEV_CONFIG_GET,
1005 				      PINCTRL_STATE_DEFAULT);
1006 
1007 	if (ret < 0) {
1008 		return ret;
1009 	}
1010 #endif
1011 
1012 	IRQ_CONNECT(QSPI_IF_BUS_IRQN,
1013 		    QSPI_IF_BUS_IRQ_PRIO,
1014 		    nrfx_isr,
1015 		    nrfx_qspi_irq_handler,
1016 		    0);
1017 
1018 	return qspi_nor_configure(dev);
1019 }
1020 
1021 #if defined(CONFIG_SOC_SERIES_NRF53X)
qspi_cmd_encryption(const struct device * dev,nrf_qspi_encryption_t * p_cfg)1022 static int qspi_cmd_encryption(const struct device *dev, nrf_qspi_encryption_t *p_cfg)
1023 {
1024 	const struct qspi_buf tx_buf = { .buf = (uint8_t *)&p_cfg->nonce[1],
1025 					 .len = sizeof(p_cfg->nonce[1]) };
1026 	const struct qspi_cmd cmd = {
1027 		.op_code = 0x4f,
1028 		.tx_buf = &tx_buf,
1029 	};
1030 
1031 	int ret = qspi_device_init(dev);
1032 
1033 	if (ret == 0) {
1034 		ret = qspi_send_cmd(dev, &cmd, false);
1035 	}
1036 
1037 	qspi_device_uninit(dev);
1038 
1039 	if (ret < 0) {
1040 		LOG_DBG("cmd_encryption failed %d", ret);
1041 	}
1042 
1043 	return ret;
1044 }
1045 #endif
1046 
qspi_RDSR2(const struct device * dev,uint8_t * rdsr2)1047 int qspi_RDSR2(const struct device *dev, uint8_t *rdsr2)
1048 {
1049 	int ret = 0;
1050 	uint8_t sr = 0;
1051 
1052 	const struct qspi_buf sr_buf = {
1053 		.buf = &sr,
1054 		.len = sizeof(sr),
1055 	};
1056 	struct qspi_cmd cmd = {
1057 		.op_code = 0x2f,
1058 		.rx_buf = &sr_buf,
1059 	};
1060 
1061 	ret = qspi_device_init(dev);
1062 
1063 	ret = qspi_send_cmd(dev, &cmd, false);
1064 
1065 	qspi_device_uninit(dev);
1066 
1067 	LOG_DBG("RDSR2 = 0x%x", sr);
1068 
1069 	if (ret == 0) {
1070 		*rdsr2 = sr;
1071 	}
1072 
1073 	return ret;
1074 }
1075 
1076 /* Wait until RDSR2 confirms RPU_WAKE write is successful */
qspi_validate_rpu_wake_writecmd(const struct device * dev)1077 int qspi_validate_rpu_wake_writecmd(const struct device *dev)
1078 {
1079 	int ret = 0;
1080 	uint8_t rdsr2 = 0;
1081 
1082 	for (int ii = 0; ii < 1; ii++) {
1083 		ret = qspi_RDSR2(dev, &rdsr2);
1084 		if (!ret && (rdsr2 & RPU_WAKEUP_NOW)) {
1085 			return 0;
1086 		}
1087 	}
1088 
1089 	return -1;
1090 }
1091 
1092 
qspi_RDSR1(const struct device * dev,uint8_t * rdsr1)1093 int qspi_RDSR1(const struct device *dev, uint8_t *rdsr1)
1094 {
1095 	int ret = 0;
1096 	uint8_t sr = 0;
1097 
1098 	const struct qspi_buf sr_buf = {
1099 		.buf = &sr,
1100 		.len = sizeof(sr),
1101 	};
1102 	struct qspi_cmd cmd = {
1103 		.op_code = 0x1f,
1104 		.rx_buf = &sr_buf,
1105 	};
1106 
1107 	ret = qspi_device_init(dev);
1108 
1109 	ret = qspi_send_cmd(dev, &cmd, false);
1110 
1111 	qspi_device_uninit(dev);
1112 
1113 	LOG_DBG("RDSR1 = 0x%x", sr);
1114 
1115 	if (ret == 0) {
1116 		*rdsr1 = sr;
1117 	}
1118 
1119 	return ret;
1120 }
1121 
1122 /* Wait until RDSR1 confirms RPU_AWAKE/RPU_READY */
qspi_wait_while_rpu_awake(const struct device * dev)1123 int qspi_wait_while_rpu_awake(const struct device *dev)
1124 {
1125 	int ret;
1126 	uint8_t val = 0;
1127 
1128 	for (int ii = 0; ii < 10; ii++) {
1129 		ret = qspi_RDSR1(dev, &val);
1130 
1131 		LOG_DBG("RDSR1 = 0x%x", val);
1132 
1133 		if (!ret && (val & RPU_AWAKE_BIT)) {
1134 			break;
1135 		}
1136 
1137 		k_msleep(1);
1138 	}
1139 
1140 	if (ret || !(val & RPU_AWAKE_BIT)) {
1141 		LOG_ERR("RPU is not awake even after 10ms");
1142 		return -1;
1143 	}
1144 
1145 	/* Restore QSPI clock frequency from DTS */
1146 	QSPIconfig.phy_if.sck_freq = INST_0_SCK_CFG;
1147 
1148 	return val;
1149 }
1150 
qspi_WRSR2(const struct device * dev,uint8_t data)1151 int qspi_WRSR2(const struct device *dev, uint8_t data)
1152 {
1153 	const struct qspi_buf tx_buf = {
1154 		.buf = &data,
1155 		.len = sizeof(data),
1156 	};
1157 	const struct qspi_cmd cmd = {
1158 		.op_code = 0x3f,
1159 		.tx_buf = &tx_buf,
1160 	};
1161 	int ret = qspi_device_init(dev);
1162 
1163 	if (ret == 0) {
1164 		ret = qspi_send_cmd(dev, &cmd, false);
1165 	}
1166 
1167 	qspi_device_uninit(dev);
1168 
1169 	if (ret < 0) {
1170 		LOG_ERR("cmd_wakeup RPU failed %d", ret);
1171 	}
1172 
1173 	return ret;
1174 }
1175 
qspi_cmd_wakeup_rpu(const struct device * dev,uint8_t data)1176 int qspi_cmd_wakeup_rpu(const struct device *dev, uint8_t data)
1177 {
1178 	int ret;
1179 
1180 	/* Waking RPU works reliably only with lowest frequency (8MHz) */
1181 	QSPIconfig.phy_if.sck_freq = INST_0_SCK_CFG_WAKE;
1182 
1183 	ret = qspi_WRSR2(dev, data);
1184 
1185 	return ret;
1186 }
1187 
1188 struct device qspi_perip = {
1189 	.data = &qspi_nor_memory_data,
1190 };
1191 
qspi_deinit(void)1192 int qspi_deinit(void)
1193 {
1194 	LOG_DBG("TODO : %s", __func__);
1195 
1196 	return 0;
1197 }
1198 
qspi_init(struct qspi_config * config)1199 int qspi_init(struct qspi_config *config)
1200 {
1201 	unsigned int rc;
1202 
1203 	qspi_cfg = config;
1204 
1205 	config->readoc = config->quad_spi ? NRF_QSPI_READOC_READ4IO : NRF_QSPI_READOC_FASTREAD;
1206 	config->writeoc = config->quad_spi ? NRF_QSPI_WRITEOC_PP4IO : NRF_QSPI_WRITEOC_PP;
1207 
1208 	rc = qspi_nor_init(&qspi_perip);
1209 
1210 	k_sem_init(&qspi_cfg->lock, 1, 1);
1211 
1212 	return rc;
1213 }
1214 
qspi_update_nonce(unsigned int addr,int len,int hlread)1215 void qspi_update_nonce(unsigned int addr, int len, int hlread)
1216 {
1217 #if NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC
1218 
1219 	NRF_QSPI_Type *p_reg = NRF_QSPI;
1220 
1221 	if (!qspi_cfg->encryption) {
1222 		return;
1223 	}
1224 
1225 	if (nonce_last_addr == 0 || hlread) {
1226 		p_reg->DMA_ENC.NONCE2 = ++nonce_cnt;
1227 	} else if ((nonce_last_addr + 4) != addr) {
1228 		p_reg->DMA_ENC.NONCE2 = ++nonce_cnt;
1229 	}
1230 
1231 	nonce_last_addr = addr + len - 4;
1232 
1233 #endif /*NRF_QSPI_HAS_XIP_ENC || NRF_QSPI_HAS_DMA_ENC*/
1234 }
1235 
qspi_addr_check(unsigned int addr,const void * data,unsigned int len)1236 void qspi_addr_check(unsigned int addr, const void *data, unsigned int len)
1237 {
1238 	if ((addr % 4 != 0) || (((unsigned int)data) % 4 != 0) || (len % 4 != 0)) {
1239 		LOG_ERR("%s : Unaligned address %x %x %d %x %x", __func__, addr,
1240 		       (unsigned int)data, (addr % 4 != 0), (((unsigned int)data) % 4 != 0),
1241 		       (len % 4 != 0));
1242 	}
1243 }
1244 
qspi_write(unsigned int addr,const void * data,int len)1245 int qspi_write(unsigned int addr, const void *data, int len)
1246 {
1247 	int status;
1248 
1249 	qspi_addr_check(addr, data, len);
1250 
1251 	addr |= qspi_cfg->addrmask;
1252 
1253 	k_sem_take(&qspi_cfg->lock, K_FOREVER);
1254 
1255 	qspi_update_nonce(addr, len, 0);
1256 
1257 	status = qspi_nor_write(&qspi_perip, addr, data, len);
1258 
1259 	k_sem_give(&qspi_cfg->lock);
1260 
1261 	return status;
1262 }
1263 
qspi_read(unsigned int addr,void * data,int len)1264 int qspi_read(unsigned int addr, void *data, int len)
1265 {
1266 	int status;
1267 
1268 	qspi_addr_check(addr, data, len);
1269 
1270 	addr |= qspi_cfg->addrmask;
1271 
1272 	k_sem_take(&qspi_cfg->lock, K_FOREVER);
1273 
1274 	qspi_update_nonce(addr, len, 0);
1275 
1276 	status = qspi_nor_read(&qspi_perip, addr, data, len);
1277 
1278 	k_sem_give(&qspi_cfg->lock);
1279 
1280 	return status;
1281 }
1282 
qspi_hl_readw(unsigned int addr,void * data)1283 int qspi_hl_readw(unsigned int addr, void *data)
1284 {
1285 	int status;
1286 	uint8_t *rxb = NULL;
1287 	uint32_t len = 4;
1288 
1289 	len = len + (4 * qspi_cfg->qspi_slave_latency);
1290 
1291 	rxb = nrf_wifi_osal_mem_alloc(len);
1292 
1293 	if (rxb == NULL) {
1294 		LOG_ERR("%s: ERROR ENOMEM line %d", __func__, __LINE__);
1295 		return -ENOMEM;
1296 	}
1297 
1298 	memset(rxb, 0, len);
1299 
1300 	k_sem_take(&qspi_cfg->lock, K_FOREVER);
1301 
1302 	qspi_update_nonce(addr, 4, 1);
1303 
1304 	status = qspi_nor_read(&qspi_perip, addr, rxb, len);
1305 
1306 	k_sem_give(&qspi_cfg->lock);
1307 
1308 	*(uint32_t *)data = *(uint32_t *)(rxb + (len - 4));
1309 
1310 	nrf_wifi_osal_mem_free(rxb);
1311 
1312 	return status;
1313 }
1314 
qspi_hl_read(unsigned int addr,void * data,int len)1315 int qspi_hl_read(unsigned int addr, void *data, int len)
1316 {
1317 	int count = 0;
1318 
1319 	qspi_addr_check(addr, data, len);
1320 
1321 	while (count < (len / 4)) {
1322 		qspi_hl_readw(addr + (4 * count), ((char *)data + (4 * count)));
1323 		count++;
1324 	}
1325 
1326 	return 0;
1327 }
1328 
qspi_cmd_sleep_rpu(const struct device * dev)1329 int qspi_cmd_sleep_rpu(const struct device *dev)
1330 {
1331 	uint8_t data = 0x0;
1332 
1333 	/* printf("TODO : %s:", __func__); */
1334 	const struct qspi_buf tx_buf = {
1335 		.buf = &data,
1336 		.len = sizeof(data),
1337 	};
1338 
1339 	const struct qspi_cmd cmd = {
1340 		.op_code = 0x3f, /* 0x3f, //WRSR2(0x3F) WakeUP RPU. */
1341 		.tx_buf = &tx_buf,
1342 	};
1343 
1344 	int ret = qspi_device_init(dev);
1345 
1346 	if (ret == 0) {
1347 		ret = qspi_send_cmd(dev, &cmd, false);
1348 	}
1349 
1350 	qspi_device_uninit(dev);
1351 
1352 	if (ret < 0) {
1353 		LOG_ERR("cmd_wakeup RPU failed: %d", ret);
1354 	}
1355 
1356 	return ret;
1357 }
1358 
1359 /* Encryption public API */
1360 
qspi_enable_encryption(uint8_t * key)1361 int qspi_enable_encryption(uint8_t *key)
1362 {
1363 #if defined(CONFIG_SOC_SERIES_NRF53X)
1364 	int err = 0;
1365 
1366 	if (qspi_cfg->encryption) {
1367 		return -EALREADY;
1368 	}
1369 
1370 	int ret = qspi_device_init(&qspi_perip);
1371 
1372 	if (ret != 0) {
1373 		LOG_ERR("qspi_device_init failed: %d", ret);
1374 		return -EIO;
1375 	}
1376 
1377 	memcpy(qspi_cfg->p_cfg.key, key, 16);
1378 
1379 	err = nrfx_qspi_dma_encrypt(&qspi_cfg->p_cfg);
1380 	if (err != NRFX_SUCCESS) {
1381 		LOG_ERR("nrfx_qspi_dma_encrypt failed: %d", err);
1382 		return -EIO;
1383 	}
1384 
1385 	err = qspi_cmd_encryption(&qspi_perip, &qspi_cfg->p_cfg);
1386 	if (err != 0) {
1387 		LOG_ERR("qspi_cmd_encryption failed: %d", err);
1388 		return -EIO;
1389 	}
1390 
1391 	qspi_cfg->encryption = true;
1392 
1393 	qspi_device_uninit(&qspi_perip);
1394 
1395 	return 0;
1396 #else
1397 	return -ENOTSUP;
1398 #endif
1399 }
1400