From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH] x86: improve "PCI reset register" rebooting Date: Fri, 13 Mar 2015 11:40:52 +0000 Message-ID: <5502CCC4.5030600@citrix.com> References: <5502CCD10200007800069AF6@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YWNxY-0006cX-KR for xen-devel@lists.xenproject.org; Fri, 13 Mar 2015 11:40:56 +0000 In-Reply-To: <5502CCD10200007800069AF6@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel Cc: Keir Fraser List-Id: xen-devel@lists.xenproject.org On 13/03/15 10:41, Jan Beulich wrote: > The way this method works allows for honoring "warm" reboot requested > by the user and additionally has a way to power-cycle the machine. > > Signed-off-by: Jan Beulich > > --- a/docs/misc/xen-command-line.markdown > +++ b/docs/misc/xen-command-line.markdown > @@ -1117,7 +1117,7 @@ The following resources are available: > * `rmid_max` indicates the max value for rmid. > > ### reboot > -> `= t[riple] | k[bd] | a[cpi] | p[ci] | e[fi] | n[o] [, [w]arm | [c]old]` > +> `= t[riple] | k[bd] | a[cpi] | p[ci] | P[ower] | e[fi] | n[o] [, [w]arm | [c]old]` > > > Default: `0` > > @@ -1137,6 +1137,8 @@ Specify the host reboot method. > > `pci` instructs Xen to reboot the host using PCI reset register (port CF9). > > +`Power` instructs Xen to power-cycle the host using PCI reset register (port CF9). > + > 'efi' instructs Xen to reboot using the EFI reboot call (in EFI mode by > default it will use that method first). > > --- a/xen/arch/x86/shutdown.c > +++ b/xen/arch/x86/shutdown.c > @@ -33,6 +33,7 @@ enum reboot_type { > BOOT_KBD = 'k', > BOOT_ACPI = 'a', > BOOT_CF9 = 'p', > + BOOT_CF9_PWR = 'P', > BOOT_EFI = 'e', > }; > > @@ -47,6 +48,7 @@ static int reboot_mode; > * kbd Use the keyboard controller. cold reset (default) > * acpi Use the RESET_REG in the FADT > * pci Use the so-called "PCI reset register", CF9 > + * Power Like 'pci' but for a full power-cyle reset > * efi Use the EFI reboot (if running under EFI) > */ > static enum reboot_type reboot_type = BOOT_INVALID; > @@ -68,8 +70,9 @@ static void __init set_reboot_type(char > case 'a': > case 'e': > case 'k': > - case 't': > + case 'P': > case 'p': > + case 't': > reboot_type = *str; > break; > } > @@ -571,11 +574,18 @@ void machine_restart(unsigned int delay_ > reboot_type = BOOT_KBD; > break; > case BOOT_CF9: > + case BOOT_CF9_PWR: > { > - u8 cf9 = inb(0xcf9) & ~6; > - outb(cf9|2, 0xcf9); /* Request hard reset */ > + u8 cf9 = inb(0xcf9) & ~0x0e; > + > + /* Request warm, hard, or power-cycle reset. */ > + if ( reboot_type == BOOT_CF9_PWR ) > + cf9 |= 0x0a; > + else if ( reboot_mode == 0 ) > + cf9 |= 0x02; > + outb(cf9, 0xcf9); > udelay(50); > - outb(cf9|6, 0xcf9); /* Actually do the reset */ > + outb(cf9 | 0x04, 0xcf9); /* Actually do the reset. */ I would be nice to have some named constants (FULL_RST, RST_CPU and SYS_RST is what the ICH10 manual uses), but the logic here does appear correct. Reviewed-by: Andrew Cooper > udelay(50); > } > reboot_type = BOOT_ACPI; > > >