aboutsummaryrefslogtreecommitdiff
path: root/src/northbridge/intel/haswell/northbridge.c
diff options
context:
space:
mode:
authorAngel Pons <th3fanbus@gmail.com>2020-07-23 02:37:12 +0200
committerAngel Pons <th3fanbus@gmail.com>2020-07-28 10:54:29 +0000
commit598ec6af9814a0b94fcbbafa9dde2197185ad4c3 (patch)
treebeb1a4cac769f6caa0b001fc8f4bfec8f6665612 /src/northbridge/intel/haswell/northbridge.c
parentb82b4314ad32dcdb02cb5db1efcda3417aa8fe5d (diff)
nb/intel/haswell: Enable DMI ASPM
On Haswell platforms, the processor and the PCH are two separate dies, and communicate through a high-speed bus. This is DMI (Direct Media Interface) on traditional two-package platforms, but single-package Haswell LP variants use OPI (On-Package Interconnect) instead. Since OPI is not routed through the mainboard, most link parameters are static and cannot be changed. OPI self-initializes on boot, anyway. However, DMI needs to be initialized in firmware. On Haswell, the MRC initializes the physical DMI link, but things like topology and power management need to be configured as well. And we don't do that properly. We enable ASPM on the PCH side of the DMI link, but not on the SA side. Both sides need to use the same settings, so enable DMI ASPM on the SA. Clearing the error status bits needs to be done on all Haswell variants. Tested on Asrock B85M Pro4, still boots. Change-Id: Ie97ff56eec9f928cfd2d5d43a287f3e0d2fbf3cf Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/43743 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Diffstat (limited to 'src/northbridge/intel/haswell/northbridge.c')
-rw-r--r--src/northbridge/intel/haswell/northbridge.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/northbridge/intel/haswell/northbridge.c b/src/northbridge/intel/haswell/northbridge.c
index ef7742e523..5c9ef744b1 100644
--- a/src/northbridge/intel/haswell/northbridge.c
+++ b/src/northbridge/intel/haswell/northbridge.c
@@ -418,10 +418,52 @@ static void disable_devices(void)
pci_write_config32(host_dev, DEVEN, deven);
}
+static void northbridge_dmi_init(void)
+{
+ const bool is_haswell_h = !CONFIG(INTEL_LYNXPOINT_LP);
+
+ u16 reg16;
+ u32 reg32;
+
+ /* Steps prior to DMI ASPM */
+ if (is_haswell_h) {
+ /* Configure DMI De-Emphasis */
+ reg16 = DMIBAR16(DMILCTL2);
+ reg16 |= (1 << 6); /* 0b: -6.0 dB, 1b: -3.5 dB */
+ DMIBAR16(DMILCTL2) = reg16;
+
+ reg32 = DMIBAR32(DMIL0SLAT);
+ reg32 |= (1 << 31);
+ DMIBAR32(DMIL0SLAT) = reg32;
+
+ reg32 = DMIBAR32(DMILLTC);
+ reg32 |= (1 << 29);
+ DMIBAR32(DMILLTC) = reg32;
+
+ reg32 = DMIBAR32(DMI_AFE_PM_TMR);
+ reg32 &= ~0x1f;
+ reg32 |= 0x13;
+ DMIBAR32(DMI_AFE_PM_TMR) = reg32;
+ }
+
+ /* Clear error status bits */
+ DMIBAR32(DMIUESTS) = 0xffffffff;
+ DMIBAR32(DMICESTS) = 0xffffffff;
+
+ if (is_haswell_h) {
+ /* Enable ASPM L0s and L1 on SA link, should happen before PCH link */
+ reg16 = DMIBAR16(DMILCTL);
+ reg16 |= (1 << 1) | (1 << 0);
+ DMIBAR16(DMILCTL) = reg16;
+ }
+}
+
static void northbridge_init(struct device *dev)
{
u8 bios_reset_cpl, pair;
+ northbridge_dmi_init();
+
/* Enable Power Aware Interrupt Routing. */
pair = MCHBAR8(INTRDIRCTL);
pair &= ~0x7; /* Clear 2:0 */