From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753346AbcIVEZw (ORCPT ); Thu, 22 Sep 2016 00:25:52 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:59812 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751072AbcIVEZu (ORCPT ); Thu, 22 Sep 2016 00:25:50 -0400 X-AuditID: cbfee68d-f790c6d000004a75-0d-57e35d4b1332 Subject: Re: [PATCH v2 1/4] mmc: dw_mmc: split out preparation of desc for IDMAC32 and IDMAC64 To: Shawn Lin References: <1472789679-15121-1-git-send-email-shawn.lin@rock-chips.com> Cc: Ulf Hansson , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Anderson , Heiko Stuebner , linux-rockchip@lists.infradead.org From: Jaehoon Chung Message-id: Date: Thu, 22 Sep 2016 13:25:47 +0900 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-version: 1.0 In-reply-to: <1472789679-15121-1-git-send-email-shawn.lin@rock-chips.com> Content-type: text/plain; charset=windows-1252 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOIsWRmVeSWpSXmKPExsWyRsSkUNc79nG4waIDZhZnlx1ks/j/6DWr xeVdc9gsjvzvZ7T49OA/s8WdJ+tZLY6vDXdg95jdcJHF4861PWwem5fUe/ydtZ/FY/u1ecwe nzfJBbBFcdmkpOZklqUW6dslcGV0X7zHXrDKrOLOn6vMDYx3NLoYOTkkBEwk9k9rYoSwxSQu 3FvP1sXIxSEksIJR4v69FlaYopkLl7NAJJYySuy9/ZAZwnnAKNHbvBWsXVggQeL3gX8sILaI gIbEjbPXoUbNY5R4sbsRrINZ4BKjxON/98Gq2AR0JLZ/O84EYvMK2EksmLOXHcRmEVCV2HD1 ANhUUYEwiZPnzrFD1AhK/Jh8D6yXU8BTYveBi0A1HEBD9STuX9QCCTMLyEtsXvMWbJeEwC12 ia7OWawQMwUkvk0+xAJSLyEgK7HpADPEa5ISB1fcYJnAKDYLyYZZCFNnIZm6gJF5FaNoakFy QXFSepGhXnFibnFpXrpecn7uJkZg/J3+96x3B+PtA9aHGAU4GJV4eDW+PwoXYk0sK67MPcRo CnTERGYp0eR8YJTnlcQbGpsZWZiamBobmVuaKYnzKkr9DBYSSE8sSc1OTS1ILYovKs1JLT7E yMTBKdXA2FW93POsSdHf4INXm/Ln/ZLOa27Lygvw9JGfqHX3ZsbTbpO9Gf1ne/Nm72ZLaU2X 1ZiWxnK5vm9jwUZZMW5VF32fmV0HuHew7axQmNIzuXd3wUm++icbLHbUuj0v/WN/NneRvGSa xG4n4ePLfW/ejbDZKG88o7C3vENt0v2bd45Ne3OjeK+rEktxRqKhFnNRcSIADB81lLoCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrCIsWRmVeSWpSXmKPExsVy+t9jAV3v2MfhBt+mGVicXXaQzeL/o9es Fpd3zWGzOPK/n9Hi04P/zBZ3nqxntTi+NtyB3WN2w0UWjzvX9rB5bF5S7/F31n4Wj+3X5jF7 fN4kF8AW1cBok5GamJJapJCal5yfkpmXbqvkHRzvHG9qZmCoa2hpYa6kkJeYm2qr5OIToOuW mQN0ipJCWWJOKVAoILG4WEnfDtOE0BA3XQuYxghd35AguB4jAzSQsIYxo/viPfaCVWYVd/5c ZW5gvKPRxcjJISFgIjFz4XIWCFtM4sK99WxdjFwcQgJLGSX23n7IDOE8YJTobd7KCFIlLJAg 8fvAP7AOEQENiRtnr0N1zGOUeLG7EayDWeASo8Tjf/fBqtgEdCS2fzvOBGLzCthJLJizlx3E ZhFQldhw9QDYVFGBMImT586xQ9QISvyYfA+sl1PAU2L3gYtANRxAQ/Uk7l/UAgkzC8hLbF7z lnkCo8AsJB2zEKpmIalawMi8ilEitSC5oDgpPdcwL7Vcrzgxt7g0L10vOT93EyM4xp9J7WA8 uMv9EKMAB6MSD6/G90fhQqyJZcWVuYcYJTiYlUR4J0c/DhfiTUmsrEotyo8vKs1JLT7EaAr0 xkRmKdHkfGD6ySuJNzQ2MTOyNDI3tDAyNlcS5338f12YkEB6YklqdmpqQWoRTB8TB6dUA2Ng Wr7+9cmpT7oSxa6esGqaEVz69LHVhGvuBRMP7izIkgjUlJvj55j358NsxsQ7QUnOV7M8314O OD/Fl3NZk+jF/88rf6jLp7Sc5efYazff44hb6MLjk/6f8A0Q4E3rbt5R8VzH5//5WEOV7K0y p3sfvxbuUI9T3ebp/a34wM6oqk8vwva++KHEUpyRaKjFXFScCACJquLjBwMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/02/2016 01:14 PM, Shawn Lin wrote: > We intend to add more check for descriptors when > preparing desc. Let's spilt out the separate body > to make the dw_mci_translate_sglist not so lengthy. > After spliting out these two functions, we could > remove dw_mci_translate_sglist and call both of them > when staring idmac. Applied on my tree. Thanks! Best Regards, Jaehoon Chung > > Signed-off-by: Shawn Lin > > --- > > Changes in v2: > - remove dw_mci_translate_sglist > > drivers/mmc/host/dw_mmc.c | 149 ++++++++++++++++++++++++---------------------- > 1 file changed, 79 insertions(+), 70 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 22dacae..782b303 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -467,112 +467,121 @@ static void dw_mci_dmac_complete_dma(void *arg) > } > } > > -static void dw_mci_translate_sglist(struct dw_mci *host, struct mmc_data *data, > - unsigned int sg_len) > +static inline void dw_mci_prepare_desc64(struct dw_mci *host, > + struct mmc_data *data, > + unsigned int sg_len) > { > unsigned int desc_len; > + struct idmac_desc_64addr *desc_first, *desc_last, *desc; > int i; > > - if (host->dma_64bit_address == 1) { > - struct idmac_desc_64addr *desc_first, *desc_last, *desc; > - > - desc_first = desc_last = desc = host->sg_cpu; > + desc_first = desc_last = desc = host->sg_cpu; > > - for (i = 0; i < sg_len; i++) { > - unsigned int length = sg_dma_len(&data->sg[i]); > + for (i = 0; i < sg_len; i++) { > + unsigned int length = sg_dma_len(&data->sg[i]); > > - u64 mem_addr = sg_dma_address(&data->sg[i]); > + u64 mem_addr = sg_dma_address(&data->sg[i]); > > - for ( ; length ; desc++) { > - desc_len = (length <= DW_MCI_DESC_DATA_LENGTH) ? > - length : DW_MCI_DESC_DATA_LENGTH; > + for ( ; length ; desc++) { > + desc_len = (length <= DW_MCI_DESC_DATA_LENGTH) ? > + length : DW_MCI_DESC_DATA_LENGTH; > > - length -= desc_len; > + length -= desc_len; > > - /* > - * Set the OWN bit and disable interrupts > - * for this descriptor > - */ > - desc->des0 = IDMAC_DES0_OWN | IDMAC_DES0_DIC | > - IDMAC_DES0_CH; > + /* > + * Set the OWN bit and disable interrupts > + * for this descriptor > + */ > + desc->des0 = IDMAC_DES0_OWN | IDMAC_DES0_DIC | > + IDMAC_DES0_CH; > > - /* Buffer length */ > - IDMAC_64ADDR_SET_BUFFER1_SIZE(desc, desc_len); > + /* Buffer length */ > + IDMAC_64ADDR_SET_BUFFER1_SIZE(desc, desc_len); > > - /* Physical address to DMA to/from */ > - desc->des4 = mem_addr & 0xffffffff; > - desc->des5 = mem_addr >> 32; > + /* Physical address to DMA to/from */ > + desc->des4 = mem_addr & 0xffffffff; > + desc->des5 = mem_addr >> 32; > > - /* Update physical address for the next desc */ > - mem_addr += desc_len; > + /* Update physical address for the next desc */ > + mem_addr += desc_len; > > - /* Save pointer to the last descriptor */ > - desc_last = desc; > - } > + /* Save pointer to the last descriptor */ > + desc_last = desc; > } > + } > > - /* Set first descriptor */ > - desc_first->des0 |= IDMAC_DES0_FD; > + /* Set first descriptor */ > + desc_first->des0 |= IDMAC_DES0_FD; > > - /* Set last descriptor */ > - desc_last->des0 &= ~(IDMAC_DES0_CH | IDMAC_DES0_DIC); > - desc_last->des0 |= IDMAC_DES0_LD; > + /* Set last descriptor */ > + desc_last->des0 &= ~(IDMAC_DES0_CH | IDMAC_DES0_DIC); > + desc_last->des0 |= IDMAC_DES0_LD; > +} > > - } else { > - struct idmac_desc *desc_first, *desc_last, *desc; > > - desc_first = desc_last = desc = host->sg_cpu; > +static inline void dw_mci_prepare_desc32(struct dw_mci *host, > + struct mmc_data *data, > + unsigned int sg_len) > +{ > + unsigned int desc_len; > + struct idmac_desc *desc_first, *desc_last, *desc; > + int i; > > - for (i = 0; i < sg_len; i++) { > - unsigned int length = sg_dma_len(&data->sg[i]); > + desc_first = desc_last = desc = host->sg_cpu; > > - u32 mem_addr = sg_dma_address(&data->sg[i]); > + for (i = 0; i < sg_len; i++) { > + unsigned int length = sg_dma_len(&data->sg[i]); > > - for ( ; length ; desc++) { > - desc_len = (length <= DW_MCI_DESC_DATA_LENGTH) ? > - length : DW_MCI_DESC_DATA_LENGTH; > + u32 mem_addr = sg_dma_address(&data->sg[i]); > > - length -= desc_len; > + for ( ; length ; desc++) { > + desc_len = (length <= DW_MCI_DESC_DATA_LENGTH) ? > + length : DW_MCI_DESC_DATA_LENGTH; > > - /* > - * Set the OWN bit and disable interrupts > - * for this descriptor > - */ > - desc->des0 = cpu_to_le32(IDMAC_DES0_OWN | > - IDMAC_DES0_DIC | > - IDMAC_DES0_CH); > + length -= desc_len; > > - /* Buffer length */ > - IDMAC_SET_BUFFER1_SIZE(desc, desc_len); > + /* > + * Set the OWN bit and disable interrupts > + * for this descriptor > + */ > + desc->des0 = cpu_to_le32(IDMAC_DES0_OWN | > + IDMAC_DES0_DIC | > + IDMAC_DES0_CH); > > - /* Physical address to DMA to/from */ > - desc->des2 = cpu_to_le32(mem_addr); > + /* Buffer length */ > + IDMAC_SET_BUFFER1_SIZE(desc, desc_len); > > - /* Update physical address for the next desc */ > - mem_addr += desc_len; > + /* Physical address to DMA to/from */ > + desc->des2 = cpu_to_le32(mem_addr); > > - /* Save pointer to the last descriptor */ > - desc_last = desc; > - } > - } > - > - /* Set first descriptor */ > - desc_first->des0 |= cpu_to_le32(IDMAC_DES0_FD); > + /* Update physical address for the next desc */ > + mem_addr += desc_len; > > - /* Set last descriptor */ > - desc_last->des0 &= cpu_to_le32(~(IDMAC_DES0_CH | > - IDMAC_DES0_DIC)); > - desc_last->des0 |= cpu_to_le32(IDMAC_DES0_LD); > + /* Save pointer to the last descriptor */ > + desc_last = desc; > + } > } > > - wmb(); /* drain writebuffer */ > + /* Set first descriptor */ > + desc_first->des0 |= cpu_to_le32(IDMAC_DES0_FD); > + > + /* Set last descriptor */ > + desc_last->des0 &= cpu_to_le32(~(IDMAC_DES0_CH | > + IDMAC_DES0_DIC)); > + desc_last->des0 |= cpu_to_le32(IDMAC_DES0_LD); > } > > static int dw_mci_idmac_start_dma(struct dw_mci *host, unsigned int sg_len) > { > u32 temp; > > - dw_mci_translate_sglist(host, host->data, sg_len); > + if (host->dma_64bit_address == 1) > + dw_mci_prepare_desc64(host, host->data, sg_len); > + else > + dw_mci_prepare_desc32(host, host->data, sg_len); > + > + /* drain writebuffer */ > + wmb(); > > /* Make sure to reset DMA in case we did PIO before this */ > dw_mci_ctrl_reset(host, SDMMC_CTRL_DMA_RESET); >