summaryrefslogtreecommitdiff
path: root/src/drivers/generic/bayhub/bh720.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2018-05-23 15:34:04 -0600
committerMartin Roth <martinroth@google.com>2018-06-25 20:50:14 +0000
commit4f16049f17a4dcbf329d6b30f0d00f0a7f5490bf (patch)
treefc85f157c406d075af7b9423fe9193aae2b2d72c /src/drivers/generic/bayhub/bh720.c
parent57ccb9c5e859f515aa4f07e6bf81a9f2ae58a988 (diff)
downloadcoreboot-4f16049f17a4dcbf329d6b30f0d00f0a7f5490bf.tar.xz
mb/google/kahlee/variants/grunt: Select low-power mode for BayHub720
Put the PCIe clock pins in power-saving mode for the BayHub eMMC bridge to save power. This requires use of an additional register (Misc control register 2) and another bit in the existing 'protect' register. The naming of bit 0 of that register is incorrect, based on the latest datasheet (14 June 2018) so fix that too. BUG=b:73726008 BRANCH=none TEST=boot without this patch: iotools mem_read32 0xfed80e00 0x0046ffff With this patch: $ iotools mem_read32 0xfed80e00 0x00463fff Also see that the PCIe clock stops when eMMC is idle and can be started by starting disk activity. Change-Id: I5ad1467b2e2e151215d2dfd2ce48cd4a451fe480 Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-on: https://review.coreboot.org/26515 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Raul Rangel <rrangel@chromium.org> Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src/drivers/generic/bayhub/bh720.c')
-rw-r--r--src/drivers/generic/bayhub/bh720.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/drivers/generic/bayhub/bh720.c b/src/drivers/generic/bayhub/bh720.c
index 3a0a9721ad..3e78b4f049 100644
--- a/src/drivers/generic/bayhub/bh720.c
+++ b/src/drivers/generic/bayhub/bh720.c
@@ -24,16 +24,24 @@
enum {
BH720_PROTECT = 0xd0,
+ BH720_PROTECT_LOCK_OFF = 0,
+ BH720_PROTECT_LOCK_ON = BIT(0),
BH720_PROTECT_OFF = 0,
- BH720_PROTECT_ON = 1,
-
- BH720_RTD3_L1 = 0x3e0,
- BH720_RTD3_L1_DISABLE_L1 = BIT(28),
+ BH720_PROTECT_ON = BIT(31),
BH720_LINK_CTRL = 0x90,
BH720_LINK_CTRL_L0_ENABLE = BIT(0),
BH720_LINK_CTRL_L1_ENABLE = BIT(1),
BH720_LINK_CTRL_CLKREQ = BIT(8),
+
+ BH720_MISC2 = 0xf0,
+ BH720_MISC2_ASPM_DISABLE = BIT(0),
+ BH720_MISC2_APSM_CLKREQ_L1 = BIT(7),
+ BH720_MISC2_APSM_PHY_L1 = BIT(10),
+ BH720_MISC2_APSM_MORE = BIT(12),
+
+ BH720_RTD3_L1 = 0x3e0,
+ BH720_RTD3_L1_DISABLE_L1 = BIT(28),
};
static void bh720_init(struct device *dev)
@@ -47,13 +55,19 @@ static void bh720_init(struct device *dev)
* This procedure for enabling power-saving mode is from the
* BayHub BIOS Implementation Guideline document.
*/
- pci_write_config32(dev, BH720_PROTECT, BH720_PROTECT_OFF);
+ pci_write_config32(dev, BH720_PROTECT,
+ BH720_PROTECT_OFF | BH720_PROTECT_LOCK_OFF);
pci_or_config32(dev, BH720_RTD3_L1, BH720_RTD3_L1_DISABLE_L1);
pci_or_config32(dev, BH720_LINK_CTRL,
BH720_LINK_CTRL_L0_ENABLE |
BH720_LINK_CTRL_L1_ENABLE);
pci_or_config32(dev, BH720_LINK_CTRL, BH720_LINK_CTRL_CLKREQ);
- pci_write_config32(dev, BH720_PROTECT, BH720_PROTECT_ON);
+ pci_update_config32(dev, BH720_MISC2, ~BH720_MISC2_ASPM_DISABLE,
+ BH720_MISC2_APSM_CLKREQ_L1 |
+ BH720_MISC2_APSM_PHY_L1);
+ pci_write_config32(dev, BH720_PROTECT,
+ BH720_PROTECT_ON | BH720_PROTECT_LOCK_ON);
+
printk(BIOS_INFO, "BayHub BH720: Power-saving enabled (link_ctrl=%#x)\n",
pci_read_config32(dev, BH720_LINK_CTRL));
}