Re: [PATCH v6 3/5] firmware: psci: Read and use vendor reset types

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/15/24 05:35, Lorenzo Pieralisi wrote:
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 ?

AFAICT, they are not, but arguably you already need custom user space which is capable of doing:

syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, reboot_cmd);

in order to utilize the custom reboot mode. I could imagine that with a discovery mechanism, a wrapper could be written to check that the specified command is actually supported before issuing the system call, or even have the system call do that under the hood.

I don't personally feel like this is very important in the sense that as long as a fallback exists for an unsupported reboot command specified, the system does reboot.
--
Florian




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux