Received: by 10.192.165.148 with SMTP id m20csp3206332imm; Mon, 23 Apr 2018 02:28:40 -0700 (PDT) X-Google-Smtp-Source: AIpwx48qi0wGfJsWJ18VrORPcBHsk7cApEhXt4CWa4z88NfPr2cDc8M0jr2F+U6rTlUf85On0k6s X-Received: by 2002:a17:902:68c5:: with SMTP id x5-v6mr20432896plm.194.1524475720372; Mon, 23 Apr 2018 02:28:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524475720; cv=none; d=google.com; s=arc-20160816; b=iZpMxlJamfvQ2J2t6uyfDtvm18FgEcyBeyKWGQO35HA1lmcVvBuXLiMrIxrVcQyyrD NIdSpUYgWk4WWjItMsBRrS6Wx7+4Yhxri5A+1yulMAR3Q3hWA/E3xgi+ycT9GAfyjzL6 vlgpiSZDu5YK9KYN7EZdFvZXgGlOuoXNNZEihCVKSqtkjRQ2CScjrOc1DxviaBka18Cf e+QIc7LhQIePUbj4VUR+pUywrDjC/hG0o0frS2kQqyII+HVi3/h4Iq82tuFgkVbnN8/u K5VyqgfAkX7+uBTWGbj3g45xGmmaGuEgxP3tiAPE0c70mP93Nx7SxQ3DFIdMSVqGfj/K ktoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=jHViwMMYIJFTn6x9PU/7UYGiIU8m4p+cNTP2Lf5qKJY=; b=zvoJUq0PaQEueY5cMnkPGggDaJTZpcDR6ejkTMo49iqXIEB5Y5PdUe8oid78vuB/wc ZC6yj0HT1wtaUv1gAQUNLuyqayJHHEZbF3biEh1niFtVmEXcZU+888qFtmeyLj2PKrk0 +mxcRbOLOP1cEkEugg+ccNn7QdKlbtFG7AfDwbRkFHt45oBl9TjhMX8kiwe4PE5GNawo QVnlDih9tAcY7zpfdv+xjlHDKK8/H2IuyZxm07og67pNzX8gxfQYPWSB40NjRshkfr1i VAV8+gVHuy+hV+l3cg4b8e2KhUU07x0OraA3iFw1xmbT0T3lwhUhhpHaZ9dAv/1nUWX4 IAjA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r63-v6si10910031plb.366.2018.04.23.02.28.26; Mon, 23 Apr 2018 02:28:40 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754490AbeDWJ1Q (ORCPT + 99 others); Mon, 23 Apr 2018 05:27:16 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:34931 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1754081AbeDWJ1C (ORCPT ); Mon, 23 Apr 2018 05:27:02 -0400 X-UUID: c4ece23c09fc41d18df951ae658ae50e-20180423 Received: from mtkcas07.mediatek.inc [(172.21.101.84)] by mailgw02.mediatek.com (envelope-from ) (mhqrelay.mediatek.com ESMTP with TLS) with ESMTP id 1129617124; Mon, 23 Apr 2018 17:26:59 +0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by mtkmbs03n1.mediatek.inc (172.21.101.181) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Mon, 23 Apr 2018 17:26:57 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1210.3 via Frontend Transport; Mon, 23 Apr 2018 17:26:57 +0800 From: Chaotian Jing To: Ulf Hansson CC: Matthias Brugger , Chaotian Jing , Phong LE , Julia Lawall , Heiner Kallweit , Ryder Lee , yong mao , , , , , Subject: [PATCH] mmc: mediatek: add 64G DRAM DMA support Date: Mon, 23 Apr 2018 17:26:50 +0800 Message-ID: <1524475610-22079-2-git-send-email-chaotian.jing@mediatek.com> X-Mailer: git-send-email 1.8.1.1.dirty In-Reply-To: <1524475610-22079-1-git-send-email-chaotian.jing@mediatek.com> References: <1524475610-22079-1-git-send-email-chaotian.jing@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org MT2712 MSDC supports 64G DRAM DMA access, it needs update gpd/bd structure. Signed-off-by: Chaotian Jing --- drivers/mmc/host/mtk-sd.c | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index d642e11..93269ac 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -228,6 +228,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 +282,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 +300,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 +340,7 @@ struct mtk_mmc_compatible { bool busy_check; bool stop_clk_fix; bool enhance_rx; + bool support_64g; }; struct msdc_tune_para { @@ -404,6 +410,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 +422,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 +434,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 +446,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 +458,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[] = { @@ -558,6 +569,10 @@ static inline void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, bd[j].bd_info &= ~BDMA_DESC_BLKPAD; bd[j].bd_info &= ~BDMA_DESC_DWPAD; bd[j].ptr = (u32)dma_address; + if (host->dev_comp->support_64g) { + bd[j].bd_info &= ~BDMA_DESC_PTR_H4; + bd[j].bd_info |= ((dma_address >> 32) & 0xf) << 28; + } bd[j].bd_data_len &= ~BDMA_DESC_BUFLEN; bd[j].bd_data_len |= (dma_len & BDMA_DESC_BUFLEN); @@ -1367,6 +1382,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 +1426,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 = (u32)dma_addr; + if (host->dev_comp->support_64g) + gpd->gpd_info |= ((dma_addr >> 32) & 0xf) << 24; + + dma_addr = dma->bd_addr; + gpd->ptr = (u32)dma->bd_addr; /* physical address */ + if (host->dev_comp->support_64g) + gpd->gpd_info |= ((dma_addr >> 32) & 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 = (u32)dma_addr; + if (host->dev_comp->support_64g) + bd[i].bd_info |= ((dma_addr >> 32) & 0xf) << 24; + } } static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) @@ -1913,7 +1944,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