From nobody Sun Dec 14 20:29:16 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 658452957D0; Wed, 23 Apr 2025 19:42:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437364; cv=none; b=Qnszgz2h7mB1coCUOiynykxsa+PcTh8bZ8jk34QRqAbsEihjW2VWONMaHhfQm9dsVE2HxvO3XUthmapK9F39F0DqVObJpJZOYiZHMoEekG7OWis9MqRtVwWQhnWO8WZhXwSubwwg23U+KQN1guCLzMuGDsGOlh7FYW0TuEyJcsw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437364; c=relaxed/simple; bh=ctYGyuPhpbkQw/STF5j4HRUKC3D1Ft1TdkVeReqE1QM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cT59+B1FXr5La1fq+xJQP4dTRhYHg5rvPobNg3OGHZnMFP/PcgyjaK41LlDvlViZB5OeQpqgvICvjW/DSsn7C+qxJoBAh4Pcy6m5d2sFBs48IUO2nPElfwSzZbB4sDh4n611bRSgs4pFdAHrCBbNjHtCdsHTHkvDZsxLozaaVns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aO5Uf8JE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aO5Uf8JE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9CED2C4CEE2; Wed, 23 Apr 2025 19:42:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745437363; bh=ctYGyuPhpbkQw/STF5j4HRUKC3D1Ft1TdkVeReqE1QM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aO5Uf8JED7xdR5Sqpkq0LFktP3AlooyJkQrzX/3l9vvfYa+HCX/fc5UMvNv6g5biA tKCLD1YgmcoGOrrqDxvU04wl5xLzW3RaqbHakFCkVMjoEueRDlaqQEVFCFsHlPI4Bs yGLgAMVG5CwDsnWy7ADvwPYjlNA0aGZVriCX+9jAqElA3El1L50sXRoHmA15I5Kn04 /5zVRKtCXE0xJvKIi9Kgr6C+RKN1O6sdjXRngjopN/QKPAM+Jz5Qtx0m5vcdKyCv7/ E5AVhxDzb4XKtVQvEw5Vs4cVuzVZ6VrzF5wOlnpfRLuLtsvEAgpX3ihHTcyg2MoJPr +dQ9ZoKYdCfDQ== From: "Rob Herring (Arm)" Date: Wed, 23 Apr 2025 14:42:13 -0500 Subject: [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-dt-memory-region-v2-v2-1-2fbd6ebd3c88@kernel.org> References: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> In-Reply-To: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> To: Saravana Kannan , Andrew Morton , Bjorn Andersson , Mathieu Poirier , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Patrice Chotard , Maxime Coquelin , Alexandre Torgue , Arnaud POULIQUEN , Chen-Yu Tsai Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, Daniel Baluta X-Mailer: b4 0.15-dev Drivers with "memory-region" properties currently have to do their own parsing of "memory-region" properties. The result is all the drivers have similar patterns of a call to parse "memory-region" and then get the region's address and size. As this is a standard property, it should have common functions for drivers to use. Add new functions to count the number of regions and retrieve the region's address as a resource. Reviewed-by: Daniel Baluta Signed-off-by: Rob Herring (Arm) Acked-by: Arnaud Pouliquen Tested-by: Peng Fan (i.MX93-11x11-EVK for imx_rproc.c) Tested-by: Tanmay Shah --- v2: - Wrap function parameters --- drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++++++++= ++++ include/linux/of_reserved_mem.h | 26 ++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index ee2e31522d7e..f87915cce961 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -12,6 +12,7 @@ #define pr_fmt(fmt) "OF: reserved mem: " fmt =20 #include +#include #include #include #include @@ -740,3 +741,82 @@ struct reserved_mem *of_reserved_mem_lookup(struct dev= ice_node *np) return NULL; } EXPORT_SYMBOL_GPL(of_reserved_mem_lookup); + +/** + * of_reserved_mem_region_to_resource() - Get a reserved memory region as = a resource + * @np: node containing 'memory-region' property + * @idx: index of 'memory-region' property to lookup + * @res: Pointer to a struct resource to fill in with reserved region + * + * This function allows drivers to lookup a node's 'memory-region' property + * entries by index and return a struct resource for the entry. + * + * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-re= gion' + * is missing or unavailable, -EINVAL for any other error. + */ +int of_reserved_mem_region_to_resource(const struct device_node *np, + unsigned int idx, struct resource *res) +{ + struct reserved_mem *rmem; + + if (!np) + return -EINVAL; + + struct device_node __free(device_node) *target =3D of_parse_phandle(np, "= memory-region", idx); + if (!target || !of_device_is_available(target)) + return -ENODEV; + + rmem =3D of_reserved_mem_lookup(target); + if (!rmem) + return -EINVAL; + + resource_set_range(res, rmem->base, rmem->size); + res->name =3D rmem->name; + return 0; +} +EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource); + +/** + * of_reserved_mem_region_to_resource_byname() - Get a reserved memory reg= ion as a resource + * @np: node containing 'memory-region' property + * @name: name of 'memory-region' property entry to lookup + * @res: Pointer to a struct resource to fill in with reserved region + * + * This function allows drivers to lookup a node's 'memory-region' property + * entries by name and return a struct resource for the entry. + * + * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-re= gion' + * is missing or unavailable, -EINVAL for any other error. + */ +int of_reserved_mem_region_to_resource_byname(const struct device_node *np, + const char *name, + struct resource *res) +{ + int idx; + + if (!name) + return -EINVAL; + + idx =3D of_property_match_string(np, "memory-region-names", name); + if (idx < 0) + return idx; + + return of_reserved_mem_region_to_resource(np, idx, res); +} +EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource_byname); + +/** + * of_reserved_mem_region_count() - Return the number of 'memory-region' e= ntries + * @np: node containing 'memory-region' property + * + * This function allows drivers to retrieve the number of entries for a no= de's + * 'memory-region' property. + * + * Returns the number of entries on success, or negative error code on a + * malformed property. + */ +int of_reserved_mem_region_count(const struct device_node *np) +{ + return of_count_phandle_with_args(np, "memory-region", NULL); +} +EXPORT_SYMBOL_GPL(of_reserved_mem_region_count); diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_me= m.h index e338282da652..f573423359f4 100644 --- a/include/linux/of_reserved_mem.h +++ b/include/linux/of_reserved_mem.h @@ -7,6 +7,7 @@ =20 struct of_phandle_args; struct reserved_mem_ops; +struct resource; =20 struct reserved_mem { const char *name; @@ -39,6 +40,12 @@ int of_reserved_mem_device_init_by_name(struct device *d= ev, void of_reserved_mem_device_release(struct device *dev); =20 struct reserved_mem *of_reserved_mem_lookup(struct device_node *np); +int of_reserved_mem_region_to_resource(const struct device_node *np, + unsigned int idx, struct resource *res); +int of_reserved_mem_region_to_resource_byname(const struct device_node *np, + const char *name, struct resource *res); +int of_reserved_mem_region_count(const struct device_node *np); + #else =20 #define RESERVEDMEM_OF_DECLARE(name, compat, init) \ @@ -63,6 +70,25 @@ static inline struct reserved_mem *of_reserved_mem_looku= p(struct device_node *np { return NULL; } + +static inline int of_reserved_mem_region_to_resource(const struct device_n= ode *np, + unsigned int idx, + struct resource *res) +{ + return -ENOSYS; +} + +static inline int of_reserved_mem_region_to_resource_byname(const struct d= evice_node *np, + const char *name, + struct resource *res) +{ + return -ENOSYS; +} + +static inline int of_reserved_mem_region_count(const struct device_node *n= p) +{ + return 0; +} #endif =20 /** --=20 2.47.2 From nobody Sun Dec 14 20:29:16 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5C1ED296178; Wed, 23 Apr 2025 19:42:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437366; cv=none; b=n5MxczVuc8RHAKYJ9R6bW439K8bhoFg5mGpWo03RD2L3FwX/Csu9wQmvncJsR9wve2A9G9Lg1F6KZ/ykCnu4smsGkUDzGSWfY3ATviGnjI4jKi0VBhfIj2tOYn6S8CcggB356IDsSK+wz06LNF2Yn/0SOmx6RlO67Q3LOPYav8I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437366; c=relaxed/simple; bh=unEvAgjEXaifATfQLY+rUlEDDFjsnO4G5ZkCTJbRQE0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AscsenrdUq7ryAG32tTH/2NUcdsSkoEhMGkHPbd5OdMg/O0+5y50OuorMCBufNKC4c+9xxPXg75lEo5xv53EflO+CvsKqVsMGGsKAu3CwwIodnQTf79IduZaV0F6Z9fWc3akR8mLa2r9GJco6qiHQYa8gDUNdEJF/40sg7iYqjE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VIjZU/Qp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VIjZU/Qp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 92FD4C4CEE8; Wed, 23 Apr 2025 19:42:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745437365; bh=unEvAgjEXaifATfQLY+rUlEDDFjsnO4G5ZkCTJbRQE0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VIjZU/QpUi50/IPulSmOpn4kWiFWTDG3gcinh++VKxhR0g3SnwhE5VxJ/GFzGnHHe chTGuKVY/RVqQ2+ptgJuzbncEHvSYeh5XibbcYG5uqp5eDcvD9FFN41cCbDVEY/gyH hrG1wheiB6Z/TJIlLaj6REEInD8RiRVU7LObwgdTi3G16jRgbdW+mYVT+GMGO4i3EU zJ8hxmKd15iZmkvAASb5LMaMvheK9A9GT4iNst9LrPx7w0+hsnxtf82eK+jQIYfRLL y9phE2/T5rX6btTzGxZNWwl54yPEsJeiUp3NPnoz0qUTNNE1U5Unz+xJO5YnupYsOD UQECtDvjOsWwg== From: "Rob Herring (Arm)" Date: Wed, 23 Apr 2025 14:42:14 -0500 Subject: [PATCH v2 2/4] of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-dt-memory-region-v2-v2-2-2fbd6ebd3c88@kernel.org> References: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> In-Reply-To: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> To: Saravana Kannan , Andrew Morton , Bjorn Andersson , Mathieu Poirier , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Patrice Chotard , Maxime Coquelin , Alexandre Torgue , Arnaud POULIQUEN , Chen-Yu Tsai Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com X-Mailer: b4 0.15-dev Simplify of_dma_set_restricted_buffer() by using of_property_present() and of_for_each_phandle() iterator. Signed-off-by: Rob Herring (Arm) Acked-by: Arnaud Pouliquen Tested-by: Peng Fan (i.MX93-11x11-EVK for imx_rproc.c) Tested-by: Tanmay Shah --- v2: - Maintain prior behavior only warning if of_reserved_mem_device_init_by_idx() fails --- drivers/of/device.c | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/drivers/of/device.c b/drivers/of/device.c index 5053e5d532cc..c80426510ec2 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -35,44 +35,35 @@ EXPORT_SYMBOL(of_match_device); static void of_dma_set_restricted_buffer(struct device *dev, struct device_node *np) { - struct device_node *node, *of_node =3D dev->of_node; - int count, i; + struct device_node *of_node =3D dev->of_node; + struct of_phandle_iterator it; + int rc, i =3D 0; =20 if (!IS_ENABLED(CONFIG_DMA_RESTRICTED_POOL)) return; =20 - count =3D of_property_count_elems_of_size(of_node, "memory-region", - sizeof(u32)); /* * If dev->of_node doesn't exist or doesn't contain memory-region, try * the OF node having DMA configuration. */ - if (count <=3D 0) { + if (!of_property_present(of_node, "memory-region")) of_node =3D np; - count =3D of_property_count_elems_of_size( - of_node, "memory-region", sizeof(u32)); - } =20 - for (i =3D 0; i < count; i++) { - node =3D of_parse_phandle(of_node, "memory-region", i); + of_for_each_phandle(&it, rc, of_node, "memory-region", NULL, 0) { /* * There might be multiple memory regions, but only one * restricted-dma-pool region is allowed. */ - if (of_device_is_compatible(node, "restricted-dma-pool") && - of_device_is_available(node)) { - of_node_put(node); + if (of_device_is_compatible(it.node, "restricted-dma-pool") && + of_device_is_available(it.node)) { + if (of_reserved_mem_device_init_by_idx(dev, of_node, i)) + dev_warn(dev, "failed to initialise \"restricted-dma-pool\" memory nod= e\n"); + of_node_put(it.node); break; } - of_node_put(node); + i++; } =20 - /* - * Attempt to initialize a restricted-dma-pool region if one was found. - * Note that count can hold a negative error code. - */ - if (i < count && of_reserved_mem_device_init_by_idx(dev, of_node, i)) - dev_warn(dev, "failed to initialise \"restricted-dma-pool\" memory node\= n"); } =20 /** --=20 2.47.2 From nobody Sun Dec 14 20:29:16 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E4847298CD2; Wed, 23 Apr 2025 19:42:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437368; cv=none; b=GXPLkh+c2LT8P5HZAZJ1QiSApszoPBq5vvGUu+/5i+EkUaGaBKnSJX2ArnDO+Kk28sqcwdOuTc142GDhYCpWfyUybnsh3uEjnZQeOvINoUJrA0nvnhPibKEBpmrtffUU/4Ojp/wSb1VdAnwH/yI54c0isOQt34AIdPe4b6p+FyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437368; c=relaxed/simple; bh=F3azllxUB00Zjj+oyESkLHmmdJpPPIUF3Md9fl4CSXY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MnO093/b98wuk452uIePO+0ZV1NmJYmPgknRfPotZ4cYHDBdWzBlEOAZDovP5m7tOzNnlqhebhY3y16v9Eiga0zWbM2PCnYa/kUJ/ttxkmFQ1WPukD+mAf77f4c5gH+GDSiT6n1+S6CfIPyS1F3d8jE+IVF8Yu8ZEokhks6yvRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qyjGsfeK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qyjGsfeK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 400B0C4CEE8; Wed, 23 Apr 2025 19:42:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745437367; bh=F3azllxUB00Zjj+oyESkLHmmdJpPPIUF3Md9fl4CSXY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qyjGsfeKW2GqcFpbWB3Kb7mvyy2Xoq+aQoDh1c/CoCcOoFyHg28t1qqkV0fIPJCkH 4OUZ6PRJoqEgjXGexarz0xJp7gH73jzW4MhyuWTN89MBqcBul7aqBEa3pSsZwfBGIM +HcPAhQVvU3iYoVDTo4bVvwNjY9dsBEcSppmkUBTA/zD48tTfHCjdOxDh3faN8Pu+H 7SZ8MFljQ0ztYHcPBYFW5zKWJ5rhQh5b5aSyGJAPacb1vt0bbfu9VUWeaVn9ENoE25 ZoZUWC5DLuCnZ49Vi9akP16BmfWUWfTqrfZPBUSr8cvm5n2x1C7QSTmTZTWlQbcQfs RlVvMmkZSPanw== From: "Rob Herring (Arm)" Date: Wed, 23 Apr 2025 14:42:15 -0500 Subject: [PATCH v2 3/4] devres: Export devm_ioremap_resource_wc() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-dt-memory-region-v2-v2-3-2fbd6ebd3c88@kernel.org> References: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> In-Reply-To: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> To: Saravana Kannan , Andrew Morton , Bjorn Andersson , Mathieu Poirier , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Patrice Chotard , Maxime Coquelin , Alexandre Torgue , Arnaud POULIQUEN , Chen-Yu Tsai Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com X-Mailer: b4 0.15-dev devm_ioremap_resource_wc() is not exported, so add one. Signed-off-by: Rob Herring (Arm) Acked-by: Arnaud Pouliquen Tested-by: Peng Fan (i.MX93-11x11-EVK for imx_rproc.c) Tested-by: Tanmay Shah --- v2: - New patch --- lib/devres.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/devres.c b/lib/devres.c index 73901160197e..378b07730420 100644 --- a/lib/devres.c +++ b/lib/devres.c @@ -206,6 +206,7 @@ void __iomem *devm_ioremap_resource_wc(struct device *d= ev, { return __devm_ioremap_resource(dev, res, DEVM_IOREMAP_WC); } +EXPORT_SYMBOL(devm_ioremap_resource_wc); =20 /* * devm_of_iomap - Requests a resource and maps the memory mapped IO --=20 2.47.2 From nobody Sun Dec 14 20:29:16 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2AD4A29AB09; Wed, 23 Apr 2025 19:42:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437370; cv=none; b=X6N4pP/0zl7FQlZ0fRzOlk28e/DwswV58V30U+xaq2Zf718SqUiSss9Zk/TsNW2CqrZU2rIlAehLuaN6Nfg0h4jHygpQVNKkwoPTnTUhhDZ9b27H/5kJJ27eWDTxZPmqJco/Rwc/docxS3bTA556H/0Eo20UrHVkXKUnaNWH9i0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745437370; c=relaxed/simple; bh=V9munzrKNGK1uPGGF90m0wh4+CAwjcqhZiXGwBDHs9w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MZXRdTQ5mGDWXWPSzeaiGRioWUGmMUITQnhC1yTIxn1iN9n8qlTAEE06dB0w9O09eKyoEjMX4SzmX8La2Uey3FY/B8/Z7HmR0aZ1ULdEtGm1DaswUEy+I1fCPOkTEUDIwyyOdF8rIL9iBa6Av2fBlr5tRW6HIdLRzBxWvLwB6Mg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DnBZ/eLB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DnBZ/eLB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 54300C4CEE2; Wed, 23 Apr 2025 19:42:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745437369; bh=V9munzrKNGK1uPGGF90m0wh4+CAwjcqhZiXGwBDHs9w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DnBZ/eLBZ50dQ3zkjMDw5JcmXJgBV+iHNLTJuIkKa0e5K2eeRAifaVzEmwP3rO9KH vd97PFlFnrkuEBF+r+007qpzx9ngASys/K6uQxukC1dBLop3rKujWdAuaOEuuYykLv kLjKO1uQGsH5QzU1A6IT9xmgH0cTy6DzOYEH9bnoZ54rdQGPya2WkbjmgGRoQaKpwu q7qPUqM3QQ/NL56TqYR3YdQvxrU8Kt/1OUiTg9QvjxDckgOUYSboq5wnQoKEHW+Ynt BYkeczeJwpy4dVYUjm/7JgAFpcPQnb3klTcTPP0/BxnjJsTm+UHfW+e0BHg22mc7/O ah4FrQXjWucWA== From: "Rob Herring (Arm)" Date: Wed, 23 Apr 2025 14:42:16 -0500 Subject: [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-dt-memory-region-v2-v2-4-2fbd6ebd3c88@kernel.org> References: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> In-Reply-To: <20250423-dt-memory-region-v2-v2-0-2fbd6ebd3c88@kernel.org> To: Saravana Kannan , Andrew Morton , Bjorn Andersson , Mathieu Poirier , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Patrice Chotard , Maxime Coquelin , Alexandre Torgue , Arnaud POULIQUEN , Chen-Yu Tsai Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com X-Mailer: b4 0.15-dev Use the newly added of_reserved_mem_region_to_resource() and of_reserved_mem_region_count() functions to handle "memory-region" properties. The error handling is a bit different in some cases. Often "memory-region" is optional, so failed lookup is not an error. But then an error in of_reserved_mem_lookup() is treated as an error. However, that distinction is not really important. Either the region is available and usable or it is not. So now, it is just of_reserved_mem_region_to_resource() which is checked for an error. Signed-off-by: Rob Herring (Arm) Acked-by: Arnaud Pouliquen Tested-by: Peng Fan (i.MX93-11x11-EVK for imx_rproc.c) Tested-by: Tanmay Shah --- v2: - Use strstarts instead of strcmp for resource names as they include the unit-address. - Drop the unit-address from resource name for imx and st drivers --- drivers/remoteproc/imx_dsp_rproc.c | 45 ++++++++------------ drivers/remoteproc/imx_rproc.c | 68 ++++++++++++---------------= --- drivers/remoteproc/qcom_q6v5_adsp.c | 24 ++++------- drivers/remoteproc/qcom_q6v5_mss.c | 60 +++++++++------------------ drivers/remoteproc/qcom_q6v5_pas.c | 69 +++++++++++----------------= ---- drivers/remoteproc/qcom_q6v5_wcss.c | 25 +++++------ drivers/remoteproc/qcom_wcnss.c | 23 ++++------- drivers/remoteproc/rcar_rproc.c | 36 +++++++--------- drivers/remoteproc/st_remoteproc.c | 41 +++++++++--------- drivers/remoteproc/stm32_rproc.c | 44 +++++++++----------- drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++-------- drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++-------- drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++-------- drivers/remoteproc/xlnx_r5_remoteproc.c | 51 +++++++++-------------- 14 files changed, 221 insertions(+), 349 deletions(-) diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_ds= p_rproc.c index 90cb1fc13e71..fffae6ff4a5c 100644 --- a/drivers/remoteproc/imx_dsp_rproc.c +++ b/drivers/remoteproc/imx_dsp_rproc.c @@ -598,11 +598,9 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_r= proc *priv) struct rproc *rproc =3D priv->rproc; struct device *dev =3D rproc->dev.parent; struct device_node *np =3D dev->of_node; - struct of_phandle_iterator it; struct rproc_mem_entry *mem; - struct reserved_mem *rmem; void __iomem *cpu_addr; - int a; + int a, i =3D 0; u64 da; =20 /* Remap required addresses */ @@ -633,45 +631,38 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_= rproc *priv) rproc_add_carveout(rproc, mem); } =20 - of_phandle_iterator_init(&it, np, "memory-region", NULL, 0); - while (of_phandle_iterator_next(&it) =3D=3D 0) { + while (1) { + int err; + struct resource res; + + err =3D of_reserved_mem_region_to_resource(np, i++, &res); + if (err) + return 0; + /* * Ignore the first memory region which will be used vdev buffer. * No need to do extra handlings, rproc_add_virtio_dev will handle it. */ - if (!strcmp(it.node->name, "vdev0buffer")) + if (strstarts(res.name, "vdev0buffer")) continue; =20 - rmem =3D of_reserved_mem_lookup(it.node); - if (!rmem) { - of_node_put(it.node); - dev_err(dev, "unable to acquire memory-region\n"); + if (imx_dsp_rproc_sys_to_da(priv, res.start, resource_size(&res), &da)) return -EINVAL; - } =20 - if (imx_dsp_rproc_sys_to_da(priv, rmem->base, rmem->size, &da)) { - of_node_put(it.node); - return -EINVAL; - } - - cpu_addr =3D devm_ioremap_wc(dev, rmem->base, rmem->size); + cpu_addr =3D devm_ioremap_resource_wc(dev, &res); if (!cpu_addr) { - of_node_put(it.node); - dev_err(dev, "failed to map memory %p\n", &rmem->base); + dev_err(dev, "failed to map memory %pR\n", &res); return -ENOMEM; } =20 /* Register memory region */ - mem =3D rproc_mem_entry_init(dev, (void __force *)cpu_addr, (dma_addr_t)= rmem->base, - rmem->size, da, NULL, NULL, it.node->name); - - if (mem) { - rproc_coredump_add_segment(rproc, da, rmem->size); - } else { - of_node_put(it.node); + mem =3D rproc_mem_entry_init(dev, (void __force *)cpu_addr, (dma_addr_t)= res.start, + resource_size(&res), da, NULL, NULL, + "%.*s", strchrnul(res.name, '@') - res.name, res.name); + if (!mem) return -ENOMEM; - } =20 + rproc_coredump_add_segment(rproc, da, resource_size(&res)); rproc_add_carveout(rproc, mem); } =20 diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c index 74299af1d7f1..31999741fbac 100644 --- a/drivers/remoteproc/imx_rproc.c +++ b/drivers/remoteproc/imx_rproc.c @@ -549,46 +549,42 @@ static int imx_rproc_prepare(struct rproc *rproc) { struct imx_rproc *priv =3D rproc->priv; struct device_node *np =3D priv->dev->of_node; - struct of_phandle_iterator it; struct rproc_mem_entry *mem; - struct reserved_mem *rmem; + int i =3D 0; u32 da; =20 /* Register associated reserved memory regions */ - of_phandle_iterator_init(&it, np, "memory-region", NULL, 0); - while (of_phandle_iterator_next(&it) =3D=3D 0) { + while (1) { + int err; + struct resource res; + + err =3D of_reserved_mem_region_to_resource(np, i++, &res); + if (err) + return 0; + /* * Ignore the first memory region which will be used vdev buffer. * No need to do extra handlings, rproc_add_virtio_dev will handle it. */ - if (!strcmp(it.node->name, "vdev0buffer")) + if (strstarts(res.name, "vdev0buffer")) continue; =20 - if (!strcmp(it.node->name, "rsc-table")) + if (strstarts(res.name, "rsc-table")) continue; =20 - rmem =3D of_reserved_mem_lookup(it.node); - if (!rmem) { - of_node_put(it.node); - dev_err(priv->dev, "unable to acquire memory-region\n"); - return -EINVAL; - } - /* No need to translate pa to da, i.MX use same map */ - da =3D rmem->base; + da =3D res.start; =20 /* Register memory region */ - mem =3D rproc_mem_entry_init(priv->dev, NULL, (dma_addr_t)rmem->base, rm= em->size, da, + mem =3D rproc_mem_entry_init(priv->dev, NULL, (dma_addr_t)res.start, + resource_size(&res), da, imx_rproc_mem_alloc, imx_rproc_mem_release, - it.node->name); - - if (mem) { - rproc_coredump_add_segment(rproc, da, rmem->size); - } else { - of_node_put(it.node); + "%.*s", strchrnul(res.name, '@') - res.name, + res.name); + if (!mem) return -ENOMEM; - } =20 + rproc_coredump_add_segment(rproc, da, resource_size(&res)); rproc_add_carveout(rproc, mem); } =20 @@ -723,47 +719,37 @@ static int imx_rproc_addr_init(struct imx_rproc *priv, } =20 /* memory-region is optional property */ - nph =3D of_count_phandle_with_args(np, "memory-region", NULL); + nph =3D of_reserved_mem_region_count(np); if (nph <=3D 0) return 0; =20 /* remap optional addresses */ for (a =3D 0; a < nph; a++) { - struct device_node *node; struct resource res; =20 - node =3D of_parse_phandle(np, "memory-region", a); - if (!node) - continue; - /* Not map vdevbuffer, vdevring region */ - if (!strncmp(node->name, "vdev", strlen("vdev"))) { - of_node_put(node); - continue; - } - err =3D of_address_to_resource(node, 0, &res); + err =3D of_reserved_mem_region_to_resource(np, a, &res); if (err) { dev_err(dev, "unable to resolve memory region\n"); - of_node_put(node); return err; } =20 - if (b >=3D IMX_RPROC_MEM_MAX) { - of_node_put(node); + /* Not map vdevbuffer, vdevring region */ + if (strstarts(res.name, "vdev")) + continue; + + if (b >=3D IMX_RPROC_MEM_MAX) break; - } =20 /* Not use resource version, because we might share region */ - priv->mem[b].cpu_addr =3D devm_ioremap_wc(&pdev->dev, res.start, resourc= e_size(&res)); + priv->mem[b].cpu_addr =3D devm_ioremap_resource_wc(&pdev->dev, &res); if (!priv->mem[b].cpu_addr) { dev_err(dev, "failed to remap %pr\n", &res); - of_node_put(node); return -ENOMEM; } priv->mem[b].sys_addr =3D res.start; priv->mem[b].size =3D resource_size(&res); - if (!strcmp(node->name, "rsc-table")) + if (!strcmp(res.name, "rsc-table")) priv->rsc_table =3D priv->mem[b].cpu_addr; - of_node_put(node); b++; } =20 diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_= q6v5_adsp.c index 94af77baa7a1..a5b7cbb8fe07 100644 --- a/drivers/remoteproc/qcom_q6v5_adsp.c +++ b/drivers/remoteproc/qcom_q6v5_adsp.c @@ -625,26 +625,20 @@ static int adsp_init_mmio(struct qcom_adsp *adsp, =20 static int adsp_alloc_memory_region(struct qcom_adsp *adsp) { - struct reserved_mem *rmem =3D NULL; - struct device_node *node; - - node =3D of_parse_phandle(adsp->dev->of_node, "memory-region", 0); - if (node) - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); + int ret; + struct resource res; =20 - if (!rmem) { + ret =3D of_reserved_mem_region_to_resource(adsp->dev->of_node, 0, &res); + if (!ret) { dev_err(adsp->dev, "unable to resolve memory-region\n"); - return -EINVAL; + return ret; } =20 - adsp->mem_phys =3D adsp->mem_reloc =3D rmem->base; - adsp->mem_size =3D rmem->size; - adsp->mem_region =3D devm_ioremap_wc(adsp->dev, - adsp->mem_phys, adsp->mem_size); + adsp->mem_phys =3D adsp->mem_reloc =3D res.start; + adsp->mem_size =3D resource_size(&res); + adsp->mem_region =3D devm_ioremap_resource_wc(adsp->dev, &res); if (!adsp->mem_region) { - dev_err(adsp->dev, "unable to map memory region: %pa+%zx\n", - &rmem->base, adsp->mem_size); + dev_err(adsp->dev, "unable to map memory region: %pR\n", &res); return -EBUSY; } =20 diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q= 6v5_mss.c index 0c0199fb0e68..0fea5f91dd1c 100644 --- a/drivers/remoteproc/qcom_q6v5_mss.c +++ b/drivers/remoteproc/qcom_q6v5_mss.c @@ -1961,8 +1961,8 @@ static int q6v5_init_reset(struct q6v5 *qproc) static int q6v5_alloc_memory_region(struct q6v5 *qproc) { struct device_node *child; - struct reserved_mem *rmem; - struct device_node *node; + struct resource res; + int ret; =20 /* * In the absence of mba/mpss sub-child, extract the mba and mpss @@ -1970,71 +1970,49 @@ static int q6v5_alloc_memory_region(struct q6v5 *qp= roc) */ child =3D of_get_child_by_name(qproc->dev->of_node, "mba"); if (!child) { - node =3D of_parse_phandle(qproc->dev->of_node, - "memory-region", 0); + ret =3D of_reserved_mem_region_to_resource(qproc->dev->of_node, 0, &res); } else { - node =3D of_parse_phandle(child, "memory-region", 0); + ret =3D of_reserved_mem_region_to_resource(child, 0, &res); of_node_put(child); } =20 - if (!node) { - dev_err(qproc->dev, "no mba memory-region specified\n"); - return -EINVAL; - } - - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); - if (!rmem) { + if (ret) { dev_err(qproc->dev, "unable to resolve mba region\n"); - return -EINVAL; + return ret; } =20 - qproc->mba_phys =3D rmem->base; - qproc->mba_size =3D rmem->size; + qproc->mba_phys =3D res.start; + qproc->mba_size =3D resource_size(&res); =20 if (!child) { - node =3D of_parse_phandle(qproc->dev->of_node, - "memory-region", 1); + ret =3D of_reserved_mem_region_to_resource(qproc->dev->of_node, 1, &res); } else { child =3D of_get_child_by_name(qproc->dev->of_node, "mpss"); - node =3D of_parse_phandle(child, "memory-region", 0); + ret =3D of_reserved_mem_region_to_resource(child, 0, &res); of_node_put(child); } =20 - if (!node) { - dev_err(qproc->dev, "no mpss memory-region specified\n"); - return -EINVAL; - } - - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); - if (!rmem) { + if (ret) { dev_err(qproc->dev, "unable to resolve mpss region\n"); - return -EINVAL; + return ret; } =20 - qproc->mpss_phys =3D qproc->mpss_reloc =3D rmem->base; - qproc->mpss_size =3D rmem->size; + qproc->mpss_phys =3D qproc->mpss_reloc =3D res.start; + qproc->mpss_size =3D resource_size(&res); =20 if (!child) { - node =3D of_parse_phandle(qproc->dev->of_node, "memory-region", 2); + ret =3D of_reserved_mem_region_to_resource(qproc->dev->of_node, 2, &res); } else { child =3D of_get_child_by_name(qproc->dev->of_node, "metadata"); - node =3D of_parse_phandle(child, "memory-region", 0); + ret =3D of_reserved_mem_region_to_resource(child, 0, &res); of_node_put(child); } =20 - if (!node) + if (ret) return 0; =20 - rmem =3D of_reserved_mem_lookup(node); - if (!rmem) { - dev_err(qproc->dev, "unable to resolve metadata region\n"); - return -EINVAL; - } - - qproc->mdata_phys =3D rmem->base; - qproc->mdata_size =3D rmem->size; + qproc->mdata_phys =3D res.start; + qproc->mdata_size =3D resource_size(&res); =20 return 0; } diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q= 6v5_pas.c index b306f223127c..73f415ff2678 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -546,53 +546,37 @@ static void adsp_pds_detach(struct qcom_adsp *adsp, s= truct device **pds, =20 static int adsp_alloc_memory_region(struct qcom_adsp *adsp) { - struct reserved_mem *rmem; - struct device_node *node; - - node =3D of_parse_phandle(adsp->dev->of_node, "memory-region", 0); - if (!node) { - dev_err(adsp->dev, "no memory-region specified\n"); - return -EINVAL; - } + struct resource res; + int ret; =20 - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); - if (!rmem) { + ret =3D of_reserved_mem_region_to_resource(adsp->dev->of_node, 0, &res); + if (ret) { dev_err(adsp->dev, "unable to resolve memory-region\n"); - return -EINVAL; + return ret; } =20 - adsp->mem_phys =3D adsp->mem_reloc =3D rmem->base; - adsp->mem_size =3D rmem->size; - adsp->mem_region =3D devm_ioremap_wc(adsp->dev, adsp->mem_phys, adsp->mem= _size); + adsp->mem_phys =3D adsp->mem_reloc =3D res.start; + adsp->mem_size =3D resource_size(&res); + adsp->mem_region =3D devm_ioremap_resource_wc(adsp->dev, &res); if (!adsp->mem_region) { - dev_err(adsp->dev, "unable to map memory region: %pa+%zx\n", - &rmem->base, adsp->mem_size); + dev_err(adsp->dev, "unable to map memory region: %pR\n", &res); return -EBUSY; } =20 if (!adsp->dtb_pas_id) return 0; =20 - node =3D of_parse_phandle(adsp->dev->of_node, "memory-region", 1); - if (!node) { - dev_err(adsp->dev, "no dtb memory-region specified\n"); - return -EINVAL; - } - - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); - if (!rmem) { + ret =3D of_reserved_mem_region_to_resource(adsp->dev->of_node, 1, &res); + if (ret) { dev_err(adsp->dev, "unable to resolve dtb memory-region\n"); - return -EINVAL; + return ret; } =20 - adsp->dtb_mem_phys =3D adsp->dtb_mem_reloc =3D rmem->base; - adsp->dtb_mem_size =3D rmem->size; - adsp->dtb_mem_region =3D devm_ioremap_wc(adsp->dev, adsp->dtb_mem_phys, a= dsp->dtb_mem_size); + adsp->dtb_mem_phys =3D adsp->dtb_mem_reloc =3D res.start; + adsp->dtb_mem_size =3D resource_size(&res); + adsp->dtb_mem_region =3D devm_ioremap_resource_wc(adsp->dev, &res); if (!adsp->dtb_mem_region) { - dev_err(adsp->dev, "unable to map dtb memory region: %pa+%zx\n", - &rmem->base, adsp->dtb_mem_size); + dev_err(adsp->dev, "unable to map dtb memory region: %pR\n", &res); return -EBUSY; } =20 @@ -602,7 +586,6 @@ static int adsp_alloc_memory_region(struct qcom_adsp *a= dsp) static int adsp_assign_memory_region(struct qcom_adsp *adsp) { struct qcom_scm_vmperm perm[MAX_ASSIGN_COUNT]; - struct device_node *node; unsigned int perm_size; int offset; int ret; @@ -611,17 +594,15 @@ static int adsp_assign_memory_region(struct qcom_adsp= *adsp) return 0; =20 for (offset =3D 0; offset < adsp->region_assign_count; ++offset) { - struct reserved_mem *rmem =3D NULL; - - node =3D of_parse_phandle(adsp->dev->of_node, "memory-region", - adsp->region_assign_idx + offset); - if (node) - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); - if (!rmem) { + struct resource res; + + ret =3D of_reserved_mem_region_to_resource(adsp->dev->of_node, + adsp->region_assign_idx + offset, + &res); + if (ret) { dev_err(adsp->dev, "unable to resolve shareable memory-region index %d\= n", offset); - return -EINVAL; + return ret; } =20 if (adsp->region_assign_shared) { @@ -636,8 +617,8 @@ static int adsp_assign_memory_region(struct qcom_adsp *= adsp) perm_size =3D 1; } =20 - adsp->region_assign_phys[offset] =3D rmem->base; - adsp->region_assign_size[offset] =3D rmem->size; + adsp->region_assign_phys[offset] =3D res.start; + adsp->region_assign_size[offset] =3D resource_size(&res); adsp->region_assign_owners[offset] =3D BIT(QCOM_SCM_VMID_HLOS); =20 ret =3D qcom_scm_assign_mem(adsp->region_assign_phys[offset], diff --git a/drivers/remoteproc/qcom_q6v5_wcss.c b/drivers/remoteproc/qcom_= q6v5_wcss.c index 93648734a2f2..4a3235ee0963 100644 --- a/drivers/remoteproc/qcom_q6v5_wcss.c +++ b/drivers/remoteproc/qcom_q6v5_wcss.c @@ -873,27 +873,22 @@ static int q6v5_wcss_init_mmio(struct q6v5_wcss *wcss, =20 static int q6v5_alloc_memory_region(struct q6v5_wcss *wcss) { - struct reserved_mem *rmem =3D NULL; - struct device_node *node; struct device *dev =3D wcss->dev; + struct resource res; + int ret; =20 - node =3D of_parse_phandle(dev->of_node, "memory-region", 0); - if (node) - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); - - if (!rmem) { + ret =3D of_reserved_mem_region_to_resource(dev->of_node, 0, &res); + if (ret) { dev_err(dev, "unable to acquire memory-region\n"); - return -EINVAL; + return ret; } =20 - wcss->mem_phys =3D rmem->base; - wcss->mem_reloc =3D rmem->base; - wcss->mem_size =3D rmem->size; - wcss->mem_region =3D devm_ioremap_wc(dev, wcss->mem_phys, wcss->mem_size); + wcss->mem_phys =3D res.start; + wcss->mem_reloc =3D res.start; + wcss->mem_size =3D resource_size(&res); + wcss->mem_region =3D devm_ioremap_resource_wc(dev, &res); if (!wcss->mem_region) { - dev_err(dev, "unable to map memory region: %pa+%pa\n", - &rmem->base, &rmem->size); + dev_err(dev, "unable to map memory region: %pR\n", &res); return -EBUSY; } =20 diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcns= s.c index 775b056d795a..7893a5a67306 100644 --- a/drivers/remoteproc/qcom_wcnss.c +++ b/drivers/remoteproc/qcom_wcnss.c @@ -525,25 +525,20 @@ static int wcnss_request_irq(struct qcom_wcnss *wcnss, =20 static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss) { - struct reserved_mem *rmem =3D NULL; - struct device_node *node; - - node =3D of_parse_phandle(wcnss->dev->of_node, "memory-region", 0); - if (node) - rmem =3D of_reserved_mem_lookup(node); - of_node_put(node); + struct resource res; + int ret; =20 - if (!rmem) { + ret =3D of_reserved_mem_region_to_resource(wcnss->dev->of_node, 0, &res); + if (ret) { dev_err(wcnss->dev, "unable to resolve memory-region\n"); - return -EINVAL; + return ret; } =20 - wcnss->mem_phys =3D wcnss->mem_reloc =3D rmem->base; - wcnss->mem_size =3D rmem->size; - wcnss->mem_region =3D devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss-= >mem_size); + wcnss->mem_phys =3D wcnss->mem_reloc =3D res.start; + wcnss->mem_size =3D resource_size(&res); + wcnss->mem_region =3D devm_ioremap_resource_wc(wcnss->dev, &res); if (!wcnss->mem_region) { - dev_err(wcnss->dev, "unable to map memory region: %pa+%zx\n", - &rmem->base, wcnss->mem_size); + dev_err(wcnss->dev, "unable to map memory region: %pR\n", &res); return -EBUSY; } =20 diff --git a/drivers/remoteproc/rcar_rproc.c b/drivers/remoteproc/rcar_rpro= c.c index 921d853594f4..0be1a4073a94 100644 --- a/drivers/remoteproc/rcar_rproc.c +++ b/drivers/remoteproc/rcar_rproc.c @@ -52,41 +52,33 @@ static int rcar_rproc_prepare(struct rproc *rproc) { struct device *dev =3D rproc->dev.parent; struct device_node *np =3D dev->of_node; - struct of_phandle_iterator it; struct rproc_mem_entry *mem; - struct reserved_mem *rmem; + int i =3D 0; u32 da; =20 /* Register associated reserved memory regions */ - of_phandle_iterator_init(&it, np, "memory-region", NULL, 0); - while (of_phandle_iterator_next(&it) =3D=3D 0) { - - rmem =3D of_reserved_mem_lookup(it.node); - if (!rmem) { - of_node_put(it.node); - dev_err(&rproc->dev, - "unable to acquire memory-region\n"); - return -EINVAL; - } + while (1) { + struct resource res; + int ret; + + ret =3D of_reserved_mem_region_to_resource(np, i++, &res); + if (ret) + return 0; =20 - if (rmem->base > U32_MAX) { - of_node_put(it.node); + if (res.start > U32_MAX) return -EINVAL; - } =20 /* No need to translate pa to da, R-Car use same map */ - da =3D rmem->base; + da =3D res.start; mem =3D rproc_mem_entry_init(dev, NULL, - rmem->base, - rmem->size, da, + res.start, + resource_size(&res), da, rcar_rproc_mem_alloc, rcar_rproc_mem_release, - it.node->name); + res.name); =20 - if (!mem) { - of_node_put(it.node); + if (!mem) return -ENOMEM; - } =20 rproc_add_carveout(rproc, mem); } diff --git a/drivers/remoteproc/st_remoteproc.c b/drivers/remoteproc/st_rem= oteproc.c index e6566a9839dc..043348366926 100644 --- a/drivers/remoteproc/st_remoteproc.c +++ b/drivers/remoteproc/st_remoteproc.c @@ -120,40 +120,37 @@ static int st_rproc_parse_fw(struct rproc *rproc, con= st struct firmware *fw) struct device *dev =3D rproc->dev.parent; struct device_node *np =3D dev->of_node; struct rproc_mem_entry *mem; - struct reserved_mem *rmem; - struct of_phandle_iterator it; - int index =3D 0; - - of_phandle_iterator_init(&it, np, "memory-region", NULL, 0); - while (of_phandle_iterator_next(&it) =3D=3D 0) { - rmem =3D of_reserved_mem_lookup(it.node); - if (!rmem) { - of_node_put(it.node); - dev_err(dev, "unable to acquire memory-region\n"); - return -EINVAL; - } + int index =3D 0, mr =3D 0; + + while (1) { + struct resource res; + int ret; + + ret =3D of_reserved_mem_region_to_resource(np, mr++, &res); + if (ret) + return 0; =20 /* No need to map vdev buffer */ - if (strcmp(it.node->name, "vdev0buffer")) { + if (!strstarts(res.name, "vdev0buffer")) { /* Register memory region */ mem =3D rproc_mem_entry_init(dev, NULL, - (dma_addr_t)rmem->base, - rmem->size, rmem->base, + (dma_addr_t)res.start, + resource_size(&res), res.start, st_rproc_mem_alloc, st_rproc_mem_release, - it.node->name); + "%.*s", + strchrnul(res.name, '@') - res.name, + res.name); } else { /* Register reserved memory for vdev buffer allocation */ mem =3D rproc_of_resm_mem_entry_init(dev, index, - rmem->size, - rmem->base, - it.node->name); + resource_size(&res), + res.start, + "vdev0buffer"); } =20 - if (!mem) { - of_node_put(it.node); + if (!mem) return -ENOMEM; - } =20 rproc_add_carveout(rproc, mem); index++; diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rp= roc.c index b02b36a3f515..61939b80a957 100644 --- a/drivers/remoteproc/stm32_rproc.c +++ b/drivers/remoteproc/stm32_rproc.c @@ -213,52 +213,46 @@ static int stm32_rproc_prepare(struct rproc *rproc) { struct device *dev =3D rproc->dev.parent; struct device_node *np =3D dev->of_node; - struct of_phandle_iterator it; struct rproc_mem_entry *mem; - struct reserved_mem *rmem; u64 da; - int index =3D 0; + int index =3D 0, mr =3D 0; =20 /* Register associated reserved memory regions */ - of_phandle_iterator_init(&it, np, "memory-region", NULL, 0); - while (of_phandle_iterator_next(&it) =3D=3D 0) { - rmem =3D of_reserved_mem_lookup(it.node); - if (!rmem) { - of_node_put(it.node); - dev_err(dev, "unable to acquire memory-region\n"); - return -EINVAL; - } + while (1) { + struct resource res; + int ret; =20 - if (stm32_rproc_pa_to_da(rproc, rmem->base, &da) < 0) { - of_node_put(it.node); - dev_err(dev, "memory region not valid %pa\n", - &rmem->base); + ret =3D of_reserved_mem_region_to_resource(np, mr++, &res); + if (ret) + return 0; + + if (stm32_rproc_pa_to_da(rproc, res.start, &da) < 0) { + dev_err(dev, "memory region not valid %pR\n", &res); return -EINVAL; } =20 /* No need to map vdev buffer */ - if (strcmp(it.node->name, "vdev0buffer")) { + if (!strstarts(res.name, "vdev0buffer")) { /* Register memory region */ mem =3D rproc_mem_entry_init(dev, NULL, - (dma_addr_t)rmem->base, - rmem->size, da, + (dma_addr_t)res.start, + resource_size(&res), da, stm32_rproc_mem_alloc, stm32_rproc_mem_release, - it.node->name); - + "%.*s", strchrnul(res.name, '@') - res.name, + res.name); if (mem) rproc_coredump_add_segment(rproc, da, - rmem->size); + resource_size(&res)); } else { /* Register reserved memory for vdev buffer alloc */ mem =3D rproc_of_resm_mem_entry_init(dev, index, - rmem->size, - rmem->base, - it.node->name); + resource_size(&res), + res.start, + "vdev0buffer"); } =20 if (!mem) { - of_node_put(it.node); return -ENOMEM; } =20 diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc= /ti_k3_dsp_remoteproc.c index a695890254ff..f02c835535bc 100644 --- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c +++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c @@ -535,13 +535,10 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_rpr= oc *kproc) { struct device *dev =3D kproc->dev; struct device_node *np =3D dev->of_node; - struct device_node *rmem_np; - struct reserved_mem *rmem; int num_rmems; int ret, i; =20 - num_rmems =3D of_property_count_elems_of_size(np, "memory-region", - sizeof(phandle)); + num_rmems =3D of_reserved_mem_region_count(np); if (num_rmems < 0) { dev_err(dev, "device does not reserved memory regions (%pe)\n", ERR_PTR(num_rmems)); @@ -571,23 +568,20 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_rpr= oc *kproc) =20 /* use remaining reserved memory regions for static carveouts */ for (i =3D 0; i < num_rmems; i++) { - rmem_np =3D of_parse_phandle(np, "memory-region", i + 1); - if (!rmem_np) - return -EINVAL; + struct resource res; =20 - rmem =3D of_reserved_mem_lookup(rmem_np); - of_node_put(rmem_np); - if (!rmem) - return -EINVAL; + ret =3D of_reserved_mem_region_to_resource(np, i + 1, &res); + if (ret) + return ret; =20 - kproc->rmem[i].bus_addr =3D rmem->base; + kproc->rmem[i].bus_addr =3D res.start; /* 64-bit address regions currently not supported */ - kproc->rmem[i].dev_addr =3D (u32)rmem->base; - kproc->rmem[i].size =3D rmem->size; - kproc->rmem[i].cpu_addr =3D devm_ioremap_wc(dev, rmem->base, rmem->size); + kproc->rmem[i].dev_addr =3D (u32)res.start; + kproc->rmem[i].size =3D resource_size(&res); + kproc->rmem[i].cpu_addr =3D devm_ioremap_resource_wc(dev, &res); if (!kproc->rmem[i].cpu_addr) { - dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n", - i + 1, &rmem->base, &rmem->size); + dev_err(dev, "failed to map reserved memory#%d at %pR\n", + i + 1, &res); return -ENOMEM; } =20 diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c b/drivers/remoteproc/= ti_k3_m4_remoteproc.c index a16fb165fced..8c7772cd6baf 100644 --- a/drivers/remoteproc/ti_k3_m4_remoteproc.c +++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c @@ -393,13 +393,10 @@ static int k3_m4_reserved_mem_init(struct k3_m4_rproc= *kproc) { struct device *dev =3D kproc->dev; struct device_node *np =3D dev->of_node; - struct device_node *rmem_np; - struct reserved_mem *rmem; int num_rmems; int ret, i; =20 - num_rmems =3D of_property_count_elems_of_size(np, "memory-region", - sizeof(phandle)); + num_rmems =3D of_reserved_mem_region_count(np); if (num_rmems < 0) { dev_err(dev, "device does not reserved memory regions (%d)\n", num_rmems); @@ -428,23 +425,20 @@ static int k3_m4_reserved_mem_init(struct k3_m4_rproc= *kproc) =20 /* use remaining reserved memory regions for static carveouts */ for (i =3D 0; i < num_rmems; i++) { - rmem_np =3D of_parse_phandle(np, "memory-region", i + 1); - if (!rmem_np) - return -EINVAL; + struct resource res; =20 - rmem =3D of_reserved_mem_lookup(rmem_np); - of_node_put(rmem_np); - if (!rmem) - return -EINVAL; + ret =3D of_reserved_mem_region_to_resource(np, i + 1, &res); + if (ret) + return ret; =20 - kproc->rmem[i].bus_addr =3D rmem->base; + kproc->rmem[i].bus_addr =3D res.start; /* 64-bit address regions currently not supported */ - kproc->rmem[i].dev_addr =3D (u32)rmem->base; - kproc->rmem[i].size =3D rmem->size; - kproc->rmem[i].cpu_addr =3D devm_ioremap_wc(dev, rmem->base, rmem->size); + kproc->rmem[i].dev_addr =3D (u32)res.start; + kproc->rmem[i].size =3D resource_size(&res); + kproc->rmem[i].cpu_addr =3D devm_ioremap_resource_wc(dev, &res); if (!kproc->rmem[i].cpu_addr) { - dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n", - i + 1, &rmem->base, &rmem->size); + dev_err(dev, "failed to map reserved memory#%d at %pR\n", + i + 1, &res); return -ENOMEM; } =20 diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/= ti_k3_r5_remoteproc.c index dbc513c5569c..9a7a61e0ecb8 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -966,13 +966,10 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc= *kproc) { struct device *dev =3D kproc->dev; struct device_node *np =3D dev_of_node(dev); - struct device_node *rmem_np; - struct reserved_mem *rmem; int num_rmems; int ret, i; =20 - num_rmems =3D of_property_count_elems_of_size(np, "memory-region", - sizeof(phandle)); + num_rmems =3D of_reserved_mem_region_count(np); if (num_rmems <=3D 0) { dev_err(dev, "device does not have reserved memory regions, ret =3D %d\n= ", num_rmems); @@ -1003,16 +1000,13 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rpr= oc *kproc) =20 /* use remaining reserved memory regions for static carveouts */ for (i =3D 0; i < num_rmems; i++) { - rmem_np =3D of_parse_phandle(np, "memory-region", i + 1); - if (!rmem_np) - return -EINVAL; + struct resource res; =20 - rmem =3D of_reserved_mem_lookup(rmem_np); - of_node_put(rmem_np); - if (!rmem) - return -EINVAL; + ret =3D of_reserved_mem_region_to_resource(np, i + 1, &res); + if (ret) + return ret; =20 - kproc->rmem[i].bus_addr =3D rmem->base; + kproc->rmem[i].bus_addr =3D res.start; /* * R5Fs do not have an MMU, but have a Region Address Translator * (RAT) module that provides a fixed entry translation between @@ -1023,12 +1017,12 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rpr= oc *kproc) * addresses/supported memory regions are restricted to 32-bit * bus addresses, and are identical */ - kproc->rmem[i].dev_addr =3D (u32)rmem->base; - kproc->rmem[i].size =3D rmem->size; - kproc->rmem[i].cpu_addr =3D devm_ioremap_wc(dev, rmem->base, rmem->size); + kproc->rmem[i].dev_addr =3D (u32)res.start; + kproc->rmem[i].size =3D resource_size(&res); + kproc->rmem[i].cpu_addr =3D devm_ioremap_resource_wc(dev, &res); if (!kproc->rmem[i].cpu_addr) { - dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n", - i + 1, &rmem->base, &rmem->size); + dev_err(dev, "failed to map reserved memory#%d at %pR\n", + i + 1, &res); return -ENOMEM; } =20 diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c b/drivers/remoteproc/x= lnx_r5_remoteproc.c index 5aeedeaf3c41..b73e97074c01 100644 --- a/drivers/remoteproc/xlnx_r5_remoteproc.c +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c @@ -460,49 +460,44 @@ static int add_mem_regions_carveout(struct rproc *rpr= oc) { struct rproc_mem_entry *rproc_mem; struct zynqmp_r5_core *r5_core; - struct of_phandle_iterator it; - struct reserved_mem *rmem; int i =3D 0; =20 r5_core =3D rproc->priv; =20 /* Register associated reserved memory regions */ - of_phandle_iterator_init(&it, r5_core->np, "memory-region", NULL, 0); + while (1) { + int err; + struct resource res; =20 - while (of_phandle_iterator_next(&it) =3D=3D 0) { - rmem =3D of_reserved_mem_lookup(it.node); - if (!rmem) { - of_node_put(it.node); - dev_err(&rproc->dev, "unable to acquire memory-region\n"); - return -EINVAL; - } + err =3D of_reserved_mem_region_to_resource(r5_core->np, i++, &res); + if (err) + return 0; =20 - if (!strcmp(it.node->name, "vdev0buffer")) { + if (strstarts(res.name, "vdev0buffer")) { /* Init reserved memory for vdev buffer */ rproc_mem =3D rproc_of_resm_mem_entry_init(&rproc->dev, i, - rmem->size, - rmem->base, - it.node->name); + resource_size(&res), + res.start, + "vdev0buffer"); } else { /* Register associated reserved memory regions */ rproc_mem =3D rproc_mem_entry_init(&rproc->dev, NULL, - (dma_addr_t)rmem->base, - rmem->size, rmem->base, + (dma_addr_t)res.start, + resource_size(&res), res.start, zynqmp_r5_mem_region_map, zynqmp_r5_mem_region_unmap, - it.node->name); + "%.*s", + strchrnul(res.name, '@') - res.name, + res.name); } =20 - if (!rproc_mem) { - of_node_put(it.node); + if (!rproc_mem) return -ENOMEM; - } =20 rproc_add_carveout(rproc, rproc_mem); - rproc_coredump_add_segment(rproc, rmem->base, rmem->size); + rproc_coredump_add_segment(rproc, res.start, resource_size(&res)); =20 - dev_dbg(&rproc->dev, "reserved mem carveout %s addr=3D%llx, size=3D0x%ll= x", - it.node->name, rmem->base, rmem->size); + dev_dbg(&rproc->dev, "reserved mem carveout %pR\n", &res); i++; } =20 @@ -776,7 +771,6 @@ static int zynqmp_r5_get_rsc_table_va(struct zynqmp_r5_= core *r5_core) struct device *dev =3D r5_core->dev; struct rsc_tbl_data *rsc_data_va; struct resource res_mem; - struct device_node *np; int ret; =20 /* @@ -786,14 +780,7 @@ static int zynqmp_r5_get_rsc_table_va(struct zynqmp_r5= _core *r5_core) * contains that data structure which holds resource table address, size * and some magic number to validate correct resource table entry. */ - np =3D of_parse_phandle(r5_core->np, "memory-region", 0); - if (!np) { - dev_err(dev, "failed to get memory region dev node\n"); - return -EINVAL; - } - - ret =3D of_address_to_resource(np, 0, &res_mem); - of_node_put(np); + ret =3D of_reserved_mem_region_to_resource(r5_core->np, 0, &res_mem); if (ret) { dev_err(dev, "failed to get memory-region resource addr\n"); return -EINVAL; --=20 2.47.2