From nobody Fri Apr 3 01:48:27 2026 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B307B24DFF3 for ; Wed, 25 Mar 2026 09:00:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429235; cv=none; b=BfX0yeRIIlv2votzw9vkz52Tw11JhWGDBlMML+Q2troUkpYymW37U3L+ATe8Pwb4OkN7ct4xMosv+QPgfX0CZqDxC6eABLbY1hv0XF6VfZxjkt0bbR5NW0YrSiRgddm58ZQcZlsa/6kacwWErVekJVsCm9kYQW16jc3yUTwP4JQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429235; c=relaxed/simple; bh=of6fOcIDOXD4R7DSxjk1g0pCCBc0p6Em7PWlZQJ0m9E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=k1ZraXIWvYXeXWUF7A7bfsoA3IhF+4+akYAiJ8HZO4tdVShBw/wCiGp9cMi2EW9UgiaLE5NbJ1JoDxlMSqJbBYehOujALpbI6Qjzafj3iE+X5fEHMiiS1AjsCjI5krqxDdSiudtq88N14MWtJmSr5X+EQLv0cCiDYcOSV8VKFpA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=TzvwX4sC; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="TzvwX4sC" Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090031euoutp01930d9faa4cd0e5dbeceee70bd141405d~gCfv5pft42240722407euoutp01a for ; Wed, 25 Mar 2026 09:00:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20260325090031euoutp01930d9faa4cd0e5dbeceee70bd141405d~gCfv5pft42240722407euoutp01a DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429231; bh=pBpVBJJsPxI1z83r19rYloW28Padt8vaPhBGoBUPBQY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TzvwX4sCOSN3wSem6qwQcGuwapILn0/bg8M5UcV5IGCZBmFALcAQglB55zUEX6+Zr ko7p+vV4/ezmsc8VNpOVTeza7udxunOXqLM8eEfMri8tjvIQV2+QHTIUHAj6BafcuD m1nLa9F3fbrjXCclLi871hfqAViLHeKvSfD4mekU= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260325090030eucas1p1a01261214ddb330f8590c7106f2980e5~gCfvlCRYU0363803638eucas1p1C; Wed, 25 Mar 2026 09:00:30 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090030eusmtip1b151172284a8a012bb01ff14122774f6~gCfvCBeY40388903889eusmtip1o; Wed, 25 Mar 2026 09:00:30 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 1/7] of: reserved_mem: remove fdt node from the structure Date: Wed, 25 Mar 2026 10:00:17 +0100 Message-Id: <20260325090023.3175348-2-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090030eucas1p1a01261214ddb330f8590c7106f2980e5 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090030eucas1p1a01261214ddb330f8590c7106f2980e5 X-EPHeader: CA X-CMS-RootMailID: 20260325090030eucas1p1a01261214ddb330f8590c7106f2980e5 References: <20260325090023.3175348-1-m.szyprowski@samsung.com> FDT node is not needed for anything besides the initialization, so it can be simply passed as an argument to the reserved memory region init function. Signed-off-by: Marek Szyprowski --- drivers/memory/tegra/tegra210-emc-table.c | 3 ++- drivers/of/of_reserved_mem.c | 25 ++++++++++------------- include/linux/of_reserved_mem.h | 4 ++-- kernel/dma/coherent.c | 4 +--- kernel/dma/contiguous.c | 3 +-- kernel/dma/swiotlb.c | 5 ++--- 6 files changed, 19 insertions(+), 25 deletions(-) diff --git a/drivers/memory/tegra/tegra210-emc-table.c b/drivers/memory/teg= ra/tegra210-emc-table.c index 34a8785d2861..ac1d1e13482a 100644 --- a/drivers/memory/tegra/tegra210-emc-table.c +++ b/drivers/memory/tegra/tegra210-emc-table.c @@ -75,7 +75,8 @@ static const struct reserved_mem_ops tegra210_emc_table_o= ps =3D { .device_release =3D tegra210_emc_table_device_release, }; =20 -static int tegra210_emc_table_init(struct reserved_mem *rmem) +static int tegra210_emc_table_init(unsigned long node, + struct reserved_mem *rmem) { pr_debug("Tegra210 EMC table at %pa, size %lu bytes\n", &rmem->base, (unsigned long)rmem->size); diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 1fd28f805610..6705b7afebf0 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -104,7 +104,8 @@ static void __init alloc_reserved_mem_array(void) reserved_mem =3D new_array; } =20 -static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem); +static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem, + unsigned long node); /* * fdt_reserved_mem_save_node() - save fdt node for second pass initializa= tion */ @@ -118,13 +119,12 @@ static void __init fdt_reserved_mem_save_node(unsigne= d long node, const char *un return; } =20 - rmem->fdt_node =3D node; rmem->name =3D uname; rmem->base =3D base; rmem->size =3D size; =20 /* Call the region specific initialization function */ - fdt_init_reserved_mem_node(rmem); + fdt_init_reserved_mem_node(rmem, node); =20 reserved_mem_count++; } @@ -483,7 +483,8 @@ static const struct of_device_id __rmem_of_table_sentin= el /* * __reserved_mem_init_node() - call region specific reserved memory init = code */ -static int __init __reserved_mem_init_node(struct reserved_mem *rmem) +static int __init __reserved_mem_init_node(struct reserved_mem *rmem, + unsigned long node) { extern const struct of_device_id __reservedmem_of_table[]; const struct of_device_id *i; @@ -493,10 +494,10 @@ static int __init __reserved_mem_init_node(struct res= erved_mem *rmem) reservedmem_of_init_fn initfn =3D i->data; const char *compat =3D i->compatible; =20 - if (!of_flat_dt_is_compatible(rmem->fdt_node, compat)) + if (!of_flat_dt_is_compatible(node, compat)) continue; =20 - ret =3D initfn(rmem); + ret =3D initfn(node, rmem); if (ret =3D=3D 0) { pr_info("initialized node %s, compatible id %s\n", rmem->name, compat); @@ -526,11 +527,6 @@ static int __init __rmem_cmp(const void *a, const void= *b) if (ra->size > rb->size) return 1; =20 - if (ra->fdt_node < rb->fdt_node) - return -1; - if (ra->fdt_node > rb->fdt_node) - return 1; - return 0; } =20 @@ -564,19 +560,20 @@ static void __init __rmem_check_for_overlap(void) /** * fdt_init_reserved_mem_node() - Initialize a reserved memory region * @rmem: reserved_mem struct of the memory region to be initialized. + * @node: fdt node of the initialized region * * This function is used to call the region specific initialization * function for a reserved memory region. */ -static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem) +static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem, + unsigned long node) { - unsigned long node =3D rmem->fdt_node; int err =3D 0; bool nomap; =20 nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; =20 - err =3D __reserved_mem_init_node(rmem); + err =3D __reserved_mem_init_node(rmem, node); if (err !=3D 0 && err !=3D -ENOENT) { pr_info("node %s compatible matching fail\n", rmem->name); if (nomap) diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_me= m.h index f573423359f4..5159938bfe03 100644 --- a/include/linux/of_reserved_mem.h +++ b/include/linux/of_reserved_mem.h @@ -11,7 +11,6 @@ struct resource; =20 struct reserved_mem { const char *name; - unsigned long fdt_node; const struct reserved_mem_ops *ops; phys_addr_t base; phys_addr_t size; @@ -25,7 +24,8 @@ struct reserved_mem_ops { struct device *dev); }; =20 -typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem); +typedef int (*reservedmem_of_init_fn)(unsigned long node, + struct reserved_mem *rmem); =20 #ifdef CONFIG_OF_RESERVED_MEM =20 diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c index 1147497bc512..34621acbd3c5 100644 --- a/kernel/dma/coherent.c +++ b/kernel/dma/coherent.c @@ -367,10 +367,8 @@ static const struct reserved_mem_ops rmem_dma_ops =3D { .device_release =3D rmem_dma_device_release, }; =20 -static int __init rmem_dma_setup(struct reserved_mem *rmem) +static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *= rmem) { - unsigned long node =3D rmem->fdt_node; - if (of_get_flat_dt_prop(node, "reusable", NULL)) return -EINVAL; =20 diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index c56004d314dc..81a2fa4971ee 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -475,9 +475,8 @@ static const struct reserved_mem_ops rmem_cma_ops =3D { .device_release =3D rmem_cma_device_release, }; =20 -static int __init rmem_cma_setup(struct reserved_mem *rmem) +static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *= rmem) { - unsigned long node =3D rmem->fdt_node; bool default_cma =3D of_get_flat_dt_prop(node, "linux,cma-default", NULL); struct cma *cma; int err; diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 487dcf73b88d..2f53d8c599d1 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -1882,10 +1882,9 @@ static const struct reserved_mem_ops rmem_swiotlb_op= s =3D { .device_release =3D rmem_swiotlb_device_release, }; =20 -static int __init rmem_swiotlb_setup(struct reserved_mem *rmem) +static int __init rmem_swiotlb_setup(unsigned long node, + struct reserved_mem *rmem) { - unsigned long node =3D rmem->fdt_node; - if (of_get_flat_dt_prop(node, "reusable", NULL) || of_get_flat_dt_prop(node, "linux,cma-default", NULL) || of_get_flat_dt_prop(node, "linux,dma-default", NULL) || --=20 2.34.1 From nobody Fri Apr 3 01:48:27 2026 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ECA0A3009EE for ; Wed, 25 Mar 2026 09:00:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429234; cv=none; b=hn6p2Xe62hN+QUFKG2qFY9dDCVEF0Ukdy1XO7cdiylvLEBUDqqZ8KV3zQplXi23L58fuMAcFwU/A7KHs4fER3Z6Y270dEXw58Wm/o6XizAhZvPVi17Ho+n51UPP1qBrXD1LNU4XFSODi3My0xsReiY10dwD3HTCHfj747GbUOzc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429234; c=relaxed/simple; bh=CPcTlIJgIyK5T1j0XTj81N/5/UyvrLhYjXjqTIrrO1s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=Xvl4HkyiJ0ZAL0KJ+6mnqe7i4OhJnY8YxvCQOttgD4IoJlsG1qcMBFxHec+XBpHQzTPLgRLoGmScpLTGt5HRJCP0gKwqAF32L0RUPEeqVhuij79OBktoEVbdNT+sN8IvhFsJLnEk76//OdREOMm8AC6HrlUnsHr+2ltT6Tj0HDc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=FY5iUkMt; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="FY5iUkMt" Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090031euoutp0126bd3d54765ffcfa62ddd3a5c4327fb4~gCfwhPZA62240722407euoutp01c for ; Wed, 25 Mar 2026 09:00:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20260325090031euoutp0126bd3d54765ffcfa62ddd3a5c4327fb4~gCfwhPZA62240722407euoutp01c DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429231; bh=qDkZBH8D9QGZmacGWO/wLlPET8ve8kNAHImwlz5MpvM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FY5iUkMtR9ARTfG7/tVvrcKFos/ZapigxegUHHHt0vVky5lQ6qCjTliLvuGask1oQ 21IwycinJ4E1/p2/flJXeKCCStkMrEvvF8uaS2bNbvl9sZI5ui9VowP/SNvPuwSh2c 8+0fWXCDgF7ZVqkiXWdFAzAcncbLr7/irtU2PxMc= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260325090031eucas1p185465a9f6f2a06a4b1d0cb2b13a92aef~gCfwMvlkl0601006010eucas1p13; Wed, 25 Mar 2026 09:00:31 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090030eusmtip1a3370e43b1c03e214df9fdc959e30922~gCfvqWu7e0170001700eusmtip1S; Wed, 25 Mar 2026 09:00:30 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 2/7] of: reserved_mem: use -ENODEV instead of -ENOENT Date: Wed, 25 Mar 2026 10:00:18 +0100 Message-Id: <20260325090023.3175348-3-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090031eucas1p185465a9f6f2a06a4b1d0cb2b13a92aef X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090031eucas1p185465a9f6f2a06a4b1d0cb2b13a92aef X-EPHeader: CA X-CMS-RootMailID: 20260325090031eucas1p185465a9f6f2a06a4b1d0cb2b13a92aef References: <20260325090023.3175348-1-m.szyprowski@samsung.com> When given reserved memory region doesn't really support given node, return -ENODEV instead of -ENOENT. Then fix __reserved_mem_init_node() function to properly propagate error code different from -ENODEV instead of silently ignoring it. Signed-off-by: Marek Szyprowski --- drivers/of/of_reserved_mem.c | 7 ++++--- kernel/dma/coherent.c | 2 +- kernel/dma/contiguous.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 6705b7afebf0..9aff460a0420 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -488,9 +488,10 @@ static int __init __reserved_mem_init_node(struct rese= rved_mem *rmem, { extern const struct of_device_id __reservedmem_of_table[]; const struct of_device_id *i; - int ret =3D -ENOENT; + int ret =3D -ENODEV; =20 - for (i =3D __reservedmem_of_table; i < &__rmem_of_table_sentinel; i++) { + for (i =3D __reservedmem_of_table; ret =3D=3D -ENODEV && + i < &__rmem_of_table_sentinel; i++) { reservedmem_of_init_fn initfn =3D i->data; const char *compat =3D i->compatible; =20 @@ -574,7 +575,7 @@ static void __init fdt_init_reserved_mem_node(struct re= served_mem *rmem, nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; =20 err =3D __reserved_mem_init_node(rmem, node); - if (err !=3D 0 && err !=3D -ENOENT) { + if (err !=3D 0 && err !=3D -ENODEV) { pr_info("node %s compatible matching fail\n", rmem->name); if (nomap) memblock_clear_nomap(rmem->base, rmem->size); diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c index 34621acbd3c5..64f9ba618e19 100644 --- a/kernel/dma/coherent.c +++ b/kernel/dma/coherent.c @@ -370,7 +370,7 @@ static const struct reserved_mem_ops rmem_dma_ops =3D { static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *= rmem) { if (of_get_flat_dt_prop(node, "reusable", NULL)) - return -EINVAL; + return -ENODEV; =20 #ifdef CONFIG_ARM if (!of_get_flat_dt_prop(node, "no-map", NULL)) { diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index 81a2fa4971ee..e6fc6906b5c0 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -483,7 +483,7 @@ static int __init rmem_cma_setup(unsigned long node, st= ruct reserved_mem *rmem) =20 if (!of_get_flat_dt_prop(node, "reusable", NULL) || of_get_flat_dt_prop(node, "no-map", NULL)) - return -EINVAL; + return -ENODEV; =20 if (!IS_ALIGNED(rmem->base | rmem->size, CMA_MIN_ALIGNMENT_BYTES)) { pr_err("Reserved memory: incorrect alignment of CMA region\n"); --=20 2.34.1 From nobody Fri Apr 3 01:48:27 2026 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C38D931716F for ; Wed, 25 Mar 2026 09:00:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429235; cv=none; b=hwaxDTbweMq+eSySZytwUMyFnAV4BfF8Ns3Hvs/wsePIa7RKyy7vbrQ8022hyP8NQR2O14cnk1f0UIRTqS6k4DTzcb/3q4dV66HW3dix4ePmy6kxtz6an/lc4FGhNgA0sCPi5Mq74HPMeJsElMXCn17tH+enaE8TNp9HitIeD6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429235; c=relaxed/simple; bh=rYdxiFd8V1p9D8axzTRdYHSmxWdNu1JUKInL/cS/0xI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=Es745eEcxrdq5/bt6hM1y29V6Lq774/wdlNcqU2/BRwEA/UP9K9P49dRl+hDgQTVKa1OQmuEG39aXUa99GsE8843xRJistR6dzX9a4XwA72CfWk/Ih87vsPJzS3HkChAAKT5uIdSOom3HKnNinB3xnwp8U3MHhPDOLie60DGEnI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=gxSREEvd; arc=none smtp.client-ip=210.118.77.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="gxSREEvd" Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090032euoutp02143b10275c7bc5a0a3b31679a56f8141~gCfxSdKnQ0087600876euoutp02b for ; Wed, 25 Mar 2026 09:00:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20260325090032euoutp02143b10275c7bc5a0a3b31679a56f8141~gCfxSdKnQ0087600876euoutp02b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429232; bh=wwurihy1qMKafazYkjQUEhOehZg0+KQHoNwHol2qBYc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gxSREEvdokyuM4SJvoYNxRBCw5lJqnKxsVDEvWM8vPv+T0ROzMuuoUJpSVYpaS58c Y8AwYTshgbVkhx1d2g5lOXTl51tvwt0eyQioLsQNKunLt3jhQVTQkqE+Z672ZdpERL yC0g5fL8R1nNpgjHlQzpfEg3CwvoujmFLw42FFo8= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260325090032eucas1p1bf0dfc6d73868e576d829d9d2208672b~gCfw1aKZu1802018020eucas1p1t; Wed, 25 Mar 2026 09:00:32 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090031eusmtip187bfb06cefb9c4211a0093e10bb3ac8a~gCfwSg-9U3134631346eusmtip1N; Wed, 25 Mar 2026 09:00:31 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 3/7] of: reserved_mem: switch to ops based OF_DECLARE() Date: Wed, 25 Mar 2026 10:00:19 +0100 Message-Id: <20260325090023.3175348-4-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090032eucas1p1bf0dfc6d73868e576d829d9d2208672b X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090032eucas1p1bf0dfc6d73868e576d829d9d2208672b X-EPHeader: CA X-CMS-RootMailID: 20260325090032eucas1p1bf0dfc6d73868e576d829d9d2208672b References: <20260325090023.3175348-1-m.szyprowski@samsung.com> Move init function from OF_DECLARE() argument to the given reserved memory region ops structure and then pass that structure to the OF_DECLARE() initializer. This node_init callback is mandatory for the reserved mem driver. Such change makes it possible in the future to add more functions called by the generic code before given memory region is initialized and rmem object is created. Signed-off-by: Marek Szyprowski --- drivers/memory/tegra/tegra210-emc-table.c | 16 ++++++++-------- drivers/of/of_reserved_mem.c | 17 +++++++++++++---- include/linux/of_reserved_mem.h | 13 ++++++------- kernel/dma/coherent.c | 13 +++++++------ kernel/dma/contiguous.c | 15 ++++++++------- kernel/dma/swiotlb.c | 14 +++++++------- 6 files changed, 49 insertions(+), 39 deletions(-) diff --git a/drivers/memory/tegra/tegra210-emc-table.c b/drivers/memory/teg= ra/tegra210-emc-table.c index ac1d1e13482a..4b3c478b2743 100644 --- a/drivers/memory/tegra/tegra210-emc-table.c +++ b/drivers/memory/tegra/tegra210-emc-table.c @@ -70,20 +70,20 @@ static void tegra210_emc_table_device_release(struct re= served_mem *rmem, memunmap(timings); } =20 -static const struct reserved_mem_ops tegra210_emc_table_ops =3D { - .device_init =3D tegra210_emc_table_device_init, - .device_release =3D tegra210_emc_table_device_release, -}; - static int tegra210_emc_table_init(unsigned long node, struct reserved_mem *rmem) { pr_debug("Tegra210 EMC table at %pa, size %lu bytes\n", &rmem->base, (unsigned long)rmem->size); =20 - rmem->ops =3D &tegra210_emc_table_ops; - return 0; } + +static const struct reserved_mem_ops tegra210_emc_table_ops =3D { + .node_init =3D tegra210_emc_table_init, + .device_init =3D tegra210_emc_table_device_init, + .device_release =3D tegra210_emc_table_device_release, +}; + RESERVEDMEM_OF_DECLARE(tegra210_emc_table, "nvidia,tegra210-emc-table", - tegra210_emc_table_init); + &tegra210_emc_table_ops); diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 9aff460a0420..4dd0d6f6a4b0 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -480,8 +480,16 @@ static int __init __reserved_mem_alloc_size(unsigned l= ong node, const char *unam static const struct of_device_id __rmem_of_table_sentinel __used __section("__reservedmem_of_table_end"); =20 -/* - * __reserved_mem_init_node() - call region specific reserved memory init = code +/** + * __reserved_mem_init_node() - initialize a reserved memory region + * @rmem: reserved_mem structure to initialize + * @node: FDT node describing the reserved memory region + * + * This function iterates through the reserved memory drivers and calls the + * node_init callback for the compatible entry matching the node. On succe= ss, + * the operations pointer is stored in the reserved_mem structure. + * + * Return: 0 on success, -ENODEV if no compatible match found */ static int __init __reserved_mem_init_node(struct reserved_mem *rmem, unsigned long node) @@ -492,14 +500,15 @@ static int __init __reserved_mem_init_node(struct res= erved_mem *rmem, =20 for (i =3D __reservedmem_of_table; ret =3D=3D -ENODEV && i < &__rmem_of_table_sentinel; i++) { - reservedmem_of_init_fn initfn =3D i->data; + const struct reserved_mem_ops *ops =3D i->data; const char *compat =3D i->compatible; =20 if (!of_flat_dt_is_compatible(node, compat)) continue; =20 - ret =3D initfn(node, rmem); + ret =3D ops->node_init(node, rmem); if (ret =3D=3D 0) { + rmem->ops =3D ops; pr_info("initialized node %s, compatible id %s\n", rmem->name, compat); break; diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_me= m.h index 5159938bfe03..747a1e73d5dd 100644 --- a/include/linux/of_reserved_mem.h +++ b/include/linux/of_reserved_mem.h @@ -18,19 +18,17 @@ struct reserved_mem { }; =20 struct reserved_mem_ops { + int (*node_init)(unsigned long fdt_node, struct reserved_mem *rmem); int (*device_init)(struct reserved_mem *rmem, struct device *dev); void (*device_release)(struct reserved_mem *rmem, struct device *dev); }; =20 -typedef int (*reservedmem_of_init_fn)(unsigned long node, - struct reserved_mem *rmem); - #ifdef CONFIG_OF_RESERVED_MEM =20 -#define RESERVEDMEM_OF_DECLARE(name, compat, init) \ - _OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn) +#define RESERVEDMEM_OF_DECLARE(name, compat, ops) \ + _OF_DECLARE(reservedmem, name, compat, ops, struct reserved_mem_ops *) =20 int of_reserved_mem_device_init_by_idx(struct device *dev, struct device_node *np, int idx); @@ -48,8 +46,9 @@ int of_reserved_mem_region_count(const struct device_node= *np); =20 #else =20 -#define RESERVEDMEM_OF_DECLARE(name, compat, init) \ - _OF_DECLARE_STUB(reservedmem, name, compat, init, reservedmem_of_init_fn) +#define RESERVEDMEM_OF_DECLARE(name, compat, ops) \ + _OF_DECLARE_STUB(reservedmem, name, compat, ops, \ + struct reserved_mem_ops *) =20 static inline int of_reserved_mem_device_init_by_idx(struct device *dev, struct device_node *np, int idx) diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c index 64f9ba618e19..bcdc0f76d2e8 100644 --- a/kernel/dma/coherent.c +++ b/kernel/dma/coherent.c @@ -362,10 +362,6 @@ static void rmem_dma_device_release(struct reserved_me= m *rmem, dev->dma_mem =3D NULL; } =20 -static const struct reserved_mem_ops rmem_dma_ops =3D { - .device_init =3D rmem_dma_device_init, - .device_release =3D rmem_dma_device_release, -}; =20 static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *= rmem) { @@ -388,7 +384,6 @@ static int __init rmem_dma_setup(unsigned long node, st= ruct reserved_mem *rmem) } #endif =20 - rmem->ops =3D &rmem_dma_ops; pr_info("Reserved memory: created DMA memory pool at %pa, size %ld MiB\n", &rmem->base, (unsigned long)rmem->size / SZ_1M); return 0; @@ -405,5 +400,11 @@ static int __init dma_init_reserved_memory(void) core_initcall(dma_init_reserved_memory); #endif /* CONFIG_DMA_GLOBAL_POOL */ =20 -RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", rmem_dma_setup); +static const struct reserved_mem_ops rmem_dma_ops =3D { + .node_init =3D rmem_dma_setup, + .device_init =3D rmem_dma_device_init, + .device_release =3D rmem_dma_device_release, +}; + +RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", &rmem_dma_ops); #endif diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index e6fc6906b5c0..efeebda92537 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -470,11 +470,6 @@ static void rmem_cma_device_release(struct reserved_me= m *rmem, dev->cma_area =3D NULL; } =20 -static const struct reserved_mem_ops rmem_cma_ops =3D { - .device_init =3D rmem_cma_device_init, - .device_release =3D rmem_cma_device_release, -}; - static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *= rmem) { bool default_cma =3D of_get_flat_dt_prop(node, "linux,cma-default", NULL); @@ -499,7 +494,6 @@ static int __init rmem_cma_setup(unsigned long node, st= ruct reserved_mem *rmem) if (default_cma) dma_contiguous_default_area =3D cma; =20 - rmem->ops =3D &rmem_cma_ops; rmem->priv =3D cma; =20 pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n", @@ -511,5 +505,12 @@ static int __init rmem_cma_setup(unsigned long node, s= truct reserved_mem *rmem) =20 return 0; } -RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup); + +static const struct reserved_mem_ops rmem_cma_ops =3D { + .node_init =3D rmem_cma_setup, + .device_init =3D rmem_cma_device_init, + .device_release =3D rmem_cma_device_release, +}; + +RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", &rmem_cma_ops); #endif diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 2f53d8c599d1..9a15e7231e39 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -1877,11 +1877,6 @@ static void rmem_swiotlb_device_release(struct reser= ved_mem *rmem, dev->dma_io_tlb_mem =3D &io_tlb_default_mem; } =20 -static const struct reserved_mem_ops rmem_swiotlb_ops =3D { - .device_init =3D rmem_swiotlb_device_init, - .device_release =3D rmem_swiotlb_device_release, -}; - static int __init rmem_swiotlb_setup(unsigned long node, struct reserved_mem *rmem) { @@ -1891,11 +1886,16 @@ static int __init rmem_swiotlb_setup(unsigned long = node, of_get_flat_dt_prop(node, "no-map", NULL)) return -EINVAL; =20 - rmem->ops =3D &rmem_swiotlb_ops; pr_info("Reserved memory: created restricted DMA pool at %pa, size %ld Mi= B\n", &rmem->base, (unsigned long)rmem->size / SZ_1M); return 0; } =20 -RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", rmem_swiotlb_setup); +static const struct reserved_mem_ops rmem_swiotlb_ops =3D { + .node_init =3D rmem_swiotlb_setup, + .device_init =3D rmem_swiotlb_device_init, + .device_release =3D rmem_swiotlb_device_release, +}; + +RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", &rmem_swiotlb_ops); #endif /* CONFIG_DMA_RESTRICTED_POOL */ --=20 2.34.1 From nobody Fri Apr 3 01:48:27 2026 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 871CC34F479 for ; Wed, 25 Mar 2026 09:00:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429240; cv=none; b=SyGm/R8riuNH7QSZrQRk4XekphT9GUI5A1f9RBYsWudaX0JeX4q8qpua0xqs0YJm2MbGt6g+ISQpWlwdj2jpyzaNGUhZGoMTvN6liyCvvY/VKtQVFwVEx3AT1o1dh0YlvE/s0PpdpRPJa8zvr9lF2RyErpmi0t3yR8YjmHKcfSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429240; c=relaxed/simple; bh=H1QeChsqxqPPbSsJMn8Dg5QKXclIAnxnA6ww5X3jya4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=Ugj83a8RgS7D3b+vMkBKHzPNGvffEV8BEkAZBTXWoCXzjA0uVcZcpbPSP/GzixhWf66x2DSuk3kCD1AvmWKtV7UiwzznSMXW0q+tdI7OjzTjHGflkiDrno3sgIgItSdg9k5URZB03wmwRO5HiIQkdXIfT3sS/ww3ZiPwBWzA7HE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=Rlvk+wjg; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="Rlvk+wjg" Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090033euoutp015e3287cef84e3a222f981ee1244f06c8~gCfx3Y5NG2584925849euoutp01Q for ; Wed, 25 Mar 2026 09:00:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20260325090033euoutp015e3287cef84e3a222f981ee1244f06c8~gCfx3Y5NG2584925849euoutp01Q DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429233; bh=pOJryLnOtYsywUhUMvO96tgOjruDrEYpbGDb5AdNkWs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Rlvk+wjgyCYtCSxN5Tk+vIePDGniDV9lB5uQekzbWGFTqhfwnMUJq5rL9tZuWFCLu otuFRHFaRIY22AWjR13DlgyOCPZSJ8cl4+0gkx/xTUP921o4IYNxbPcmSfVAc2OSyR CFyvEnkGsGiSh34YHRqsLWOxq5BfOjsbhwbj+t4s= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20260325090032eucas1p27b9ce5fce5014a7d9d9ef2163f0bffd0~gCfxdRkLL1848518485eucas1p2K; Wed, 25 Mar 2026 09:00:32 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090032eusmtip12b607a260e827a127ce3c05108bb6768~gCfw7EZwN0388903889eusmtip1r; Wed, 25 Mar 2026 09:00:32 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 4/7] of: reserved_mem: replace CMA quirks by generic methods Date: Wed, 25 Mar 2026 10:00:20 +0100 Message-Id: <20260325090023.3175348-5-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090032eucas1p27b9ce5fce5014a7d9d9ef2163f0bffd0 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090032eucas1p27b9ce5fce5014a7d9d9ef2163f0bffd0 X-EPHeader: CA X-CMS-RootMailID: 20260325090032eucas1p27b9ce5fce5014a7d9d9ef2163f0bffd0 References: <20260325090023.3175348-1-m.szyprowski@samsung.com> Add optional reserved memory callbacks to perform region verification and early fixup, then move all CMA related code in of_reserved_mem.c to them. Signed-off-by: Marek Szyprowski --- drivers/of/of_reserved_mem.c | 118 ++++++++++++++++++++++---------- include/linux/cma.h | 10 --- include/linux/dma-map-ops.h | 3 - include/linux/of_reserved_mem.h | 3 + kernel/dma/contiguous.c | 70 ++++++++++++++----- 5 files changed, 137 insertions(+), 67 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 4dd0d6f6a4b0..5dd585bcf8a8 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -24,8 +24,6 @@ #include #include #include -#include -#include =20 #include "of_private.h" =20 @@ -106,6 +104,11 @@ static void __init alloc_reserved_mem_array(void) =20 static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem, unsigned long node); +static int fdt_validate_reserved_mem_node(unsigned long node, + phys_addr_t *align); +static int fdt_fixup_reserved_mem_node(unsigned long node, + phys_addr_t base, phys_addr_t size); + /* * fdt_reserved_mem_save_node() - save fdt node for second pass initializa= tion */ @@ -154,21 +157,19 @@ static int __init __reserved_mem_reserve_reg(unsigned= long node, const char *uname) { phys_addr_t base, size; - int i, len; + int i, len, err; const __be32 *prop; - bool nomap, default_cma; + bool nomap; =20 prop =3D of_flat_dt_get_addr_size_prop(node, "reg", &len); if (!prop) return -ENOENT; =20 nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; - default_cma =3D of_get_flat_dt_prop(node, "linux,cma-default", NULL); =20 - if (default_cma && cma_skip_dt_default_reserved_mem()) { - pr_err("Skipping dt linux,cma-default for \"cma=3D\" kernel param.\n"); - return -EINVAL; - } + 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; @@ -179,10 +180,7 @@ static int __init __reserved_mem_reserve_reg(unsigned = long node, size =3D s; =20 if (size && early_init_dt_reserve_memory(base, size, nomap) =3D=3D 0) { - /* Architecture specific contiguous memory fixup. */ - if (of_flat_dt_is_compatible(node, "shared-dma-pool") && - of_get_flat_dt_prop(node, "reusable", NULL)) - dma_contiguous_early_fixup(base, size); + 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 { @@ -253,17 +251,19 @@ void __init fdt_scan_reserved_mem_reg_nodes(void) =20 fdt_for_each_subnode(child, fdt, node) { const char *uname; - bool default_cma =3D of_get_flat_dt_prop(child, "linux,cma-default", NUL= L); u64 b, s; + int ret; =20 if (!of_fdt_device_is_available(fdt, child)) continue; - if (default_cma && cma_skip_dt_default_reserved_mem()) - continue; =20 if (!of_flat_dt_get_addr_size(child, "reg", &b, &s)) continue; =20 + ret =3D fdt_validate_reserved_mem_node(child, NULL); + if (ret && ret !=3D -ENODEV) + continue; + base =3D b; size =3D s; =20 @@ -397,7 +397,7 @@ static int __init __reserved_mem_alloc_size(unsigned lo= ng node, const char *unam phys_addr_t base =3D 0, align =3D 0, size; int i, len; const __be32 *prop; - bool nomap, default_cma; + bool nomap; int ret; =20 prop =3D of_get_flat_dt_prop(node, "size", &len); @@ -421,19 +421,10 @@ static int __init __reserved_mem_alloc_size(unsigned = long node, const char *unam } =20 nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; - default_cma =3D of_get_flat_dt_prop(node, "linux,cma-default", NULL); - - if (default_cma && cma_skip_dt_default_reserved_mem()) { - pr_err("Skipping dt linux,cma-default for \"cma=3D\" kernel param.\n"); - return -EINVAL; - } =20 - /* Need adjust the alignment to satisfy the CMA requirement */ - if (IS_ENABLED(CONFIG_CMA) - && of_flat_dt_is_compatible(node, "shared-dma-pool") - && of_get_flat_dt_prop(node, "reusable", NULL) - && !nomap) - align =3D max_t(phys_addr_t, align, CMA_MIN_ALIGNMENT_BYTES); + ret =3D fdt_validate_reserved_mem_node(node, &align); + if (ret && ret !=3D -ENODEV) + return ret; =20 prop =3D of_flat_dt_get_addr_size_prop(node, "alloc-ranges", &len); if (prop) { @@ -468,18 +459,76 @@ static int __init __reserved_mem_alloc_size(unsigned = long node, const char *unam uname, (unsigned long)(size / SZ_1M)); return -ENOMEM; } - /* Architecture specific contiguous memory fixup. */ - if (of_flat_dt_is_compatible(node, "shared-dma-pool") && - of_get_flat_dt_prop(node, "reusable", NULL)) - dma_contiguous_early_fixup(base, size); + + fdt_fixup_reserved_mem_node(node, base, size); + /* Save region in the reserved_mem array */ fdt_reserved_mem_save_node(node, uname, base, size); return 0; } =20 +extern const struct of_device_id __reservedmem_of_table[]; static const struct of_device_id __rmem_of_table_sentinel __used __section("__reservedmem_of_table_end"); =20 +/** + * fdt_fixup_reserved_mem_node() - call fixup function for a reserved memo= ry node + * @node: FDT node to fixup + * @base: base address of the reserved memory region + * @size: size of the reserved memory region + * + * This function iterates through the reserved memory drivers and calls + * the node_fixup callback for the compatible entry matching the node. + * + * Return: 0 on success, -ENODEV if no compatible match found + */ +static int __init fdt_fixup_reserved_mem_node(unsigned long node, + phys_addr_t base, phys_addr_t size) +{ + const struct of_device_id *i; + int ret =3D -ENODEV; + + for (i =3D __reservedmem_of_table; ret =3D=3D -ENODEV && + i < &__rmem_of_table_sentinel; i++) { + const struct reserved_mem_ops *ops =3D i->data; + + if (!of_flat_dt_is_compatible(node, i->compatible)) + continue; + + if (ops->node_fixup) + ret =3D ops->node_fixup(node, base, size); + } + return ret; +} + +/** + * fdt_validate_reserved_mem_node() - validate a reserved memory node + * @node: FDT node to validate + * @align: pointer to store the validated alignment (may be modified by ca= llback) + * + * This function iterates through the reserved memory drivers and calls + * the node_validate callback for the compatible entry matching the node. + * + * Return: 0 on success, -ENODEV if no compatible match found + */ +static int __init fdt_validate_reserved_mem_node(unsigned long node, phys_= addr_t *align) +{ + const struct of_device_id *i; + int ret =3D -ENODEV; + + for (i =3D __reservedmem_of_table; ret =3D=3D -ENODEV && + i < &__rmem_of_table_sentinel; i++) { + const struct reserved_mem_ops *ops =3D i->data; + + if (!of_flat_dt_is_compatible(node, i->compatible)) + continue; + + if (ops->node_validate) + ret =3D ops->node_validate(node, align); + } + return ret; +} + /** * __reserved_mem_init_node() - initialize a reserved memory region * @rmem: reserved_mem structure to initialize @@ -494,7 +543,6 @@ static const struct of_device_id __rmem_of_table_sentin= el static int __init __reserved_mem_init_node(struct reserved_mem *rmem, unsigned long node) { - extern const struct of_device_id __reservedmem_of_table[]; const struct of_device_id *i; int ret =3D -ENODEV; =20 @@ -511,7 +559,7 @@ static int __init __reserved_mem_init_node(struct reser= ved_mem *rmem, rmem->ops =3D ops; pr_info("initialized node %s, compatible id %s\n", rmem->name, compat); - break; + return ret; } } return ret; diff --git a/include/linux/cma.h b/include/linux/cma.h index d0793eaaadaa..8555d38a97b1 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -61,14 +61,4 @@ extern int cma_for_each_area(int (*it)(struct cma *cma, = void *data), void *data) extern bool cma_intersects(struct cma *cma, unsigned long start, unsigned = long end); =20 extern void cma_reserve_pages_on_error(struct cma *cma); - -#ifdef CONFIG_DMA_CMA -extern bool cma_skip_dt_default_reserved_mem(void); -#else -static inline bool cma_skip_dt_default_reserved_mem(void) -{ - return false; -} -#endif - #endif diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index 8a07df5a9ef6..d0642a6bc985 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -147,9 +147,6 @@ static inline void dma_free_contiguous(struct device *d= ev, struct page *page, { __free_pages(page, get_order(size)); } -static inline void dma_contiguous_early_fixup(phys_addr_t base, unsigned l= ong size) -{ -} #endif /* CONFIG_DMA_CMA*/ =20 #ifdef CONFIG_DMA_DECLARE_COHERENT diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_me= m.h index 747a1e73d5dd..e8b20b29fa68 100644 --- a/include/linux/of_reserved_mem.h +++ b/include/linux/of_reserved_mem.h @@ -18,6 +18,9 @@ struct reserved_mem { }; =20 struct reserved_mem_ops { + int (*node_validate)(unsigned long fdt_node, phys_addr_t *align); + int (*node_fixup)(unsigned long fdt_node, phys_addr_t base, + phys_addr_t size); int (*node_init)(unsigned long fdt_node, struct reserved_mem *rmem); int (*device_init)(struct reserved_mem *rmem, struct device *dev); diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index efeebda92537..65d216663e81 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -91,16 +91,6 @@ static int __init early_cma(char *p) } early_param("cma", early_cma); =20 -/* - * cma_skip_dt_default_reserved_mem - This is called from the - * reserved_mem framework to detect if the default cma region is being - * set by the "cma=3D" kernel parameter. - */ -bool __init cma_skip_dt_default_reserved_mem(void) -{ - return size_cmdline !=3D -1; -} - #ifdef CONFIG_DMA_NUMA_CMA =20 static struct cma *dma_contiguous_numa_area[MAX_NUMNODES]; @@ -470,25 +460,65 @@ static void rmem_cma_device_release(struct reserved_m= em *rmem, dev->cma_area =3D NULL; } =20 +static int __init __rmem_cma_verify_node(unsigned long node) +{ + if (!of_get_flat_dt_prop(node, "reusable", NULL) || + of_get_flat_dt_prop(node, "no-map", NULL)) + return -ENODEV; + + if (size_cmdline !=3D -1 && + of_get_flat_dt_prop(node, "linux,cma-default", NULL)) { + pr_err("Skipping dt linux,cma-default node in favor for \"cma=3D\" kerne= l param.\n"); + return -EBUSY; + } + return 0; +} + +static int __init rmem_cma_validate(unsigned long node, phys_addr_t *align) +{ + int ret =3D __rmem_cma_verify_node(node); + + if (ret) + return ret; + + if (align) + *align =3D max_t(phys_addr_t, *align, CMA_MIN_ALIGNMENT_BYTES); + + return 0; +} + +static int __init rmem_cma_fixup(unsigned long node, phys_addr_t base, + phys_addr_t size) +{ + int ret =3D __rmem_cma_verify_node(node); + + if (ret) + return ret; + + /* Architecture specific contiguous memory fixup. */ + dma_contiguous_early_fixup(base, size); + return 0; +} + static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *= rmem) { bool default_cma =3D of_get_flat_dt_prop(node, "linux,cma-default", NULL); struct cma *cma; - int err; + int ret; =20 - if (!of_get_flat_dt_prop(node, "reusable", NULL) || - of_get_flat_dt_prop(node, "no-map", NULL)) - return -ENODEV; + ret =3D __rmem_cma_verify_node(node); + if (ret) + return ret; =20 if (!IS_ALIGNED(rmem->base | rmem->size, CMA_MIN_ALIGNMENT_BYTES)) { pr_err("Reserved memory: incorrect alignment of CMA region\n"); return -EINVAL; } =20 - err =3D cma_init_reserved_mem(rmem->base, rmem->size, 0, rmem->name, &cma= ); - if (err) { + ret =3D cma_init_reserved_mem(rmem->base, rmem->size, 0, rmem->name, &cma= ); + if (ret) { pr_err("Reserved memory: unable to setup CMA region\n"); - return err; + return ret; } =20 if (default_cma) @@ -499,14 +529,16 @@ static int __init rmem_cma_setup(unsigned long node, = struct reserved_mem *rmem) pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n", &rmem->base, (unsigned long)rmem->size / SZ_1M); =20 - err =3D dma_heap_cma_register_heap(cma); - if (err) + ret =3D dma_heap_cma_register_heap(cma); + if (ret) pr_warn("Couldn't register CMA heap."); =20 return 0; } =20 static const struct reserved_mem_ops rmem_cma_ops =3D { + .node_validate =3D rmem_cma_validate, + .node_fixup =3D rmem_cma_fixup, .node_init =3D rmem_cma_setup, .device_init =3D rmem_cma_device_init, .device_release =3D rmem_cma_device_release, --=20 2.34.1 From nobody Fri Apr 3 01:48:27 2026 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02E613502AA for ; Wed, 25 Mar 2026 09:00:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429239; cv=none; b=DsMLfx7YUO/TjNO8Asw/iiR+cFw6py2fL9jIYxPu8XONlt42ZQfN/eFlcxhCzZUx2peyau+vU2srxfaNUfr9oYnOwMprqQaeEHmh6BlgW4w3lPBQCotVoXqKqP1LE+3AQ+OL/NXuVLnBt0/k5vhEDCTnbxi3zGlRwexKO0aF2wM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429239; c=relaxed/simple; bh=qaAekJTzU7B9Xp63BJnfPlzU4jaUAFahslZK0am8744=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=FhX3t2ybF3Y05haGvNjlNzPifvVniz8D/QDSSB+P2WT86AlN8gVfTXeBhJthjW8GqChQshpfS0b8Gs9eCrRBwSPHhE4LV53tHorfADJw477GxiUrCnpfqoP1axugoFCTJc8tY/0BhFC3JqfRHwHX83/0mJkdh5JCZA99xV1fHYA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=vJh1PR6R; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="vJh1PR6R" Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090033euoutp01009ead8817d47713971dcbc08a30a4ec~gCfycUNbK2273022730euoutp01G for ; Wed, 25 Mar 2026 09:00:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20260325090033euoutp01009ead8817d47713971dcbc08a30a4ec~gCfycUNbK2273022730euoutp01G DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429233; bh=7VLOktVyCw/sFKOWYlySyASENC5MrPmRSGXG0sIJP9g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vJh1PR6R/JJrJQT0Yy9l+oeTPEAESSNCukDx8KwAlQ0GZ83nScB+YYStOxYHarYF5 38ruH8knTj16gvDc6w1pszGt9x+8I83y9dwgNu42HujE/IEf4c04y2aRycomHynjls Ylhjzmkrrf/26hDTlzhr2iz+5tJvJmZYcQvMZGnQ= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260325090033eucas1p1715349936f9737a7bc7968351fcab7f5~gCfyEzQz70601006010eucas1p15; Wed, 25 Mar 2026 09:00:33 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090032eusmtip1584a0042647e55c92d56f1e00b3a2c3d~gCfxiiw4T0281802818eusmtip1-; Wed, 25 Mar 2026 09:00:32 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 5/7] of: reserved_mem: rearrange code a bit Date: Wed, 25 Mar 2026 10:00:21 +0100 Message-Id: <20260325090023.3175348-6-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090033eucas1p1715349936f9737a7bc7968351fcab7f5 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090033eucas1p1715349936f9737a7bc7968351fcab7f5 X-EPHeader: CA X-CMS-RootMailID: 20260325090033eucas1p1715349936f9737a7bc7968351fcab7f5 References: <20260325090023.3175348-1-m.szyprowski@samsung.com> Move __rmem_check_for_overlap() and __rmem_cmp() functions before fdt_scan_reserved_mem_reg_nodes() to avoid forward declaration and keep related code close together. Signed-off-by: Marek Szyprowski --- drivers/of/of_reserved_mem.c | 99 ++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 5dd585bcf8a8..f9b6d3ebcc20 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -214,7 +214,55 @@ static int __init __reserved_mem_check_root(unsigned l= ong node) return 0; } =20 -static void __init __rmem_check_for_overlap(void); +static int __init __rmem_cmp(const void *a, const void *b) +{ + const struct reserved_mem *ra =3D a, *rb =3D b; + + if (ra->base < rb->base) + return -1; + + if (ra->base > rb->base) + return 1; + + /* + * Put the dynamic allocations (address =3D=3D 0, size =3D=3D 0) before s= tatic + * allocations at address 0x0 so that overlap detection works + * correctly. + */ + if (ra->size < rb->size) + return -1; + if (ra->size > rb->size) + return 1; + + return 0; +} + +static void __init __rmem_check_for_overlap(void) +{ + int i; + + if (reserved_mem_count < 2) + return; + + sort(reserved_mem, reserved_mem_count, sizeof(reserved_mem[0]), + __rmem_cmp, NULL); + for (i =3D 0; i < reserved_mem_count - 1; i++) { + struct reserved_mem *this, *next; + + this =3D &reserved_mem[i]; + next =3D &reserved_mem[i + 1]; + + if (this->base + this->size > next->base) { + phys_addr_t this_end, next_end; + + this_end =3D this->base + this->size; + next_end =3D next->base + next->size; + pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n", + this->name, &this->base, &this_end, + next->name, &next->base, &next_end); + } + } +} =20 /** * fdt_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined @@ -565,55 +613,6 @@ static int __init __reserved_mem_init_node(struct rese= rved_mem *rmem, return ret; } =20 -static int __init __rmem_cmp(const void *a, const void *b) -{ - const struct reserved_mem *ra =3D a, *rb =3D b; - - if (ra->base < rb->base) - return -1; - - if (ra->base > rb->base) - return 1; - - /* - * Put the dynamic allocations (address =3D=3D 0, size =3D=3D 0) before s= tatic - * allocations at address 0x0 so that overlap detection works - * correctly. - */ - if (ra->size < rb->size) - return -1; - if (ra->size > rb->size) - return 1; - - return 0; -} - -static void __init __rmem_check_for_overlap(void) -{ - int i; - - if (reserved_mem_count < 2) - return; - - sort(reserved_mem, reserved_mem_count, sizeof(reserved_mem[0]), - __rmem_cmp, NULL); - for (i =3D 0; i < reserved_mem_count - 1; i++) { - struct reserved_mem *this, *next; - - this =3D &reserved_mem[i]; - next =3D &reserved_mem[i + 1]; - - if (this->base + this->size > next->base) { - phys_addr_t this_end, next_end; - - this_end =3D this->base + this->size; - next_end =3D next->base + next->size; - pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n", - this->name, &this->base, &this_end, - next->name, &next->base, &next_end); - } - } -} =20 /** * fdt_init_reserved_mem_node() - Initialize a reserved memory region --=20 2.34.1 From nobody Fri Apr 3 01:48:27 2026 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02D2F3502A4 for ; Wed, 25 Mar 2026 09:00:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429239; cv=none; b=GbdUKC4kvwrh2rXsRuoKsWYN0dNqc2+CYBSlPERGhj7nEDwQqWjIv6dV/RqdeYfNd+5cLRDQTnIi07NGPyohUE9oI3aSM8PhHkZTofe095ksbjPTRFjKhSErWZx4nP56cT6Dh9JACZyYQCKwbCi/g0zT572FxB4BvTJa1f/qUrc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429239; c=relaxed/simple; bh=nsgAlWuKaSJxQgydmdcmYOzjIpY72npbYNgK+fAINDQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=KWq/HkjMsJanNTojBNrPs0h8JdWrpNT0ZFbbZgsO6iOj5ohKtTcmVS8lgxqBVQH1CBJXG1z1SbobecUX6ME5+6flrzT5xUe7IItNBG0Ajt6vlg+uL9pd42MD25mcvnLpvF8TnSzWql4Z4dKE8HmjOsRNpp37P7A/WqmCEmyUK/U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=O+R8hPse; arc=none smtp.client-ip=210.118.77.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="O+R8hPse" Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090034euoutp01929341d829c860209824df4a73a05665~gCfzD5E1F2262222622euoutp01N for ; Wed, 25 Mar 2026 09:00:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20260325090034euoutp01929341d829c860209824df4a73a05665~gCfzD5E1F2262222622euoutp01N DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429234; bh=d+89c32tU4lTTTppNlFl+vXaQCaUGhisq2Ypb82nMCo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O+R8hPsenLyzl0FkSCF0zsxaWOjqsB2sn2m6zYEGWn/RoU523pfK0Y3UReyR8ZDsS /hlkReXM02nvJGlnVmWxD2aAhCXNrdZpnHs7Ry1BaYLzK2bvm6mfADxMTsxKamcUVu Y4xy2NwxGgtKwF/E3Z9Y+pacgHdsL/OIF4Q/nEuo= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260325090034eucas1p17e2eefa714bbc8cd4828a7e88c2dbfd3~gCfytXeNy1762717627eucas1p1k; Wed, 25 Mar 2026 09:00:34 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090033eusmtip154597783022f9c979a4fa8fc7bb4a0d4~gCfyKkZO_0170001700eusmtip1T; Wed, 25 Mar 2026 09:00:33 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 6/7] of: reserved_mem: clarify fdt_scan_reserved_mem*() functions Date: Wed, 25 Mar 2026 10:00:22 +0100 Message-Id: <20260325090023.3175348-7-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090034eucas1p17e2eefa714bbc8cd4828a7e88c2dbfd3 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090034eucas1p17e2eefa714bbc8cd4828a7e88c2dbfd3 X-EPHeader: CA X-CMS-RootMailID: 20260325090034eucas1p17e2eefa714bbc8cd4828a7e88c2dbfd3 References: <20260325090023.3175348-1-m.szyprowski@samsung.com> Rename fdt_scan_reserved_mem_reg_nodes() to fdt_scan_reserved_mem_late() to clearly show how it differs from fdt_scan_reserved_mem() and update description of both functions. Signed-off-by: Marek Szyprowski --- drivers/of/fdt.c | 2 +- drivers/of/of_private.h | 2 +- drivers/of/of_reserved_mem.c | 24 +++++++++++++++--------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 2967e4aff807..104e697bee7b 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -1295,7 +1295,7 @@ void __init unflatten_device_tree(void) void *fdt =3D initial_boot_params; =20 /* Save the statically-placed regions in the reserved_mem array */ - fdt_scan_reserved_mem_reg_nodes(); + fdt_scan_reserved_mem_late(); =20 /* Populate an empty root node when bootloader doesn't provide one */ if (!fdt) { diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h index df0bb00349e0..0ae16da066e2 100644 --- a/drivers/of/of_private.h +++ b/drivers/of/of_private.h @@ -186,7 +186,7 @@ static inline struct device_node *__of_get_dma_parent(c= onst struct device_node * #endif =20 int fdt_scan_reserved_mem(void); -void __init fdt_scan_reserved_mem_reg_nodes(void); +void __init fdt_scan_reserved_mem_late(void); =20 bool of_fdt_device_is_available(const void *blob, unsigned long node); =20 diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index f9b6d3ebcc20..037e3d74dde1 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -265,16 +265,15 @@ static void __init __rmem_check_for_overlap(void) } =20 /** - * fdt_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined - * reserved memory regions. + * fdt_scan_reserved_mem_late() - Scan FDT and initialize remaining reserv= ed + * memory regions. * - * This function is used to scan through the DT and store the - * information for the reserved memory regions that are defined using - * the "reg" property. The region node number, name, base address, and - * size are all stored in the reserved_mem array by calling the - * fdt_reserved_mem_save_node() function. + * This function is used to scan again through the DT and initialize the + * "static" reserved memory regions, that are defined using the "reg" + * property. Each such region is then initialized with its specific init + * function and stored in the global reserved_mem array. */ -void __init fdt_scan_reserved_mem_reg_nodes(void) +void __init fdt_scan_reserved_mem_late(void) { const void *fdt =3D initial_boot_params; phys_addr_t base, size; @@ -328,7 +327,14 @@ void __init fdt_scan_reserved_mem_reg_nodes(void) static int __init __reserved_mem_alloc_size(unsigned long node, const char= *uname); =20 /* - * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory + * fdt_scan_reserved_mem() - reserve and allocate memory occupied by + * reserved memory regions. + * + * This function is used to scan through the FDT and mark memory occupied + * by all static (defined by the "reg" property) reserved memory regions. + * Then memory for all dynamic regions (defined by size & alignment) is + * allocated, a region specific init function is called and region informa= tion + * is stored in the reserved_mem array. */ int __init fdt_scan_reserved_mem(void) { --=20 2.34.1 From nobody Fri Apr 3 01:48:27 2026 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25732322B7B for ; Wed, 25 Mar 2026 09:00:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429240; cv=none; b=VhT5pMZl1SQCfQInzKH4sTK/XLA7lH2ILaSns0aUm2fM04TLsym81xC9FIzj2Myuogs/WCcwW9tfEIfNoojEWfcz/d5KqfDNv81ZWaZUABv8c2mbyqJaIgr60JSiCSFJXL6OIMjQEeODuIg5wctYVuIQCOWBTAnTmACIc/VINDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429240; c=relaxed/simple; bh=P3AMQcGHZ8YR9ZVybND3kBp0O9Gr5HyF4BZhB4a6bUo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:MIME-Version: Content-Type:References; b=c7l/ULWqDBAGF7a1CiyBPFOLZu21RXMBZYGzW7hqACSCouPrqoJLttpq22dUtF6/hcn3dlkCpQcYsDzA8g4OTBxOjPu1c26JaU48hMIdm0Pa/YqssZ7OCjTyWlNFs0RNyMwFmGl/lupE9Cw4Zg2ZBoOEOrSuuIpbrE2Xw4Y0qkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=ivAGQBxD; arc=none smtp.client-ip=210.118.77.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="ivAGQBxD" Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20260325090034euoutp02abaf7aacbc96aef98fbe9209121030f6~gCfzk2cWS0097900979euoutp02G for ; Wed, 25 Mar 2026 09:00:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20260325090034euoutp02abaf7aacbc96aef98fbe9209121030f6~gCfzk2cWS0097900979euoutp02G DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1774429234; bh=VJvoL7Svez6wRSfUGCmBuRi8m+f/G0Wc/DykecDJV2k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ivAGQBxDvj1e/LcGA0Bnu3dhxJuZBzp4M50oH5+6E4DArMz/uHngUdD86AE9LeJHH OXmv5T08PnWBDe8tdbqg5gTg2SnZvZqDytFG6Kss0aytHGJ6g34RCOiYvl2bJo6kgv 5E2uKEWqIPu7qiux7fKT1zXT+dcmMuXs6s0Ee/zE= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20260325090034eucas1p2fb10744edcc6cf8550e9855973492a00~gCfzU3Jn23169331693eucas1p2i; Wed, 25 Mar 2026 09:00:34 +0000 (GMT) Received: from AMDC4653.digital.local (unknown [106.120.51.32]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260325090034eusmtip15244f1412a032a5a834b55e8229409f2~gCfyy4X3J0318403184eusmtip1m; Wed, 25 Mar 2026 09:00:34 +0000 (GMT) From: Marek Szyprowski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mm@kvack.org, iommu@lists.linux.dev Cc: Marek Szyprowski , Rob Herring , Krzysztof Kozlowski , Oreoluwa Babatunde , Saravana Kannan , Andrew Morton , Robin Murphy Subject: [PATCH v3 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node() Date: Wed, 25 Mar 2026 10:00:23 +0100 Message-Id: <20260325090023.3175348-8-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260325090023.3175348-1-m.szyprowski@samsung.com> 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 X-CMS-MailID: 20260325090034eucas1p2fb10744edcc6cf8550e9855973492a00 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260325090034eucas1p2fb10744edcc6cf8550e9855973492a00 X-EPHeader: CA X-CMS-RootMailID: 20260325090034eucas1p2fb10744edcc6cf8550e9855973492a00 References: <20260325090023.3175348-1-m.szyprowski@samsung.com> Move the content of fdt_reserved_mem_save_node() to fdt_init_reserved_mem_node() function. Initialization is no longer performed in two steps as it was initially, so fdt_reserved_mem_save_node() name is a bit misleading and that function now performs full initialization of the reserved memory region. This also fixes the problem of keeping pointers to the regions, which failed to initialize, what might cause issues when such region is assigned to the device. Signed-off-by: Marek Szyprowski --- drivers/of/of_reserved_mem.c | 62 ++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 037e3d74dde1..8d5777cb5d1b 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -102,36 +102,13 @@ static void __init alloc_reserved_mem_array(void) reserved_mem =3D new_array; } =20 -static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem, - unsigned long node); +static void fdt_init_reserved_mem_node(unsigned long node, const char *una= me, + phys_addr_t base, phys_addr_t size); static int fdt_validate_reserved_mem_node(unsigned long node, phys_addr_t *align); static int fdt_fixup_reserved_mem_node(unsigned long node, phys_addr_t base, phys_addr_t size); =20 -/* - * fdt_reserved_mem_save_node() - save fdt node for second pass initializa= tion - */ -static void __init fdt_reserved_mem_save_node(unsigned long node, const ch= ar *uname, - phys_addr_t base, phys_addr_t size) -{ - struct reserved_mem *rmem =3D &reserved_mem[reserved_mem_count]; - - if (reserved_mem_count =3D=3D total_reserved_mem_cnt) { - pr_err("not enough space for all defined regions.\n"); - return; - } - - rmem->name =3D uname; - rmem->base =3D base; - rmem->size =3D size; - - /* Call the region specific initialization function */ - fdt_init_reserved_mem_node(rmem, node); - - reserved_mem_count++; -} - static int __init early_init_dt_reserve_memory(phys_addr_t base, phys_addr_t size, bool nomap) { @@ -316,7 +293,7 @@ void __init fdt_scan_reserved_mem_late(void) =20 if (size) { uname =3D fdt_get_name(fdt, child, NULL); - fdt_reserved_mem_save_node(child, uname, base, size); + fdt_init_reserved_mem_node(child, uname, base, size); } } =20 @@ -515,9 +492,8 @@ static int __init __reserved_mem_alloc_size(unsigned lo= ng node, const char *unam } =20 fdt_fixup_reserved_mem_node(node, base, size); + fdt_init_reserved_mem_node(node, uname, base, size); =20 - /* Save region in the reserved_mem array */ - fdt_reserved_mem_save_node(node, uname, base, size); return 0; } =20 @@ -619,30 +595,46 @@ static int __init __reserved_mem_init_node(struct res= erved_mem *rmem, return ret; } =20 - /** * fdt_init_reserved_mem_node() - Initialize a reserved memory region - * @rmem: reserved_mem struct of the memory region to be initialized. * @node: fdt node of the initialized region + * @uname: name of the reserved memory node + * @base: base address of the reserved memory region + * @size: size of the reserved memory region * - * This function is used to call the region specific initialization - * function for a reserved memory region. + * This function calls the region-specific initialization function for a + * reserved memory region and saves all region-specific data to the + * reserved_mem array to allow of_reserved_mem_lookup() to find it. */ -static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem, - unsigned long node) +static void __init fdt_init_reserved_mem_node(unsigned long node, const ch= ar *uname, + phys_addr_t base, phys_addr_t size) { int err =3D 0; bool nomap; =20 + struct reserved_mem *rmem =3D &reserved_mem[reserved_mem_count]; + + if (reserved_mem_count =3D=3D total_reserved_mem_cnt) { + pr_err("not enough space for all defined regions.\n"); + return; + } + + rmem->name =3D uname; + rmem->base =3D base; + rmem->size =3D size; + nomap =3D of_get_flat_dt_prop(node, "no-map", NULL) !=3D NULL; =20 err =3D __reserved_mem_init_node(rmem, node); if (err !=3D 0 && err !=3D -ENODEV) { pr_info("node %s compatible matching fail\n", rmem->name); + rmem->name =3D NULL; + if (nomap) memblock_clear_nomap(rmem->base, rmem->size); else memblock_phys_free(rmem->base, rmem->size); + return; } else { phys_addr_t end =3D rmem->base + rmem->size - 1; bool reusable =3D @@ -654,6 +646,8 @@ static void __init fdt_init_reserved_mem_node(struct re= served_mem *rmem, reusable ? "reusable" : "non-reusable", rmem->name ? rmem->name : "unknown"); } + + reserved_mem_count++; } =20 struct rmem_assigned_device { --=20 2.34.1