#include <soc/pm.h> #include <soc/rcba.h> #include <soc/romstage.h> #include <soc/smbus.h> #include <soc/intel/broadwell/chip.h> const struct reg_script pch_early_init_script[] = { /* Setup southbridge BARs */ REG_PCI_WRITE32(RCBA, RCBA_BASE_ADDRESS | 1), REG_PCI_WRITE32(PMBASE, ACPI_BASE_ADDRESS | 1), REG_PCI_WRITE8(ACPI_CNTL, ACPI_EN), REG_PCI_WRITE32(GPIO_BASE, GPIO_BASE_ADDRESS | 1), REG_PCI_WRITE8(GPIO_CNTL, GPIO_EN), /* Set COM1/COM2 decode range */ REG_PCI_WRITE16(LPC_IO_DEC, 0x0010), /* Enable legacy decode ranges */ REG_PCI_WRITE16(LPC_EN, CNF1_LPC_EN | CNF2_LPC_EN | GAMEL_LPC_EN | COMA_LPC_EN | KBC_LPC_EN | MC_LPC_EN), /* Enable IOAPIC */ REG_MMIO_WRITE16(RCBA_BASE_ADDRESS + OIC, 0x0100), /* Read back for posted write */ REG_MMIO_READ16(RCBA_BASE_ADDRESS + OIC), /* Set HPET address and enable it */ REG_MMIO_RMW32(RCBA_BASE_ADDRESS + HPTC, ~3, (1 << 7)), /* Read back for posted write */ REG_MMIO_READ32(RCBA_BASE_ADDRESS + HPTC), /* Enable HPET to start counter */ REG_MMIO_OR32(HPET_BASE_ADDRESS + 0x10, (1 << 0)),
#include <arch/io.h> #include <device/pci_def.h> #include <device/early_smbus.h> #include <intelblocks/smbus.h> #include <reg_script.h> #include <soc/pci_devs.h> #include "smbuslib.h" static const struct reg_script smbus_init_script[] = { /* Set SMBus I/O base address */ REG_PCI_WRITE32(PCI_BASE_ADDRESS_4, SMBUS_IO_BASE), /* Set SMBus enable */ REG_PCI_WRITE8(HOSTC, HST_EN), /* Enable I/O access */ REG_PCI_WRITE16(PCI_COMMAND, PCI_COMMAND_IO), /* Disable interrupts */ REG_IO_WRITE8(SMBUS_IO_BASE + SMBHSTCTL, 0), /* Clear errors */ REG_IO_WRITE8(SMBUS_IO_BASE + SMBHSTSTAT, 0xff), /* Indicate the end of this array by REG_SCRIPT_END */ REG_SCRIPT_END, }; u16 smbus_read_word(u32 smbus_dev, u8 addr, u8 offset) { return smbus_read16(SMBUS_IO_BASE, addr, offset); } u8 smbus_read_byte(u32 smbus_dev, u8 addr, u8 offset) {
/* BAR + 0x80e0[16,9,6]=001b, leave bit 24=0 to prevent HC reset */ REG_RES_RMW32(PCI_BASE_ADDRESS_0, 0x80e0, ~0x01010200, 0x00000040), REG_SCRIPT_END }; const struct reg_script xhci_clock_gating_script[] = { /* ConfigureXhciClockGating() */ /* D20:F0:40[21:19,18,10:8]=000,1,001 (don't write byte 3) */ REG_PCI_RMW16(0x40, ~0x0600, 0x0100), REG_PCI_RMW8(0x42, ~0x38, 0x04), /* D20:F0:44[5:3]=001b */ REG_PCI_RMW16(0x44, ~0x0030, 0x0008), /* D20:F0:A0[19:18]=01b */ REG_PCI_RMW32(0xa0, ~0x00080000, 0x00040000), /* D20:F0:A4[15:0]=0x00 */ REG_PCI_WRITE16(0xa4, 0x0000), /* D20:F0:B0[21:17,14:13]=0000000b */ REG_PCI_RMW32(0xb0, ~0x00376000, 0x00000000), /* D20:F0:50[31:0]=0x0bce6e5f */ REG_PCI_WRITE32(0x50, 0x0bce6e5f), REG_SCRIPT_END }; /* Warm Reset a USB3 port */ static void xhci_reset_port_usb3(device_t dev, int port) { struct reg_script reset_port_usb3_script[] = { /* Issue Warm Port Rest to the port */ REG_RES_OR32(PCI_BASE_ADDRESS_0, XHCI_USB3_PORTSC(port), XHCI_USB3_PORTSC_WPR), /* Wait up to 100ms for it to complete */