Received: by 10.192.165.148 with SMTP id m20csp631932imm; Fri, 27 Apr 2018 05:06:32 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqd3XEalSTFgIKJCR0Xe78mOfKMoRotzRl/KOzgAAhjmQli58vCORjWYPckVHadMIAfNoih X-Received: by 10.98.253.9 with SMTP id p9mr2013157pfh.152.1524830792467; Fri, 27 Apr 2018 05:06:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524830792; cv=none; d=google.com; s=arc-20160816; b=0QXtEfCgE2SmP+BGA/BPcB4qmh9ew2xf6JA0TToN84EFLJNjuebYmp/lm41+E322lJ YmZ/SOJ5zpnx/+q+V6bk62lVSkauUhkB43sxBs7g96CJMYAcFdvGwllLpineFdQkk8yK F0JjUEotJnRMFl8PsJiAZ7JrYi7yIANDtNi6L2Dsp9vXuuK5ftOWneC6kkLAKXxg3Z7m fwgvKpjS1zqxZUGCX++5gV6+Tp0vZzob/9A6O3pMRCHdYOq0qsoJAOCUAzrxuMsHbS+Q HWeRu8zYooiz8KkLVKZoPK6Fl513fMkP0MOoX7uqulFHw7S9BV6e/oBnJCvNdNtANIx0 3CRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=YrU6908QGV0HkQdfteLsKvvpONPPahVwMiz4rQLKbNY=; b=XySuqMsGDaRs33I3/wohwwZ3gYAZXPq6oi20i3+qpvgLpzeddLhPSkcYOaQ5yZTvTF zzwE/r2NtXk4Vl6kgbwJZrm8JiYLWWsSfbF9zZNDedM9L8grFQLoNFn7IIXwP7twjtAU UjfZ5AV7JLKe2/C1j+1b5iXECOFvPWkhoDg8oAH4fjryHVdcnqt8H7ETfmRX6oHlKkiV a1GZFz/Dlg0AOq/Sd5/OUi3SM0nqhJcphWdm+K+e20zAvTbDPpIkMQ3Kqo7wtaBmXKzx Q2hPt7GUReD4hd5bqkucl4OHtez5mRLxqegNnWrxnBUB2wlND+uAfSQs/xAHXZnRbgIX Exsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hU/MOGGw; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z15-v6si1057329pgr.615.2018.04.27.05.06.18; Fri, 27 Apr 2018 05:06:32 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hU/MOGGw; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758001AbeD0MFM (ORCPT + 99 others); Fri, 27 Apr 2018 08:05:12 -0400 Received: from mail-io0-f196.google.com ([209.85.223.196]:43377 "EHLO mail-io0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757946AbeD0MFJ (ORCPT ); Fri, 27 Apr 2018 08:05:09 -0400 Received: by mail-io0-f196.google.com with SMTP id t23-v6so2136076ioc.10 for ; Fri, 27 Apr 2018 05:05:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=YrU6908QGV0HkQdfteLsKvvpONPPahVwMiz4rQLKbNY=; b=hU/MOGGwBPMhTPk4A+kh5PC+G4wXvV2Pk7pQraPDuOJozlmgsluypwEmJpDZP/m5gx lnh2SHNXdUxOQWusCrnvALoVyicZmCbBKbh4PaRSg4EREpJtWV2TyHmZ8e7AljC/3A1l Q7TZXc9RDzDoB7Xleik1RA42STcIyNzB5+NQI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=YrU6908QGV0HkQdfteLsKvvpONPPahVwMiz4rQLKbNY=; b=ZSGz4XUhhvIykpCWPF0VnAzXMPjj0eA8ZnU12kQ2VJZf6M/0/28gX06i/7YEMeKt8Y GNR1rqaDUH9pKSbrSssozk6wbSoSBFaBHb8j6AvEacLlGg+1rp5lPm8NUgDKfdO9lqXP drMWwViDR7M3ceRMS+Ix3xJWb/iNy3f9Y32PiuiZtFyE+zQQCO3bG/Zv18sN9A3J8I7e 2Zngs8/wc1WacHMzADa6DQfbynmu1fkEnhkewstkKzkl+Nowi31LC3AtsyD9BmAnQEpa 2q4gc7mWd1N2Z0+ke4LBJkELCTPX5v/YgZMsT+HjntQJzvvUpo6+imdlovXk1OG6ba0j UnkA== X-Gm-Message-State: ALQs6tA708Y2PAIRYOvzMpA39IyneP2JQzPYvuuAjBgwGDHUg9YwzXOX tSZlki2t9UpI0m2q/5IJ/RxFSBVRo4Mtxfs/uhh2tw== X-Received: by 2002:a6b:1456:: with SMTP id 83-v6mr1848366iou.218.1524830708536; Fri, 27 Apr 2018 05:05:08 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a02:952f:0:0:0:0:0 with HTTP; Fri, 27 Apr 2018 05:05:08 -0700 (PDT) In-Reply-To: <1524640743-11732-2-git-send-email-chaotian.jing@mediatek.com> References: <1524640743-11732-1-git-send-email-chaotian.jing@mediatek.com> <1524640743-11732-2-git-send-email-chaotian.jing@mediatek.com> From: Ulf Hansson Date: Fri, 27 Apr 2018 14:05:08 +0200 Message-ID: Subject: Re: [PATCH v2] mmc: mediatek: add 64G DRAM DMA support To: Chaotian Jing Cc: Matthias Brugger , Phong LE , Julia Lawall , Heiner Kallweit , Ryder Lee , yong mao , "linux-mmc@vger.kernel.org" , Linux ARM , linux-mediatek@lists.infradead.org, Linux Kernel Mailing List , srv_heupstream Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 25 April 2018 at 09:19, Chaotian Jing wrote: > MT2712 MSDC supports 64G DRAM DMA access, it needs update > gpd/bd structure. > > Signed-off-by: Chaotian Jing Thanks, applied for next! Kind regards Uffe > --- > drivers/mmc/host/mtk-sd.c | 56 +++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 49 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index d642e11..0484138 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -71,6 +71,7 @@ > #define SDC_ADV_CFG0 0x64 > #define EMMC_IOCON 0x7c > #define SDC_ACMD_RESP 0x80 > +#define DMA_SA_H4BIT 0x8c > #define MSDC_DMA_SA 0x90 > #define MSDC_DMA_CTRL 0x98 > #define MSDC_DMA_CFG 0x9c > @@ -195,6 +196,9 @@ > /* SDC_ADV_CFG0 mask */ > #define SDC_RX_ENHANCE_EN (0x1 << 20) /* RW */ > > +/* DMA_SA_H4BIT mask */ > +#define DMA_ADDR_HIGH_4BIT (0xf << 0) /* RW */ > + > /* MSDC_DMA_CTRL mask */ > #define MSDC_DMA_CTRL_START (0x1 << 0) /* W */ > #define MSDC_DMA_CTRL_STOP (0x1 << 1) /* W */ > @@ -228,6 +232,7 @@ > > #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ > #define MSDC_PATCH_BIT2_CFGCRCSTS (0x1 << 28) /* RW */ > +#define MSDC_PB2_SUPPORT_64G (0x1 << 1) /* RW */ > #define MSDC_PB2_RESPWAIT (0x3 << 2) /* RW */ > #define MSDC_PB2_RESPSTSENSEL (0x7 << 16) /* RW */ > #define MSDC_PB2_CRCSTSENSEL (0x7 << 29) /* RW */ > @@ -281,6 +286,8 @@ struct mt_gpdma_desc { > #define GPDMA_DESC_BDP (0x1 << 1) > #define GPDMA_DESC_CHECKSUM (0xff << 8) /* bit8 ~ bit15 */ > #define GPDMA_DESC_INT (0x1 << 16) > +#define GPDMA_DESC_NEXT_H4 (0xf << 24) > +#define GPDMA_DESC_PTR_H4 (0xf << 28) > u32 next; > u32 ptr; > u32 gpd_data_len; > @@ -297,6 +304,8 @@ struct mt_bdma_desc { > #define BDMA_DESC_CHECKSUM (0xff << 8) /* bit8 ~ bit15 */ > #define BDMA_DESC_BLKPAD (0x1 << 17) > #define BDMA_DESC_DWPAD (0x1 << 18) > +#define BDMA_DESC_NEXT_H4 (0xf << 24) > +#define BDMA_DESC_PTR_H4 (0xf << 28) > u32 next; > u32 ptr; > u32 bd_data_len; > @@ -335,6 +344,7 @@ struct mtk_mmc_compatible { > bool busy_check; > bool stop_clk_fix; > bool enhance_rx; > + bool support_64g; > }; > > struct msdc_tune_para { > @@ -404,6 +414,7 @@ struct msdc_host { > .busy_check = false, > .stop_clk_fix = false, > .enhance_rx = false, > + .support_64g = false, > }; > > static const struct mtk_mmc_compatible mt8173_compat = { > @@ -415,6 +426,7 @@ struct msdc_host { > .busy_check = false, > .stop_clk_fix = false, > .enhance_rx = false, > + .support_64g = false, > }; > > static const struct mtk_mmc_compatible mt2701_compat = { > @@ -426,6 +438,7 @@ struct msdc_host { > .busy_check = false, > .stop_clk_fix = false, > .enhance_rx = false, > + .support_64g = false, > }; > > static const struct mtk_mmc_compatible mt2712_compat = { > @@ -437,6 +450,7 @@ struct msdc_host { > .busy_check = true, > .stop_clk_fix = true, > .enhance_rx = true, > + .support_64g = true, > }; > > static const struct mtk_mmc_compatible mt7622_compat = { > @@ -448,6 +462,7 @@ struct msdc_host { > .busy_check = true, > .stop_clk_fix = true, > .enhance_rx = true, > + .support_64g = false, > }; > > static const struct of_device_id msdc_of_ids[] = { > @@ -557,7 +572,12 @@ static inline void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, > /* init bd */ > bd[j].bd_info &= ~BDMA_DESC_BLKPAD; > bd[j].bd_info &= ~BDMA_DESC_DWPAD; > - bd[j].ptr = (u32)dma_address; > + bd[j].ptr = lower_32_bits(dma_address); > + if (host->dev_comp->support_64g) { > + bd[j].bd_info &= ~BDMA_DESC_PTR_H4; > + bd[j].bd_info |= (upper_32_bits(dma_address) & 0xf) > + << 28; > + } > bd[j].bd_data_len &= ~BDMA_DESC_BUFLEN; > bd[j].bd_data_len |= (dma_len & BDMA_DESC_BUFLEN); > > @@ -576,7 +596,10 @@ static inline void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, > dma_ctrl &= ~(MSDC_DMA_CTRL_BRUSTSZ | MSDC_DMA_CTRL_MODE); > dma_ctrl |= (MSDC_BURST_64B << 12 | 1 << 8); > writel_relaxed(dma_ctrl, host->base + MSDC_DMA_CTRL); > - writel((u32)dma->gpd_addr, host->base + MSDC_DMA_SA); > + if (host->dev_comp->support_64g) > + sdr_set_field(host->base + DMA_SA_H4BIT, DMA_ADDR_HIGH_4BIT, > + upper_32_bits(dma->gpd_addr) & 0xf); > + writel(lower_32_bits(dma->gpd_addr), host->base + MSDC_DMA_SA); > } > > static void msdc_prepare_data(struct msdc_host *host, struct mmc_request *mrq) > @@ -1367,6 +1390,9 @@ static void msdc_init_hw(struct msdc_host *host) > MSDC_PATCH_BIT2_CFGCRCSTS); > } > > + if (host->dev_comp->support_64g) > + sdr_set_bits(host->base + MSDC_PATCH_BIT2, > + MSDC_PB2_SUPPORT_64G); > if (host->dev_comp->data_tune) { > sdr_set_bits(host->base + tune_reg, > MSDC_PAD_TUNE_RD_SEL | MSDC_PAD_TUNE_CMD_SEL); > @@ -1408,19 +1434,32 @@ static void msdc_init_gpd_bd(struct msdc_host *host, struct msdc_dma *dma) > { > struct mt_gpdma_desc *gpd = dma->gpd; > struct mt_bdma_desc *bd = dma->bd; > + dma_addr_t dma_addr; > int i; > > memset(gpd, 0, sizeof(struct mt_gpdma_desc) * 2); > > + dma_addr = dma->gpd_addr + sizeof(struct mt_gpdma_desc); > gpd->gpd_info = GPDMA_DESC_BDP; /* hwo, cs, bd pointer */ > - gpd->ptr = (u32)dma->bd_addr; /* physical address */ > /* gpd->next is must set for desc DMA > * That's why must alloc 2 gpd structure. > */ > - gpd->next = (u32)dma->gpd_addr + sizeof(struct mt_gpdma_desc); > + gpd->next = lower_32_bits(dma_addr); > + if (host->dev_comp->support_64g) > + gpd->gpd_info |= (upper_32_bits(dma_addr) & 0xf) << 24; > + > + dma_addr = dma->bd_addr; > + gpd->ptr = lower_32_bits(dma->bd_addr); /* physical address */ > + if (host->dev_comp->support_64g) > + gpd->gpd_info |= (upper_32_bits(dma_addr) & 0xf) << 28; > + > memset(bd, 0, sizeof(struct mt_bdma_desc) * MAX_BD_NUM); > - for (i = 0; i < (MAX_BD_NUM - 1); i++) > - bd[i].next = (u32)dma->bd_addr + sizeof(*bd) * (i + 1); > + for (i = 0; i < (MAX_BD_NUM - 1); i++) { > + dma_addr = dma->bd_addr + sizeof(*bd) * (i + 1); > + bd[i].next = lower_32_bits(dma_addr); > + if (host->dev_comp->support_64g) > + bd[i].bd_info |= (upper_32_bits(dma_addr) & 0xf) << 24; > + } > } > > static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) > @@ -1913,7 +1952,10 @@ static int msdc_drv_probe(struct platform_device *pdev) > mmc->max_blk_size = 2048; > mmc->max_req_size = 512 * 1024; > mmc->max_blk_count = mmc->max_req_size / 512; > - host->dma_mask = DMA_BIT_MASK(32); > + if (host->dev_comp->support_64g) > + host->dma_mask = DMA_BIT_MASK(36); > + else > + host->dma_mask = DMA_BIT_MASK(32); > mmc_dev(mmc)->dma_mask = &host->dma_mask; > > host->timeout_clks = 3 * 1048576; > -- > 1.8.1.1.dirty >