[v5,2/2] pstore/ram: Rework logic for detecting ramoops

Message ID 1675330081-15029-2-git-send-email-quic_mojha@quicinc.com
State New
Headers
Series [v5,1/2] dt-bindings: ramoops: Add support to get the region dynamically |

Commit Message

Mukesh Ojha Feb. 2, 2023, 9:28 a.m. UTC
  The reserved memory region for ramoops is assumed to be at a fixed
and known location when read from the devicetree. This is not desirable
in an environment where it is preferred the region to be dynamically
allocated at runtime, as opposed to being fixed at compile time.

Also, some of the platforms might be still expecting dedicated
memory region for ramoops node where the region is known beforehand
and platform_get_resource() is used in that case.

So, add logic to detect the start and size of the ramoops memory
region by looking up reserved memory region with of_reserved_mem_lookup()
api when platform_get_resource() fails also update the ramoops
documentation,

Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com>
---
Changes in v5:
 - Removed the CC list from the commit text.

Changes in v4:
 - Updated the minor change in documentation.

Changes in v3:
 - Merged 2/3 and 3/3 into one.
   https://lore.kernel.org/lkml/1673611126-13803-2-git-send-email-quic_mojha@quicinc.com/
   https://lore.kernel.org/lkml/1673611126-13803-3-git-send-email-quic_mojha@quicinc.com/

Changes in v2:
 - Addressed the comments made by kees and Guilherme in v1.


 Documentation/admin-guide/ramoops.rst | 25 ++++++++++++++++++++++---
 fs/pstore/ram.c                       | 18 +++++++++++++-----
 2 files changed, 35 insertions(+), 8 deletions(-)
  

Comments

Mukesh Ojha Feb. 14, 2023, 1:44 p.m. UTC | #1
Hi Kees/Rob,

Since, we are not agreeing to put dynamics ramoops region support in 
device tree.

In Qualcomm SoC, during reset the pstore static region did not get 
preserved across boots and we have our own mechanism to collect regions
if physical address and size is somehow passed to boot-firmware by 
writing to some shared memory. So, we wanted to reuse the region
supported by pstore(dmesg/console/ etc.) for that we wanted to this
flexibility to put this region dynamically anywhere in the ram.

This patch will help achieve the same . Can you suggest if this gets
allowed.

-Mukesh

