* [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array
2024-06-11 15:35 [PATCH v4 0/4] Implement vendor resets for PSCI SYSTEM_RESET2 Elliot Berman
@ 2024-06-11 15:35 ` Elliot Berman
2024-06-11 20:40 ` Rob Herring
2024-06-11 15:35 ` [PATCH v4 2/4] dt-bindings: arm: Document reboot mode magic Elliot Berman
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Elliot Berman @ 2024-06-11 15:35 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski
Cc: Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm, Elliot Berman
PSCI reboot mode will map a mode name to multiple magic values instead
of just one. Convert the mode-.* property to an array. Users of the
reboot-mode schema will need to specify the maxItems of the mode-.*
properties. Existing users will all be 1.
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
.../devicetree/bindings/power/reset/nvmem-reboot-mode.yaml | 5 +++++
Documentation/devicetree/bindings/power/reset/qcom,pon.yaml | 8 ++++++++
Documentation/devicetree/bindings/power/reset/reboot-mode.yaml | 4 ++--
.../devicetree/bindings/power/reset/syscon-reboot-mode.yaml | 5 +++++
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
index 627f8a6078c2..9b9bbc0f29e7 100644
--- a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
+++ b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
@@ -31,6 +31,11 @@ properties:
allOf:
- $ref: reboot-mode.yaml#
+patternProperties:
+ "^mode-.*$":
+ items:
+ maxItems: 1
+
required:
- compatible
- nvmem-cells
diff --git a/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml b/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
index fc8105a7b9b2..4c87ff5ecc9a 100644
--- a/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
+++ b/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
@@ -54,6 +54,11 @@ required:
- compatible
- reg
+patternProperties:
+ "^mode-.*$":
+ items:
+ maxItems: 1
+
unevaluatedProperties: false
allOf:
@@ -75,6 +80,9 @@ allOf:
reg-names:
items:
- const: pon
+ else:
+ patternProperties:
+ "^mode-.*$": false
# Special case for pm8941, which doesn't store reset mode
- if:
diff --git a/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
index ad0a0b95cec1..523602fb82d2 100644
--- a/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
+++ b/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
@@ -28,13 +28,13 @@ description: |
properties:
mode-normal:
- $ref: /schemas/types.yaml#/definitions/uint32
+ $ref: "#/patternProperties/^mode-.*$"
description:
Default value to set on a reboot if no command was provided.
patternProperties:
"^mode-.*$":
- $ref: /schemas/types.yaml#/definitions/uint32
+ $ref: /schemas/types.yaml#/definitions/uint32-array
additionalProperties: true
diff --git a/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
index b6acff199cde..e9d2e3b27885 100644
--- a/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
+++ b/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
@@ -32,6 +32,11 @@ properties:
allOf:
- $ref: reboot-mode.yaml#
+patternProperties:
+ "^mode-.*$":
+ items:
+ maxItems: 1
+
unevaluatedProperties: false
required:
--
2.34.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array
2024-06-11 15:35 ` [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array Elliot Berman
@ 2024-06-11 20:40 ` Rob Herring
2024-06-11 23:23 ` Elliot Berman
0 siblings, 1 reply; 8+ messages in thread
From: Rob Herring @ 2024-06-11 20:40 UTC (permalink / raw)
To: Elliot Berman
Cc: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski,
Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm
On Tue, Jun 11, 2024 at 08:35:13AM -0700, Elliot Berman wrote:
> PSCI reboot mode will map a mode name to multiple magic values instead
> of just one. Convert the mode-.* property to an array. Users of the
> reboot-mode schema will need to specify the maxItems of the mode-.*
> properties. Existing users will all be 1.
>
> Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> ---
> .../devicetree/bindings/power/reset/nvmem-reboot-mode.yaml | 5 +++++
> Documentation/devicetree/bindings/power/reset/qcom,pon.yaml | 8 ++++++++
> Documentation/devicetree/bindings/power/reset/reboot-mode.yaml | 4 ++--
> .../devicetree/bindings/power/reset/syscon-reboot-mode.yaml | 5 +++++
> 4 files changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> index 627f8a6078c2..9b9bbc0f29e7 100644
> --- a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> +++ b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> @@ -31,6 +31,11 @@ properties:
> allOf:
> - $ref: reboot-mode.yaml#
>
> +patternProperties:
> + "^mode-.*$":
> + items:
> + maxItems: 1
Drop 'items'. Otherwise, you are defining constraints of a matrix.
> +
> required:
> - compatible
> - nvmem-cells
> diff --git a/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml b/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
> index fc8105a7b9b2..4c87ff5ecc9a 100644
> --- a/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
> +++ b/Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
> @@ -54,6 +54,11 @@ required:
> - compatible
> - reg
>
> +patternProperties:
> + "^mode-.*$":
> + items:
> + maxItems: 1
> +
> unevaluatedProperties: false
>
> allOf:
> @@ -75,6 +80,9 @@ allOf:
> reg-names:
> items:
> - const: pon
> + else:
> + patternProperties:
> + "^mode-.*$": false
>
> # Special case for pm8941, which doesn't store reset mode
> - if:
> diff --git a/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
> index ad0a0b95cec1..523602fb82d2 100644
> --- a/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
> +++ b/Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
> @@ -28,13 +28,13 @@ description: |
>
> properties:
> mode-normal:
> - $ref: /schemas/types.yaml#/definitions/uint32
> + $ref: "#/patternProperties/^mode-.*$"
No need for this. The pattern schema will be applied already. Also, a
$ref to a regex is fragile as it won't work for some regex patterns.
> description:
> Default value to set on a reboot if no command was provided.
>
> patternProperties:
> "^mode-.*$":
> - $ref: /schemas/types.yaml#/definitions/uint32
> + $ref: /schemas/types.yaml#/definitions/uint32-array
>
> additionalProperties: true
>
> diff --git a/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
> index b6acff199cde..e9d2e3b27885 100644
> --- a/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
> +++ b/Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
> @@ -32,6 +32,11 @@ properties:
> allOf:
> - $ref: reboot-mode.yaml#
>
> +patternProperties:
> + "^mode-.*$":
> + items:
> + maxItems: 1
> +
> unevaluatedProperties: false
>
> required:
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array
2024-06-11 20:40 ` Rob Herring
@ 2024-06-11 23:23 ` Elliot Berman
2024-06-13 17:35 ` Rob Herring
0 siblings, 1 reply; 8+ messages in thread
From: Elliot Berman @ 2024-06-11 23:23 UTC (permalink / raw)
To: Rob Herring
Cc: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski,
Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm
On Tue, Jun 11, 2024 at 02:40:01PM -0600, Rob Herring wrote:
> On Tue, Jun 11, 2024 at 08:35:13AM -0700, Elliot Berman wrote:
> > PSCI reboot mode will map a mode name to multiple magic values instead
> > of just one. Convert the mode-.* property to an array. Users of the
> > reboot-mode schema will need to specify the maxItems of the mode-.*
> > properties. Existing users will all be 1.
> >
> > Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> > ---
> > .../devicetree/bindings/power/reset/nvmem-reboot-mode.yaml | 5 +++++
> > Documentation/devicetree/bindings/power/reset/qcom,pon.yaml | 8 ++++++++
> > Documentation/devicetree/bindings/power/reset/reboot-mode.yaml | 4 ++--
> > .../devicetree/bindings/power/reset/syscon-reboot-mode.yaml | 5 +++++
> > 4 files changed, 20 insertions(+), 2 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> > index 627f8a6078c2..9b9bbc0f29e7 100644
> > --- a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> > +++ b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> > @@ -31,6 +31,11 @@ properties:
> > allOf:
> > - $ref: reboot-mode.yaml#
> >
> > +patternProperties:
> > + "^mode-.*$":
> > + items:
> > + maxItems: 1
>
> Drop 'items'. Otherwise, you are defining constraints of a matrix.
>
If I do this, I also have to add $ref: .../uint32-array as well so
the property can be picked up as an array type. Let me know if this isn't
right, otherwise I'll send out a fixed version in a few days.
Thanks,
Elliot
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array
2024-06-11 23:23 ` Elliot Berman
@ 2024-06-13 17:35 ` Rob Herring
0 siblings, 0 replies; 8+ messages in thread
From: Rob Herring @ 2024-06-13 17:35 UTC (permalink / raw)
To: Elliot Berman
Cc: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski,
Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm
On Tue, Jun 11, 2024 at 04:23:00PM -0700, Elliot Berman wrote:
> On Tue, Jun 11, 2024 at 02:40:01PM -0600, Rob Herring wrote:
> > On Tue, Jun 11, 2024 at 08:35:13AM -0700, Elliot Berman wrote:
> > > PSCI reboot mode will map a mode name to multiple magic values instead
> > > of just one. Convert the mode-.* property to an array. Users of the
> > > reboot-mode schema will need to specify the maxItems of the mode-.*
> > > properties. Existing users will all be 1.
> > >
> > > Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> > > ---
> > > .../devicetree/bindings/power/reset/nvmem-reboot-mode.yaml | 5 +++++
> > > Documentation/devicetree/bindings/power/reset/qcom,pon.yaml | 8 ++++++++
> > > Documentation/devicetree/bindings/power/reset/reboot-mode.yaml | 4 ++--
> > > .../devicetree/bindings/power/reset/syscon-reboot-mode.yaml | 5 +++++
> > > 4 files changed, 20 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> > > index 627f8a6078c2..9b9bbc0f29e7 100644
> > > --- a/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> > > +++ b/Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
> > > @@ -31,6 +31,11 @@ properties:
> > > allOf:
> > > - $ref: reboot-mode.yaml#
> > >
> > > +patternProperties:
> > > + "^mode-.*$":
> > > + items:
> > > + maxItems: 1
> >
> > Drop 'items'. Otherwise, you are defining constraints of a matrix.
> >
>
> If I do this, I also have to add $ref: .../uint32-array as well so
> the property can be picked up as an array type. Let me know if this isn't
> right, otherwise I'll send out a fixed version in a few days.
Ah, I suppose the tools get confused with what to do here. That's an
issue I'm working on addressing. The issue is everything is a matrix
because without other information for a property we don't know how to
decode them. But with the schemas being fairly complete now and the move
away from DTB->YAML decoding, we can decode properties to the right
type. One issue to switch over is places where this 'everything is a
matrix' crept into schemas. I've been fixing these. The above is an
example of this.
So for now, just drop 'items'. It won't enforce anything, but once we
switch over it will.
Rob
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 2/4] dt-bindings: arm: Document reboot mode magic
2024-06-11 15:35 [PATCH v4 0/4] Implement vendor resets for PSCI SYSTEM_RESET2 Elliot Berman
2024-06-11 15:35 ` [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array Elliot Berman
@ 2024-06-11 15:35 ` Elliot Berman
2024-06-11 15:35 ` [PATCH v4 3/4] firmware: psci: Read and use vendor reset types Elliot Berman
2024-06-11 15:35 ` [PATCH v4 4/4] arm64: dts: qcom: Add PSCI SYSTEM_RESET2 types for qcm6490-idp Elliot Berman
3 siblings, 0 replies; 8+ messages in thread
From: Elliot Berman @ 2024-06-11 15:35 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski
Cc: Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm, Elliot Berman
Add bindings to describe vendor-specific reboot modes. Values here
correspond to valid parameters to vendor-specific reset types in PSCI
SYSTEM_RESET2 call.
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
Documentation/devicetree/bindings/arm/psci.yaml | 44 +++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/Documentation/devicetree/bindings/arm/psci.yaml b/Documentation/devicetree/bindings/arm/psci.yaml
index cbb012e217ab..7bc828661dec 100644
--- a/Documentation/devicetree/bindings/arm/psci.yaml
+++ b/Documentation/devicetree/bindings/arm/psci.yaml
@@ -98,6 +98,28 @@ properties:
[1] Kernel documentation - ARM idle states bindings
Documentation/devicetree/bindings/cpu/idle-states.yaml
+ reset-types:
+ type: object
+ $ref: /schemas/power/reset/reboot-mode.yaml#
+ unevaluatedProperties: false
+ properties:
+ # "mode-normal" is just SYSTEM_RESET
+ mode-normal: false
+ patternProperties:
+ "^mode-.*$":
+ $ref: /schemas/types.yaml#/definitions/uint32-array
+ minItems: 1
+ maxItems: 2
+ description: |
+ Describes a vendor-specific reset type. The string after "mode-"
+ maps a reboot mode to the parameters in the PSCI SYSTEM_RESET2 call.
+
+ Parameters are named mode-xxx = <type[, cookie]>, where xxx
+ is the name of the magic reboot mode, type is the lower 31 bits
+ of the reset_type, and, optionally, the cookie value. If the cookie
+ is not provided, it is defaulted to zero.
+ The 31st bit (vendor-resets) will be implicitly set by the driver.
+
patternProperties:
"^power-domain-":
$ref: /schemas/power/power-domain.yaml#
@@ -137,6 +159,15 @@ allOf:
required:
- cpu_off
- cpu_on
+ - if:
+ not:
+ properties:
+ compatible:
+ contains:
+ const: arm,psci-1.0
+ then:
+ properties:
+ reset-types: false
additionalProperties: false
@@ -261,4 +292,17 @@ examples:
domain-idle-states = <&CLUSTER_RET>, <&CLUSTER_PWRDN>;
};
};
+
+ - |+
+
+ // Case 5: SYSTEM_RESET2 vendor resets
+ psci {
+ compatible = "arm,psci-1.0";
+ method = "smc";
+
+ reset-types {
+ mode-edl = <0>;
+ mode-bootloader = <1 2>;
+ };
+ };
...
--
2.34.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 3/4] firmware: psci: Read and use vendor reset types
2024-06-11 15:35 [PATCH v4 0/4] Implement vendor resets for PSCI SYSTEM_RESET2 Elliot Berman
2024-06-11 15:35 ` [PATCH v4 1/4] dt-bindings: power: reset: Convert mode-.* properties to array Elliot Berman
2024-06-11 15:35 ` [PATCH v4 2/4] dt-bindings: arm: Document reboot mode magic Elliot Berman
@ 2024-06-11 15:35 ` Elliot Berman
2024-06-11 15:35 ` [PATCH v4 4/4] arm64: dts: qcom: Add PSCI SYSTEM_RESET2 types for qcm6490-idp Elliot Berman
3 siblings, 0 replies; 8+ messages in thread
From: Elliot Berman @ 2024-06-11 15:35 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski
Cc: Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm, Elliot Berman
SoC vendors have different types of resets and are controlled through
various registers. For instance, Qualcomm chipsets can reboot to a
"download mode" that allows a RAM dump to be collected. Another example
is they also support writing a cookie that can be read by bootloader
during next boot. PSCI offers a mechanism, SYSTEM_RESET2, for these
vendor reset types to be implemented without requiring drivers for every
register/cookie.
Add support in PSCI to statically map reboot mode commands from
userspace to a vendor reset and cookie value using the device tree.
A separate initcall is needed to parse the devicetree, instead of using
psci_dt_init because mm isn't sufficiently set up to allocate memory.
Reboot mode framework is close but doesn't quite fit with the
design and requirements for PSCI SYSTEM_RESET2. Some of these issues can
be solved but doesn't seem reasonable in sum:
1. reboot mode registers against the reboot_notifier_list, which is too
early to call SYSTEM_RESET2. PSCI would need to remember the reset
type from the reboot-mode framework callback and use it
psci_sys_reset.
2. reboot mode assumes only one cookie/parameter is described in the
device tree. SYSTEM_RESET2 uses 2: one for the type and one for
cookie.
3. psci cpuidle driver already registers a driver against the
arm,psci-1.0 compatible. Refactoring would be needed to have both a
cpuidle and reboot-mode driver.
Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
drivers/firmware/psci/psci.c | 92 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 92 insertions(+)
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
index d9629ff87861..e672b33b71d1 100644
--- a/drivers/firmware/psci/psci.c
+++ b/drivers/firmware/psci/psci.c
@@ -29,6 +29,8 @@
#include <asm/smp_plat.h>
#include <asm/suspend.h>
+#define REBOOT_PREFIX "mode-"
+
/*
* While a 64-bit OS can make calls with SMC32 calling conventions, for some
* calls it is necessary to use SMC64 to pass or return 64-bit values.
@@ -79,6 +81,14 @@ struct psci_0_1_function_ids get_psci_0_1_function_ids(void)
static u32 psci_cpu_suspend_feature;
static bool psci_system_reset2_supported;
+struct psci_reset_param {
+ const char *mode;
+ u32 reset_type;
+ u32 cookie;
+};
+static struct psci_reset_param *psci_reset_params;
+static size_t num_psci_reset_params;
+
static inline bool psci_has_ext_power_state(void)
{
return psci_cpu_suspend_feature &
@@ -305,9 +315,29 @@ static int get_set_conduit_method(const struct device_node *np)
return 0;
}
+static void psci_vendor_sys_reset2(unsigned long action, void *data)
+{
+ const char *cmd = data;
+ unsigned long ret;
+ size_t i;
+
+ for (i = 0; i < num_psci_reset_params; i++) {
+ if (!strcmp(psci_reset_params[i].mode, cmd)) {
+ ret = invoke_psci_fn(PSCI_FN_NATIVE(1_1, SYSTEM_RESET2),
+ psci_reset_params[i].reset_type,
+ psci_reset_params[i].cookie, 0);
+ pr_err("failed to perform reset \"%s\": %ld\n",
+ cmd, (long)ret);
+ }
+ }
+}
+
static int psci_sys_reset(struct notifier_block *nb, unsigned long action,
void *data)
{
+ if (data && num_psci_reset_params)
+ psci_vendor_sys_reset2(action, data);
+
if ((reboot_mode == REBOOT_WARM || reboot_mode == REBOOT_SOFT) &&
psci_system_reset2_supported) {
/*
@@ -748,6 +778,68 @@ static const struct of_device_id psci_of_match[] __initconst = {
{},
};
+static int __init psci_init_system_reset2_modes(void)
+{
+ const size_t len = strlen(REBOOT_PREFIX);
+ struct psci_reset_param *param;
+ struct device_node *psci_np __free(device_node) = NULL;
+ struct device_node *np __free(device_node) = NULL;
+ struct property *prop;
+ size_t count = 0;
+ u32 magic[2];
+ int num;
+
+ if (!psci_system_reset2_supported)
+ return 0;
+
+ psci_np = of_find_matching_node(NULL, psci_of_match);
+ if (!psci_np)
+ return 0;
+
+ np = of_find_node_by_name(psci_np, "reset-types");
+ if (!np)
+ return 0;
+
+ for_each_property_of_node(np, prop) {
+ if (strncmp(prop->name, REBOOT_PREFIX, len))
+ continue;
+ num = of_property_count_elems_of_size(np, prop->name, sizeof(magic[0]));
+ if (num != 1 && num != 2)
+ continue;
+
+ count++;
+ }
+
+ param = psci_reset_params = kcalloc(count, sizeof(*psci_reset_params), GFP_KERNEL);
+ if (!psci_reset_params)
+ return -ENOMEM;
+
+ for_each_property_of_node(np, prop) {
+ if (strncmp(prop->name, REBOOT_PREFIX, len))
+ continue;
+
+ param->mode = kstrdup_const(prop->name + len, GFP_KERNEL);
+ if (!param->mode)
+ continue;
+
+ num = of_property_read_variable_u32_array(np, prop->name, magic, 1, 2);
+ if (num < 0) {
+ pr_warn("Failed to parse vendor reboot mode %s\n", param->mode);
+ kfree_const(param->mode);
+ continue;
+ }
+
+ /* Force reset type to be in vendor space */
+ param->reset_type = PSCI_1_1_RESET_TYPE_VENDOR_START | magic[0];
+ param->cookie = num == 2 ? magic[1] : 0;
+ param++;
+ num_psci_reset_params++;
+ }
+
+ return 0;
+}
+arch_initcall(psci_init_system_reset2_modes);
+
int __init psci_dt_init(void)
{
struct device_node *np;
--
2.34.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 4/4] arm64: dts: qcom: Add PSCI SYSTEM_RESET2 types for qcm6490-idp
2024-06-11 15:35 [PATCH v4 0/4] Implement vendor resets for PSCI SYSTEM_RESET2 Elliot Berman
` (2 preceding siblings ...)
2024-06-11 15:35 ` [PATCH v4 3/4] firmware: psci: Read and use vendor reset types Elliot Berman
@ 2024-06-11 15:35 ` Elliot Berman
3 siblings, 0 replies; 8+ messages in thread
From: Elliot Berman @ 2024-06-11 15:35 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Sebastian Reichel, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Vinod Koul, Andy Yan,
Lorenzo Pieralisi, Mark Rutland, Bartosz Golaszewski
Cc: Satya Durga Srinivasu Prabhala, Melody Olvera, Shivendra Pratap,
devicetree, linux-kernel, linux-arm-kernel, Florian Fainelli,
linux-pm, linux-arm-msm, Elliot Berman
Add nodes for the vendor-defined system resets. "bootloader" will cause
device to reboot and stop in the bootloader's fastboot mode. "edl" will
cause device to reboot into "emergency download mode", which permits
loading images via the Firehose protocol.
Co-developed-by: Shivendra Pratap <quic_spratap@quicinc.com>
Signed-off-by: Shivendra Pratap <quic_spratap@quicinc.com>
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
arch/arm64/boot/dts/qcom/qcm6490-idp.dts | 7 +++++++
arch/arm64/boot/dts/qcom/sc7280.dtsi | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/qcm6490-idp.dts b/arch/arm64/boot/dts/qcom/qcm6490-idp.dts
index e4bfad50a669..fd0a7dd14483 100644
--- a/arch/arm64/boot/dts/qcom/qcm6490-idp.dts
+++ b/arch/arm64/boot/dts/qcom/qcm6490-idp.dts
@@ -448,6 +448,13 @@ led@3 {
};
};
+&psci {
+ reset-types {
+ mode-bootloader = <0x10001 0x2>;
+ mode-edl = <0 0x1>;
+ };
+};
+
&qupv3_id_0 {
status = "okay";
};
diff --git a/arch/arm64/boot/dts/qcom/sc7280.dtsi b/arch/arm64/boot/dts/qcom/sc7280.dtsi
index 7e7f0f0fb41b..da25a3089419 100644
--- a/arch/arm64/boot/dts/qcom/sc7280.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc7280.dtsi
@@ -848,7 +848,7 @@ pmu {
interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW>;
};
- psci {
+ psci: psci {
compatible = "arm,psci-1.0";
method = "smc";
--
2.34.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 8+ messages in thread