Commit 529182e2 authored by Kees Cook's avatar Kees Cook

ramoops: use DT reserved-memory bindings

Instead of a ramoops-specific node, use a child node of /reserved-memory.
This requires that of_platform_device_create() be explicitly called
for the node, though, since "/reserved-memory" does not have its own
"compatible" property.
Suggested-by: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarRob Herring <robh@kernel.org>
parent f38d2e53
...@@ -2,8 +2,9 @@ Ramoops oops/panic logger ...@@ -2,8 +2,9 @@ Ramoops oops/panic logger
========================= =========================
ramoops provides persistent RAM storage for oops and panics, so they can be ramoops provides persistent RAM storage for oops and panics, so they can be
recovered after a reboot. It is a backend to pstore, so this node is named recovered after a reboot. This is a child-node of "/reserved-memory", and
"ramoops" after the backend, rather than "pstore" which is the subsystem. is named "ramoops" after the backend, rather than "pstore" which is the
subsystem.
Parts of this storage may be set aside for other persistent log buffers, such Parts of this storage may be set aside for other persistent log buffers, such
as kernel log messages, or for optional ECC error-correction data. The total as kernel log messages, or for optional ECC error-correction data. The total
...@@ -21,8 +22,7 @@ Required properties: ...@@ -21,8 +22,7 @@ Required properties:
- compatible: must be "ramoops" - compatible: must be "ramoops"
- memory-region: phandle to a region of memory that is preserved between - reg: region of memory that is preserved between reboots
reboots
Optional properties: Optional properties:
......
...@@ -45,18 +45,34 @@ corrupt, but usually it is restorable. ...@@ -45,18 +45,34 @@ corrupt, but usually it is restorable.
2. Setting the parameters 2. Setting the parameters
Setting the ramoops parameters can be done in 3 different manners: Setting the ramoops parameters can be done in several different manners:
1. Use the module parameters (which have the names of the variables described
as before). A. Use the module parameters (which have the names of the variables described
For quick debugging, you can also reserve parts of memory during boot as before). For quick debugging, you can also reserve parts of memory during
and then use the reserved memory for ramoops. For example, assuming a machine boot and then use the reserved memory for ramoops. For example, assuming a
with > 128 MB of memory, the following kernel command line will tell the machine with > 128 MB of memory, the following kernel command line will tell
kernel to use only the first 128 MB of memory, and place ECC-protected ramoops the kernel to use only the first 128 MB of memory, and place ECC-protected
region at 128 MB boundary: ramoops region at 128 MB boundary:
"mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1" "mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1"
2. Use Device Tree bindings, as described in
Documentation/device-tree/bindings/misc/ramoops.txt. B. Use Device Tree bindings, as described in
3. Use a platform device and set the platform data. The parameters can then Documentation/device-tree/bindings/reserved-memory/ramoops.txt.
For example:
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
ramoops@8f000000 {
compatible = "ramoops";
reg = <0 0x8f000000 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: be set through that platform data. An example of doing that is:
#include <linux/pstore_ram.h> #include <linux/pstore_ram.h>
......
...@@ -499,8 +499,24 @@ EXPORT_SYMBOL_GPL(of_platform_default_populate); ...@@ -499,8 +499,24 @@ EXPORT_SYMBOL_GPL(of_platform_default_populate);
static int __init of_platform_default_populate_init(void) static int __init of_platform_default_populate_init(void)
{ {
if (of_have_populated_dt()) struct device_node *node;
of_platform_default_populate(NULL, NULL, NULL);
if (!of_have_populated_dt())
return -ENODEV;
/*
* Handle ramoops explicitly, since it is inside /reserved-memory,
* which lacks a "compatible" property.
*/
node = of_find_node_by_path("/reserved-memory");
if (node) {
node = of_find_compatible_node(node, NULL, "ramoops");
if (node)
of_platform_device_create(node, NULL, NULL);
}
/* Populate everything else. */
of_platform_default_populate(NULL, NULL, NULL);
return 0; return 0;
} }
......
...@@ -486,30 +486,21 @@ static int ramoops_parse_dt(struct platform_device *pdev, ...@@ -486,30 +486,21 @@ static int ramoops_parse_dt(struct platform_device *pdev,
struct ramoops_platform_data *pdata) struct ramoops_platform_data *pdata)
{ {
struct device_node *of_node = pdev->dev.of_node; struct device_node *of_node = pdev->dev.of_node;
struct device_node *mem_region; struct resource *res;
struct resource res;
u32 value; u32 value;
int ret; int ret;
dev_dbg(&pdev->dev, "using Device Tree\n"); dev_dbg(&pdev->dev, "using Device Tree\n");
mem_region = of_parse_phandle(of_node, "memory-region", 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem_region) { if (!res) {
dev_err(&pdev->dev, "no memory-region phandle\n");
return -ENODEV;
}
ret = of_address_to_resource(mem_region, 0, &res);
of_node_put(mem_region);
if (ret) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"failed to translate memory-region to resource: %d\n", "failed to locate DT /reserved-memory resource\n");
ret); return -EINVAL;
return ret;
} }
pdata->mem_size = resource_size(&res); pdata->mem_size = resource_size(res);
pdata->mem_address = res.start; pdata->mem_address = res->start;
pdata->mem_type = of_property_read_bool(of_node, "unbuffered"); pdata->mem_type = of_property_read_bool(of_node, "unbuffered");
pdata->dump_oops = !of_property_read_bool(of_node, "no-dump-oops"); pdata->dump_oops = !of_property_read_bool(of_node, "no-dump-oops");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment