1 2 #include <linux/pci.h> 3 #include <linux/acpi.h> 4 #include <acpi/reboot.h> 5 acpi_reboot(void)6void acpi_reboot(void) 7 { 8 struct acpi_generic_address *rr; 9 struct pci_bus *bus0; 10 u8 reset_value; 11 unsigned int devfn; 12 13 if (acpi_disabled) 14 return; 15 16 rr = &acpi_gbl_FADT.reset_register; 17 18 /* Is the reset register supported? */ 19 if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) || 20 rr->bit_width != 8 || rr->bit_offset != 0) 21 return; 22 23 reset_value = acpi_gbl_FADT.reset_value; 24 25 /* The reset register can only exist in I/O, Memory or PCI config space 26 * on a device on bus 0. */ 27 switch (rr->space_id) { 28 case ACPI_ADR_SPACE_PCI_CONFIG: 29 /* The reset register can only live on bus 0. */ 30 bus0 = pci_find_bus(0, 0); 31 if (!bus0) 32 return; 33 /* Form PCI device/function pair. */ 34 devfn = PCI_DEVFN((rr->address >> 32) & 0xffff, 35 (rr->address >> 16) & 0xffff); 36 printk(KERN_DEBUG "Resetting with ACPI PCI RESET_REG."); 37 /* Write the value that resets us. */ 38 pci_bus_write_config_byte(bus0, devfn, 39 (rr->address & 0xffff), reset_value); 40 break; 41 42 case ACPI_ADR_SPACE_SYSTEM_MEMORY: 43 case ACPI_ADR_SPACE_SYSTEM_IO: 44 printk(KERN_DEBUG "ACPI MEMORY or I/O RESET_REG.\n"); 45 acpi_reset(); 46 break; 47 } 48 /* Wait ten seconds */ 49 acpi_os_stall(10000000); 50 } 51