mmc/dw_mmc: Fix DMA descriptor corruption
PATCH 1/1 mmc/dw_mmc: Fix DMA descriptor corruption
In dwmci_prepare_data, the descriptors are allocated for DMA transfer. These are allocated using the ALLOC_CACHE_ALIGN_BUFFER. This macro uses the stack to allocate these descriptors. This becomes a problem if the DMA transfer continues after the processor leaves the function in which the descriptors were allocated.
Therefore, I have moved the allocated of the buffers up one level, to dwmci_send_cmd(). The DMA transfer should be complete when leaving this function.
--- drivers/mmc/dw_mmc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/mmc/dw_mmc.c +4 -3
@@ -41,12 +41,11 @@ static void dwmci_set_idma_desc(struct dwmci_idmac *idmac, }static void dwmci_prepare_data (struct dwmci_host *host, -struct mmc_data *data) +struct mmc_data *data,struct dwmci_idmac *cur_idmac) {unsigned long ctrl;unsigned int i =0 , flags, cnt, blk_cnt;ulong data_start, data_end, start_addr; - ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, data->blocks); blk_cnt = data->blocks;
@@ -111,6 +110,8 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data) {struct dwmci_host *host = (struct dwmci_host *)mmc->priv; + ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, + data ? data->blocks : 0);int flags =0 , i;unsigned int timeout =100000 ;u32 retry =10000 ;
@@ -127,7 +128,7 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,dwmci_writel (host,DWMCI_RINTSTS ,DWMCI_INTMSK_ALL );if (data) -dwmci_prepare_data (host, data); +dwmci_prepare_data (host, data, cur_idmac);dwmci_writel (host,DWMCI_CMDARG , cmd->cmdarg);
Signature · 1 line
1.7.9.5
PATCH 1/1 mmc/dw_mmc: Fix DMA descriptor corruption
Hi, Mischa,
Looks good to me.
Best Regards,
Jaehoon Chung
Quoted 55 lines · Mischa Jonker
In
dwmci_prepare_data, the descriptors are allocated for DMA transfer. These are allocated using theALLOC_CACHE_ALIGN_BUFFER. This macro uses the stack to allocate these descriptors. This becomes a problem if the DMA transfer continues after the processor leaves the function in which the descriptors were allocated.Therefore, I have moved the allocated of the buffers up one level, to
dwmci_send_cmd(). The DMA transfer should be complete when leaving this function.Signed-off-by Mischa Jonker <[email protected]>Cc Alexey Brodkin <[email protected]>Cc Jaehoon Chung <[email protected]>Cc Andy Fleming <[email protected]>--- drivers/mmc/dw_mmc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)drivers/mmc/dw_mmc.c +4
-3@@ -41,12 +41,11 @@ static void dwmci_set_idma_desc(struct dwmci_idmac *idmac, }static void dwmci_prepare_data (struct dwmci_host *host, -struct mmc_data *data) +struct mmc_data *data,struct dwmci_idmac *cur_idmac) {unsigned long ctrl;unsigned int i =0 , flags, cnt, blk_cnt;ulong data_start, data_end, start_addr; - ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, data->blocks); blk_cnt = data->blocks;@@ -111,6 +110,8 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data) {struct dwmci_host *host = (struct dwmci_host *)mmc->priv; + ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, + data ? data->blocks : 0);int flags =0 , i;unsigned int timeout =100000 ;u32 retry =10000 ;@@ -127,7 +128,7 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,dwmci_writel (host,DWMCI_RINTSTS ,DWMCI_INTMSK_ALL );if (data) -dwmci_prepare_data (host, data); +dwmci_prepare_data (host, data, cur_idmac);dwmci_writel (host,DWMCI_CMDARG , cmd->cmdarg);
PATCH 1/1 mmc/dw_mmc: Fix DMA descriptor corruption
In reply to Mischa JonkerHi Mischa,
Quoted 6 lines · Mischa Jonker
In
dwmci_prepare_data, the descriptors are allocated for DMA transfer. These are allocated using theALLOC_CACHE_ALIGN_BUFFER. This macro uses the stack to allocate these descriptors. This becomes a problem if the DMA transfer continues after the processor leaves the function in which the descriptors were allocated.
Quoted 8 lines
Therefore, I have moved the allocated of the buffers up one level, to
dwmci_send_cmd(). The DMA transfer should be complete when leaving this function.Signed-off-by Mischa Jonker <[email protected]>Cc Alexey Brodkin <[email protected]>Cc Jaehoon Chung <[email protected]>Cc Andy Fleming <[email protected]>
Thanks