From 84b9cf4756ff5cda10d4683c5957b6748c3ca377 Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Thu, 31 Jul 2014 10:46:57 -0700 Subject: [PATCH] broadwell: Tweak GFXPAUSE settings based on revision Changes from 2.1.0 reference code release. BUG=chrome-os-partner:28234 BRANCH=None TEST=build and boot on samus Original-Change-Id: I6110a9bdb2973f1a134d8105c37659bf43f61d34 Original-Signed-off-by: Duncan Laurie Original-Reviewed-on: https://chromium-review.googlesource.com/210607 Original-Reviewed-by: Aaron Durbin (cherry picked from commit ef660ddc6c17a003f06b8995e821c7642c49a56e) Signed-off-by: Marc Jones Change-Id: Ibb41cd7369cfc7b9b86b61460650a56415b3d8fb Reviewed-on: http://review.coreboot.org/8949 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- src/soc/intel/broadwell/broadwell/systemagent.h | 3 +++ src/soc/intel/broadwell/igd.c | 14 ++++++++++++-- src/soc/intel/broadwell/systemagent.c | 5 +++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/soc/intel/broadwell/broadwell/systemagent.h b/src/soc/intel/broadwell/broadwell/systemagent.h index f95370b2b5..c3b5f942e6 100644 --- a/src/soc/intel/broadwell/broadwell/systemagent.h +++ b/src/soc/intel/broadwell/broadwell/systemagent.h @@ -122,4 +122,7 @@ /* Data is passed through bits 31:0 of the data register. */ #define BIOS_MAILBOX_DATA 0x5da0 +/* System Agent identification */ +u8 systemagent_revision(void); + #endif diff --git a/src/soc/intel/broadwell/igd.c b/src/soc/intel/broadwell/igd.c index 31293e5ed3..53d108def5 100644 --- a/src/soc/intel/broadwell/igd.c +++ b/src/soc/intel/broadwell/igd.c @@ -148,8 +148,7 @@ static const struct reg_script broadwell_early_init_script[] = { REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0xa250, 0x000000ff), REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0xa25c, 0x00000010), - /* GFXPAUSE settings */ - REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0xa000, 0x00030020), + /* GFXPAUSE settings (set based on stepping) */ /* ECO Settings */ REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0xa180, 0x45200000), @@ -167,6 +166,9 @@ static const struct reg_script broadwell_early_init_script[] = { /* Video Frequency Request */ REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0xa00c, 0x08000000), + REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0x138158, 0x00000009), + REG_RES_WRITE32(PCI_BASE_ADDRESS_0, 0x13815c, 0x0000000d), + /* * RC6 Settings */ @@ -489,6 +491,14 @@ static void igd_init(struct device *dev) /* Early init steps */ if (is_broadwell) { reg_script_run_on_dev(dev, broadwell_early_init_script); + + /* Set GFXPAUSE based on stepping */ + if (cpu_stepping() <= (CPUID_BROADWELL_E0 & 0xf) && + systemagent_revision() <= 9) { + gtt_write(0xa000, 0x300ff); + } else { + gtt_write(0xa000, 0x30020); + } } else { reg_script_run_on_dev(dev, haswell_early_init_script); } diff --git a/src/soc/intel/broadwell/systemagent.c b/src/soc/intel/broadwell/systemagent.c index ac021fb9ef..0488ccbe4c 100644 --- a/src/soc/intel/broadwell/systemagent.c +++ b/src/soc/intel/broadwell/systemagent.c @@ -36,6 +36,11 @@ #include #include +u8 systemagent_revision(void) +{ + return pci_read_config8(SA_DEV_ROOT, PCI_REVISION_ID); +} + static int get_pcie_bar(device_t dev, unsigned int index, u32 *base, u32 *len) { u32 pciexbar_reg;