Message ID | 20180907073448.6908-1-vaibhav@linux.ibm.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 8139046a5a34787849df81f4a5875cf4b404a7a1 |
Headers | show |
Series | [v3] powerpc/powernv: Make possible for user to force a full ipl cec reboot | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | next/apply_patch Successfully applied |
snowpatch_ozlabs/checkpatch | success | Test checkpatch on branch next |
snowpatch_ozlabs/build-ppc64le | success | Test build-ppc64le on branch next |
snowpatch_ozlabs/build-ppc64be | success | Test build-ppc64be on branch next |
snowpatch_ozlabs/build-ppc64e | success | Test build-ppc64e on branch next |
snowpatch_ozlabs/build-ppc32 | success | Test build-ppc32 on branch next |
On 07/09/18 17:34, Vaibhav Jain wrote: > Ever since fast reboot is enabled by default in opal, > opal_cec_reboot() will use fast-reset instead of full IPL to perform > system reboot. This leaves the user with no direct way to force a full > IPL reboot except changing an nvram setting that persistently disables > fast-reset for all subsequent reboots. > > This patch provides a more direct way for the user to force a one-shot > full IPL reboot by passing the command line argument 'full' to the > reboot command. So the user will be able to tweak the reboot behavior > via: > > $ sudo reboot full # Force a full ipl reboot skipping fast-reset > > or > $ sudo reboot # default reboot path (usually fast-reset) > > The reboot command passes the un-parsed command argument to the kernel > via the 'Reboot' syscall which is then passed on to the arch function > pnv_restart(). The patch updates pnv_restart() to handle this cmd-arg > and issues opal_cec_reboot2 with OPAL_REBOOT_FULL_IPL to force a full > IPL reset. > > Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> This looks better! Acked-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> > --- > Change-log: > > v3 -> Re-factored the code to make it more readable [Andrew] > Handle return of OPAL_SUCCESS from cec_reboot variants > [Vasant] > > v2 -> Updated the code to handle case when opal_cec_reboot2() is > not supported by opal. [Andrew] > > -> Force a call to opal_cec_reboot() is opal_cec_reboot2() > fails or the action verb 'cmd' is not recognized. > --- > arch/powerpc/include/asm/opal-api.h | 1 + > arch/powerpc/platforms/powernv/setup.c | 36 +++++++++++++++++++++----- > 2 files changed, 31 insertions(+), 6 deletions(-) > > diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h > index 8365353330b4..870fb7b239ea 100644 > --- a/arch/powerpc/include/asm/opal-api.h > +++ b/arch/powerpc/include/asm/opal-api.h > @@ -1050,6 +1050,7 @@ enum OpalSysCooling { > enum { > OPAL_REBOOT_NORMAL = 0, > OPAL_REBOOT_PLATFORM_ERROR = 1, > + OPAL_REBOOT_FULL_IPL = 2, > }; > > /* Argument to OPAL_PCI_TCE_KILL */ > diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c > index adddde023622..79fd839faa2d 100644 > --- a/arch/powerpc/platforms/powernv/setup.c > +++ b/arch/powerpc/platforms/powernv/setup.c > @@ -219,17 +219,41 @@ static void pnv_prepare_going_down(void) > > static void __noreturn pnv_restart(char *cmd) > { > - long rc = OPAL_BUSY; > + long rc; > > pnv_prepare_going_down(); > > - while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > - rc = opal_cec_reboot(); > - if (rc == OPAL_BUSY_EVENT) > - opal_poll_events(NULL); > + do { > + if (!cmd) > + rc = opal_cec_reboot(); > + else if (strcmp(cmd, "full") == 0) > + rc = opal_cec_reboot2(OPAL_REBOOT_FULL_IPL, NULL); > else > + rc = OPAL_UNSUPPORTED; > + > + if (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > + /* Opal is busy wait for some time and retry */ > + opal_poll_events(NULL); > mdelay(10); > - } > + > + } else if (cmd && rc) { > + /* Unknown error while issuing reboot */ > + if (rc == OPAL_UNSUPPORTED) > + pr_err("Unsupported '%s' reboot.\n", cmd); > + else > + pr_err("Unable to issue '%s' reboot. Err=%ld\n", > + cmd, rc); > + pr_info("Forcing a cec-reboot\n"); > + cmd = NULL; > + rc = OPAL_BUSY; > + > + } else if (rc != OPAL_SUCCESS) { > + /* Unknown error while issuing cec-reboot */ > + pr_err("Unable to reboot. Err=%ld\n", rc); > + } > + > + } while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT); > + > for (;;) > opal_poll_events(NULL); > } >
On Fri, 2018-09-07 at 07:34:48 UTC, Vaibhav Jain wrote: > Ever since fast reboot is enabled by default in opal, > opal_cec_reboot() will use fast-reset instead of full IPL to perform > system reboot. This leaves the user with no direct way to force a full > IPL reboot except changing an nvram setting that persistently disables > fast-reset for all subsequent reboots. > > This patch provides a more direct way for the user to force a one-shot > full IPL reboot by passing the command line argument 'full' to the > reboot command. So the user will be able to tweak the reboot behavior > via: > > $ sudo reboot full # Force a full ipl reboot skipping fast-reset > > or > $ sudo reboot # default reboot path (usually fast-reset) > > The reboot command passes the un-parsed command argument to the kernel > via the 'Reboot' syscall which is then passed on to the arch function > pnv_restart(). The patch updates pnv_restart() to handle this cmd-arg > and issues opal_cec_reboot2 with OPAL_REBOOT_FULL_IPL to force a full > IPL reset. > > Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> > Acked-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Applied to powerpc next, thanks. https://git.kernel.org/powerpc/c/8139046a5a34787849df81f4a5875c cheers
diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 8365353330b4..870fb7b239ea 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -1050,6 +1050,7 @@ enum OpalSysCooling { enum { OPAL_REBOOT_NORMAL = 0, OPAL_REBOOT_PLATFORM_ERROR = 1, + OPAL_REBOOT_FULL_IPL = 2, }; /* Argument to OPAL_PCI_TCE_KILL */ diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c index adddde023622..79fd839faa2d 100644 --- a/arch/powerpc/platforms/powernv/setup.c +++ b/arch/powerpc/platforms/powernv/setup.c @@ -219,17 +219,41 @@ static void pnv_prepare_going_down(void) static void __noreturn pnv_restart(char *cmd) { - long rc = OPAL_BUSY; + long rc; pnv_prepare_going_down(); - while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { - rc = opal_cec_reboot(); - if (rc == OPAL_BUSY_EVENT) - opal_poll_events(NULL); + do { + if (!cmd) + rc = opal_cec_reboot(); + else if (strcmp(cmd, "full") == 0) + rc = opal_cec_reboot2(OPAL_REBOOT_FULL_IPL, NULL); else + rc = OPAL_UNSUPPORTED; + + if (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { + /* Opal is busy wait for some time and retry */ + opal_poll_events(NULL); mdelay(10); - } + + } else if (cmd && rc) { + /* Unknown error while issuing reboot */ + if (rc == OPAL_UNSUPPORTED) + pr_err("Unsupported '%s' reboot.\n", cmd); + else + pr_err("Unable to issue '%s' reboot. Err=%ld\n", + cmd, rc); + pr_info("Forcing a cec-reboot\n"); + cmd = NULL; + rc = OPAL_BUSY; + + } else if (rc != OPAL_SUCCESS) { + /* Unknown error while issuing cec-reboot */ + pr_err("Unable to reboot. Err=%ld\n", rc); + } + + } while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT); + for (;;) opal_poll_events(NULL); }
Ever since fast reboot is enabled by default in opal, opal_cec_reboot() will use fast-reset instead of full IPL to perform system reboot. This leaves the user with no direct way to force a full IPL reboot except changing an nvram setting that persistently disables fast-reset for all subsequent reboots. This patch provides a more direct way for the user to force a one-shot full IPL reboot by passing the command line argument 'full' to the reboot command. So the user will be able to tweak the reboot behavior via: $ sudo reboot full # Force a full ipl reboot skipping fast-reset or $ sudo reboot # default reboot path (usually fast-reset) The reboot command passes the un-parsed command argument to the kernel via the 'Reboot' syscall which is then passed on to the arch function pnv_restart(). The patch updates pnv_restart() to handle this cmd-arg and issues opal_cec_reboot2 with OPAL_REBOOT_FULL_IPL to force a full IPL reset. Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> --- Change-log: v3 -> Re-factored the code to make it more readable [Andrew] Handle return of OPAL_SUCCESS from cec_reboot variants [Vasant] v2 -> Updated the code to handle case when opal_cec_reboot2() is not supported by opal. [Andrew] -> Force a call to opal_cec_reboot() is opal_cec_reboot2() fails or the action verb 'cmd' is not recognized. --- arch/powerpc/include/asm/opal-api.h | 1 + arch/powerpc/platforms/powernv/setup.c | 36 +++++++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-)