xref: /openbmc/qemu/include/hw/acpi/acpi.h (revision 4c6f44644d08f6f712474288d61deba601421988)
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