From patchwork Tue Jun 9 07:59:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 1305663 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256 header.s=selector2 header.b=n+9bMOf+; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49h2Zv1f46z9sRN for ; Tue, 9 Jun 2020 17:59:35 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6F71B812F8; Tue, 9 Jun 2020 09:59:30 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="n+9bMOf+"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5227D812F8; Tue, 9 Jun 2020 09:59:29 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER, SPF_HELO_PASS,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20626.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1b::626]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C180D8006D for ; Tue, 9 Jun 2020 09:59:25 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ye.li@nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lrBt0ydFK602Q73UOvE60XnQmQeaTmaIUwkLfIURzPdH3zvGc7jUJ+rwFU5OE/hum5PHwGxDUBVoyV1UacLiBJn2yiz6hiyin8dzMhUuOCzFW3BPYNZCipmSKdSGDqRP0ZWzmM4aTBCio1vIzZw6UsLUXLsY2za2n811xuTf2jlSS90m6EdBvtc7KAp6J0U8dq8FNGJt9lx/0VHfuo4fa0JxYNeytOEmakUqw2HrFPo71qbvMcnOCDJH+BXmzli5+PlnScwx6vqjDr7upagr6kD3vi72n+sL5qo5eczYQRwscE0Me9qrpQMn7DPonIxCnWUqMbmuJkkZP11yYJ7aSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=06MC6KIrLkRy4y1bUKPAaJiWoTIF1VPtl9qxBxFA9vU=; b=FDzdDR1YNN6QxMEcgDLXV7MbytYevB3yXMikye1eC+YbqfAiAy2USLntz2FBdDFNQzgF4EcMzp4ZwSJILvwUul7nk0Qpv10R6uuBlmU0Ufh9yb3hUrLgd+XlBQkp0GSlDEtPcb6R/bsz9TYuxpRCv3iny4KHBM7HDrW9Or65va/WznxHG/xy51UL+fAo1qwTsSL2NkhTNWUmxd8Kqq0wjSXYScglEt/kCtdDjsI/eTl36zZwVCAL1DDYdtQo77gG8ET8Bhv0wHB+cSgzKuutlg/dz4PxX35QBNf9Yc5YDlSI5H4WiCglrGbKZVqGaNg2BkJfwRYKiUIIS3vj3bbWNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=06MC6KIrLkRy4y1bUKPAaJiWoTIF1VPtl9qxBxFA9vU=; b=n+9bMOf++k500yK36jUiy/dKC+Uvqx8OgREnjBzmec5t3dGBnE5Uxr6WNiPnGREljgcIrtUX8M0AIkFrSrOwFfwRl24BPWI1vq2VQHKq2woEpLUoB8Np5kDLlhHzHVRRPdeaUu9vAXEweUc/cNDYS9R/NMjdsj6YvF85x2j9qQg= Authentication-Results: amarulasolutions.com; dkim=none (message not signed) header.d=none;amarulasolutions.com; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:69::13) by VI1PR04MB5390.eurprd04.prod.outlook.com (2603:10a6:803:d9::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.20; Tue, 9 Jun 2020 07:59:23 +0000 Received: from VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::450f:3c2f:20f2:1bf5]) by VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::450f:3c2f:20f2:1bf5%6]) with mapi id 15.20.3066.023; Tue, 9 Jun 2020 07:59:23 +0000 From: Ye Li To: jagan@amarulasolutions.com Cc: u-boot@lists.denx.de, peng.fan@nxp.com, uboot-imx@nxp.com, ashish.kumar@nxp.com, kuldeep.singh@nxp.com, sr@denx.de, frieder.schrempf@kontron.de Subject: [PATCH 1/2] spi: fsl_qspi: Add support for i.MX7ULP Date: Tue, 9 Jun 2020 00:59:05 -0700 Message-Id: <1591689546-64136-1-git-send-email-ye.li@nxp.com> X-Mailer: git-send-email 2.7.4 X-ClientProxiedBy: SGAP274CA0005.SGPP274.PROD.OUTLOOK.COM (2603:1096:4:b6::17) To VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:69::13) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from ubuntu.localdomain (119.31.174.68) by SGAP274CA0005.SGPP274.PROD.OUTLOOK.COM (2603:1096:4:b6::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.3066.18 via Frontend Transport; Tue, 9 Jun 2020 07:59:20 +0000 X-Mailer: git-send-email 2.7.4 X-Originating-IP: [119.31.174.68] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 160f96f7-424b-409d-4d1e-08d80c4b05e3 X-MS-TrafficTypeDiagnostic: VI1PR04MB5390: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6430; X-Forefront-PRVS: 042957ACD7 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3SYE3oWqdABGw1i3pIRFteqgw/fterEh+3sOjvzzG37PA03YtOZcJoMNLukkiFVW7FlJjSrql0uKWbERnQSDnbIYXxk2B8JHh3HnatN7Y7R2jFhq4taf3e920gKNMCwprmaQjhDOGQBXpuNF3ZZGP6j3zqSBscnF1kUemIOy/pRhXNRj4Xy8LOdSMbIN9ojn+0fDLtYg+WwDsqxiO8VP1uLbEQCFcpQFbUN1YizrSBeY4GMJZZ/4ZucBFPFsuUifPqAl2lT3IGo4Q0jkhtPnmhREb/JZgGFSuEJW/UYzQ8B4wtenfnxnRMu25AixXh9NrH4liA91uBXlB5CZkJqluw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB4414.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(136003)(39860400002)(376002)(396003)(346002)(366004)(66476007)(2616005)(6666004)(956004)(26005)(66946007)(4326008)(2906002)(6506007)(8676002)(6916009)(66556008)(6512007)(316002)(36756003)(478600001)(186003)(52116002)(44832011)(86362001)(6486002)(5660300002)(83380400001)(16526019)(8936002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: QryEpVwMEl05nOrtvp+Nq09Z65vIiDyWodOI0ck7TlkpDzmcy6emBH2RK/9cwr8vMIQrjfN0e6t4OqKO8txEqZNmi80nvJXrDv2U2ok+LmUJ5AA0HJuP6XaIWeM6/LIj3Vs/LjRFph5jnFdxRYpqR6Bk2PEF39HHiRH/V8Z6t6WsZpgFvRVcJuhSajSXihCby5JaGVIaXRWKiP03PWxqe2zuag8wdCuff7dLmqKYDSkqlI+dOJjA9FWywVb79im7RBOhHsNluSafzBOnGLsnwPdDVHGyHS0pmMnBRnuUXGufVXfYHUpFzsZEa0RQMhWVbEa9AEXSG/JbM3ynZuHlmt2nwzDCBB4pmQ1btxCeePOe46etsyZXyqRiisMKOWJL6eXEQ2VvInA0SffKNFr4wmGu0PueGSDNaZz7gPwArHldyo5dIeBQcoGdaMDb4fXlYJGuYIvLVuHRhQQYTy6hDXsyhbLnNXJxSUJsai9b8r4= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 160f96f7-424b-409d-4d1e-08d80c4b05e3 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jun 2020 07:59:23.6826 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ChqkxiSoCKvyEx7CG+iZ7mmyrcvVwxzW+dPxIDi13xvtOPr6xbTTWHovxd0y5vCk X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB5390 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Add compatible string and driver data for i.MX7ULP. Meanwhile, the address set to SFA1AD/SFA2AD/SFB1AD/SFB2AD should align with 1KB, because the lowest 10 bits are reserved by the registers definition. For i.MX7ULP which has only 128Bytes AHB buffer, must align it when setting the registers and selecting cs. Signed-off-by: Ye Li Reviewed-by: Ashish Kumar Reviewed-by: Kuldeep Singh --- drivers/spi/fsl_qspi.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c index e715f98..d9f531a 100644 --- a/drivers/spi/fsl_qspi.c +++ b/drivers/spi/fsl_qspi.c @@ -231,6 +231,15 @@ static const struct fsl_qspi_devtype_data imx6ul_data = { .little_endian = true, }; +static const struct fsl_qspi_devtype_data imx7ulp_data = { + .rxfifo = SZ_64, + .txfifo = SZ_64, + .ahb_buf_size = SZ_128, + .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK | + QUADSPI_QUIRK_USE_TDH_SETTING, + .little_endian = true, +}; + static const struct fsl_qspi_devtype_data ls1021a_data = { .rxfifo = SZ_128, .txfifo = SZ_64, @@ -485,7 +494,7 @@ static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_slave *slave) static void fsl_qspi_read_ahb(struct fsl_qspi *q, const struct spi_mem_op *op) { memcpy_fromio(op->data.buf.in, - q->ahb_addr + q->selected * q->devtype_data->ahb_buf_size, + q->ahb_addr + q->selected * ALIGN(q->devtype_data->ahb_buf_size, 0x400), op->data.nbytes); } @@ -589,7 +598,7 @@ static int fsl_qspi_exec_op(struct spi_slave *slave, addr_offset = q->memmap_phy; qspi_writel(q, - q->selected * q->devtype_data->ahb_buf_size + addr_offset, + q->selected * ALIGN(q->devtype_data->ahb_buf_size, 0x400) + addr_offset, base + QUADSPI_SFAR); qspi_writel(q, qspi_readl(q, base + QUADSPI_MCR) | @@ -695,13 +704,13 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q) * We use ahb_buf_size for each chip and set SFA1AD, SFA2AD, SFB1AD, * SFB2AD accordingly. */ - qspi_writel(q, q->devtype_data->ahb_buf_size + addr_offset, + qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) + addr_offset, base + QUADSPI_SFA1AD); - qspi_writel(q, q->devtype_data->ahb_buf_size * 2 + addr_offset, + qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) * 2 + addr_offset, base + QUADSPI_SFA2AD); - qspi_writel(q, q->devtype_data->ahb_buf_size * 3 + addr_offset, + qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) * 3 + addr_offset, base + QUADSPI_SFB1AD); - qspi_writel(q, q->devtype_data->ahb_buf_size * 4 + addr_offset, + qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) * 4 + addr_offset, base + QUADSPI_SFB2AD); q->selected = -1; @@ -799,6 +808,7 @@ static const struct udevice_id fsl_qspi_ids[] = { { .compatible = "fsl,imx6sx-qspi", .data = (ulong)&imx6sx_data, }, { .compatible = "fsl,imx6ul-qspi", .data = (ulong)&imx6ul_data, }, { .compatible = "fsl,imx7d-qspi", .data = (ulong)&imx7d_data, }, + { .compatible = "fsl,imx7ulp-qspi", .data = (ulong)&imx7ulp_data, }, { .compatible = "fsl,ls1021a-qspi", .data = (ulong)&ls1021a_data, }, { .compatible = "fsl,ls1088a-qspi", .data = (ulong)&ls1088a_data, }, { .compatible = "fsl,ls2080a-qspi", .data = (ulong)&ls2080a_data, }, From patchwork Tue Jun 9 07:59:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 1305664 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256 header.s=selector2 header.b=SfbvKeCO; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49h2bB5Qx5z9sRN for ; Tue, 9 Jun 2020 17:59:50 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7F6E0815E9; Tue, 9 Jun 2020 09:59:35 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="SfbvKeCO"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5F140815E9; Tue, 9 Jun 2020 09:59:34 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER, SPF_HELO_PASS,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20606.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1b::606]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id BE4A28006D for ; Tue, 9 Jun 2020 09:59:29 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ye.li@nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cJwxaTmqdXxkRojqGLNVRSwPkUq2xAhJV/iPg8KG3LUpIquEsgeTRmPxBXJGJKlreVzmY7eJy7fpmBqQD2qq2Ly57gNLE5Y5qv0+AoTavDNY/9EMX40vyzayVhzLKI9L04AjD7dVBkjgnNOqRZ5qKswSJtFWVlPv/giBWJ1YGQ0wrVUOYleyZB/C2UQfV0CoG+MEv7TY08F3Fc+bx2QuFN484HNGSyegjk7HydA8+aoQIuB3ku0pX7YGZZpsz/fjLIGZdmXtXf5bcG4En6cowk1xlJHetKVKX3NGHstsuhECmYloItCU3cx00Dl7QJumfhPKD7mEU6of7fhM0Fg2sA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CMADBVYwGVp2nyUJPk2Jcg0YoqfOO3hT6S8ISpBKFek=; b=UfBBGH/5jk7LPjU5PlKPIGJR5tMyK+jAWliPHsJfBQIYy3+DwLNhyZvffMUJritcM3BpzojMi1d55LZEE6v6BxRlHsoLt7sihuIC9ccnZTVjYDI2STRj4guNFcZlWbolcVUWpLeqimfv2fusA2OoZvkhYjVSUtF86OH5CeiDh+NstJr/PnoCKxH1pVgo+MRbvYWnf4aAZrSBZCocnMv0Zw6tlhLYfKAypheCZQOH3EZ5NJuugCEMg0lhn0EP2NHiVGChbCoGgH0beaUe1kiXBmzquz+V0pBGTMzPx9FeqyfqzRs/POYSLDtgYzpfn996Ezm7hEjSUOc51G2ackM7pw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CMADBVYwGVp2nyUJPk2Jcg0YoqfOO3hT6S8ISpBKFek=; b=SfbvKeCOr7EArZuwjAXiZC0YdkevFP9e4CHQJpWb64KzO8iHzvflL6WLQAJokcBQik2JaUDetX34ffEwt3Zfua4QbdkqEzD7KJXVpPBfDPF1oOvOWytFNQSakd6nghUqWQ1MchWiC+JmyigJW31HVTVwrVhsp6QZQZ4+tzECJUo= Authentication-Results: amarulasolutions.com; dkim=none (message not signed) header.d=none;amarulasolutions.com; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:69::13) by VI1PR04MB5390.eurprd04.prod.outlook.com (2603:10a6:803:d9::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.20; Tue, 9 Jun 2020 07:59:27 +0000 Received: from VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::450f:3c2f:20f2:1bf5]) by VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::450f:3c2f:20f2:1bf5%6]) with mapi id 15.20.3066.023; Tue, 9 Jun 2020 07:59:27 +0000 From: Ye Li To: jagan@amarulasolutions.com Cc: u-boot@lists.denx.de, peng.fan@nxp.com, uboot-imx@nxp.com, ashish.kumar@nxp.com, kuldeep.singh@nxp.com, sr@denx.de, frieder.schrempf@kontron.de Subject: [PATCH 2/2] spi: fsl_qspi: Support to use full AHB space on i.MX Date: Tue, 9 Jun 2020 00:59:06 -0700 Message-Id: <1591689546-64136-2-git-send-email-ye.li@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1591689546-64136-1-git-send-email-ye.li@nxp.com> References: <1591689546-64136-1-git-send-email-ye.li@nxp.com> X-ClientProxiedBy: SGAP274CA0005.SGPP274.PROD.OUTLOOK.COM (2603:1096:4:b6::17) To VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:69::13) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from ubuntu.localdomain (119.31.174.68) by SGAP274CA0005.SGPP274.PROD.OUTLOOK.COM (2603:1096:4:b6::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.3066.18 via Frontend Transport; Tue, 9 Jun 2020 07:59:24 +0000 X-Mailer: git-send-email 2.7.4 X-Originating-IP: [119.31.174.68] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 40456d26-aee6-4efe-281b-08d80c4b0818 X-MS-TrafficTypeDiagnostic: VI1PR04MB5390: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:7691; X-Forefront-PRVS: 042957ACD7 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: GUUb0uRIcRJmv00sBFkOhZmI2bhCaa4BzW3XVp2C+H/w9gkvbgRvf+KcLHBUfmolagAHq1RQO4AHovZpCZbTqP2BuJ82/obmwncXV8viGNqcBhZQ6XKUNwhWDaBSVuH6yIJJDXbeYtbrvn0rxao89Oyk4bw3ZEg6xWpinWPmx7zztSG19FpxTBviWWY0NFGpAkATsq68tDvHtRoMCs+heorUCIdWLqX+xENwwa0lldcpoTJQQZPictSoTR7WOAzW/TMOikqerW65d4m4gc7tL8wC5VRarlO53bGUs5dN//fkJt+RbfqrX2hqsxyAYmARIT9hTIKiFuCxc+WIQh79hA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB4414.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(136003)(39860400002)(376002)(396003)(346002)(366004)(66476007)(2616005)(6666004)(956004)(26005)(66946007)(4326008)(2906002)(6506007)(8676002)(6916009)(66556008)(6512007)(316002)(36756003)(478600001)(186003)(52116002)(44832011)(86362001)(6486002)(5660300002)(83380400001)(16526019)(8936002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: y8rC4md+yhGdptI1PxNn2Bi2UbquSynB9Yk2PMjgb0MmoJhl0eRyQyWQoJYRSh+0dDx4+sPvNcxDEf7Z+BVwtBuwT0vGsEzNxbwmOu/T2tO7xPk6eRa1wrm4v7Sic/9lc6n4HiipXkpjLDgH5AUh5pyQjaxjdDBFIMvoBZma3L+OJutN5f08PzkaEnEpSgQnc78yaJXkQoUovat0tMASFFm7HUQr+iJ6SGX9MqNoS2VMPnFqlHMH8LzzyWogPcgIxTmQgfPsVNT4dSM5W4XncVbKSGC5tTDzzO6aEwtOArTABgcLyNbiKsjUkO4E8OoBtTXm7fg2cDNrYlupCgKbQfpVkd5+Hz0W+pni8GUEBTxwV15NVLBH8I4GAAao/xY7K5chd1EGJUXvpDujKBUHOhVFpiNmUsjINAwlFeq7tZ3zL9qn5ueCEQ15CBDpVgG5g/v55i4qtk9MaFePpZuoOMki1ebm81evGHVIkkjglTo= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 40456d26-aee6-4efe-281b-08d80c4b0818 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jun 2020 07:59:27.3674 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: X1rQBVnmy+Z2lS/UljMzBBmbDqa+ETy86fZhADsY4Jtzm72BBlgLHs4xwhI3dBu6 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB5390 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean i.MX platforms provide large AHB mapped space for QSPI, each controller has 256MB. However, current driver only maps small size (AHB buffer size) of AHB space, this implementation causes i.MX failed to boot M4 with QSPI XIP image. Add config CONFIG_FSL_QSPI_AHB_FULL_MAP (default enabled for i.MX) to address above problem. When the config is set: 1. Full AHB space is divided to each CS. 2. A dedicated LUT entry is used for AHB read only. 3. The MODE instruction in LUT is replaced to standard ADDR instruction 4. The address in spi_mem_op is used to SFAR and AHB read Signed-off-by: Ye Li Reviewed-by: Ashish Kumar Reviewed-by: Kuldeep Singh --- drivers/spi/Kconfig | 8 ++++ drivers/spi/fsl_qspi.c | 114 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 98 insertions(+), 24 deletions(-) diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 5941520..dc8a958 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -149,6 +149,14 @@ config FSL_QSPI used to access the SPI NOR flash on platforms embedding this Freescale IP core. +config FSL_QSPI_AHB_FULL_MAP + bool "Use full AHB memory map space" + depends on FSL_QSPI + default y if ARCH_MX6 || ARCH_MX7 || ARCH_MX7ULP || ARCH_IMX8M + help + Enable the Freescale QSPI driver to use full AHB memory map space for + flash access. + config ICH_SPI bool "Intel ICH SPI driver" help diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c index d9f531a..eec968e 100644 --- a/drivers/spi/fsl_qspi.c +++ b/drivers/spi/fsl_qspi.c @@ -46,6 +46,7 @@ DECLARE_GLOBAL_DATA_PTR; * read operation, so let's use the last entry (15). */ #define SEQID_LUT 15 +#define SEQID_LUT_AHB 14 /* Registers used by the driver */ #define QUADSPI_MCR 0x00 @@ -122,6 +123,10 @@ DECLARE_GLOBAL_DATA_PTR; #define QUADSPI_LUT_REG(idx) \ (QUADSPI_LUT_BASE + QUADSPI_LUT_OFFSET + (idx) * 4) +#define QUADSPI_AHB_LUT_OFFSET (SEQID_LUT_AHB * 4 * 4) +#define QUADSPI_AHB_LUT_REG(idx) \ + (QUADSPI_LUT_BASE + QUADSPI_AHB_LUT_OFFSET + (idx) * 4) + /* Instruction set for the LUT register */ #define LUT_STOP 0 #define LUT_CMD 1 @@ -189,6 +194,11 @@ DECLARE_GLOBAL_DATA_PTR; */ #define QUADSPI_QUIRK_USE_TDH_SETTING BIT(5) +/* + * Controller only has Two CS on flash A, no flash B port + */ +#define QUADSPI_QUIRK_SINGLE_BUS BIT(6) + struct fsl_qspi_devtype_data { unsigned int rxfifo; unsigned int txfifo; @@ -236,7 +246,7 @@ static const struct fsl_qspi_devtype_data imx7ulp_data = { .txfifo = SZ_64, .ahb_buf_size = SZ_128, .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK | - QUADSPI_QUIRK_USE_TDH_SETTING, + QUADSPI_QUIRK_USE_TDH_SETTING | QUADSPI_QUIRK_SINGLE_BUS, .little_endian = true, }; @@ -269,6 +279,7 @@ struct fsl_qspi { void __iomem *iobase; void __iomem *ahb_addr; u32 memmap_phy; + u32 memmap_size; const struct fsl_qspi_devtype_data *devtype_data; int selected; }; @@ -303,6 +314,11 @@ static inline int needs_tdh_setting(struct fsl_qspi *q) return q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING; } +static inline int needs_single_bus(struct fsl_qspi *q) +{ + return q->devtype_data->quirks & QUADSPI_QUIRK_SINGLE_BUS; +} + /* * An IC bug makes it necessary to rearrange the 32-bit data. * Later chips, such as IMX6SLX, have fixed this bug. @@ -405,18 +421,27 @@ static void fsl_qspi_prepare_lut(struct fsl_qspi *q, lutval[0] |= LUT_DEF(0, LUT_CMD, LUT_PAD(op->cmd.buswidth), op->cmd.opcode); - /* - * For some unknown reason, using LUT_ADDR doesn't work in some - * cases (at least with only one byte long addresses), so - * let's use LUT_MODE to write the address bytes one by one - */ - for (i = 0; i < op->addr.nbytes; i++) { - u8 addrbyte = op->addr.val >> (8 * (op->addr.nbytes - i - 1)); - - lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_MODE, - LUT_PAD(op->addr.buswidth), - addrbyte); - lutidx++; + if (IS_ENABLED(CONFIG_FSL_QSPI_AHB_FULL_MAP)) { + if (op->addr.nbytes) { + lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_ADDR, + LUT_PAD(op->addr.buswidth), + (op->addr.nbytes == 4) ? 0x20 : 0x18); + lutidx++; + } + } else { + /* + * For some unknown reason, using LUT_ADDR doesn't work in some + * cases (at least with only one byte long addresses), so + * let's use LUT_MODE to write the address bytes one by one + */ + for (i = 0; i < op->addr.nbytes; i++) { + u8 addrbyte = op->addr.val >> (8 * (op->addr.nbytes - i - 1)); + + lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_MODE, + LUT_PAD(op->addr.buswidth), + addrbyte); + lutidx++; + } } if (op->dummy.nbytes) { @@ -449,6 +474,14 @@ static void fsl_qspi_prepare_lut(struct fsl_qspi *q, for (i = 0; i < ARRAY_SIZE(lutval); i++) qspi_writel(q, lutval[i], base + QUADSPI_LUT_REG(i)); + if (IS_ENABLED(CONFIG_FSL_QSPI_AHB_FULL_MAP)) { + if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_IN && + op->addr.nbytes) { + for (i = 0; i < ARRAY_SIZE(lutval); i++) + qspi_writel(q, lutval[i], base + QUADSPI_AHB_LUT_REG(i)); + } + } + /* lock LUT */ qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY); qspi_writel(q, QUADSPI_LCKER_LOCK, q->iobase + QUADSPI_LCKCR); @@ -491,10 +524,29 @@ static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_slave *slave) fsl_qspi_invalidate(q); } +static u32 fsl_qspi_memsize_per_cs(struct fsl_qspi *q) +{ + if (IS_ENABLED(CONFIG_FSL_QSPI_AHB_FULL_MAP)) { + if (needs_single_bus(q)) + return q->memmap_size / 2; + else + return q->memmap_size / 4; + } else { + return ALIGN(q->devtype_data->ahb_buf_size, 0x400); + } +} + static void fsl_qspi_read_ahb(struct fsl_qspi *q, const struct spi_mem_op *op) { + void __iomem *ahb_read_addr = q->ahb_addr; + + if (IS_ENABLED(CONFIG_FSL_QSPI_AHB_FULL_MAP)) { + if (op->addr.nbytes) + ahb_read_addr += op->addr.val; + } + memcpy_fromio(op->data.buf.in, - q->ahb_addr + q->selected * ALIGN(q->devtype_data->ahb_buf_size, 0x400), + ahb_read_addr + q->selected * fsl_qspi_memsize_per_cs(q), op->data.nbytes); } @@ -597,8 +649,13 @@ static int fsl_qspi_exec_op(struct spi_slave *slave, if (needs_amba_base_offset(q)) addr_offset = q->memmap_phy; + if (IS_ENABLED(CONFIG_FSL_QSPI_AHB_FULL_MAP)) { + if (op->addr.nbytes) + addr_offset += op->addr.val; + } + qspi_writel(q, - q->selected * ALIGN(q->devtype_data->ahb_buf_size, 0x400) + addr_offset, + q->selected * fsl_qspi_memsize_per_cs(q) + addr_offset, base + QUADSPI_SFAR); qspi_writel(q, qspi_readl(q, base + QUADSPI_MCR) | @@ -655,7 +712,7 @@ static int fsl_qspi_adjust_op_size(struct spi_slave *slave, static int fsl_qspi_default_setup(struct fsl_qspi *q) { void __iomem *base = q->iobase; - u32 reg, addr_offset = 0; + u32 reg, addr_offset = 0, memsize_cs; /* Reset the module */ qspi_writel(q, QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK, @@ -687,8 +744,13 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q) qspi_writel(q, 0, base + QUADSPI_BUF1IND); qspi_writel(q, 0, base + QUADSPI_BUF2IND); - qspi_writel(q, QUADSPI_BFGENCR_SEQID(SEQID_LUT), - q->iobase + QUADSPI_BFGENCR); + if (IS_ENABLED(CONFIG_FSL_QSPI_AHB_FULL_MAP)) + qspi_writel(q, QUADSPI_BFGENCR_SEQID(SEQID_LUT_AHB), + q->iobase + QUADSPI_BFGENCR); + else + qspi_writel(q, QUADSPI_BFGENCR_SEQID(SEQID_LUT), + q->iobase + QUADSPI_BFGENCR); + qspi_writel(q, QUADSPI_RBCT_WMRK_MASK, base + QUADSPI_RBCT); qspi_writel(q, QUADSPI_BUF3CR_ALLMST_MASK | QUADSPI_BUF3CR_ADATSZ(q->devtype_data->ahb_buf_size / 8), @@ -704,14 +766,17 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q) * We use ahb_buf_size for each chip and set SFA1AD, SFA2AD, SFB1AD, * SFB2AD accordingly. */ - qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) + addr_offset, + memsize_cs = fsl_qspi_memsize_per_cs(q); + qspi_writel(q, memsize_cs + addr_offset, base + QUADSPI_SFA1AD); - qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) * 2 + addr_offset, + qspi_writel(q, memsize_cs * 2 + addr_offset, base + QUADSPI_SFA2AD); - qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) * 3 + addr_offset, - base + QUADSPI_SFB1AD); - qspi_writel(q, ALIGN(q->devtype_data->ahb_buf_size, 0x400) * 4 + addr_offset, - base + QUADSPI_SFB2AD); + if (!needs_single_bus(q)) { + qspi_writel(q, memsize_cs * 3 + addr_offset, + base + QUADSPI_SFB1AD); + qspi_writel(q, memsize_cs * 4 + addr_offset, + base + QUADSPI_SFB2AD); + } q->selected = -1; @@ -759,6 +824,7 @@ static int fsl_qspi_probe(struct udevice *bus) q->ahb_addr = map_physmem(res.start, res.end - res.start, MAP_NOCACHE); q->memmap_phy = res.start; + q->memmap_size = res.end - res.start; dm_bus->max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", 66000000);