On 2/2/2023 2:58 PM, Mukesh Ojha wrote:
> The reserved memory region for ramoops is assumed to be at a fixed
> and known location when read from the devicetree. This is not desirable
> in an environment where it is preferred the region to be dynamically
> allocated at runtime, as opposed to being fixed at compile time.
> 
> Also, some of the platforms might be still expecting dedicated
> memory region for ramoops node where the region is known beforehand
> and platform_get_resource() is used in that case.
> 
> So, add logic to detect the start and size of the ramoops memory
> region by looking up reserved memory region with of_reserved_mem_lookup()
> api when platform_get_resource() fails also update the ramoops
> documentation.
> 
> Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> > ---
> Changes in v5:
>   - Removed the CC list from the commit text.
> 
> Changes in v4:
>   - Updated the minor change in documentation.
> 
> Changes in v3:
>   - Merged 2/3 and 3/3 into one.
>     https://lore.kernel.org/lkml/1673611126-13803-2-git-send-email-quic_mojha@quicinc.com/
>     https://lore.kernel.org/lkml/1673611126-13803-3-git-send-email-quic_mojha@quicinc.com/
> 
> Changes in v2:
>   - Addressed the comments made by kees and Guilherme in v1.
> 
> 
>   Documentation/admin-guide/ramoops.rst | 25 ++++++++++++++++++++++---
>   fs/pstore/ram.c                       | 18 +++++++++++++-----
>   2 files changed, 35 insertions(+), 8 deletions(-)
> 
> diff --git a/Documentation/admin-guide/ramoops.rst b/Documentation/admin-guide/ramoops.rst
> index e9f8514..3586d15 100644
> --- a/Documentation/admin-guide/ramoops.rst
> +++ b/Documentation/admin-guide/ramoops.rst
> @@ -16,8 +16,9 @@ survive after a restart.
>   Ramoops concepts
>   ----------------
>   
> -Ramoops uses a predefined memory area to store the dump. The start and size
> -and type of the memory area are set using three variables:
> +Ramoops uses both predefined and dynamically memory area to store the dump.
> +The start and size and type of the memory area are set using three
> +variables:
>   
>     * ``mem_address`` for the start
>     * ``mem_size`` for the size. The memory size will be rounded down to a
> @@ -70,7 +71,8 @@ Setting the ramoops parameters can be done in several different manners:
>   
>    B. Use Device Tree bindings, as described in
>    ``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``.
> - For example::
> +
> + Example of statically reserved ramoops region::
>   
>   	reserved-memory {
>   		#address-cells = <2>;
> @@ -85,6 +87,23 @@ Setting the ramoops parameters can be done in several different manners:
>   		};
>   	};
>   
> + Example of dynamically reserved ramoops region::
> +
> +	reserved-memory {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		ranges;
> +
> +		ramoops_region: ramoops {
> +			compatible = "ramoops";
> +			alloc-ranges = <0x00000000 0xffffffff>;
> +			size = <0 0x100000>;
> +			record-size = <0x4000>;
> +			console-size = <0x4000>;
> +		};
> +	};
> +
> +
>    C. Use a platform device and set the platform data. The parameters can then
>    be set through that platform data. An example of doing that is:
>   
> diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
> index ade66db..17c9f46 100644
> --- a/fs/pstore/ram.c
> +++ b/fs/pstore/ram.c
> @@ -20,6 +20,7 @@
>   #include <linux/compiler.h>
>   #include <linux/of.h>
>   #include <linux/of_address.h>
> +#include <linux/of_reserved_mem.h>
>   
>   #include "internal.h"
>   #include "ram_internal.h"
> @@ -643,6 +644,7 @@ static int ramoops_parse_dt(struct platform_device *pdev,
>   {
>   	struct device_node *of_node = pdev->dev.of_node;
>   	struct device_node *parent_node;
> +	struct reserved_mem *rmem;
>   	struct resource *res;
>   	u32 value;
>   	int ret;
> @@ -651,13 +653,19 @@ static int ramoops_parse_dt(struct platform_device *pdev,
>   
>   	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>   	if (!res) {
> -		dev_err(&pdev->dev,
> -			"failed to locate DT /reserved-memory resource\n");
> -		return -EINVAL;
> +		rmem = of_reserved_mem_lookup(of_node);
> +		if (!rmem) {
> +			dev_err(&pdev->dev,
> +				"failed to locate DT /reserved-memory resource\n");
> +			return -EINVAL;
> +		}
> +		pdata->mem_size = rmem->size;
> +		pdata->mem_address = rmem->base;
> +	} else {
> +		pdata->mem_size = resource_size(res);
> +		pdata->mem_address = res->start;
>   	}
>   
> -	pdata->mem_size = resource_size(res);
> -	pdata->mem_address = res->start;
>   	/*
>   	 * Setting "unbuffered" is deprecated and will be ignored if
>   	 * "mem_type" is also specified.
  

Patch

diff --git a/Documentation/admin-guide/ramoops.rst b/Documentation/admin-guide/ramoops.rst
index e9f8514..3586d15 100644
--- a/Documentation/admin-guide/ramoops.rst
+++ b/Documentation/admin-guide/ramoops.rst
@@ -16,8 +16,9 @@  survive after a restart.
 Ramoops concepts
 ----------------
 
-Ramoops uses a predefined memory area to store the dump. The start and size
-and type of the memory area are set using three variables:
+Ramoops uses both predefined and dynamically memory area to store the dump.
+The start and size and type of the memory area are set using three
+variables:
 
   * ``mem_address`` for the start
   * ``mem_size`` for the size. The memory size will be rounded down to a
@@ -70,7 +71,8 @@  Setting the ramoops parameters can be done in several different manners:
 
  B. Use Device Tree bindings, as described in
  ``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``.
- For example::
+
+ Example of statically reserved ramoops region::
 
 	reserved-memory {
 		#address-cells = <2>;
@@ -85,6 +87,23 @@  Setting the ramoops parameters can be done in several different manners:
 		};
 	};
 
+ Example of dynamically reserved ramoops region::
+
+	reserved-memory {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		ramoops_region: ramoops {
+			compatible = "ramoops";
+			alloc-ranges = <0x00000000 0xffffffff>;
+			size = <0 0x100000>;
+			record-size = <0x4000>;
+			console-size = <0x4000>;
+		};
+	};
+
+
  C. Use a platform device and set the platform data. The parameters can then
  be set through that platform data. An example of doing that is:
 
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index ade66db..17c9f46 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -20,6 +20,7 @@ 
 #include <linux/compiler.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/of_reserved_mem.h>
 
 #include "internal.h"
 #include "ram_internal.h"
@@ -643,6 +644,7 @@  static int ramoops_parse_dt(struct platform_device *pdev,
 {
 	struct device_node *of_node = pdev->dev.of_node;
 	struct device_node *parent_node;
+	struct reserved_mem *rmem;
 	struct resource *res;
 	u32 value;
 	int ret;
@@ -651,13 +653,19 @@  static int ramoops_parse_dt(struct platform_device *pdev,
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res) {
-		dev_err(&pdev->dev,
-			"failed to locate DT /reserved-memory resource\n");
-		return -EINVAL;
+		rmem = of_reserved_mem_lookup(of_node);
+		if (!rmem) {
+			dev_err(&pdev->dev,
+				"failed to locate DT /reserved-memory resource\n");
+			return -EINVAL;
+		}
+		pdata->mem_size = rmem->size;
+		pdata->mem_address = rmem->base;
+	} else {
+		pdata->mem_size = resource_size(res);
+		pdata->mem_address = res->start;
 	}
 
-	pdata->mem_size = resource_size(res);
-	pdata->mem_address = res->start;
 	/*
 	 * Setting "unbuffered" is deprecated and will be ignored if
 	 * "mem_type" is also specified.