diff --git a/arch/x86_64/kernel/reboot.c b/arch/x86_64/kernel/reboot.c
index 5b14772..a88bc6f 100644
--- a/arch/x86_64/kernel/reboot.c
+++ b/arch/x86_64/kernel/reboot.c
@@ -34,6 +34,7 @@ EXPORT_SYMBOL(machine_emergency_restart_func);
 
 static long no_idt[3];
 static enum { 
+	BOOT_PCI = 'p',
 	BOOT_TRIPLE = 't',
 	BOOT_KBD = 'k'
 } reboot_type = BOOT_KBD;
@@ -46,6 +47,7 @@ int reboot_force;
    triple Force a triple fault (init)
    kbd    Use the keyboard controller. cold reset (default)
    force  Avoid anything that could hang.
+   pci    Use the so-called "PCI reset register", CF9
  */ 
 static int __init reboot_setup(char *str)
 {
@@ -62,6 +64,7 @@ static int __init reboot_setup(char *str)
 		case 't':
 		case 'b':
 		case 'k':
+		case 'p':
 			reboot_type = *str;
 			break;
 		case 'f':
@@ -149,6 +152,17 @@ void machine_emergency_restart(void)
 
 			reboot_type = BOOT_KBD;
 			break;
+
+		case BOOT_PCI:
+			{
+				u8 cf9 = inb(0xcf9) & ~6;
+				outb(cf9|2, 0xcf9); /* Request hard reset */
+				udelay(50);
+				outb(cf9|6, 0xcf9); /* Actually do the reset */
+				udelay(50);
+			}
+			reboot_type = BOOT_KBD;
+			break;
 		}      
 	}      
 }
