All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lorenzo Pieralisi <lpieralisi@kernel.org>
To: Elliot Berman <quic_eberman@quicinc.com>
Cc: Stephen Boyd <swboyd@chromium.org>,
	Andy Yan <andy.yan@rock-chips.com>, Arnd Bergmann <arnd@arndb.de>,
	Bartosz Golaszewski <bartosz.golaszewski@linaro.org>,
	Bjorn Andersson <andersson@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Conor Dooley <conor+dt@kernel.org>,
	Konrad Dybcio <konradybcio@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Olof Johansson <olof@lixom.net>, Rob Herring <robh@kernel.org>,
	Sebastian Reichel <sre@kernel.org>, Vinod Koul <vkoul@kernel.org>,
	Will Deacon <will@kernel.org>,
	cros-qcom-dts-watchers@chromium.org,
	Satya Durga Srinivasu Prabhala <quic_satyap@quicinc.com>,
	Melody Olvera <quic_molvera@quicinc.com>,
	Shivendra Pratap <quic_spratap@quicinc.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Florian Fainelli <florian.fainelli@broadcom.com>,
	linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org
Subject: Re: [PATCH v6 3/5] firmware: psci: Read and use vendor reset types
Date: Fri, 15 Nov 2024 14:35:52 +0100	[thread overview]
Message-ID: <ZzdOOP0KuMMdo64W@lpieralisi> (raw)
In-Reply-To: <20241023092251529-0700.eberman@hu-eberman-lv.qualcomm.com>

On Wed, Oct 23, 2024 at 09:30:21AM -0700, Elliot Berman wrote:
> On Fri, Oct 18, 2024 at 10:42:46PM -0700, Stephen Boyd wrote:
> > Quoting Elliot Berman (2024-10-18 12:39:48)
> > > diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
> > > index 2328ca58bba6..60bc285622ce 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-"
> > 
> > Maybe move this near the function that uses it.
> > 
> > > +
> > >  /*
> > >   * 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.
> > > @@ -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);
> > 
> > Do this intentionally return? Should it be some other function that's
> > __noreturn instead and a while (1) if the firmware returns back to the
> > kernel?
> > 
> 
> Yes, I think it's best to make sure we fall back to the architectural
> reset (whether it's the SYSTEM_RESET or architectural SYSTEM_RESET2)
> since device would reboot then.

Well, that's one of the doubts I have about enabling this code. From
userspace we are requesting a reboot (I don't even think that user
space knows which reboot modes are actually implemented (?)) and we may
end up issuing one with completely different semantics ?

Are these "reset types" exported to user space ?

Lorenzo

> > > +               }
> > > +       }
> > > +}
> > > +
> > >  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) {
> > >                 /*
> > > @@ -750,6 +780,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]));
> > 
> > Use of_property_count_u32_elems()?
> > 
> > > +               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);
> > 
> > ARRAY_SIZE(magic)?
> > 
> > > +               if (num < 0) {
> > 
> > Should this be less than 1?
> > 
> 
> of_property_read_variable_u32_array should return -EOVERFLOW (or maybe
> -ENODATA) if the array is empty. I don't see it's possible for
> of_property_read_variable_u32_array() to return a non-negative value
> that's not 1 or 2.
> 
> > > +                       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;
> > 
> > ARRAY_SIZE(magic)?
> > 
> > > +               param++;
> > > +               num_psci_reset_params++;
> > > +       }
> > > +
> > > +       return 0;


  parent reply	other threads:[~2024-11-15 13:37 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-18 19:39 [PATCH v6 0/5] Implement vendor resets for PSCI SYSTEM_RESET2 Elliot Berman
2024-10-18 19:39 ` [PATCH v6 1/5] dt-bindings: power: reset: Convert mode-.* properties to array Elliot Berman
2024-10-18 19:39 ` [PATCH v6 2/5] dt-bindings: arm: Document reboot mode magic Elliot Berman
2024-10-18 19:39 ` [PATCH v6 3/5] firmware: psci: Read and use vendor reset types Elliot Berman
2024-10-19  5:42   ` Stephen Boyd
2024-10-23 16:30     ` Elliot Berman
2024-10-23 19:02       ` Stephen Boyd
2024-10-23 22:16         ` Elliot Berman
2024-11-15 13:35       ` Lorenzo Pieralisi [this message]
2024-11-15 18:53         ` Florian Fainelli
2024-11-15 19:08         ` Elliot Berman
2024-11-18 15:13           ` Lorenzo Pieralisi
2024-11-18 19:27             ` Elliot Berman
2024-10-18 19:39 ` [PATCH v6 4/5] arm64: dts: qcom: Add PSCI SYSTEM_RESET2 types for qcm6490-idp Elliot Berman
2024-10-18 19:39 ` [PATCH v6 5/5] arm64: dts: qcom: Add PSCI SYSTEM_RESET2 types for sa8775p-ride Elliot Berman
2024-10-18 19:51   ` Konrad Dybcio
2024-10-20 19:52   ` kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZzdOOP0KuMMdo64W@lpieralisi \
    --to=lpieralisi@kernel.org \
    --cc=andersson@kernel.org \
    --cc=andy.yan@rock-chips.com \
    --cc=arnd@arndb.de \
    --cc=bartosz.golaszewski@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=conor+dt@kernel.org \
    --cc=cros-qcom-dts-watchers@chromium.org \
    --cc=devicetree@vger.kernel.org \
    --cc=florian.fainelli@broadcom.com \
    --cc=konradybcio@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=olof@lixom.net \
    --cc=quic_eberman@quicinc.com \
    --cc=quic_molvera@quicinc.com \
    --cc=quic_satyap@quicinc.com \
    --cc=quic_spratap@quicinc.com \
    --cc=robh@kernel.org \
    --cc=sre@kernel.org \
    --cc=swboyd@chromium.org \
    --cc=vkoul@kernel.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.