Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions drivers/flash/flash_mspi_nor.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@
static int api_read(const struct device *dev, off_t addr, void *dest,
size_t size)
{
const struct flash_mspi_nor_config *dev_config = dev->config;
struct flash_mspi_nor_data *dev_data = dev->data;
const uint32_t flash_size = dev_flash_size(dev);
int rc;
Expand All @@ -353,11 +354,26 @@
return rc;
}

set_up_xfer_with_addr(dev, MSPI_RX, addr);
dev_data->xfer.rx_dummy = get_rx_dummy(dev);
dev_data->packet.data_buf = dest;
dev_data->packet.num_bytes = size;
rc = perform_xfer(dev, dev_data->cmd_info.read_cmd, true);
while (size > 0) {
uint32_t to_read;

if (dev_config->packet_data_limit &&
dev_config->packet_data_limit < size) {
to_read = dev_config->packet_data_limit;

Check notice on line 362 in drivers/flash/flash_mspi_nor.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/flash/flash_mspi_nor.c:362 - if (dev_config->packet_data_limit && - dev_config->packet_data_limit < size) { + if (dev_config->packet_data_limit && dev_config->packet_data_limit < size) {
} else {
to_read = size;
}

set_up_xfer_with_addr(dev, MSPI_RX, addr);
dev_data->xfer.rx_dummy = get_rx_dummy(dev);
dev_data->packet.data_buf = dest;
dev_data->packet.num_bytes = to_read;
rc = perform_xfer(dev, dev_data->cmd_info.read_cmd, true);

addr += to_read;
dest = (uint8_t *)dest + to_read;
size -= to_read;

Check notice on line 375 in drivers/flash/flash_mspi_nor.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/flash/flash_mspi_nor.c:375 - dev_data->packet.data_buf = dest; + dev_data->packet.data_buf = dest; dev_data->packet.num_bytes = to_read; rc = perform_xfer(dev, dev_data->cmd_info.read_cmd, true); addr += to_read; - dest = (uint8_t *)dest + to_read; + dest = (uint8_t *)dest + to_read;
}

release(dev);

Expand Down Expand Up @@ -1294,13 +1310,22 @@
#define INIT_PRIORITY UTIL_INC(CONFIG_MSPI_INIT_PRIORITY)
#endif

#define PACKET_DATA_LIMIT(inst) \
DT_PROP_OR(DT_INST_BUS(inst), packet_data_limit, 0)

#define FLASH_MSPI_NOR_INST(inst) \
BUILD_ASSERT(!PACKET_DATA_LIMIT(inst) || \
FLASH_PAGE_SIZE(inst) <= PACKET_DATA_LIMIT(inst), \
"Page size for " DT_NODE_FULL_NAME(DT_DRV_INST(inst)) \
" exceeds controller packet data limit"); \
SFDP_BUILD_ASSERTS(inst); \
PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb); \
DEFAULT_ERASE_TYPES_DEFINE(inst); \
static struct flash_mspi_nor_data dev##inst##_data; \
static const struct flash_mspi_nor_config dev##inst##_config = { \
.bus = DEVICE_DT_GET(DT_INST_BUS(inst)), \
.packet_data_limit = DT_PROP_OR(DT_INST_BUS(inst), \
packet_data_limit, 0), \
.flash_size = FLASH_SIZE(inst), \
.page_size = FLASH_PAGE_SIZE(inst), \
.mspi_id = MSPI_DEVICE_ID_DT_INST(inst), \
Expand Down Expand Up @@ -1336,5 +1361,5 @@
&dev##inst##_data, &dev##inst##_config, \
POST_KERNEL, INIT_PRIORITY, \
&drv_api);

