11a6981bbSBernhard Beschow #ifndef HW_SOUTHBRIDGE_ICH9_H 21a6981bbSBernhard Beschow #define HW_SOUTHBRIDGE_ICH9_H 3e516572fSJason Baron 40d09e41aSPaolo Bonzini #include "hw/isa/apm.h" 50d09e41aSPaolo Bonzini #include "hw/acpi/ich9.h" 671671814SBernhard Beschow #include "hw/intc/ioapic.h" 771671814SBernhard Beschow #include "hw/pci/pci.h" 871671814SBernhard Beschow #include "hw/pci/pci_device.h" 9f0bc6bf7SBernhard Beschow #include "hw/rtc/mc146818rtc.h" 10*8be545baSRichard Henderson #include "system/memory.h" 1171671814SBernhard Beschow #include "qemu/notify.h" 12db1015e9SEduardo Habkost #include "qom/object.h" 13e516572fSJason Baron 1492055797SPaulo Alcantara void ich9_generate_smi(void); 1592055797SPaulo Alcantara 167335a95aSCao jin #define ICH9_CC_SIZE (16 * 1024) /* 16KB. Chipset configuration registers */ 17e516572fSJason Baron 18292b1634SMichael S. Tsirkin #define TYPE_ICH9_LPC_DEVICE "ICH9-LPC" 198063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(ICH9LPCState, ICH9_LPC_DEVICE) 20e516572fSJason Baron 21db1015e9SEduardo Habkost struct ICH9LPCState { 22e516572fSJason Baron /* ICH9 LPC PCI to ISA bridge */ 23e516572fSJason Baron PCIDevice d; 24e516572fSJason Baron 25e516572fSJason Baron /* (pci device, intx) -> pirq 26e516572fSJason Baron * In real chipset case, the unused slots are never used 270668a06bSCao jin * as ICH9 supports only D25-D31 irq routing. 28e516572fSJason Baron * On the other hand in qemu case, any slot/function can be populated 29e516572fSJason Baron * via command line option. 30e516572fSJason Baron * So fallback interrupt routing for any devices in any slots is necessary. 31e516572fSJason Baron */ 32e516572fSJason Baron uint8_t irr[PCI_SLOT_MAX][PCI_NUM_PINS]; 33e516572fSJason Baron 34f0bc6bf7SBernhard Beschow MC146818RtcState rtc; 35e516572fSJason Baron APMState apm; 36e516572fSJason Baron ICH9LPCPMRegs pm; 37e516572fSJason Baron uint32_t sci_level; /* track sci level */ 388f242cb7SPaolo Bonzini uint8_t sci_gsi; 39e516572fSJason Baron 405add35beSPaulo Alcantara /* 2.24 Pin Straps */ 415add35beSPaulo Alcantara struct { 425add35beSPaulo Alcantara bool spkr_hi; 435add35beSPaulo Alcantara } pin_strap; 445add35beSPaulo Alcantara 45e516572fSJason Baron /* 10.1 Chipset Configuration registers(Memory Space) 46e516572fSJason Baron which is pointed by RCBA */ 47e516572fSJason Baron uint8_t chip_config[ICH9_CC_SIZE]; 480e98b436SLaszlo Ersek 490e98b436SLaszlo Ersek /* 500e98b436SLaszlo Ersek * 13.7.5 RST_CNT---Reset Control Register (LPC I/F---D31:F0) 510e98b436SLaszlo Ersek * 520e98b436SLaszlo Ersek * register contents and IO memory region 530e98b436SLaszlo Ersek */ 540e98b436SLaszlo Ersek uint8_t rst_cnt; 550e98b436SLaszlo Ersek MemoryRegion rst_cnt_mem; 560e98b436SLaszlo Ersek 5750de920bSLaszlo Ersek /* SMI feature negotiation via fw_cfg */ 5850de920bSLaszlo Ersek uint64_t smi_host_features; /* guest-invisible, host endian */ 5950de920bSLaszlo Ersek uint8_t smi_host_features_le[8]; /* guest-visible, read-only, little 6050de920bSLaszlo Ersek * endian uint64_t */ 6150de920bSLaszlo Ersek uint8_t smi_guest_features_le[8]; /* guest-visible, read-write, little 6250de920bSLaszlo Ersek * endian uint64_t */ 6350de920bSLaszlo Ersek uint8_t smi_features_ok; /* guest-visible, read-only; selecting it 6450de920bSLaszlo Ersek * triggers feature lockdown */ 6550de920bSLaszlo Ersek uint64_t smi_negotiated_features; /* guest-invisible, host endian */ 6650de920bSLaszlo Ersek 677335a95aSCao jin MemoryRegion rcrb_mem; /* root complex register block */ 683f5bc9e8SGerd Hoffmann Notifier machine_ready; 69e516572fSJason Baron 70e3e3a8adSBernhard Beschow qemu_irq gsi[IOAPIC_NUM_PINS]; 71db1015e9SEduardo Habkost }; 72e516572fSJason Baron 73c288b686SBernhard Beschow #define ICH9_MASK(bit, ms_bit, ls_bit) \ 74e516572fSJason Baron ((uint##bit##_t)(((1ULL << ((ms_bit) + 1)) - 1) & ~((1ULL << ls_bit) - 1))) 75e516572fSJason Baron 76e516572fSJason Baron /* ICH9: Chipset Configuration Registers */ 77e516572fSJason Baron #define ICH9_CC_ADDR_MASK (ICH9_CC_SIZE - 1) 78e516572fSJason Baron 79e516572fSJason Baron #define ICH9_CC 80e516572fSJason Baron #define ICH9_CC_D28IP 0x310C 81e516572fSJason Baron #define ICH9_CC_D28IP_SHIFT 4 82e516572fSJason Baron #define ICH9_CC_D28IP_MASK 0xf 83e516572fSJason Baron #define ICH9_CC_D28IP_DEFAULT 0x00214321 84e516572fSJason Baron #define ICH9_CC_D31IR 0x3140 85e516572fSJason Baron #define ICH9_CC_D30IR 0x3142 86e516572fSJason Baron #define ICH9_CC_D29IR 0x3144 87e516572fSJason Baron #define ICH9_CC_D28IR 0x3146 88e516572fSJason Baron #define ICH9_CC_D27IR 0x3148 89e516572fSJason Baron #define ICH9_CC_D26IR 0x314C 90e516572fSJason Baron #define ICH9_CC_D25IR 0x3150 91e516572fSJason Baron #define ICH9_CC_DIR_DEFAULT 0x3210 92e516572fSJason Baron #define ICH9_CC_D30IR_DEFAULT 0x0 93e516572fSJason Baron #define ICH9_CC_DIR_SHIFT 4 94e516572fSJason Baron #define ICH9_CC_DIR_MASK 0x7 95e516572fSJason Baron #define ICH9_CC_OIC 0x31FF 96e516572fSJason Baron #define ICH9_CC_OIC_AEN 0x1 9792055797SPaulo Alcantara #define ICH9_CC_GCS 0x3410 9892055797SPaulo Alcantara #define ICH9_CC_GCS_DEFAULT 0x00000020 9992055797SPaulo Alcantara #define ICH9_CC_GCS_NO_REBOOT (1 << 5) 100e516572fSJason Baron 101e516572fSJason Baron /* D28:F[0-5] */ 102e516572fSJason Baron #define ICH9_PCIE_DEV 28 103e516572fSJason Baron #define ICH9_PCIE_FUNC_MAX 6 104e516572fSJason Baron 105e516572fSJason Baron 106e516572fSJason Baron /* D29:F0 USB UHCI Controller #1 */ 107e516572fSJason Baron #define ICH9_USB_UHCI1_DEV 29 108e516572fSJason Baron #define ICH9_USB_UHCI1_FUNC 0 109e516572fSJason Baron 110263cf436SBALATON Zoltan /* D30:F0 DMI-to-PCI bridge */ 111e516572fSJason Baron #define ICH9_D2P_BRIDGE "ICH9 D2P BRIDGE" 112e516572fSJason Baron #define ICH9_D2P_BRIDGE_SAVEVM_VERSION 0 113e516572fSJason Baron 114e516572fSJason Baron #define ICH9_D2P_BRIDGE_DEV 30 115e516572fSJason Baron #define ICH9_D2P_BRIDGE_FUNC 0 116e516572fSJason Baron 117e516572fSJason Baron #define ICH9_D2P_SECONDARY_DEFAULT (256 - 8) 118e516572fSJason Baron 119e516572fSJason Baron #define ICH9_D2P_A2_REVISION 0x92 120e516572fSJason Baron 1210e98b436SLaszlo Ersek /* D31:F0 LPC Processor Interface */ 1220e98b436SLaszlo Ersek #define ICH9_RST_CNT_IOPORT 0xCF9 123e516572fSJason Baron 124e516572fSJason Baron /* D31:F1 LPC controller */ 125e516572fSJason Baron #define ICH9_A2_LPC "ICH9 A2 LPC" 126e516572fSJason Baron #define ICH9_A2_LPC_SAVEVM_VERSION 0 127e516572fSJason Baron 128e516572fSJason Baron #define ICH9_LPC_DEV 31 129e516572fSJason Baron #define ICH9_LPC_FUNC 0 130e516572fSJason Baron 131e516572fSJason Baron #define ICH9_A2_LPC_REVISION 0x2 132e516572fSJason Baron #define ICH9_LPC_NB_PIRQS 8 /* PCI A-H */ 133e516572fSJason Baron 134e516572fSJason Baron #define ICH9_LPC_PMBASE 0x40 135c288b686SBernhard Beschow #define ICH9_LPC_PMBASE_BASE_ADDRESS_MASK ICH9_MASK(32, 15, 7) 136e516572fSJason Baron #define ICH9_LPC_PMBASE_RTE 0x1 137e516572fSJason Baron #define ICH9_LPC_PMBASE_DEFAULT 0x1 1384177b062SPhilippe Mathieu-Daudé 139e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL 0x44 140e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_ACPI_EN 0x80 141c288b686SBernhard Beschow #define ICH9_LPC_ACPI_CTRL_SCI_IRQ_SEL_MASK ICH9_MASK(8, 2, 0) 142e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_9 0x0 143e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_10 0x1 144e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_11 0x2 145e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_20 0x4 146e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_21 0x5 147e516572fSJason Baron #define ICH9_LPC_ACPI_CTRL_DEFAULT 0x0 148e516572fSJason Baron 149e516572fSJason Baron #define ICH9_LPC_PIRQA_ROUT 0x60 150e516572fSJason Baron #define ICH9_LPC_PIRQB_ROUT 0x61 151e516572fSJason Baron #define ICH9_LPC_PIRQC_ROUT 0x62 152e516572fSJason Baron #define ICH9_LPC_PIRQD_ROUT 0x63 153e516572fSJason Baron 154e516572fSJason Baron #define ICH9_LPC_PIRQE_ROUT 0x68 155e516572fSJason Baron #define ICH9_LPC_PIRQF_ROUT 0x69 156e516572fSJason Baron #define ICH9_LPC_PIRQG_ROUT 0x6a 157e516572fSJason Baron #define ICH9_LPC_PIRQH_ROUT 0x6b 158e516572fSJason Baron 159e516572fSJason Baron #define ICH9_LPC_PIRQ_ROUT_IRQEN 0x80 160c288b686SBernhard Beschow #define ICH9_LPC_PIRQ_ROUT_MASK ICH9_MASK(8, 3, 0) 161e516572fSJason Baron #define ICH9_LPC_PIRQ_ROUT_DEFAULT 0x80 162e516572fSJason Baron 16311e66a15SGerd Hoffmann #define ICH9_LPC_GEN_PMCON_1 0xa0 16411e66a15SGerd Hoffmann #define ICH9_LPC_GEN_PMCON_1_SMI_LOCK (1 << 4) 16511e66a15SGerd Hoffmann #define ICH9_LPC_GEN_PMCON_2 0xa2 16611e66a15SGerd Hoffmann #define ICH9_LPC_GEN_PMCON_3 0xa4 16711e66a15SGerd Hoffmann #define ICH9_LPC_GEN_PMCON_LOCK 0xa6 16811e66a15SGerd Hoffmann 169e516572fSJason Baron #define ICH9_LPC_RCBA 0xf0 170c288b686SBernhard Beschow #define ICH9_LPC_RCBA_BA_MASK ICH9_MASK(32, 31, 14) 171e516572fSJason Baron #define ICH9_LPC_RCBA_EN 0x1 172e516572fSJason Baron #define ICH9_LPC_RCBA_DEFAULT 0x0 173e516572fSJason Baron 174e516572fSJason Baron #define ICH9_LPC_PIC_NUM_PINS 16 175e516572fSJason Baron #define ICH9_LPC_IOAPIC_NUM_PINS 24 176e516572fSJason Baron 177f999c0deSEfimov Vasily #define ICH9_GPIO_GSI "gsi" 178f999c0deSEfimov Vasily 179e516572fSJason Baron /* D31:F2 SATA Controller #1 */ 180e516572fSJason Baron #define ICH9_SATA1_DEV 31 181e516572fSJason Baron #define ICH9_SATA1_FUNC 2 182e516572fSJason Baron 1830668a06bSCao jin /* D31:F0 power management I/O registers 184e516572fSJason Baron offset from the address ICH9_LPC_PMBASE */ 185e516572fSJason Baron 186e516572fSJason Baron /* ICH9 LPC PM I/O registers are 128 ports and 128-aligned */ 187e516572fSJason Baron #define ICH9_PMIO_SIZE 128 188e516572fSJason Baron #define ICH9_PMIO_MASK (ICH9_PMIO_SIZE - 1) 189e516572fSJason Baron 190e516572fSJason Baron #define ICH9_PMIO_PM1_STS 0x00 191e516572fSJason Baron #define ICH9_PMIO_PM1_EN 0x02 192e516572fSJason Baron #define ICH9_PMIO_PM1_CNT 0x04 193e516572fSJason Baron #define ICH9_PMIO_PM1_TMR 0x08 194e516572fSJason Baron #define ICH9_PMIO_GPE0_STS 0x20 195e516572fSJason Baron #define ICH9_PMIO_GPE0_EN 0x28 196e516572fSJason Baron #define ICH9_PMIO_GPE0_LEN 16 197e516572fSJason Baron #define ICH9_PMIO_SMI_EN 0x30 198e516572fSJason Baron #define ICH9_PMIO_SMI_EN_APMC_EN (1 << 5) 1996e3c2d58SDominic Prinz #define ICH9_PMIO_SMI_EN_SWSMI_EN (1 << 6) 20092055797SPaulo Alcantara #define ICH9_PMIO_SMI_EN_TCO_EN (1 << 13) 2016e3c2d58SDominic Prinz #define ICH9_PMIO_SMI_EN_PERIODIC_EN (1 << 14) 202e516572fSJason Baron #define ICH9_PMIO_SMI_STS 0x34 2036e3c2d58SDominic Prinz #define ICH9_PMIO_SMI_STS_SWSMI_STS (1 << 6) 2046e3c2d58SDominic Prinz #define ICH9_PMIO_SMI_STS_PERIODIC_STS (1 << 14) 20592055797SPaulo Alcantara #define ICH9_PMIO_TCO_RLD 0x60 20692055797SPaulo Alcantara #define ICH9_PMIO_TCO_LEN 32 207e516572fSJason Baron 208e516572fSJason Baron /* FADT ACPI_ENABLE/ACPI_DISABLE */ 209e516572fSJason Baron #define ICH9_APM_ACPI_ENABLE 0x2 210e516572fSJason Baron #define ICH9_APM_ACPI_DISABLE 0x3 211e516572fSJason Baron 212e516572fSJason Baron 213e516572fSJason Baron /* D31:F3 SMBus controller */ 214e178113fSMarkus Armbruster #define TYPE_ICH9_SMB_DEVICE "ICH9-SMB" 215f2dd8ebdSEfimov Vasily 216e516572fSJason Baron #define ICH9_A2_SMB_REVISION 0x02 217e516572fSJason Baron #define ICH9_SMB_PI 0x00 218e516572fSJason Baron 219e516572fSJason Baron #define ICH9_SMB_SMBMBAR0 0x10 220e516572fSJason Baron #define ICH9_SMB_SMBMBAR1 0x14 221e516572fSJason Baron #define ICH9_SMB_SMBM_BAR 0 222e516572fSJason Baron #define ICH9_SMB_SMBM_SIZE (1 << 8) 223e516572fSJason Baron #define ICH9_SMB_SMB_BASE 0x20 224e516572fSJason Baron #define ICH9_SMB_SMB_BASE_BAR 4 225e516572fSJason Baron #define ICH9_SMB_SMB_BASE_SIZE (1 << 5) 226e516572fSJason Baron #define ICH9_SMB_HOSTC 0x40 227e516572fSJason Baron #define ICH9_SMB_HOSTC_SSRESET ((uint8_t)(1 << 3)) 228e516572fSJason Baron #define ICH9_SMB_HOSTC_I2C_EN ((uint8_t)(1 << 2)) 229e516572fSJason Baron #define ICH9_SMB_HOSTC_SMB_SMI_EN ((uint8_t)(1 << 1)) 230e516572fSJason Baron #define ICH9_SMB_HOSTC_HST_EN ((uint8_t)(1 << 0)) 231e516572fSJason Baron 232e516572fSJason Baron /* D31:F3 SMBus I/O and memory mapped I/O registers */ 233e516572fSJason Baron #define ICH9_SMB_DEV 31 234e516572fSJason Baron #define ICH9_SMB_FUNC 3 235e516572fSJason Baron 236e516572fSJason Baron #define ICH9_SMB_HST_STS 0x00 237e516572fSJason Baron #define ICH9_SMB_HST_CNT 0x02 238e516572fSJason Baron #define ICH9_SMB_HST_CMD 0x03 239e516572fSJason Baron #define ICH9_SMB_XMIT_SLVA 0x04 240e516572fSJason Baron #define ICH9_SMB_HST_D0 0x05 241e516572fSJason Baron #define ICH9_SMB_HST_D1 0x06 242e516572fSJason Baron #define ICH9_SMB_HOST_BLOCK_DB 0x07 243e516572fSJason Baron 244eb8f7f91SIgor Mammedov #define ICH9_LPC_SMI_NEGOTIATED_FEAT_PROP "x-smi-negotiated-features" 245eb8f7f91SIgor Mammedov 2465ce45c7aSLaszlo Ersek /* bit positions used in fw_cfg SMI feature negotiation */ 2475ce45c7aSLaszlo Ersek #define ICH9_LPC_SMI_F_BROADCAST_BIT 0 24800dc02d2SIgor Mammedov #define ICH9_LPC_SMI_F_CPU_HOTPLUG_BIT 1 24900dc02d2SIgor Mammedov #define ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT 2 2505ce45c7aSLaszlo Ersek 2511a6981bbSBernhard Beschow #endif /* HW_SOUTHBRIDGE_ICH9_H */ 252