Skip to content

Commit d404788

Browse files
mif1-nordicmasz-nordic
authored andcommitted
drivers: mspi: No copy IPC-drivers
Implemented option to pass data between cores through IPC by reference. Signed-off-by: Michal Frankiewicz <michal.frankiewicz@nordicsemi.no>
1 parent f0fdb8c commit d404788

File tree

2 files changed

+65
-36
lines changed

2 files changed

+65
-36
lines changed

drivers/mspi/mspi_nrfe.c

+61-36
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ LOG_MODULE_REGISTER(mspi_nrfe, CONFIG_MSPI_LOG_LEVEL);
2323
#define MSPI_NRFE_NODE DT_DRV_INST(0)
2424
#define MAX_TX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_tx)))
2525
#define MAX_RX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_rx)))
26-
#define CONFIG_TIMEOUT_MS 100
26+
#define IPC_TIMEOUT_MS 100
2727
#define EP_SEND_TIMEOUT_MS 10
2828

2929
#define SDP_MPSI_PINCTRL_DEV_CONFIG_INIT(node_id) \
@@ -65,6 +65,10 @@ static atomic_t ipc_atomic_sem = ATOMIC_INIT(0);
6565
.sw_multi_periph = false, \
6666
}
6767

68+
struct mspi_nrfe_data {
69+
nrfe_mspi_xfer_config_msg_t xfer_config_msg;
70+
};
71+
6872
struct mspi_nrfe_config {
6973
struct mspi_cfg mspicfg;
7074
const struct pinctrl_dev_config *pcfg;
@@ -75,6 +79,8 @@ static const struct mspi_nrfe_config dev_config = {
7579
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(0),
7680
};
7781

82+
static struct mspi_nrfe_data dev_data;
83+
7884
static void ep_recv(const void *data, size_t len, void *priv);
7985

8086
static void ep_bound(void *priv)
@@ -254,27 +260,35 @@ static int nrfe_mspi_wait_for_response(nrfe_mspi_opcode_t opcode, uint32_t timeo
254260
}
255261

256262
/**
257-
* @brief Send a configuration struct to the FLPR core using the IPC service.
263+
* @brief Send data to the FLPR core using the IPC service, and wait for FLPR response.
258264
*
259265
* @param opcode The configuration packet opcode to send.
260-
* @param config The data to send.
266+
* @param data The data to send.
261267
* @param len The length of the data to send.
262268
*
263269
* @return 0 on success, negative errno code on failure.
264270
*/
265-
static int send_config(nrfe_mspi_opcode_t opcode, const void *config, size_t len)
271+
static int send_data(nrfe_mspi_opcode_t opcode, const void *data, size_t len)
266272
{
267273
int rc;
268-
rc = mspi_ipc_data_send(opcode, config, len);
274+
275+
#ifdef CONFIG_MSPI_NRFE_IPC_NO_COPY
276+
(void)len;
277+
void *data_ptr = (void *)data;
278+
279+
rc = mspi_ipc_data_send(opcode, &data_ptr, sizeof(void *));
280+
#else
281+
rc = mspi_ipc_data_send(opcode, data, len);
282+
#endif
269283

270284
if (rc < 0) {
271-
LOG_ERR("Configuration send failed: %d", rc);
285+
LOG_ERR("Data transfer failed: %d", rc);
272286
return rc;
273287
}
274288

275-
rc = nrfe_mspi_wait_for_response(opcode, CONFIG_TIMEOUT_MS);
289+
rc = nrfe_mspi_wait_for_response(opcode, IPC_TIMEOUT_MS);
276290
if (rc < 0) {
277-
LOG_ERR("FLPR config: %d response timeout: %d!", opcode, rc);
291+
LOG_ERR("Data transfer: %d response timeout: %d!", opcode, rc);
278292
}
279293

280294
return rc;
@@ -337,8 +351,8 @@ static int api_config(const struct mspi_dt_spec *spec)
337351
mspi_pin_config.opcode = NRFE_MSPI_CONFIG_PINS;
338352

339353
/* Send pinout configuration to FLPR */
340-
return send_config(NRFE_MSPI_CONFIG_PINS, (const void *)&mspi_pin_config,
341-
sizeof(nrfe_mspi_pinctrl_soc_pin_msg_t));
354+
return send_data(NRFE_MSPI_CONFIG_PINS, (const void *)&mspi_pin_config,
355+
sizeof(nrfe_mspi_pinctrl_soc_pin_msg_t));
342356
}
343357

344358
static int check_io_mode(enum mspi_io_mode io_mode)
@@ -425,8 +439,8 @@ static int api_dev_config(const struct device *dev, const struct mspi_dev_id *de
425439
mspi_dev_config_msg.dev_config.freq = cfg->freq;
426440
mspi_dev_config_msg.dev_config.ce_index = cfg->ce_num;
427441

428-
return send_config(NRFE_MSPI_CONFIG_DEV, (void *)&mspi_dev_config_msg,
429-
sizeof(nrfe_mspi_dev_config_msg_t));
442+
return send_data(NRFE_MSPI_CONFIG_DEV, (void *)&mspi_dev_config_msg,
443+
sizeof(nrfe_mspi_dev_config_msg_t));
430444
}
431445

432446
static int api_get_channel_status(const struct device *dev, uint8_t ch)
@@ -449,27 +463,38 @@ static int api_get_channel_status(const struct device *dev, uint8_t ch)
449463
static int xfer_packet(struct mspi_xfer_packet *packet, uint32_t timeout)
450464
{
451465
int rc;
466+
nrfe_mspi_opcode_t opcode = (packet->dir == MSPI_RX) ? NRFE_MSPI_TXRX : NRFE_MSPI_TX;
467+
468+
#ifdef CONFIG_MSPI_NRFE_IPC_NO_COPY
469+
/* Check for alignment problems. */
470+
uint32_t len = ((uint32_t)packet->data_buf) % sizeof(uint32_t) != 0
471+
? sizeof(nrfe_mspi_xfer_packet_msg_t) + packet->num_bytes
472+
: sizeof(nrfe_mspi_xfer_packet_msg_t);
473+
#else
452474
uint32_t len = sizeof(nrfe_mspi_xfer_packet_msg_t) + packet->num_bytes;
475+
#endif
453476
uint8_t buffer[len];
454477
nrfe_mspi_xfer_packet_msg_t *xfer_packet = (nrfe_mspi_xfer_packet_msg_t *)buffer;
455478

456-
xfer_packet->opcode = (packet->dir == MSPI_RX) ? NRFE_MSPI_TXRX : NRFE_MSPI_TX;
479+
xfer_packet->opcode = opcode;
457480
xfer_packet->command = packet->cmd;
458481
xfer_packet->address = packet->address;
459482
xfer_packet->num_bytes = packet->num_bytes;
460483

461-
memcpy((void *)xfer_packet->data, (void *)packet->data_buf, packet->num_bytes);
462-
463-
rc = mspi_ipc_data_send(xfer_packet->opcode, buffer, len);
464-
if (rc < 0) {
465-
LOG_ERR("Packet transfer error: %d", rc);
484+
#ifdef CONFIG_MSPI_NRFE_IPC_NO_COPY
485+
/* Check for alignlemt problems. */
486+
if (((uint32_t)packet->data_buf) % sizeof(uint32_t) != 0) {
487+
memcpy((void *)(buffer + sizeof(nrfe_mspi_xfer_packet_msg_t)),
488+
(void *)packet->data_buf, packet->num_bytes);
489+
xfer_packet->data = buffer + sizeof(nrfe_mspi_xfer_packet_msg_t);
490+
} else {
491+
xfer_packet->data = packet->data_buf;
466492
}
493+
#else
494+
memcpy((void *)xfer_packet->data, (void *)packet->data_buf, packet->num_bytes);
495+
#endif
467496

468-
rc = nrfe_mspi_wait_for_response(xfer_packet->opcode, timeout);
469-
if (rc < 0) {
470-
LOG_ERR("FLPR Xfer response timeout: %d", rc);
471-
return rc;
472-
}
497+
rc = send_data(xfer_packet->opcode, xfer_packet, len);
473498

474499
/* Wait for the transfer to complete and receive data. */
475500
if ((packet->dir == MSPI_RX) && (ipc_receive_buffer != NULL) && (ipc_received > 0)) {
@@ -534,10 +559,9 @@ static int start_next_packet(struct mspi_xfer *xfer, uint32_t packets_done)
534559
static int api_transceive(const struct device *dev, const struct mspi_dev_id *dev_id,
535560
const struct mspi_xfer *req)
536561
{
537-
(void)dev;
562+
struct mspi_nrfe_data *drv_data = dev->data;
538563
uint32_t packets_done = 0;
539564
int rc;
540-
nrfe_mspi_xfer_config_msg_t mspi_xfer_config_msg;
541565

542566
/* TODO: add support for asynchronous transfers */
543567
if (req->async) {
@@ -549,16 +573,17 @@ static int api_transceive(const struct device *dev, const struct mspi_dev_id *de
549573
return -EFAULT;
550574
}
551575

552-
mspi_xfer_config_msg.opcode = NRFE_MSPI_CONFIG_XFER;
553-
mspi_xfer_config_msg.xfer_config.device_index = dev_id->dev_idx;
554-
mspi_xfer_config_msg.xfer_config.command_length = req->cmd_length;
555-
mspi_xfer_config_msg.xfer_config.address_length = req->addr_length;
556-
mspi_xfer_config_msg.xfer_config.hold_ce = req->hold_ce;
557-
mspi_xfer_config_msg.xfer_config.tx_dummy = req->tx_dummy;
558-
mspi_xfer_config_msg.xfer_config.rx_dummy = req->rx_dummy;
576+
drv_data->xfer_config_msg.opcode = NRFE_MSPI_CONFIG_XFER;
577+
drv_data->xfer_config_msg.xfer_config.device_index = dev_id->dev_idx;
578+
drv_data->xfer_config_msg.xfer_config.command_length = req->cmd_length;
579+
drv_data->xfer_config_msg.xfer_config.address_length = req->addr_length;
580+
drv_data->xfer_config_msg.xfer_config.hold_ce = req->hold_ce;
581+
drv_data->xfer_config_msg.xfer_config.tx_dummy = req->tx_dummy;
582+
drv_data->xfer_config_msg.xfer_config.rx_dummy = req->rx_dummy;
583+
584+
rc = send_data(NRFE_MSPI_CONFIG_XFER, (void *)&drv_data->xfer_config_msg,
585+
sizeof(nrfe_mspi_xfer_config_msg_t));
559586

560-
rc = send_config(NRFE_MSPI_CONFIG_XFER, (void *)&mspi_xfer_config_msg,
561-
sizeof(nrfe_mspi_xfer_config_msg_t));
562587
if (rc < 0) {
563588
LOG_ERR("Send xfer config error: %d", rc);
564589
return rc;
@@ -678,5 +703,5 @@ static const struct mspi_driver_api drv_api = {
678703

679704
PM_DEVICE_DT_INST_DEFINE(0, dev_pm_action_cb);
680705

681-
DEVICE_DT_INST_DEFINE(0, nrfe_mspi_init, PM_DEVICE_DT_INST_GET(0), NULL, &dev_config, POST_KERNEL,
682-
CONFIG_MSPI_NRFE_INIT_PRIORITY, &drv_api);
706+
DEVICE_DT_INST_DEFINE(0, nrfe_mspi_init, PM_DEVICE_DT_INST_GET(0), &dev_data, &dev_config,
707+
POST_KERNEL, CONFIG_MSPI_NRFE_INIT_PRIORITY, &drv_api);

include/drivers/mspi/nrfe_mspi.h

+4
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ typedef struct {
7979
uint32_t command;
8080
uint32_t address;
8181
uint32_t num_bytes; /* Size of data */
82+
#if (defined(CONFIG_MSPI_NRFE_IPC_NO_COPY) || defined(CONFIG_SDP_MSPI_IPC_NO_COPY))
83+
uint8_t *data;
84+
#else
8285
uint8_t data[]; /* Variable length data field at the end of packet. */
86+
#endif
8387
} nrfe_mspi_xfer_packet_msg_t;
8488

8589
typedef struct {

0 commit comments

Comments
 (0)