From patchwork Fri Jan 13 18:45:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Francesco Dolcini X-Patchwork-Id: 1726359 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.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: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mailserver.it header.i=@mailserver.it header.a=rsa-sha256 header.s=mailsrv header.b=jqBdTj7m; 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 ECDSA (P-384)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Ntr3k1sHHz23fk for ; Sat, 14 Jan 2023 05:46:26 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 98FEE853C0; Fri, 13 Jan 2023 19:46:05 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=dolcini.it Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mailserver.it header.i=@mailserver.it header.b="jqBdTj7m"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3CE74853C0; Fri, 13 Jan 2023 19:45:58 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from smtp-out-06.comm2000.it (smtp-out-06.comm2000.it [212.97.32.74]) (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 4852D853E0 for ; Fri, 13 Jan 2023 19:45:53 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=dolcini.it Authentication-Results: phobos.denx.de; spf=none smtp.mailfrom=francesco@dolcini.it Received: from francesco-nb.pivistrello.it (93-49-2-63.ip317.fastwebnet.it [93.49.2.63]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: francesco@dolcini.it) by smtp-out-06.comm2000.it (Postfix) with ESMTPSA id E26E0561D3D; Fri, 13 Jan 2023 19:45:51 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailserver.it; s=mailsrv; t=1673635552; bh=eOUqIWF2Ec0dmxMwvHrDf6eQJQ5/BljXOsPjJIhvS5E=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jqBdTj7m9iimyNB2zNQJ0pcYU3Q1s4PRedRarU1lhASbfBaq9LUMeUtJHUmdJYOrS R/KJsxIscIzuX8NEl4/MwGea23nw/MPLV6W0Q/5rV0sabOaeHNaiqNYBGoNaTqGKUy 5ki0uTPkQ+UZyU6TPE+tON1nc7uzqATpbwDy0QpO9cNJB+d5cZ/ifhIxXZ4vRmcaOT z7fsYk3zbiGNjpVWoTu+OwXuHq9fvcy4AVRW+1tzDx2grN9+5X4aVJMAwycSG4YgvU L2TIS0xYjb6o2YxBXiUFS7JtgWUTYur8LQFJZT1dT5oSlg40vQNLjt7qPFfztUeMqv 4YjAbjdzYbcvg== From: Francesco Dolcini To: Simon Glass , u-boot@lists.denx.de, Marcel Ziswiler Cc: Francesco Dolcini , Marek Vasut , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH v1 1/3] fdt: validate/fix cells count on mtdpart fixup Date: Fri, 13 Jan 2023 19:45:45 +0100 Message-Id: <20230113184547.487322-2-francesco@dolcini.it> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230113184547.487322-1-francesco@dolcini.it> References: <20230113184547.487322-1-francesco@dolcini.it> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 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.103.6 at phobos.denx.de X-Virus-Status: Clean From: Francesco Dolcini Fixup #size-cells value when updating the MTD partitions, this is required to prevent issues in case the MTD parent set #size-cells to zero. This could happen for example in the legacy case in which the partitions are created as direct child of the mtd node and that specific node has no children. Recent clean-up on Linux device tree files created a boot regression on colibri-imx7. This fixup has the limitation to assume 32-bit (#size-cells=1) addressing, therefore it will not work with device bigger than 4GiB. This change also enforce #address-cells to be the same as #size-cells, this was already silently enforced by fdt_node_set_part_info(), now this is checked explicitly and partition fixup will just fail in such case. In general board should not generally need nor use this functionality and should be just deprecated, passing mtdparts= in the kernel command line is the preferred way according to Linux MTD subsystem maintainer. Link: https://lore.kernel.org/all/20221202071900.1143950-1-francesco@dolcini.it/ Link: https://lore.kernel.org/all/Y4dgBTGNWpM6SQXI@francesco-nb.int.toradex.com/ Cc: Marek Vasut Cc: Miquel Raynal Signed-off-by: Francesco Dolcini --- common/fdt_support.c | 45 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/common/fdt_support.c b/common/fdt_support.c index dbceec6f2dcc..3aee826e60cf 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -877,27 +877,20 @@ static int fdt_del_partitions(void *blob, int parent_offset) return 0; } -static int fdt_node_set_part_info(void *blob, int parent_offset, +/* This expects #address-cells and #size-cells to have same value */ +static int fdt_node_set_part_info(void *blob, int parent_offset, int sizecell, struct mtd_device *dev) { struct list_head *pentry; struct part_info *part; int off, ndepth = 0; int part_num, ret; - int sizecell; char buf[64]; ret = fdt_del_partitions(blob, parent_offset); if (ret < 0) return ret; - /* - * Check if size/address is 1 or 2 cells. - * We assume #address-cells and #size-cells have same value. - */ - sizecell = fdt_getprop_u32_default_node(blob, parent_offset, - 0, "#size-cells", 1); - /* * Check if it is nand {}; subnode, adjust * the offset in this case @@ -992,6 +985,31 @@ err_prop: return ret; } +static int fdt_mtdparts_cell_cnt(void *fdt, int off) +{ + int sizecell, addrcell; + + sizecell = fdt_getprop_u32_default_node(fdt, off, 0, "#size-cells", 0); + if (sizecell != 1 && sizecell != 2) { + printf("%s: Invalid or missing #size-cells %d value, assuming 1\n", + __func__, sizecell); + + sizecell = 1; + if (fdt_setprop_u32(fdt, off, "#size-cells", sizecell)) + return -1; + } + + addrcell = fdt_getprop_u32_default_node(fdt, off, 0, + "#address-cells", 0); + if (addrcell != sizecell) { + printf("%s: Invalid #address-cells %d != #size-cells %d, aborting\n", + __func__, addrcell, sizecell); + return -1; + } + + return sizecell; +} + /* * Update partitions in nor/nand nodes using info from * mtdparts environment variable. The nodes to update are @@ -1037,12 +1055,19 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info *node_info, dev = device_find(node_info[i].type, idx++); if (dev) { + int cell; + parts = fdt_subnode_offset(blob, noff, "partitions"); if (parts < 0) parts = noff; - if (fdt_node_set_part_info(blob, parts, dev)) + cell = fdt_mtdparts_cell_cnt(blob, parts); + if (cell < 0) + return; + + if (fdt_node_set_part_info(blob, parts, + cell, dev)) return; /* return on error */ } }