Skip to content

Commit adb6461

Browse files
fanwang-ambiqjhedberg
authored andcommitted
drivers: sdhc: optimize cache related coding
Add buf_in_nocache to check buffer cacheability. Signed-off-by: Fan Wang <[email protected]>
1 parent d770690 commit adb6461

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

drivers/sdhc/Kconfig.ambiq

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,17 @@ config AMBIQ_SDIO_ASYNC
2222
help
2323
This option enables Ambiq SDIO Async Mode.
2424

25+
config SDHC_AMBIQ_HANDLE_CACHE
26+
bool "Turn on cache handling in SDHC driver"
27+
default y
28+
depends on CACHE_MANAGEMENT && DCACHE
29+
help
30+
Disable this if cache has been handled in upper layers.
31+
2532
config SDHC_BUFFER_ALIGNMENT
26-
default 32 if DCACHE
33+
default DCACHE_LINE_SIZE if DCACHE
2734
default 16
2835
help
29-
SDHC buffer should be 32bytes aligned when placed in cacheable region.
36+
SDHC buffer should aligned to the value of DCACHE_LINE_SIZE when placed in a cacheable region.
3037

3138
endif

drivers/sdhc/sdhc_ambiq.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
LOG_MODULE_REGISTER(ambiq_sdio, CONFIG_SDHC_LOG_LEVEL);
2323

24-
#define CACHABLE_START_ADDR SSRAM_BASEADDR
2524
#if defined(CONFIG_SOC_SERIES_APOLLO4X)
2625
#define SDIO_BASE_ADDR SDIO_BASE
2726
#define SDIO_ADDR_INTERVAL 1
@@ -551,13 +550,12 @@ static int ambiq_sdio_request(const struct device *dev, struct sdhc_command *cmd
551550
}
552551

553552
if (data) {
554-
#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
555-
/* Clean Dcache before DMA write */
556-
if (cmd_data.dir == AM_HAL_DATA_DIR_WRITE &&
557-
(uint32_t)(data->data) >= CACHABLE_START_ADDR) {
553+
#if CONFIG_SDHC_AMBIQ_HANDLE_CACHE
554+
if (!buf_in_nocache((uintptr_t)data->data, data->blocks * data->block_size)) {
555+
/* Clean Dcache before DMA write or after memset*/
558556
sys_cache_data_flush_range(data->data, data->blocks * data->block_size);
559557
}
560-
#endif
558+
#endif /* CONFIG_SDHC_AMBIQ_HANDLE_CACHE */
561559

562560
#ifdef CONFIG_AMBIQ_SDIO_ASYNC
563561
k_sem_reset(dev_data->async_sem);
@@ -572,17 +570,19 @@ static int ambiq_sdio_request(const struct device *dev, struct sdhc_command *cmd
572570
}
573571
#endif /* CONFIG_AMBIQ_SDIO_ASYNC */
574572

575-
#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
576-
/* Invalidate Dcache after DMA read */
577-
if (cmd_data.dir == AM_HAL_DATA_DIR_READ &&
578-
(uint32_t)(data->data) >= CACHABLE_START_ADDR) {
579-
sys_cache_data_invd_range(data->data, data->blocks * data->block_size);
573+
#if CONFIG_SDHC_AMBIQ_HANDLE_CACHE
574+
if (!buf_in_nocache((uintptr_t)data->data, data->blocks * data->block_size)) {
575+
/* Invalidate Dcache after DMA read */
576+
if (cmd_data.dir == AM_HAL_DATA_DIR_READ) {
577+
sys_cache_data_invd_range(data->data,
578+
data->blocks * data->block_size);
579+
}
580580
}
581-
#endif
581+
#endif /* CONFIG_SDHC_AMBIQ_HANDLE_CACHE */
582582

583583
} else {
584-
ui32Status =
585-
dev_data->host->ops->execute_cmd(dev_data->host->pHandle, &sdio_cmd, NULL);
584+
ui32Status = dev_data->host->ops->execute_cmd(dev_data->host->pHandle,
585+
&sdio_cmd, NULL);
586586
}
587587
if ((ui32Status & 0xFFFF) != AM_HAL_STATUS_SUCCESS) {
588588
if ((ui32Status & 0xFFFF) == AM_HAL_STATUS_TIMEOUT) {

0 commit comments

Comments
 (0)