@@ -336,6 +336,7 @@ static uint8_t get_rx_dummy(const struct device *dev)
336336static 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), \
0 commit comments