Check notice on line 1364 in drivers/flash/flash_mspi_nor.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/flash/flash_mspi_nor.c:1364 -#define PACKET_DATA_LIMIT(inst) \ - DT_PROP_OR(DT_INST_BUS(inst), packet_data_limit, 0) - -#define FLASH_MSPI_NOR_INST(inst) \ - BUILD_ASSERT(!PACKET_DATA_LIMIT(inst) || \ - FLASH_PAGE_SIZE(inst) <= PACKET_DATA_LIMIT(inst), \ - "Page size for " DT_NODE_FULL_NAME(DT_DRV_INST(inst)) \ - " exceeds controller packet data limit"); \ - SFDP_BUILD_ASSERTS(inst); \ - PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb); \ - DEFAULT_ERASE_TYPES_DEFINE(inst); \ - static struct flash_mspi_nor_data dev##inst##_data; \ - static const struct flash_mspi_nor_config dev##inst##_config = { \ - .bus = DEVICE_DT_GET(DT_INST_BUS(inst)), \ - .packet_data_limit = DT_PROP_OR(DT_INST_BUS(inst), \ - packet_data_limit, 0), \ - .flash_size = FLASH_SIZE(inst), \ - .page_size = FLASH_PAGE_SIZE(inst), \ - .mspi_id = MSPI_DEVICE_ID_DT_INST(inst), \ - .mspi_nor_cfg = MSPI_DEVICE_CONFIG_DT_INST(inst), \ - .mspi_nor_init_cfg = FLASH_INITIAL_CONFIG(inst), \ - IF_ENABLED(CONFIG_MSPI_XIP, \ - (.xip_cfg = MSPI_XIP_CONFIG_DT_INST(inst),)) \ - IF_ENABLED(WITH_SUPPLY_GPIO, \ - (.supply = GPIO_DT_SPEC_INST_GET_OR(inst, supply_gpios, {0}),)) \ - IF_ENABLED(WITH_RESET_GPIO, \ +#define PACKET_DATA_LIMIT(inst) DT_PROP_OR(DT_INST_BUS(inst), packet_data_limit, 0) + +#define FLASH_MSPI_NOR_INST(inst) \ + BUILD_ASSERT(!PACKET_DATA_LIMIT(inst) || FLASH_PAGE_SIZE(inst) <= PACKET_DATA_LIMIT(inst), \ + "Page size for " DT_NODE_FULL_NAME( \ + DT_DRV_INST(inst)) " exceeds controller packet data limit"); \ + SFDP_BUILD_ASSERTS(inst); \ + PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb); \ + DEFAULT_ERASE_TYPES_DEFINE(inst);
DT_INST_FOREACH_STATUS_OKAY(FLASH_MSPI_NOR_INST)
1 change: 1 addition & 0 deletions drivers/flash/flash_mspi_nor.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct flash_mspi_nor_switch_info {

struct flash_mspi_nor_config {
const struct device *bus;
uint32_t packet_data_limit;
uint32_t flash_size;
uint16_t page_size;
struct mspi_dev_id mspi_id;
Expand Down
8 changes: 8 additions & 0 deletions dts/bindings/mspi/mspi-controller.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,11 @@ properties:
Regardless of whether the CE pin may need software control or MSPI
controller has dedicated CE pin, this field should be defined to
help manage multiple devices on the same MSPI controller.

packet-data-limit:
type: int
description: |
Specifies the maximum length of data that the controller can transfer
in a single packet. Transceive requests made to the controller must be
split into multiple packets if a single one would exceed this value.
If not specified, no limit is imposed.
4 changes: 4 additions & 0 deletions dts/bindings/mspi/snps,designware-ssi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ properties:
interrupts:
required: true

packet-data-limit:
required: true
const: 65536

aux-reg-enable:
type: boolean
description: |
Expand Down
1 change: 1 addition & 0 deletions dts/vendor/nordic/nrf54h20.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,7 @@
interrupts = <149 NRF_DEFAULT_IRQ_PRIORITY>;
power-domains = <&gdpwr_fast_active_0>;
clock-frequency = <DT_FREQ_M(400)>;
packet-data-limit = <65536>;
fifo-depth = <32>;
status = "disabled";
};
Expand Down
1 change: 1 addition & 0 deletions dts/vendor/nordic/nrf9280.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@
reg-names = "wrapper", "core";
interrupts = <149 NRF_DEFAULT_IRQ_PRIORITY>;
clock-frequency = <DT_FREQ_M(400)>;
packet-data-limit = <65536>;
fifo-depth = <32>;
status = "disabled";
};
Expand Down
Loading