10d09e41aSPaolo Bonzini #ifndef QEMU_HW_ACPI_H 20d09e41aSPaolo Bonzini #define QEMU_HW_ACPI_H 3175de524SMarkus Armbruster 40d09e41aSPaolo Bonzini /* 50d09e41aSPaolo Bonzini * Copyright (c) 2009 Isaku Yamahata <yamahata at valinux co jp> 60d09e41aSPaolo Bonzini * VA Linux Systems Japan K.K. 70d09e41aSPaolo Bonzini * 80d09e41aSPaolo Bonzini * This library is free software; you can redistribute it and/or 90d09e41aSPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 100d09e41aSPaolo Bonzini * License as published by the Free Software Foundation; either 1161f3c91aSChetan Pant * version 2.1 of the License, or (at your option) any later version. 120d09e41aSPaolo Bonzini * 130d09e41aSPaolo Bonzini * This library is distributed in the hope that it will be useful, 140d09e41aSPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 150d09e41aSPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 160d09e41aSPaolo Bonzini * Lesser General Public License for more details. 170d09e41aSPaolo Bonzini * 180d09e41aSPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 190d09e41aSPaolo Bonzini * License along with this library; if not, see 200d09e41aSPaolo Bonzini * <http://www.gnu.org/licenses/>. 210d09e41aSPaolo Bonzini */ 220d09e41aSPaolo Bonzini 23e53339cfSMichael S. Tsirkin #include "qemu/notify.h" 24e53339cfSMichael S. Tsirkin #include "exec/memory.h" 25eaf23bf7SIgor Mammedov #include "hw/acpi/acpi_dev_interface.h" 26e53339cfSMichael S. Tsirkin 27a0cc8856SIgor Mammedov /* 28b4acfbcdSMichael S. Tsirkin * current device naming scheme supports up to 256 memory devices 29a0cc8856SIgor Mammedov */ 30a0cc8856SIgor Mammedov #define ACPI_MAX_RAM_SLOTS 256 31a0cc8856SIgor Mammedov 320d09e41aSPaolo Bonzini /* from linux include/acpi/actype.h */ 330d09e41aSPaolo Bonzini /* Default ACPI register widths */ 340d09e41aSPaolo Bonzini 350d09e41aSPaolo Bonzini #define ACPI_GPE_REGISTER_WIDTH 8 360d09e41aSPaolo Bonzini #define ACPI_PM1_REGISTER_WIDTH 16 370d09e41aSPaolo Bonzini #define ACPI_PM2_REGISTER_WIDTH 8 380d09e41aSPaolo Bonzini #define ACPI_PM_TIMER_WIDTH 32 390d09e41aSPaolo Bonzini 409dc047ceSPhilippe Mathieu-Daudé /* PC-style peripherals (also used by other machines). */ 419dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_S3_DISABLED "disable_s3" 429dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_S4_DISABLED "disable_s4" 439dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_S4_VAL "s4_val" 449dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_SCI_INT "sci_int" 459dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_ACPI_ENABLE_CMD "acpi_enable_cmd" 469dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_ACPI_DISABLE_CMD "acpi_disable_cmd" 479dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_PM_IO_BASE "pm_io_base" 489dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_GPE0_BLK "gpe0_blk" 499dc047ceSPhilippe Mathieu-Daudé #define ACPI_PM_PROP_GPE0_BLK_LEN "gpe0_blk_len" 50*aa29466bSAni Sinha #define ACPI_PM_PROP_ACPI_PCIHP_BRIDGE "acpi-pci-hotplug-with-bridge-support" 51*aa29466bSAni Sinha #define ACPI_PM_PROP_ACPI_PCI_ROOTHP "acpi-root-pci-hotplug" 529dc047ceSPhilippe Mathieu-Daudé 530d09e41aSPaolo Bonzini /* PM Timer ticks per second (HZ) */ 540d09e41aSPaolo Bonzini #define PM_TIMER_FREQUENCY 3579545 550d09e41aSPaolo Bonzini 560d09e41aSPaolo Bonzini 570d09e41aSPaolo Bonzini /* ACPI fixed hardware registers */ 580d09e41aSPaolo Bonzini 590d09e41aSPaolo Bonzini /* from linux/drivers/acpi/acpica/aclocal.h */ 600d09e41aSPaolo Bonzini /* Masks used to access the bit_registers */ 610d09e41aSPaolo Bonzini 620d09e41aSPaolo Bonzini /* PM1x_STS */ 630d09e41aSPaolo Bonzini #define ACPI_BITMASK_TIMER_STATUS 0x0001 640d09e41aSPaolo Bonzini #define ACPI_BITMASK_BUS_MASTER_STATUS 0x0010 650d09e41aSPaolo Bonzini #define ACPI_BITMASK_GLOBAL_LOCK_STATUS 0x0020 660d09e41aSPaolo Bonzini #define ACPI_BITMASK_POWER_BUTTON_STATUS 0x0100 670d09e41aSPaolo Bonzini #define ACPI_BITMASK_SLEEP_BUTTON_STATUS 0x0200 680d09e41aSPaolo Bonzini #define ACPI_BITMASK_RT_CLOCK_STATUS 0x0400 690d09e41aSPaolo Bonzini #define ACPI_BITMASK_PCIEXP_WAKE_STATUS 0x4000 /* ACPI 3.0 */ 700d09e41aSPaolo Bonzini #define ACPI_BITMASK_WAKE_STATUS 0x8000 710d09e41aSPaolo Bonzini 720d09e41aSPaolo Bonzini #define ACPI_BITMASK_ALL_FIXED_STATUS (\ 730d09e41aSPaolo Bonzini ACPI_BITMASK_TIMER_STATUS | \ 740d09e41aSPaolo Bonzini ACPI_BITMASK_BUS_MASTER_STATUS | \ 750d09e41aSPaolo Bonzini ACPI_BITMASK_GLOBAL_LOCK_STATUS | \ 760d09e41aSPaolo Bonzini ACPI_BITMASK_POWER_BUTTON_STATUS | \ 770d09e41aSPaolo Bonzini ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ 780d09e41aSPaolo Bonzini ACPI_BITMASK_RT_CLOCK_STATUS | \ 790d09e41aSPaolo Bonzini ACPI_BITMASK_WAKE_STATUS) 800d09e41aSPaolo Bonzini 810d09e41aSPaolo Bonzini /* PM1x_EN */ 820d09e41aSPaolo Bonzini #define ACPI_BITMASK_TIMER_ENABLE 0x0001 830d09e41aSPaolo Bonzini #define ACPI_BITMASK_GLOBAL_LOCK_ENABLE 0x0020 840d09e41aSPaolo Bonzini #define ACPI_BITMASK_POWER_BUTTON_ENABLE 0x0100 850d09e41aSPaolo Bonzini #define ACPI_BITMASK_SLEEP_BUTTON_ENABLE 0x0200 860d09e41aSPaolo Bonzini #define ACPI_BITMASK_RT_CLOCK_ENABLE 0x0400 870d09e41aSPaolo Bonzini #define ACPI_BITMASK_PCIEXP_WAKE_DISABLE 0x4000 /* ACPI 3.0 */ 880d09e41aSPaolo Bonzini 8906313503SIgor Mammedov #define ACPI_BITMASK_PM1_COMMON_ENABLED ( \ 9006313503SIgor Mammedov ACPI_BITMASK_RT_CLOCK_ENABLE | \ 9106313503SIgor Mammedov ACPI_BITMASK_POWER_BUTTON_ENABLE | \ 9206313503SIgor Mammedov ACPI_BITMASK_GLOBAL_LOCK_ENABLE | \ 9306313503SIgor Mammedov ACPI_BITMASK_TIMER_ENABLE) 9406313503SIgor Mammedov 950d09e41aSPaolo Bonzini /* PM1x_CNT */ 960d09e41aSPaolo Bonzini #define ACPI_BITMASK_SCI_ENABLE 0x0001 970d09e41aSPaolo Bonzini #define ACPI_BITMASK_BUS_MASTER_RLD 0x0002 980d09e41aSPaolo Bonzini #define ACPI_BITMASK_GLOBAL_LOCK_RELEASE 0x0004 990d09e41aSPaolo Bonzini #define ACPI_BITMASK_SLEEP_TYPE 0x1C00 1000d09e41aSPaolo Bonzini #define ACPI_BITMASK_SLEEP_ENABLE 0x2000 1010d09e41aSPaolo Bonzini 1020d09e41aSPaolo Bonzini /* PM2_CNT */ 1030d09e41aSPaolo Bonzini #define ACPI_BITMASK_ARB_DISABLE 0x0001 1040d09e41aSPaolo Bonzini 1050d09e41aSPaolo Bonzini /* structs */ 1060d09e41aSPaolo Bonzini typedef struct ACPIPMTimer ACPIPMTimer; 1070d09e41aSPaolo Bonzini typedef struct ACPIPM1EVT ACPIPM1EVT; 1080d09e41aSPaolo Bonzini typedef struct ACPIPM1CNT ACPIPM1CNT; 1090d09e41aSPaolo Bonzini typedef struct ACPIGPE ACPIGPE; 1100d09e41aSPaolo Bonzini typedef struct ACPIREGS ACPIREGS; 1110d09e41aSPaolo Bonzini 1120d09e41aSPaolo Bonzini typedef void (*acpi_update_sci_fn)(ACPIREGS *ar); 1130d09e41aSPaolo Bonzini 1140d09e41aSPaolo Bonzini struct ACPIPMTimer { 1150d09e41aSPaolo Bonzini QEMUTimer *timer; 1160d09e41aSPaolo Bonzini MemoryRegion io; 1170d09e41aSPaolo Bonzini int64_t overflow_time; 1180d09e41aSPaolo Bonzini 1190d09e41aSPaolo Bonzini acpi_update_sci_fn update_sci; 1200d09e41aSPaolo Bonzini }; 1210d09e41aSPaolo Bonzini 1220d09e41aSPaolo Bonzini struct ACPIPM1EVT { 1230d09e41aSPaolo Bonzini MemoryRegion io; 1240d09e41aSPaolo Bonzini uint16_t sts; 1250d09e41aSPaolo Bonzini uint16_t en; 1260d09e41aSPaolo Bonzini acpi_update_sci_fn update_sci; 1270d09e41aSPaolo Bonzini }; 1280d09e41aSPaolo Bonzini 1290d09e41aSPaolo Bonzini struct ACPIPM1CNT { 1300d09e41aSPaolo Bonzini MemoryRegion io; 1310d09e41aSPaolo Bonzini uint16_t cnt; 1320d09e41aSPaolo Bonzini uint8_t s4_val; 1336be8cf56SIsaku Yamahata bool acpi_only; 1340d09e41aSPaolo Bonzini }; 1350d09e41aSPaolo Bonzini 1360d09e41aSPaolo Bonzini struct ACPIGPE { 1370d09e41aSPaolo Bonzini uint8_t len; 1380d09e41aSPaolo Bonzini 1390d09e41aSPaolo Bonzini uint8_t *sts; 1400d09e41aSPaolo Bonzini uint8_t *en; 1410d09e41aSPaolo Bonzini }; 1420d09e41aSPaolo Bonzini 1430d09e41aSPaolo Bonzini struct ACPIREGS { 1440d09e41aSPaolo Bonzini ACPIPMTimer tmr; 1450d09e41aSPaolo Bonzini ACPIGPE gpe; 1460d09e41aSPaolo Bonzini struct { 1470d09e41aSPaolo Bonzini ACPIPM1EVT evt; 1480d09e41aSPaolo Bonzini ACPIPM1CNT cnt; 1490d09e41aSPaolo Bonzini } pm1; 1500d09e41aSPaolo Bonzini Notifier wakeup; 1510d09e41aSPaolo Bonzini }; 1520d09e41aSPaolo Bonzini 1530d09e41aSPaolo Bonzini /* PM_TMR */ 1540d09e41aSPaolo Bonzini void acpi_pm_tmr_update(ACPIREGS *ar, bool enable); 1550d09e41aSPaolo Bonzini void acpi_pm_tmr_calc_overflow_time(ACPIREGS *ar); 1560d09e41aSPaolo Bonzini void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, 1570d09e41aSPaolo Bonzini MemoryRegion *parent); 1580d09e41aSPaolo Bonzini void acpi_pm_tmr_reset(ACPIREGS *ar); 1590d09e41aSPaolo Bonzini 1600d09e41aSPaolo Bonzini /* PM1a_EVT: piix and ich9 don't implement PM1b. */ 1610d09e41aSPaolo Bonzini uint16_t acpi_pm1_evt_get_sts(ACPIREGS *ar); 1620d09e41aSPaolo Bonzini void acpi_pm1_evt_power_down(ACPIREGS *ar); 1630d09e41aSPaolo Bonzini void acpi_pm1_evt_reset(ACPIREGS *ar); 1640d09e41aSPaolo Bonzini void acpi_pm1_evt_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, 1650d09e41aSPaolo Bonzini MemoryRegion *parent); 1660d09e41aSPaolo Bonzini 1670d09e41aSPaolo Bonzini /* PM1a_CNT: piix and ich9 don't implement PM1b CNT. */ 1689a10bbb4SLaszlo Ersek void acpi_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent, 1696be8cf56SIsaku Yamahata bool disable_s3, bool disable_s4, uint8_t s4_val, 1706be8cf56SIsaku Yamahata bool acpi_only); 1710d09e41aSPaolo Bonzini void acpi_pm1_cnt_update(ACPIREGS *ar, 1720d09e41aSPaolo Bonzini bool sci_enable, bool sci_disable); 1730d09e41aSPaolo Bonzini void acpi_pm1_cnt_reset(ACPIREGS *ar); 1740d09e41aSPaolo Bonzini 1750d09e41aSPaolo Bonzini /* GPE0 */ 1760d09e41aSPaolo Bonzini void acpi_gpe_init(ACPIREGS *ar, uint8_t len); 1770d09e41aSPaolo Bonzini void acpi_gpe_reset(ACPIREGS *ar); 1780d09e41aSPaolo Bonzini 1790d09e41aSPaolo Bonzini void acpi_gpe_ioport_writeb(ACPIREGS *ar, uint32_t addr, uint32_t val); 1800d09e41aSPaolo Bonzini uint32_t acpi_gpe_ioport_readb(ACPIREGS *ar, uint32_t addr); 1810d09e41aSPaolo Bonzini 182ca9b46bcSZhu Guihua void acpi_send_gpe_event(ACPIREGS *ar, qemu_irq irq, 183eaf23bf7SIgor Mammedov AcpiEventStatusBits status); 184ca9b46bcSZhu Guihua 18506313503SIgor Mammedov void acpi_update_sci(ACPIREGS *acpi_regs, qemu_irq irq); 18606313503SIgor Mammedov 1870445259bSMichael S. Tsirkin /* acpi.c */ 1880445259bSMichael S. Tsirkin extern char unsigned *acpi_tables; 1890445259bSMichael S. Tsirkin extern size_t acpi_tables_len; 1900445259bSMichael S. Tsirkin 19160de1163SMichael S. Tsirkin uint8_t *acpi_table_first(void); 19260de1163SMichael S. Tsirkin uint8_t *acpi_table_next(uint8_t *current); 19360de1163SMichael S. Tsirkin unsigned acpi_table_len(void *current); 1940445259bSMichael S. Tsirkin void acpi_table_add(const QemuOpts *opts, Error **errp); 1950445259bSMichael S. Tsirkin 19688594e4fSLaszlo Ersek typedef struct AcpiSlicOem AcpiSlicOem; 19788594e4fSLaszlo Ersek struct AcpiSlicOem { 19888594e4fSLaszlo Ersek char *id; 19988594e4fSLaszlo Ersek char *table_id; 20088594e4fSLaszlo Ersek }; 20188594e4fSLaszlo Ersek int acpi_get_slic_oem(AcpiSlicOem *oem); 20288594e4fSLaszlo Ersek 203175de524SMarkus Armbruster #endif /* QEMU_HW_ACPI_H */ 204