extern void generic_find_legacy_serial_ports(u64 *physport,
                unsigned int *default_speed);
 
-
 static void maple_restart(char *cmd)
 {
+       unsigned int maple_nvram_base;
+       unsigned int maple_nvram_offset;
+       unsigned int maple_nvram_command;
+       struct device_node *rtcs;
+
+       /* find NVRAM device */
+       rtcs = find_compatible_devices("nvram", "AMD8111");
+       if (rtcs && rtcs->addrs) {
+               maple_nvram_base = rtcs->addrs[0].address;
+       } else {
+               printk(KERN_EMERG "Maple: Unable to find NVRAM\n");
+               printk(KERN_EMERG "Maple: Manual Restart Required\n");
+               return;
+       }
+
+       /* find service processor device */
+       rtcs = find_devices("service-processor");
+       if (!rtcs) {
+               printk(KERN_EMERG "Maple: Unable to find Service Processor\n");
+               printk(KERN_EMERG "Maple: Manual Restart Required\n");
+               return;
+       }
+       maple_nvram_offset = *(unsigned int*) get_property(rtcs,
+                       "restart-addr", NULL);
+       maple_nvram_command = *(unsigned int*) get_property(rtcs,
+                       "restart-value", NULL);
+
+       /* send command */
+       outb_p(maple_nvram_command, maple_nvram_base + maple_nvram_offset);
+       for (;;) ;
 }
 
 static void maple_power_off(void)
 {
+       unsigned int maple_nvram_base;
+       unsigned int maple_nvram_offset;
+       unsigned int maple_nvram_command;
+       struct device_node *rtcs;
+
+       /* find NVRAM device */
+       rtcs = find_compatible_devices("nvram", "AMD8111");
+       if (rtcs && rtcs->addrs) {
+               maple_nvram_base = rtcs->addrs[0].address;
+       } else {
+               printk(KERN_EMERG "Maple: Unable to find NVRAM\n");
+               printk(KERN_EMERG "Maple: Manual Power-Down Required\n");
+               return;
+       }
+
+       /* find service processor device */
+       rtcs = find_devices("service-processor");
+       if (!rtcs) {
+               printk(KERN_EMERG "Maple: Unable to find Service Processor\n");
+               printk(KERN_EMERG "Maple: Manual Power-Down Required\n");
+               return;
+       }
+       maple_nvram_offset = *(unsigned int*) get_property(rtcs,
+                       "power-off-addr", NULL);
+       maple_nvram_command = *(unsigned int*) get_property(rtcs,
+                       "power-off-value", NULL);
+
+       /* send command */
+       outb_p(maple_nvram_command, maple_nvram_base + maple_nvram_offset);
+       for (;;) ;
 }
 
 static void maple_halt(void)
 {
+       maple_power_off();
 }
 
 #ifdef CONFIG_SMP