[PATCH rtems-libbsd 2/2] st-sdmmc: Handle short not cache aligned buffers
Christian MAUDERER
christian.mauderer at embedded-brains.de
Thu Apr 15 13:49:03 UTC 2021
Hello Gedare,
thanks for the review.
Best regards
Christian
Am 14.04.21 um 18:31 schrieb Gedare Bloom:
> These two look good if no one complains go ahead. (I'm not 100% on
> this libbsd stuff yet.)
>
> On Wed, Apr 14, 2021 at 1:21 AM Christian Mauderer
> <christian.mauderer at embedded-brains.de> wrote:
>>
>> Possible data sources for SD driver:
>>
>> - mmc_sd_switch():
>> - length: 64 byte;
>> - buffer on stack
>> - mmc_test_bus_width():
>> - length: 4 or 8 byte
>> - buffer in program memory or on stack
>> - mmc_app_send_scr():
>> - length: 8 byte
>> - buffer from device ivar structure
>> - mmc_app_sd_status():
>> - length: 64 byte
>> - buffer from device ivar structure
>> - mmc_send_ext_csd():
>> - length: MMC_EXTCSD_SIZE = 512
>> - buffer from device ivar structure
>> - rtems_bsd_mmcsd_disk_read_write():
>> - length: depends on read
>> - buffer from rtems_blkdev buffer -> already aligned
>> - mmcsd_ioctl_cmd():
>> - length: depends on call
>> - buffer malloced, not aligned -> patched in RTEMS
>>
>> So the problematic buffers are only the ones up to 512 bytes. Copy these data
>> into a buffer to avoid that problem.
>> ---
>> rtemsbsd/sys/dev/mmc/st-sdmmc.c | 14 ++++++++++----
>> 1 file changed, 10 insertions(+), 4 deletions(-)
>>
>> diff --git a/rtemsbsd/sys/dev/mmc/st-sdmmc.c b/rtemsbsd/sys/dev/mmc/st-sdmmc.c
>> index e50b400a..4b202952 100644
>> --- a/rtemsbsd/sys/dev/mmc/st-sdmmc.c
>> +++ b/rtemsbsd/sys/dev/mmc/st-sdmmc.c
>> @@ -117,7 +117,8 @@ __FBSDID("$FreeBSD$");
>> #define RES_IRQ_SDMMC 2
>> #define RES_NR 3
>>
>> -#define DMA_BUF_SIZE CPU_CACHE_LINE_BYTES
>> +/* Maximum non-aligned buffer is 512 byte from mmc_send_ext_csd() */
>> +#define DMA_BUF_SIZE 512
>>
>> #if 0
>> #define debug_print(sc, lvl, ...) \
>> @@ -575,14 +576,19 @@ st_sdmmc_cmd_do(struct st_sdmmc_softc *sc, struct mmc_command *cmd)
>>
>> BSD_ASSERT(xferlen % (1 << blksize) == 0);
>>
>> - if (xferlen < CPU_CACHE_LINE_BYTES) {
>> + data = cmd->data->data;
>> + /*
>> + * Check whether data have to be copied. Reason is either
>> + * misaligned start address or misaligned length.
>> + */
>> + if (((uintptr_t)data % CPU_CACHE_LINE_BYTES != 0) ||
>> + (xferlen % CPU_CACHE_LINE_BYTES) != 0) {
>> + BSD_ASSERT(xferlen < DMA_BUF_SIZE);
>> if ((cmd->data->flags & MMC_DATA_READ) == 0) {
>> memcpy(sc->dmabuf, cmd->data->data, xferlen);
>> }
>> data = sc->dmabuf;
>> short_xfer = true;
>> - } else {
>> - data = cmd->data->data;
>> }
>>
>> dctrl |= blksize << SDMMC_DCTRL_DBLOCKSIZE_Pos;
>> --
>> 2.26.2
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
--
--------------------------------------------
embedded brains GmbH
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email: christian.mauderer at embedded-brains.de
phone: +49-89-18 94 741 - 18
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
More information about the devel
mailing list