Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3219610imu; Sat, 24 Nov 2018 00:23:45 -0800 (PST) X-Google-Smtp-Source: AFSGD/WLLAux0cfCLj5oalsOXq/4zLpTvY44z++pg9AIRGxVxf/OcAxKkL6ohSmZsGAWLvsVMEWs X-Received: by 2002:a63:ba48:: with SMTP id l8mr16835141pgu.72.1543047825952; Sat, 24 Nov 2018 00:23:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543047825; cv=none; d=google.com; s=arc-20160816; b=qfneoAjWeVLeOFX/2p7qLCscO49Rm0xOMNcSSNZxou05v1zJjS4Ss+/n+igine76GW zgDRTzWAdApyInCXReuyACZQkGQqpw7xOXX7s5HdbI1BVFXLjvecGhYe3EvU5anMcXxb x6iVkmI1GTbsLNLyILFHiQl7z5hNldk6p+4Zuwp4xRjm/0pVk87KDBiIPvIJI/s8tvNk tJwO+XimcbMT9J9AaxFsOMz/ZyMCYaQBKKef+O/6BY0MDrkrMT8g677GgBgAlCSRwG6b FOvg4Lgstmwe6cQgHs13lvPPKg8PBsRUnUUneU/GIw67w1BgmkCtHQ3XbiQsUQSEcrlU BDfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date; bh=9+f9V8JEGIsJQht65mPTWG6iHoDmLmVO8gOqmqKSiSw=; b=vjGd4riPXZ+IsleAf7Bz6HnJRwFSW8IA9OPFJGxGFVsUDyLA+nyWV3NAflBlxTTEVz KF1Hyi6nR/8KJrbh0N4n6y+KRb3D4cfQTTyNetTFOro6U0j9wmzNNHh/lp0NL4DaPRxt 4nDSi8oeDRqBWLM4m3zBKSKuK362qoJH5go6iqFuHB8EzXMXWCx8urNWyMWGNqvrlId6 GvhEtMhl5atqXVdoDVPISDCkbJkI3AJqNKTL7TMoN5egG0m303O8GNf5mBDKrwVPS1XF hJ2AnUoefw+ghe9YjolpIEly1g1lpq8Srq7RtD4OWt0UX0uYbnV+8Mj+KcBIgOm/bo4p ysYQ== 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 y6si18480593plr.186.2018.11.24.00.23.31; Sat, 24 Nov 2018 00:23:45 -0800 (PST) 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 S2503244AbeKWVB7 (ORCPT + 99 others); Fri, 23 Nov 2018 16:01:59 -0500 Received: from mail.bootlin.com ([62.4.15.54]:55124 "EHLO mail.bootlin.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388074AbeKWVB7 (ORCPT ); Fri, 23 Nov 2018 16:01:59 -0500 Received: by mail.bootlin.com (Postfix, from userid 110) id DE26420D92; Fri, 23 Nov 2018 11:18:18 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.bootlin.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT, URIBL_BLOCKED shortcircuit=ham autolearn=disabled version=3.4.2 Received: from bbrezillon (91-160-177-164.subs.proxad.net [91.160.177.164]) by mail.bootlin.com (Postfix) with ESMTPSA id 7737820EB0; Fri, 23 Nov 2018 11:17:34 +0100 (CET) Date: Fri, 23 Nov 2018 11:17:29 +0100 From: Boris Brezillon To: "Sverdlin, Alexander (Nokia - DE/Ulm)" Cc: "Tudor.Ambarus@microchip.com" , "marek.vasut@gmail.com" , "dwmw2@infradead.org" , "computersforpeace@gmail.com" , "richard@nod.at" , "linux-mtd@lists.infradead.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH] mtd: spi-nor: fix erase_type array to indicate current map conf Message-ID: <20181123111729.1d5b6e57@bbrezillon> In-Reply-To: <3d8a2b83-282d-7cb2-3c8b-addae3c2af7f@nokia.com> References: <20181122123552.15756-1-tudor.ambarus@microchip.com> <3d8a2b83-282d-7cb2-3c8b-addae3c2af7f@nokia.com> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 23 Nov 2018 09:42:55 +0000 "Sverdlin, Alexander (Nokia - DE/Ulm)" wrote: > Hello Tudor, > > On 22/11/2018 13:36, Tudor.Ambarus@microchip.com wrote: > > From: Tudor Ambarus > > > > Bug reported for the out-of-tree S25FS128S flash memory. > > > > BFPT table advertises all the erase types supported by all the > > possible map configurations. Update the erase_type array to indicate > > which erase types are applicable to the current map configuration. > > > > Backward compatibility test done on sst26vf064b. > > > > Fixes: b038e8e3be72 ("mtd: spi-nor: parse SFDP Sector Map Parameter Table") > > Reported-by: Alexander Sverdlin > > Signed-off-by: Tudor Ambarus > > I've tested this patch and it fixes the erasesize for S25FS128S and > our 128k partitions are writeable again with this patch. > > Nevertheless, I think this is coincidence. I don't think that it > makes sense to OR all the erase types from all regions in one > bitmask and derive any uniform erasesize out of it. > This makes little sense for me in case of non-uniform maps. > > I believe, the culprit here is one level higher, in the MTD partitioning > code (mtdpart.c) which has to be taught about non-uniform maps > but there is no infrastructure for this currently. Keep in mind that mtdpart is only one part of the issue. As I said previously, some MTD users (UBI) expect a single eraseblock size, so it's not only mtdpart that you'd need to fix, but basically all MTD users that don't check ->eraseregions. > > What is possible to fix still is to choose smallest, not biggest > erasesize for uniform case. Yep, I agree. But we also have to be careful here, if some NORs were already supported and were picking the biggest erasesize, we have to preserve this behavior, otherwise we'll break things. > I have such a patch, but I need hands > on on a S25FS128S configured in uniform mode. > > Non uniform case requires MTD layer rework. There's already the concept of ->eraseregions. Maybe I'm wrong but I thought it would fit the non-uniform erase scheme we have in SPI NOR. > We just cannot handle > this hardware with just one erasesize in mind. We can, if we decide to always use the biggest non-uniform erasesize. Of course that only works if the biggest erase size is always a multiple of smaller ones, but I'm pretty sure this is always true. > > > --- > > drivers/mtd/spi-nor/spi-nor.c | 29 ++++++++++++++++++++++++++++- > > 1 file changed, 28 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > > index 93c9bc8931fc..a71adcd6ddfa 100644 > > --- a/drivers/mtd/spi-nor/spi-nor.c > > +++ b/drivers/mtd/spi-nor/spi-nor.c > > @@ -3000,7 +3000,8 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, > > u64 offset; > > u32 region_count; > > int i, j; > > - u8 erase_type, uniform_erase_type; > > + u8 uniform_erase_type, save_uniform_erase_type; > > + u8 erase_type, regions_erase_type; > > > > region_count = SMPT_MAP_REGION_COUNT(*smpt); > > /* > > @@ -3014,6 +3015,7 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, > > map->regions = region; > > > > uniform_erase_type = 0xff; > > + regions_erase_type = 0; > > offset = 0; > > /* Populate regions. */ > > for (i = 0; i < region_count; i++) { > > @@ -3030,13 +3032,38 @@ static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, > > */ > > uniform_erase_type &= erase_type; > > > > + /* > > + * regions_erase_type mask will indicate all the erase types > > + * supported in this configuration map. > > + */ > > + regions_erase_type |= erase_type; > > + > > offset = (region[i].offset & ~SNOR_ERASE_FLAGS_MASK) + > > region[i].size; > > } > > > > + save_uniform_erase_type = map->uniform_erase_type; > > map->uniform_erase_type = spi_nor_sort_erase_mask(map, > > uniform_erase_type); > > > > + if (!regions_erase_type) { > > + /* > > + * Roll back to the previous uniform_erase_type mask, SMPT is > > + * broken. > > + */ > > + map->uniform_erase_type = save_uniform_erase_type; > > + return -EINVAL; > > + } > > + > > + /* > > + * BFPT table advertises all the erase types supported by all the > > + * possible map configurations. Update the erase_type array to indicate > > + * which erase types are applicable to the current map configuration. > > + */ > > + for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++) > > + if (!(regions_erase_type & BIT(erase[i].idx))) > > + spi_nor_set_erase_type(&erase[i], 0, 0xFF); > > + > > spi_nor_region_mark_end(®ion[i - 1]); > > > > return 0; >