Skip to content

Commit d3d01f7

Browse files
committed
[nrf fromtree] drivers: flash_mspi_nor: Take into account MSPI controller packet limit
Use information provided in the dts node for the MSPI controller regarding maximum amount of data that can be transferred in one packet and split the requested transfers if necessary. Signed-off-by: Andrzej Głąbek <[email protected]> (cherry picked from commit c3469a6)
1 parent 9af8765 commit d3d01f7

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

drivers/flash/flash_mspi_nor.c

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ static uint8_t get_rx_dummy(const struct device *dev)
336336
static int api_read(const struct device *dev, off_t addr, void *dest,
337337
size_t size)
338338
{
339+
const struct flash_mspi_nor_config *dev_config = dev->config;
339340
struct flash_mspi_nor_data *dev_data = dev->data;
340341
const uint32_t flash_size = dev_flash_size(dev);
341342
int rc;
@@ -353,11 +354,26 @@ static int api_read(const struct device *dev, off_t addr, void *dest,
353354
return rc;
354355
}
355356

356-
set_up_xfer_with_addr(dev, MSPI_RX, addr);
357-
dev_data->xfer.rx_dummy = get_rx_dummy(dev);
358-
dev_data->packet.data_buf = dest;
359-
dev_data->packet.num_bytes = size;
360-
rc = perform_xfer(dev, dev_data->cmd_info.read_cmd, true);
357+
while (size > 0) {
358+
uint32_t to_read;
359+
360+
if (dev_config->packet_data_limit &&
361+
dev_config->packet_data_limit < size) {
362+
to_read = dev_config->packet_data_limit;
363+
} else {
364+
to_read = size;
365+
}
366+
367+
set_up_xfer_with_addr(dev, MSPI_RX, addr);
368+
dev_data->xfer.rx_dummy = get_rx_dummy(dev);
369+
dev_data->packet.data_buf = dest;
370+
dev_data->packet.num_bytes = to_read;
371+
rc = perform_xfer(dev, dev_data->cmd_info.read_cmd, true);
372+
373+
addr += to_read;
374+
dest = (uint8_t *)dest + to_read;
375+
size -= to_read;
376+
}
361377

362378
release(dev);
363379

@@ -1294,13 +1310,22 @@ BUILD_ASSERT((FLASH_SIZE(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) == 0, \
12941310
#define INIT_PRIORITY UTIL_INC(CONFIG_MSPI_INIT_PRIORITY)
12951311
#endif
12961312

1313+
#define PACKET_DATA_LIMIT(inst) \
1314+
DT_PROP_OR(DT_INST_BUS(inst), packet_data_limit, 0)
1315+
12971316
#define FLASH_MSPI_NOR_INST(inst) \
1317+
BUILD_ASSERT(!PACKET_DATA_LIMIT(inst) || \
1318+
FLASH_PAGE_SIZE(inst) <= PACKET_DATA_LIMIT(inst), \
1319+
"Page size for " DT_NODE_FULL_NAME(DT_DRV_INST(inst)) \
1320+
" exceeds controller packet data limit"); \
12981321
SFDP_BUILD_ASSERTS(inst); \
12991322
PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb); \
13001323
DEFAULT_ERASE_TYPES_DEFINE(inst); \
13011324
static struct flash_mspi_nor_data dev##inst##_data; \
13021325
static const struct flash_mspi_nor_config dev##inst##_config = { \
13031326
.bus = DEVICE_DT_GET(DT_INST_BUS(inst)), \
1327+
.packet_data_limit = DT_PROP_OR(DT_INST_BUS(inst), \
1328+
packet_data_limit, 0), \
13041329
.flash_size = FLASH_SIZE(inst), \
13051330
.page_size = FLASH_PAGE_SIZE(inst), \
13061331
.mspi_id = MSPI_DEVICE_ID_DT_INST(inst), \

drivers/flash/flash_mspi_nor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct flash_mspi_nor_switch_info {
7070

7171
struct flash_mspi_nor_config {
7272
const struct device *bus;
73+
uint32_t packet_data_limit;
7374
uint32_t flash_size;
7475
uint16_t page_size;
7576
struct mspi_dev_id mspi_id;

0 commit comments

Comments
 (0)