Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp2823362iog; Mon, 27 Jun 2022 03:48:11 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vAdqGdVukM76j/M/njL828cDk+zpwpgkBaolB9LjuYJPXkCylWOKmAxxzWop1TczxKYdii X-Received: by 2002:a63:4716:0:b0:410:ac39:868d with SMTP id u22-20020a634716000000b00410ac39868dmr1483116pga.347.1656326890991; Mon, 27 Jun 2022 03:48:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656326890; cv=none; d=google.com; s=arc-20160816; b=oRsfGfIqUtYCu/+lVeKQApoopOUsahw+PGHH0OxRM2+N3PgAfsNGg98HTnBIZy5kc4 k3oz32icwGkQGOPxeVbpZ3KaAWbibv39rULjjLWL4+DRBeisvRuf4fKwWM0gbpaVRM9k 9+1xcMHuEh3Chb85TJV+ArZtEFwUWY0IBGnqLKr6GHlX4j5kyBYjRfqJoSLgHwB2Kn/j uocVsj9GEtG4EjFGMsZl4+pb8IX6kngybYOMw624UmF/rInEnRrNr7/Pxsyldq71ifyP zDgmd35UzuXqpRDR4sY7+SCIfUd4Oe9yZP+agmikm2pypX8KSFn74WAezxqMs8mPOrnV lxWg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=KnoPSQu9+s4MNxSd6/7W2N8bFdgAeqY92rdLfhAmmHM=; b=qwejgPClgK9GA7Qa1w7oFKG6PPk7rbuyVAq3JT+5cUYTKxOE3KeosgfeLh4Te4PrJo 3qFv6ZX9AZuEZfBYdilJOzzK+N+Pb4wbf5xJ4TQW9sV8grpNxVO0PWvL1TLcIlaULVW+ 8RTD78c4o6JCQ2DxDvSBu85RwIwFdW0ipQRrrtbToMe9CxDR7842y64hR5owLWkWfNtc hMxp8BXEL46X8aW9hMQjDUnFuzjZHtNofIVbSw8bx6m9NY9ByH8jEf8eR1nC3GI9DSSb ph0j0Kd/yPuaugZ+HY8vrOmBmNJ+fUgg0ngu6I2A+OhoXKR/7/RWzYzP6KINGejS5HWx mP9g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gb5-20020a17090b060500b001e073312c32si13872488pjb.8.2022.06.27.03.47.59; Mon, 27 Jun 2022 03:48:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233710AbiF0KBz (ORCPT + 99 others); Mon, 27 Jun 2022 06:01:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233887AbiF0KBu (ORCPT ); Mon, 27 Jun 2022 06:01:50 -0400 X-Greylist: delayed 616 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Mon, 27 Jun 2022 03:01:42 PDT Received: from 7.mo548.mail-out.ovh.net (7.mo548.mail-out.ovh.net [46.105.33.25]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8B0456252 for ; Mon, 27 Jun 2022 03:01:42 -0700 (PDT) Received: from mxplan5.mail.ovh.net (unknown [10.108.16.62]) by mo548.mail-out.ovh.net (Postfix) with ESMTPS id 7066B21B82; Mon, 27 Jun 2022 09:43:22 +0000 (UTC) Received: from kaod.org (37.59.142.96) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.9; Mon, 27 Jun 2022 11:43:20 +0200 Authentication-Results: garm.ovh; auth=pass (GARM-96R001214c8b85-88ae-43d7-9f45-820f0b88e976, D5BAD815273CE4794DDBC5929823026F491AE39B) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 Message-ID: <82015d89-cab5-3e9a-a40e-e5dafa17ec0c@kaod.org> Date: Mon, 27 Jun 2022 11:43:15 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: [RFC PATCH 3/6] mtd: spi-nor: core: run calibration when initialization is done Content-Language: en-US To: Pratyush Yadav CC: Miquel Raynal , Nishanth Menon , Tero Kristo , Rob Herring , Tudor Ambarus , Michael Walle , Richard Weinberger , Vignesh Raghavendra , Mark Brown , , , , , , Joel Stanley References: <20210311191216.7363-1-p.yadav@ti.com> <20210311191216.7363-4-p.yadav@ti.com> <20220517160226.4107f282@xps-13> <20220518060640.os5fp5rez4ie7qc4@ti.com> <20220518091931.279c5398@xps-13> <20220518075651.mvdhfnfbgutecgyq@ti.com> <20220627091404.54257obrdazcjhre@ti.com> From: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= In-Reply-To: <20220627091404.54257obrdazcjhre@ti.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [37.59.142.96] X-ClientProxiedBy: DAG3EX2.mxp5.local (172.16.2.22) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: d90d66d2-6dd4-4970-a538-40e48684ccd2 X-Ovh-Tracer-Id: 8915438414617938820 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvfedrudeghedgvddtucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhepkfffgggfuffvvehfhfgjtgfgihesthekredttdefjeenucfhrhhomhepveorughrihgtpgfnvggpifhorghtvghruceotghlgheskhgrohgurdhorhhgqeenucggtffrrghtthgvrhhnpeekteejtdelkeejvdevffduhfetteelieefgeefffeugffhfeekheffueefledujeenucfkpheptddrtddrtddrtddpfeejrdehledrudegvddrleeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmohguvgepshhmthhpohhuthdphhgvlhhopehmgihplhgrnhehrdhmrghilhdrohhvhhdrnhgvthdpihhnvghtpedtrddtrddtrddtpdhmrghilhhfrhhomheptghlgheskhgrohgurdhorhhgpdhnsggprhgtphhtthhopedupdhrtghpthhtohepjhhovghlsehjmhhsrdhiugdrrghupdfovfetjfhoshhtpehmohehgeek X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 6/27/22 11:14, Pratyush Yadav wrote: > On 18/05/22 10:51AM, Cédric Le Goater wrote: >> Hello, >> >> On 5/18/22 09:56, Pratyush Yadav wrote: >>> On 18/05/22 09:19AM, Miquel Raynal wrote: >>>> Hi Pratyush, >>>> >>>> p.yadav@ti.com wrote on Wed, 18 May 2022 11:37:05 +0530: >>>> >>>>> +Cedric >>>>> >>>>> On 17/05/22 04:02PM, Miquel Raynal wrote: >>>>>> Hi Pratyush, >>>>>> >>>>>> p.yadav@ti.com wrote on Fri, 12 Mar 2021 00:42:13 +0530: >>>>>>> Once the flash is initialized tell the controller it can run >>>>>>> calibration procedures if needed. This can be useful when calibration is >>>>>>> needed to run at higher clock speeds. >>>>>>> >>>>>>> Signed-off-by: Pratyush Yadav >>>>>>> --- >>>>>>> drivers/mtd/spi-nor/core.c | 12 ++++++++++-- >>>>>>> 1 file changed, 10 insertions(+), 2 deletions(-) >>>>>>> >>>>>>> diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c >>>>>>> index 88888df009f0..e0cbcaf1be89 100644 >>>>>>> --- a/drivers/mtd/spi-nor/core.c >>>>>>> +++ b/drivers/mtd/spi-nor/core.c >>>>>>> @@ -3650,6 +3650,7 @@ static int spi_nor_probe(struct spi_mem *spimem) >>>>>>> * checking what's really supported using spi_mem_supports_op(). >>>>>>> */ >>>>>>> const struct spi_nor_hwcaps hwcaps = { .mask = SNOR_HWCAPS_ALL }; >>>>>>> + struct spi_mem_op op; >>>>>>> char *flash_name; >>>>>>> int ret; >>>>>>> @@ -3709,8 +3710,15 @@ static int spi_nor_probe(struct spi_mem *spimem) >>>>>>> if (ret) >>>>>>> return ret; >>>>>>> - return mtd_device_register(&nor->mtd, data ? data->parts : NULL, >>>>>>> - data ? data->nr_parts : 0); >>>>>>> + ret = mtd_device_register(&nor->mtd, data ? data->parts : NULL, >>>>>>> + data ? data->nr_parts : 0); >>>>>>> + if (ret) >>>>>>> + return ret; >>>>>>> + >>>>>>> + op = spi_nor_spimem_get_read_op(nor); >>>>>> >>>>>> Isn't this too specific? I really don't know much about spi-nors, but I >>>>>> find odd to have this op being created here, why not moving this into >>>>>> the _do_calibration() helper? >>>>> >>>>> Maybe the naming confused you but this is a function in the SPI NOR >>>>> core, not in SPI MEM. SPI NOR supports both SPI MEM based controllers >>>>> and "legacy" controllers, so the convention is to add the "spimem" >>>>> prefix before SPI MEM specific functions. So I don't get the comment >>>>> about it being too specific. It is too specific to what? >>>> >>>> Mmh right, it's fine then. >>>> >>>>> >>>>> And how can spi_mem_do_calibration() know what op the flash uses to read >>>>> data? SPI NOR or SPI NAND would know it, but not SPI MEM. That is why we >>>>> pass in that information to spi_mem_do_calibration(). >>>> >>>> But here the op is "spi-nor wide", I would have expected a >>>> per-device op. But that is not a big deal, that is something that can >>>> also be updated later if needed I guess. >>> >>> It is per-device. The op is generated using nor->read_opcode, >>> nor->addr_width, nor->read_dummy, etc. So if you have 2 NOR flashes on >>> your system with different opcodes, it would work for both. >>> >>>> >>>> One last question, is there something that mtd_device_register() does >>>> that is really needed for the calibration to work? Otherwise I would >>>> rather prefer to have that calibration happening before the user gets >>>> access to the device. >> >> Which would mean calling it right after : >> >> ret = spi_nor_create_read_dirmap(nor); >> if (ret) >> return ret; >> >> ret = spi_nor_create_write_dirmap(nor); >> if (ret) >> return ret; >> >>> The calibration works by reading a known pattern that is already written >>> to the flash again and again and seeing what delays work and what don't. >>> For that to happen, the controller driver needs to know where the >>> pattern is stored. >> >> Why don't you simply choose some random place, first 16KB for instance, >> and check that the data is random enough ? If not, declare calibration >> not possible and choose a default safe setting which is anyhow a >> requirement for calibration. Retry at reboot as data might have changed. > > I did not come up with the pattern myself. But from what I can > understand, the pattern is not random at all, but is carefully chosen to > target certain ways a read can fail on the controller. So a random piece > of data won't work as well as this carefully designed pattern. True. I don't exactly remember how your proposal worked from the driver side but I imagine having a specific DT property to locate that pattern in the setup handler and to use it later on is not too complex. >>> This series does that by looking at the MTD >>> partitions. For that to happen, we need to create those partitions >>> first, which happens after mtd_device_register(). >> >> hmm, that might work for some boards. This is not at all the case for >> the BMC boards. Vendors can put any kind of flash model and/or layout >> and the driver needs to be more generic. > > Yes, vendors can choose any layout, but one partition on that layout > would be your calibration pattern. I think you can use a different > compatible for that partition. OK. and that it would become more generic then. > I have not thought this through yet though. If a partition is required, that's a dependency on mtdpart. It could be done from spi_nor_probe() after mtd_device_register() with some spimem handler using the 'struct mtd_partition' for the {size,offset} parameters. >> >>> But I am planning to use device tree to get that information now so this >>> should no longer be needed and we can do calibration before registering >>> the device with MTD. >> >> Perfect, we can move the calibration hook in spi_nor_create_read_dirmap() >> then, or in devm_spi_mem_dirmap_create(), which would make more sense IMHO. > > Sorry, I still don't get why you want to tie dirmap and calibration > together. Just let them be independent and let flash drivers take care > of when to call what. SPI MEM should not care. I know you would prefer a specific handler and that can still be done. Thanks, C.