From patchwork Mon Jan 7 05:22:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 1021174 X-Patchwork-Delegate: jagannadh.teki@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="H5TbppTz"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43Y3gX4QBZz9sCs for ; Mon, 7 Jan 2019 16:22:48 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 3702DC21D8A; Mon, 7 Jan 2019 05:22:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 808E6C21C6A; Mon, 7 Jan 2019 05:22:40 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id D2EA2C21C6A; Mon, 7 Jan 2019 05:22:38 +0000 (UTC) Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20046.outbound.protection.outlook.com [40.107.2.46]) by lists.denx.de (Postfix) with ESMTPS id 4C6C5C21C3F for ; Mon, 7 Jan 2019 05:22:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Yof0viSH04gJ3MlqppQhqU3SH8nU2cXL+LFKYFLZW5c=; b=H5TbppTzLSwEFi7DYRdzv10ifd5rOPTGAmguxcTlOySRRe/c16HSXD5LZso/3jUk/9n7eqgGvlWvGILtMPQfX+RlUjRu1UlS2r4cStv1ja1SML7K2m5BH7VK2McPsiqGz1z1BNLzpneiNCd3T53ysGQhArZ+0r6qI1KDz1sO+EE= Received: from VI1PR04MB4414.eurprd04.prod.outlook.com (20.177.55.153) by VI1PR04MB4464.eurprd04.prod.outlook.com (20.177.53.211) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.9; Mon, 7 Jan 2019 05:22:36 +0000 Received: from VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::f1e0:df54:f9c:b4b9]) by VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::f1e0:df54:f9c:b4b9%3]) with mapi id 15.20.1495.011; Mon, 7 Jan 2019 05:22:36 +0000 From: Ye Li To: "jagan@amarulasolutions.com" , "u-boot@lists.denx.de" Thread-Topic: [PATCH] mtd: spi: Add 4bytes extend address support Thread-Index: AQHUpkkAVHgulft/Z0GpUxo5MhL+sg== Date: Mon, 7 Jan 2019 05:22:36 +0000 Message-ID: <1546838540-19675-1-git-send-email-ye.li@nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.7.4 x-clientproxiedby: HK0PR01CA0071.apcprd01.prod.exchangelabs.com (2603:1096:203:a6::35) To VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:6e::25) authentication-results: spf=none (sender IP is ) smtp.mailfrom=ye.li@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [119.31.174.68] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR04MB4464; 6:33bJHwnn1aImT5mmLHCSjKRoCzbM49sADSCRRKzXGw9FF7eyy+X0phDzN9DWodUEC8vwjjKRtuRh9jVmTZBMPr7DAvjQs+gH2++qBlz0pkm5HmsxuaBCEA8ooM/P7nJApRiW+3pqS2hrAQCgekvfSq6MP7MKJqjrclcfo3rsQNInWAktVSFLipnhXq60kwgklvUx/taAlT/N+nXMkDj8SOUTxfbS/m88f38XeSoesWtxEn+iokSGy6ks6yvNK+IZZbJK9ejM0fHAGwrtkCsvcSFTkzak+siBZVsDVaLgVr58es3SXGdUdGcW2pC/+ZqjgAlRRIp8TwIHYoMV72SmBjdW0buhhmUDVcAjpXvCnx6cZh4lV2ijVZaqpv56ultPHhmtJb/jVSw73bOGPgHLSF40X9J5ufW1VxWOToMspEmsNpZ8zDzVDRILs3XbGFx44Md8QgQr6FQNraQSaoGhKg==; 5:9Iwx5R/acOKQeNYBqvWEwH3dctmsqLH+ev6hj5kcbU5fH+mPYf3Vmk4Mdp/ZIfM2HpHj5XiyjxMJdIRElhKJa1zYXYqrrM9NYftHFCn6PObRxZYHE3k7GS9OXXnSm95/UGiQ9Mh2Tztls6DLuTXfznrivq/ZYvJSeQ9imyPS/yR9OVo0seJ5eldWaeOQGGvg9FjhEp7UjCBMJp9mD49L3A==; 7:6BHYzMZx9Io2UvVWwANXhjOy4tfdWUHDnBdhaMVaHterItQc3YR1I0UQ9wxmcDQbqXGWGN3TBlvujd0ZzXUGN7otMEKDgXyqlIhbz4he2q2uQc6qv2qE3m8BzJ30iOIeZ2shDCDkae/rg2BXJ1KSHg== x-ms-office365-filtering-correlation-id: f204943d-9cdf-46e8-27c4-08d67460225f x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600109)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR04MB4464; x-ms-traffictypediagnostic: VI1PR04MB4464: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6055026)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123558120)(20161123560045)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:VI1PR04MB4464; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB4464; x-forefront-prvs: 0910AAF391 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(136003)(39860400002)(396003)(376002)(346002)(199004)(189003)(52116002)(8936002)(6116002)(54906003)(14444005)(110136005)(186003)(3846002)(4326008)(256004)(44832011)(478600001)(81156014)(50226002)(6506007)(6436002)(5660300001)(106356001)(386003)(316002)(2906002)(6486002)(36756003)(486006)(105586002)(25786009)(81166006)(26005)(102836004)(71190400001)(6512007)(97736004)(68736007)(99286004)(2616005)(476003)(2501003)(305945005)(7736002)(66066001)(575784001)(86362001)(53936002)(14454004)(8676002)(71200400001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB4464; H:VI1PR04MB4414.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: hRVZOxvfrSLBe3A+PbSRGBl0518K+5o6nUlQQBnD2ynfCv42CESeJsiFQxA/RuHjaSWgoPx5HJyOch+eZZ5S3+w2ZMeGLfi2gM5HgBhYCdHie1N/VXKj+75D/qnoBUGUZ6FIEHMa8TlRLCazyVjjgetBQ56Da3Gk4xXPgP2zfj/x6lOdhnP5ynnVUU3GoHkab7bFt/cvJoUVLxvGdCiq3yDcn+o/PgQbFC/p2zYOAtnOBQgbM9fB3Rm+hEd9d5PZjUgJt4HCMMQL9geAaaqpKN8DGlg8inFiYNXlEfKqF3T0CJdasAyZJuimaReTsHK4 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: f204943d-9cdf-46e8-27c4-08d67460225f X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Jan 2019 05:22:33.8566 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB4464 Cc: Fabio Estevam , dl-uboot-imx Subject: [U-Boot] [PATCH] mtd: spi: Add 4bytes extend address support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 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" Current SPI flash framework only supports to set bank register (CONFIG_SPI_FLASH_BAR) for flash with size > 16MiB. But some new flash device (for example, mt35xu512g) does not support this way, it only supports 4bytes extend address. To access the whole memory size for such flash device, we add the support for this 4bytes extend address mode to SPI flash framework. The configuration CONFIG_SPI_FLASH_4BYTES_ADDR is used to enable the feature. Signed-off-by: Ye Li --- drivers/mtd/spi/Kconfig | 7 ++++ drivers/mtd/spi/sf_internal.h | 8 +++++ drivers/mtd/spi/spi_flash.c | 75 ++++++++++++++++++++++++++++++++++++++----- 3 files changed, 82 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/spi/Kconfig b/drivers/mtd/spi/Kconfig index 76d5a1d..ffc80dd 100644 --- a/drivers/mtd/spi/Kconfig +++ b/drivers/mtd/spi/Kconfig @@ -42,6 +42,13 @@ config SPI_FLASH_BAR Bank/Extended address registers are used to access the flash which has size > 16MiB in 3-byte addressing. +config SPI_FLASH_4BYTES_ADDR + bool "SPI flash 4bytes (32) address mode support" + depends on SPI_FLASH && !SPI_FLASH_BAR + help + Enable the SPI flash 4bytes extend address mode support to access the flash + which has size > 16MiB. + config SF_DUAL_FLASH bool "SPI DUAL flash memory support" depends on SPI_FLASH diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h index 46a5044..50d0863 100644 --- a/drivers/mtd/spi/sf_internal.h +++ b/drivers/mtd/spi/sf_internal.h @@ -63,6 +63,14 @@ enum spi_nor_option_flags { #define CMD_READ_CONFIG 0x35 #define CMD_FLAG_STATUS 0x70 +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR +#define CMD_READ_ARRAY_FAST_4B 0x0c +#define CMD_PAGE_PROGRAM_4B 0x12 +#define CMD_ERASE_64K_4B 0xdc +#define CMD_ERASE_4K_4B 0x21 +#define CMD_EN4B 0xB7 +#endif + /* Bank addr access commands */ #ifdef CONFIG_SPI_FLASH_BAR # define CMD_BANKADDR_BRWR 0x17 diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c index 0c2392f..312bedb 100644 --- a/drivers/mtd/spi/spi_flash.c +++ b/drivers/mtd/spi/spi_flash.c @@ -28,6 +28,17 @@ static void spi_flash_addr(u32 addr, u8 *cmd) cmd[3] = addr >> 0; } +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR +static void spi_flash_addr_4b(u32 addr, u8 *cmd) +{ + /* cmd[0] is actual command */ + cmd[1] = addr >> 24; + cmd[2] = addr >> 16; + cmd[3] = addr >> 8; + cmd[4] = addr >> 0; +} +#endif + static int read_sr(struct spi_flash *flash, u8 *rs) { int ret; @@ -325,8 +336,8 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd, int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len) { - u32 erase_size, erase_addr; - u8 cmd[SPI_FLASH_CMD_LEN]; + u32 erase_size, erase_addr, cmd_len; + u8 cmd[SPI_FLASH_CMD_LEN + 1]; int ret = -1; erase_size = flash->erase_size; @@ -357,11 +368,19 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len) return ret; #endif spi_flash_addr(erase_addr, cmd); + cmd_len = SPI_FLASH_CMD_LEN; + +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR + if (flash->size > SPI_FLASH_16MB_BOUN) { + spi_flash_addr_4b(erase_addr, cmd); + cmd_len = SPI_FLASH_CMD_LEN + 1; + } +#endif debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1], cmd[2], cmd[3], erase_addr); - ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0); + ret = spi_flash_write_common(flash, cmd, cmd_len, NULL, 0); if (ret < 0) { debug("SF: erase failed\n"); break; @@ -384,8 +403,8 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset, struct spi_slave *spi = flash->spi; unsigned long byte_addr, page_size; u32 write_addr; - size_t chunk_len, actual; - u8 cmd[SPI_FLASH_CMD_LEN]; + size_t chunk_len, actual, cmd_len; + u8 cmd[SPI_FLASH_CMD_LEN + 1]; int ret = -1; page_size = flash->page_size; @@ -419,11 +438,19 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset, spi->max_write_size - sizeof(cmd)); spi_flash_addr(write_addr, cmd); + cmd_len = SPI_FLASH_CMD_LEN; + +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR + if (flash->size > SPI_FLASH_16MB_BOUN) { + spi_flash_addr_4b(write_addr, cmd); + cmd_len = SPI_FLASH_CMD_LEN + 1; + } +#endif debug("SF: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n", buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len); - ret = spi_flash_write_common(flash, cmd, sizeof(cmd), + ret = spi_flash_write_common(flash, cmd, cmd_len, buf + actual, chunk_len); if (ret < 0) { debug("SF: write failed\n"); @@ -500,6 +527,10 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, } cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte; +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR + if (flash->size > SPI_FLASH_16MB_BOUN) + cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte + 1; +#endif u8 cmd[cmdsz]; cmd[0] = flash->read_cmd; @@ -528,6 +559,12 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, spi_flash_addr(read_addr, cmd); +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR + if (flash->size > SPI_FLASH_16MB_BOUN) { + spi_flash_addr_4b(read_addr, cmd); + read_len = len; /* Not care remain len for current bank */ + } +#endif ret = spi_flash_read_common(flash, cmd, cmdsz, data, read_len); if (ret < 0) { debug("SF: read failed\n"); @@ -1114,6 +1151,13 @@ static int set_quad_mode(struct spi_flash *flash, } } +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR +static int enter_4bytes_addr(struct spi_flash *flash) +{ + return spi_flash_cmd(flash->spi, CMD_EN4B, NULL, 0); +} +#endif + #if CONFIG_IS_ENABLED(OF_CONTROL) int spi_flash_decode_fdt(struct spi_flash *flash) { @@ -1262,6 +1306,21 @@ int spi_flash_scan(struct spi_flash *flash) /* Go for default supported write cmd */ flash->write_cmd = CMD_PAGE_PROGRAM; +#ifdef CONFIG_SPI_FLASH_4BYTES_ADDR + if (flash->size > SPI_FLASH_16MB_BOUN) { + flash->read_cmd = CMD_READ_ARRAY_FAST_4B; + flash->write_cmd = CMD_PAGE_PROGRAM_4B; + + if (flash->erase_cmd == CMD_ERASE_4K) + flash->erase_cmd = CMD_ERASE_4K_4B; + else + flash->erase_cmd = CMD_ERASE_64K_4B; + + enter_4bytes_addr(flash); + } +#endif + + /* Set the quad enable bit - only for quad commands */ if ((flash->read_cmd == CMD_READ_QUAD_OUTPUT_FAST) || (flash->read_cmd == CMD_READ_QUAD_IO_FAST) || @@ -1323,13 +1382,13 @@ int spi_flash_scan(struct spi_flash *flash) puts("\n"); #endif -#ifndef CONFIG_SPI_FLASH_BAR +#if !defined(CONFIG_SPI_FLASH_BAR) && !defined(CONFIG_SPI_FLASH_4BYTES_ADDR) if (((flash->dual_flash == SF_SINGLE_FLASH) && (flash->size > SPI_FLASH_16MB_BOUN)) || ((flash->dual_flash > SF_SINGLE_FLASH) && (flash->size > SPI_FLASH_16MB_BOUN << 1))) { puts("SF: Warning - Only lower 16MiB accessible,"); - puts(" Full access #define CONFIG_SPI_FLASH_BAR\n"); + puts(" Full access #define CONFIG_SPI_FLASH_BAR or #define CONFIG_SPI_FLASH_4BYTES_ADDR\n"); } #endif