RE: [PATCH] reboot: perform warm/cold reset correctly for CF9 type

From: H. Peter Anvin
Date: Sun Sep 08 2013 - 22:57:13 EST


Please answer the questions that I asked, not something else entirely.

"Liu, Chuansheng" <chuansheng.liu@xxxxxxxxx> wrote:
>Hello hpa,
>
>> I could be wrong and the cold/warm reset values in CF9 end up having
>> exactly the same function as the magic BIOS signature does; if so,
>then
>> I would like to be told so explicitly, ideally with an explanation
>about
>> how it works on the hw level (or a pointer to relevant documentation,
>> Intel internal docs are fine.)
>The Intel link is here for SandyBridge platform:
>https://houston.fm.intel.com/wiki/doku.php?id=svwiki:projects:sandybridge:testplans:reset:start
>And we have one internal baytrail platform doc refered it also.
>
>>
>> Finally, again, does this solve a real problem?
>Yes, we already have the 0xCF9 rebooting function, why not support the
>COLD/WARM reset both?
>Thanks.
>
>
>For safety and compatibility, we prepared the below patch, do you think
>is it making sense?
>
>
>
>From: liu chuansheng <chuansheng.liu@xxxxxxxxx>
>Subject: [PATCH] X86, reboot: supporting COLD reset thru 0xcf9 port
>
>Current X86 rebooting function supports the platform reset thru
>port 0xcf9, but currently it hardcoded only for WARM reset that
>writing 0x6 into port 0xcf9.
>
>Here we added the support the COLD reset that writing 0xe thru
>port 0xcf9, and the actual reset type is determined by reboot_mode
>variable.
>
>Also for safety and compatibility, we will set the default reboot
>mode as WARM reset for several Apple MacBooks.
>
>Signed-off-by: Li Fei <fei.li@xxxxxxxxx>
>Signed-off-by: liu chuansheng <chuansheng.liu@xxxxxxxxx>
>---
> arch/x86/kernel/reboot.c | 20 ++++++++++++++++++--
> 1 files changed, 18 insertions(+), 2 deletions(-)
>
>diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
>index 563ed91..b4a1cb4 100644
>--- a/arch/x86/kernel/reboot.c
>+++ b/arch/x86/kernel/reboot.c
>@@ -116,6 +116,12 @@ static int __init set_pci_reboot(const struct
>dmi_system_id *d)
> {
> if (reboot_type != BOOT_CF9) {
> reboot_type = BOOT_CF9;
>+
>+ /* The default reboot_mode value is COLD reset(0) for
>X86 platform,
>+ * here for safety and compatibility, we set the
>default reboot
>+ * mode as WARM reset for several Apple MacBooks.
>+ */
>+ reboot_mode = REBOOT_WARM;
>pr_info("%s series board detected. Selecting %s-method for reboots.\n",
> "PCI", d->ident);
> }
>@@ -511,10 +517,20 @@ static void
>native_machine_emergency_restart(void)
>
> case BOOT_CF9_COND:
> if (port_cf9_safe) {
>- u8 cf9 = inb(0xcf9) & ~6;
>+ u8 reboot_val;
>+ u8 cf9;
>+
>+ if (reboot_mode == REBOOT_WARM)
>+ reboot_val = 0x6;
>+ else
>+ reboot_val = 0xe;
>+
>+ cf9 = inb(0xcf9) & ~reboot_val;
> outb(cf9|2, 0xcf9); /* Request hard reset */
> udelay(50);
>- outb(cf9|6, 0xcf9); /* Actually do the
>reset */
>+
>+ /* Actually do the reset */
>+ outb(cf9|reboot_val, 0xcf9);
> udelay(50);
> }
> reboot_type = BOOT_KBD;

--
Sent from my mobile phone. Please pardon brevity and lack of formatting.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/