From nobody Mon Jun 8 23:56:53 2026 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1696E2066DE for ; Mon, 25 May 2026 12:17:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779711430; cv=none; b=IVNL3YtuyhTM41NCbjXEn3DwGIFQ2a5OswjoOdMvo/t8WmG1VNDFDMjQUICiMrVhSzcCCN90hr5EmUPGYigJ2bqP+PthxgawQefW5YWM5bZSTxQXxpiwk2jlMRdd0Mjj2efrDSt5XYlFm8QNqkd6vlAE4ajiKhfty19i8Y21/Ec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779711430; c=relaxed/simple; bh=h9iNL7GcSDIAkVpPEBDpEbAJy9stQvpAtUfYK4xo1NY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=LW2ROhIuPbVCM94iI/8DMJv/lKw1qc+eNEC96NGWdAMc4rS67lSF3oF2ZE/U6p/XCmZ11iW4Hg73Pe5c6A/gL9BWbXhdfAkYNTrcQadViYj4yk5/81LRShC1G5pI8EezncC/vis54i/rni0j8QqMsRtnKJui+ewtKU4LJH+jgkA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZDXODRjd; arc=none smtp.client-ip=209.85.214.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZDXODRjd" Received: by mail-pl1-f194.google.com with SMTP id d9443c01a7336-2b9fcf7c91bso108353975ad.0 for ; Mon, 25 May 2026 05:17:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779711428; x=1780316228; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=luD6oCvODFwNGsXqoj4sMPhB9qkWWUzbgy0pVHbWtks=; b=ZDXODRjdBL2TLyjmxhcgQl20I7+ZudxfjizJDk3rwKwko1IAxLNpsGydtAyLkLA+JJ XUEBMbjw3DBcOKNnestTDWjVa+S+ERHR/zqE5gNg4Z7Q9AYtdeid6Vpx3EGzoOR2Aucp W7Yhj3f93oTut+L9j/rrgBpn/6vIuuqcBgoldnScpGH2W34iliRlnUs+0ddyWp+V9HjH q/fi1mzREs+0auGABZ/qeoP1OEidzupa10yMV/4yW0rlmitjX9Ks2STCkE+w93BqkTif R9HpSKuVvVOZy/pas1j6aKXf76yftyaVe0AtTuqh9jPKRxpvsUfhZnONPVy+UM4nFAlS cqhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779711428; x=1780316228; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=luD6oCvODFwNGsXqoj4sMPhB9qkWWUzbgy0pVHbWtks=; b=Uo+oYjVQgRS4HyzY/OCKlR9aq7kCM485OoWRpHaDJ5ZfgWi3xyY3U3mUVCgybBJuoc w6DzwAAynw1m1QCp+lVqR0lnpzudS3JzOKs+dI/sJ06LbdsoKszx1su966pCF0FDP+iH i6qBpPT6OdW3/7Jg74r4NOMX9h4i4U72zoIxeXDSQoZGDxoxzI76dCcvOfzQnNWY9Gw8 9I/q12sAb+RvRwlrAoHmnuKMu4tRT4UqvK3wc3vHA1q7G01Dp6O1NvDm2PO+RjtBMcVy WNdFqr8Hfw/OvRwiKZ1hNMBk330egGusG4pPYlyR7g3indEnRSnW1Inn0SLaI7Xbz+bU e5bw== X-Forwarded-Encrypted: i=1; AFNElJ+9LZ7sA0zV1HK1K/IUTh4Lci4vNGiciKhuGzF6qrnYXEn/RxfdZYIo3ayvFE4uQCU7wUSQ7SDryd6PLIY=@vger.kernel.org X-Gm-Message-State: AOJu0YzT7xSWwBm3viESlSyYEQTNoBHEHwubfHEd2JhZq/hnByxxjAhp Za4lEVZmWsJEPeKYpHsrODskCkVMs5eVTObtmwy4OFSHAPrKO/7f5QHz X-Gm-Gg: Acq92OFY6M/YwbCnNDTpXnh77yYRprpyy/9Ca4edMW2+i1CQG2GFeYgGX+eTnsij3TK 2UqcWe+O8GxKapNWRkGEO7peaZqMfv+2doVdVwbPqgIrpvA3BXKX5QagJ0pzdm4kmi4VzXijXIx w12suluE50vw0xHyYSrxfGAPdT8ND5yaOk/oE9qVxLQmxjT5zASLg0wa+eEuadMHLdWLIOOi04u XWW3qBx1P8yVJDVbNFyxONlXKY2xta7Ca94/aE99Ue8dG3UZwT9i9AZ3KsAPcDA+JRPmxIOAXqU TpDxI+vSHE29Ip1WmeWUhTLTx9Cgcowa8antCIsLTu9KjGvqXYg7eZRAyTuXcuz4T4EsS+gbH5Y 3ANKB0IPER6RyZ5fPl4HXm1VqjreqdLrUQWPF1140nckmFRQEiS1S5wLmeYCIKsSkoeok/yb57e VONg3nWaEHRqN7ApQ5/0MBprLYk+e3WyNsBvCi X-Received: by 2002:a17:903:1a2b:b0:2bd:ef12:14d6 with SMTP id d9443c01a7336-2beb06cfc33mr156683025ad.34.1779711428250; Mon, 25 May 2026 05:17:08 -0700 (PDT) Received: from intel.company.local ([210.184.73.204]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2beb56bc46esm100762205ad.25.2026.05.25.05.17.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 May 2026 05:17:07 -0700 (PDT) From: Wandun Chen To: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: robh@kernel.org, saravanak@kernel.org Subject: [PATCH v3] of: reserved_mem: only support one entry in reg property Date: Mon, 25 May 2026 20:17:00 +0800 Message-ID: <20260525121700.2706141-1-chenwandun1@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wandun Chen A /reserved-memory child node may have multiple tuples in 'reg' property, but multiple entries in 'reg' have never been fully functional: - fdt_scan_reserved_mem() in the early pass loops over every tuple and reserves them all. - fdt_scan_reserved_mem_late() reads 'reg' by of_flat_dt_get_addr_size(), which returns false if entries !=3D 1. So 'reg' property with multiple entries will be skipped, no reserved_mem entry is created in reserved_mem[]. Supporting multiple tuples is not a good idea: - It requires reserved_mem_ops->node_init support. Currently, CMA(rmem_cma_setup) and DMA(rmem_dma_setup) are not supported. - of_reserved_mem_lookup() is name-based, only the first entry in multiple tuples will be found. So change to support one entry in 'reg' property. Also update dt binding: https://github.com/devicetree-org/dt-schema/pull/197 Suggested-by: Rob Herring Signed-off-by: Wandun Chen Tested-by: Meijing Zhao Link: https://lore.kernel.org/all/20260506014752.GA280279-robh@kernel.org/ --- v2 --> v3: 1. Fix out-of-bounds issue in v2 if device tree contains an empty reg property [1]. v1 --> v2: 1. Support only one entry in reg property, suggested by Rob Herring [2]. [1] https://sashiko.dev/#/patchset/20260519082427.4181476-1-chenwandun%40li= xiang.com?part=3D3 [2] https://lore.kernel.org/all/20260429065831.1510858-1-chenwandun@lixiang= .com/T/#m29fa0f1c22c23e6343070e70f905c9482f930901 --- drivers/of/of_reserved_mem.c | 43 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 8d5777cb5d1b..ce1d5530ec0f 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -128,42 +128,43 @@ static int __init early_init_dt_reserve_memory(phys_a= ddr_t base, } =20 /* - * __reserved_mem_reserve_reg() - reserve all memory described in 'reg' pr= operty + * __reserved_mem_reserve_reg() - reserve memory described in the + * first entry in 'reg' property */ static int __init __reserved_mem_reserve_reg(unsigned long node, const char *uname) { phys_addr_t base, size; - int i, len, err; + int len, err; const __be32 *prop; bool nomap; + u64 b, s; =20 prop =3D of_flat_dt_get_addr_size_prop(node, "reg", &len); - if (!prop) + if (!prop || !len) return -ENOENT; =20 + if (len > 1) + pr_warn("Reserved memory: node '%s' has %d entries, only the= first is used\n", + uname, len); + nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; =20 err =3D fdt_validate_reserved_mem_node(node, NULL); if (err && err !=3D -ENODEV) return err; =20 - for (i =3D 0; i < len; i++) { - u64 b, s; - - of_flat_dt_read_addr_size(prop, i, &b, &s); - - base =3D b; - size =3D s; + of_flat_dt_read_addr_size(prop, 0, &b, &s); + base =3D b; + size =3D s; =20 - if (size && early_init_dt_reserve_memory(base, size, nomap) =3D=3D 0) { - fdt_fixup_reserved_mem_node(node, base, size); - pr_debug("Reserved memory: reserved region for node '%s': base %pa, siz= e %lu MiB\n", - uname, &base, (unsigned long)(size / SZ_1M)); - } else { - pr_err("Reserved memory: failed to reserve memory for node '%s': base %= pa, size %lu MiB\n", - uname, &base, (unsigned long)(size / SZ_1M)); - } + if (size && early_init_dt_reserve_memory(base, size, nomap) =3D=3D 0) { + fdt_fixup_reserved_mem_node(node, base, size); + pr_debug("Reserved memory: reserved region for node '%s': base %pa, size= %lu MiB\n", + uname, &base, (unsigned long)(size / SZ_1M)); + } else { + pr_err("Reserved memory: failed to reserve memory for node '%s': base %p= a, size %lu MiB\n", + uname, &base, (unsigned long)(size / SZ_1M)); } return 0; } @@ -274,20 +275,24 @@ void __init fdt_scan_reserved_mem_late(void) } =20 fdt_for_each_subnode(child, fdt, node) { + const __be32 *prop; const char *uname; u64 b, s; int ret; + int len; =20 if (!of_fdt_device_is_available(fdt, child)) continue; =20 - if (!of_flat_dt_get_addr_size(child, "reg", &b, &s)) + prop =3D of_flat_dt_get_addr_size_prop(child, "reg", &len); + if (!prop || !len) continue; =20 ret =3D fdt_validate_reserved_mem_node(child, NULL); if (ret && ret !=3D -ENODEV) continue; =20 + of_flat_dt_read_addr_size(prop, 0, &b, &s); base =3D b; size =3D s; =20 --=20 2.43.0