Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers: flash: andes_qspi: Fix bug when RX length exceeds 512 bytes and optimize the check for being used as a flash fetch device. #83676

Merged
Merged
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
48 changes: 40 additions & 8 deletions drivers/flash/flash_andes_qspi.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@

LOG_MODULE_REGISTER(flash_andes, CONFIG_FLASH_LOG_LEVEL);

/* ATCSPI200 transfer count is limited to 512 bytes. */
#define MAX_TRANSFER_CNT (512)

/* Indicates that an access command includes bytes for the address.
* If not provided the opcode is not followed by address bytes.
*/
Expand Down Expand Up @@ -50,7 +53,7 @@ struct flash_andes_qspi_config {
uint32_t base;
uint32_t irq_num;
struct flash_parameters parameters;
bool xip;
bool qspi_cfg_rom;
#if defined(CONFIG_FLASH_ANDES_QSPI_SFDP_DEVICETREE)
uint8_t jedec_id[SPI_NOR_MAX_ID_LEN];
uint32_t flash_size;
Expand Down Expand Up @@ -304,6 +307,8 @@ static int flash_andes_qspi_read(const struct device *dev,
off_t addr, void *dest, size_t size)
{
const size_t flash_size = dev_flash_size(dev);
size_t to_read = size;

int ret;

/* should be between 0 and flash size */
Expand All @@ -317,8 +322,23 @@ static int flash_andes_qspi_read(const struct device *dev,

acquire_device(dev);

ret = flash_andes_qspi_cmd_addr_read(dev,
FLASH_ANDES_CMD_4READ, addr, dest, size);
do {
/* Get the adequate size to receive */
to_read = MIN(MAX_TRANSFER_CNT, size);

ret = flash_andes_qspi_cmd_addr_read(dev,
FLASH_ANDES_CMD_4READ, addr, dest, to_read);

if (ret != 0) {
break;
}

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

flash_andes_qspi_wait_until_ready(dev);
} while (size > 0);

release_device(dev);
return ret;
Expand Down Expand Up @@ -353,6 +373,8 @@ static int flash_andes_qspi_write(const struct device *dev, off_t addr,
/* Get the adequate size to send*/
to_write = MIN(page_size - (addr % page_size), size);

flash_andes_qspi_cmd_write(dev, FLASH_ANDES_CMD_WREN);

ret = flash_andes_qspi_cmd_addr_write(dev,
FLASH_ANDES_CMD_4PP, addr, src, to_write);

Expand Down Expand Up @@ -801,7 +823,7 @@ static int flash_andes_qspi_init(const struct device *dev)
uint8_t jedec_id[SPI_NOR_MAX_ID_LEN];

/* we should not configure the device we are running on */
if (config->xip) {
if (config->qspi_cfg_rom) {
return -EINVAL;
}

Expand Down Expand Up @@ -880,7 +902,7 @@ flash_andes_qspi_get_parameters(const struct device *dev)
return &config->parameters;
}

static DEVICE_API(flash, flash_andes_qspi_api) = {
static const struct flash_driver_api flash_andes_qspi_api = {
.read = flash_andes_qspi_read,
.write = flash_andes_qspi_write,
.erase = flash_andes_qspi_erase,
Expand All @@ -895,11 +917,21 @@ static DEVICE_API(flash, flash_andes_qspi_api) = {
};

#if (CONFIG_XIP)
#define QSPI_ROM_CFG_XIP(node_id) DT_SAME_NODE(node_id, DT_CHOSEN(zephyr_flash))
#define QSPI_FLASH_BASE DT_REG_ADDR_BY_IDX(DT_PARENT(DT_CHOSEN(zephyr_flash)), 1)
#define QSPI_FLASH_SIZE DT_REG_SIZE_BY_IDX(DT_PARENT(DT_CHOSEN(zephyr_flash)), 1)
#define QSPI_FLASH_END (QSPI_FLASH_BASE + QSPI_FLASH_SIZE)

#if ((QSPI_FLASH_BASE <= CONFIG_FLASH_BASE_ADDRESS) && \
(CONFIG_FLASH_BASE_ADDRESS <= QSPI_FLASH_END))
#define QSPI_CFG_ROM(node_id) DT_SAME_NODE(node_id, DT_CHOSEN(zephyr_flash))
#else
#define QSPI_ROM_CFG_XIP(node_id) false
#define QSPI_CFG_ROM(node_id) false
#endif

#else /* CONFIG_XIP */
#define QSPI_CFG_ROM(node_id) false
#endif /* CONFIG_XIP */

#define LAYOUT_PAGES_PROP(n) \
IF_ENABLED(CONFIG_FLASH_PAGE_LAYOUT, \
(.layout = { \
Expand Down Expand Up @@ -940,7 +972,7 @@ static DEVICE_API(flash, flash_andes_qspi_api) = {
.write_block_size = 1, \
.erase_value = 0xff \
}, \
.xip = QSPI_ROM_CFG_XIP(DT_DRV_INST(n)), \
.qspi_cfg_rom = QSPI_CFG_ROM(DT_DRV_INST(n)), \
ANDES_QSPI_SFDP_DEVICETREE_PROP(n) \
}; \
\
Expand Down
Loading