From patchwork Wed May 5 09:41:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pratyush Yadav X-Patchwork-Id: 1474220 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; dkim=pass (1024-bit key; unprotected) header.d=ti.com header.i=@ti.com header.a=rsa-sha256 header.s=ti-com-17Q1 header.b=fmXx0gsU; 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) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FZsFH5ZSqz9sVb for ; Wed, 5 May 2021 19:42:27 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CE4C382CC0; Wed, 5 May 2021 11:42:06 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=ti.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=ti.com header.i=@ti.com header.b="fmXx0gsU"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 48FFC82CBF; Wed, 5 May 2021 11:42:04 +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=-2.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from fllv0016.ext.ti.com (fllv0016.ext.ti.com [198.47.19.142]) (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 8D2F280F0A for ; Wed, 5 May 2021 11:41:57 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=p.yadav@ti.com Received: from lelv0265.itg.ti.com ([10.180.67.224]) by fllv0016.ext.ti.com (8.15.2/8.15.2) with ESMTP id 1459fgjG129102; Wed, 5 May 2021 04:41:42 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1620207702; bh=sc3Tlq5RI3xwt3luaIHwQDo9Dm4JttzfVikT8DZWiX8=; h=From:To:CC:Subject:Date; b=fmXx0gsUAVesTsvezXCPIRIG9S4Mi9emBsViSCCAmBIMAFFmxgYnssi/qQWm85aoD pTwsUV0shl+EohbVlTJ+sgSBaQ8jh82H/MRZQIc/iqIpGnBKaBt/QsBTkd9eM4pKbh vubIYeNDgMMkZGSqoNC2DLBF5Zava9znXuBqEanE= Received: from DFLE113.ent.ti.com (dfle113.ent.ti.com [10.64.6.34]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 1459fgkG029871 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 5 May 2021 04:41:42 -0500 Received: from DFLE101.ent.ti.com (10.64.6.22) by DFLE113.ent.ti.com (10.64.6.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Wed, 5 May 2021 04:41:42 -0500 Received: from lelv0326.itg.ti.com (10.180.67.84) by DFLE101.ent.ti.com (10.64.6.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2 via Frontend Transport; Wed, 5 May 2021 04:41:42 -0500 Received: from pratyush-OptiPlex-790.dhcp.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by lelv0326.itg.ti.com (8.15.2/8.15.2) with ESMTP id 1459fcKj053048; Wed, 5 May 2021 04:41:39 -0500 From: Pratyush Yadav To: Chris Packham , Jagan Teki , Vignesh R , Ryder Lee , Weijie Gao , Chunfeng Yun , GSS_MTK_Uboot_upstream , CC: Pratyush Yadav , Takahiro Kuwano , Sean Anderson Subject: [PATCH v9 00/28] mtd: spi-nor-core: add xSPI Octal DTR support Date: Wed, 5 May 2021 15:11:10 +0530 Message-ID: <20210505094138.30805-1-p.yadav@ti.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.4 at phobos.denx.de X-Virus-Status: Clean Hi, This series adds support for octal DTR flashes in the SPI NOR framework, and then adds hooks for the Cypress S28HS512T and Micron MT35XU512ABA flashes. The Cadence QSPI controller driver is also updated to run in Octal DTR mode. Tested on TI J721E for MT35XU512ABA and J7200 for S28HS512T. Also tested on MT25QU512A for regressions. Changes in v9: - Fix a typo in patch 26 commit message. - Add Sean's Reviewed-by in patch 3. - Drop the 2-byte check from spi_mem_dtr_supports_op(). Instead, perform a even-byte length check on all 4 phases. Only do this when the buswidth of the phase is 8. - Make template ops in spi_nor_check_readop() and spi_nor_check_pp() have 2-byte data phase so they don't get rejected when 8D-8D-8D protocol is being used. Changes in v8: - Rebase on latest master, fixing merge conflicts. - Fix a regression related to address width that was discovered on Linux. - Port spi_mem_dtr_supports_op() from Linux and use it in Cadence qspi driver. - Do not set non-volatile Uniform Sector mode bit on S28HS512T. Instead use Takahiro's non-uniform erase patch to enable non-uniform erases. - Make sure spi_nor_write_reg() does not set data direction to out when there is no data to write, like in write enable. - Set buswidths to 0 before calling spi_nor_setup_op(), like how it is done in Linux. Changes in v7: - Port back changes requested on the Linux series. - Introduce the flag SPI_NOR_OCTAL_DTR_PP to indicate 8D page program support since it can't be detected from SFDP. - Re-order Profile 1.0 related defines by DWORD order. - Drop local variables addr_width and dummy in spi_nor_read_sr() spi_nor_read_fsr(). - Do not make having command opcode extension as a reserved field fatal. - Update doc comment for spi_nor_parse_profile1() and spi_nor_cypress_octal_dtr_enable() to add missing fields. - Move rdsr parameter parsing to where opcode is parsed because it is from the same DWORD. - Convert a comment in Profile 1.0 parsing from multi-line to one line. - Rename 'table' to 'dwords' in xSPI Profile 1.0 parsing. - Update spi_nor_check_readop() and spi_nor_check_pp() to use spi_nor_setup_op() so the buswidths are properly set up for DTR ops. - Do not set Uniform Sector bit on the Cypress S28HS512T flash if it is already set. It will avoid wearing out the non-volatile bit. - Enable DQS for Micron MT35XU512ABA. No reason not to. - Avoid enabling 4-byte addressing mode for all DTR ops instead of just Octal DTR ops. This is based on the assumption that DTR ops can only use 4-byte addressing. - Make spi_nor_set_fixups() static. - Add flag SPI_NOR_OCTAL_DTR_PP to both Cypress S28HS512T and Micron MT35XU512ABA. - Use values set up by spi-{rx,tx}-bus-width via device tree to determine if the controller supports the op or not. Gives more flexibility to choose protocol per-board. - Use tiny SPI NOR on x530 because of size constraints. Changes in v6: - Use "# CONFIG_SPI_FLASH_SMART_HWCAPS is not set" instead of "CONFIG_SPI_FLASH_SMART_HWCAPS=n" in x530_defconfig. Changes in v5: - Fix build breaking when CONFIG_SPL_SPI_FLASH_TINY is enabled because spi-nor-tiny did not have spi_nor_remove(). - The build was breaking in x530 because of SPL size too big. Fix it by the below changes. - Re-introduce old hwcaps selection logic and put the new one behind a config. This lets boards with size restrictions use the old logic which takes up less space. The code was getting hard to manage with the old code behind ifdefs. So, re-structure the old hwcaps selection logic and move it into one function: spi_nor_adjust_hwcaps(). This way, the common code just calls spi_nor_adjust_hwcaps(), but the old or new hwcaps selection is used based on the config option selected. - Put spi_nor_soft_reset() behind the config option SPI_NOR_SOFT_RESET. - Rename the config option used for soft resetting on boot to SPI_NOR_SOFT_RESET_ON_BOOT to make its intention clearer. - Put the fixup hooks of MT35XU512ABA and S28HS512T flashes behind config options to reduce code size on platforms that don't need them. - Introduce spi_nor_set_fixups(). Earlier, the fixup members of each flash was specified in spi-nor-ids.c. This meant they had to be declared as extern in sf_internal.h. But since spi-nor-tiny.c also uses it, and it doesn't have those fixups, they had to be put behind in an ifdef. The ".fixups = " assignment in spi-nor-ids.c also had to be put in an ifdef to account for spi-nor-tiny.c not having the fixup hooks. On top of this, the fixup of each flash is behind the flash's config. All this lead to a soup of ifdefs that wasn't easy to digest. So don't set the fixups in the common code. Instead, add a function in spi-nor-core.c that sets the fixups of each flash. This isn't ideal, but its the best compromise I could figure out. - Build were breaking with boards that use spi-mem-nodm.c because it doesn't have spi_mem_supports_op() which is needed for smart hwcaps selection. Add an equivalent to spi_mem_default_supports_op() there. - Replace uses of sizeof(op->cmd.opcode) with op->cmd.nbytes. - Do not set quad_enable to NULL if the value is set to reserved. Instead just print a warning and go on. quad_enable should be set to NULL in fixup hooks instead. Suggested on the Linux list. - Set dummy cycles for DTR mode in spi_nor_micron_octal_dtr_enable() instead of in the post sfdp hook. This keeps the flash functional in case Octal DTR mode is not selected. - Only use nor->rdsr_addr_nbytes and nor->rdsr_dummy when in Octal DTR mode. This makes sure the flash is functional in case Octal DTR is not selected. - Rebase on latest master and fix a small merge conflict. Changes in v4: - Fix BFPT parsing stopping too early for JESD216 rev B flashes. - Instead of just checking for spi_nor_get_protocol_width() in spi_nor_octal_dtr_enable(), make sure the protocol is SNOR_PROTO_8_8_8_DTR since get_protocol_width() only cares about data width. - Do not enable stateful X-X-X modes if the reset line is broken. - Instead of setting SNOR_READ_HWCAPS_8_8_8_DTR from Profile 1.0 table parsing, do it in spi_nor_info_init_params() instead based on the SPI_NOR_OCTAL_DTR_READ flag instead. - Set SNOR_HWCAPS_PP_8_8_8_DTR in s28hs post_sfdp hook since this capability is no longer set in Profile 1.0 parsing. - Rename spi_nor_cypress_octal_enable() to spi_nor_cypress_octal_dtr_enable(). - Instead of hard-coding 8D-8D-8D Fast Read dummy cycles to 20, find them out from the Profile 1.0 table. - Call post-bfpt fixup when exiting early because of JESD rev A. - Do not make an invalid Quad Enable BFPT field a fatal error. Silently ignore it by assuming no quad enable bit is present. - Set cmd.nbytes to 1 when using SPI_MEM_OP_CMD(). - Reject ops with more than 1 command byte in spi_mem_default_supports_op(). - Drop flag SPI_NOR_SOFT_RESET. Instead, discover soft reset capability via BFPT. - Add missing headers that were removed from common header. Changes in v3: - Read 2 bytes in Octal DTR mode when reading SR and FSR to avoid tripping up controllers. - Use op->data.nbytes as a measure of whether the data phase exists or not. This fixes data buswidth not being updadted for SR and FSR reads because they keep data buffer as NULL when calling spi_nor_setup_op(). - Add support for Micron mt35xu512aba to run in Octal DTR mode. Pratyush Yadav (27): spi: spi-mem: allow specifying whether an op is DTR or not spi: spi-mem: allow specifying a command's extension spi: spi-mem: export spi_mem_default_supports_op() spi: spi-mem: add spi_mem_dtr_supports_op() spi: cadence-qspi: Do not calibrate when device tree sets read delay spi: cadence-qspi: Add a small delay before indirect writes spi: cadence-qspi: Add support for octal DTR flashes arm: mvebu: x530: Use tiny SPI NOR mtd: spi-nor-core: Fix address width on flash chips > 16MB mtd: spi-nor-core: Add a ->setup() hook mtd: spi-nor-core: Move SFDP related declarations to top mtd: spi-nor-core: Introduce flash-specific fixup hooks mtd: spi-nor-core: Rework hwcaps selection mtd: spi-nor-core: Do not set data direction when there is no data mtd: spi-nor-core: Add support for DTR protocol mtd: spi-nor-core: prepare BFPT parsing for JESD216 rev D mtd: spi-nor-core: Get command opcode extension type from BFPT mtd: spi-nor-core: Parse xSPI Profile 1.0 table mtd: spi-nor-core: Prepare Read SR and FSR for Octal DTR mode mtd: spi-nor-core: Enable octal DTR mode when possible mtd: spi-nor-core: Do not make invalid quad enable fatal mtd: spi-nor-core: Detect Soft Reset sequence support from BFPT mtd: spi-nor-core: Perform a Soft Reset on shutdown mtd: spi-nor-core: Perform a Soft Reset on boot mtd: spi-nor-core: allow truncated erases mtd: spi-nor-core: Add support for Cypress Semper flash mtd: spi-nor-core: Allow using Micron mt35xu512aba in Octal DTR mode Takahiro Kuwano (1): mtd: spi-nor-core: Add non-uniform erase for Spansion/Cypress configs/x530_defconfig | 1 - drivers/mtd/spi/Kconfig | 42 + drivers/mtd/spi/sf_internal.h | 1 + drivers/mtd/spi/sf_probe.c | 8 + drivers/mtd/spi/spi-nor-core.c | 1447 ++++++++++++++++++++++++++------ drivers/mtd/spi/spi-nor-ids.c | 7 +- drivers/mtd/spi/spi-nor-tiny.c | 22 - drivers/spi/cadence_qspi.c | 69 +- drivers/spi/cadence_qspi.h | 16 +- drivers/spi/cadence_qspi_apb.c | 292 ++++++- drivers/spi/mtk_snfi_spi.c | 3 +- drivers/spi/spi-mem-nodm.c | 66 +- drivers/spi/spi-mem.c | 46 +- include/linux/mtd/spi-nor.h | 279 ++++-- include/spi-mem.h | 19 +- 15 files changed, 1923 insertions(+), 395 deletions(-) --- 2.30.0