siemens/mc_apl1: Extend circuit life by clock gating and power gating

The firmware of devices connected to LPC should deassert the LPC CLKRUN#
signal when there is no bus activity on LPC.

Necessary changes:

- Enable LPC CLKRUN#
- Enable LPC PCE (Power Control Enable)
- Enable LPC CCE (Clock Control Enable)
- Remove I/O decoding range on LPC for COM 3
- Disable I/O UART driver

Change-Id: I2fd80e3fdcf23658f97b8182a77df7e09ddf25d6
Signed-off-by: Mario Scheithauer <mario.scheithauer@siemens.com>
Reviewed-on: https://review.coreboot.org/28268
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Werner Zeh <werner.zeh@siemens.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
Mario Scheithauer 2018-08-22 13:03:55 +02:00 committed by Martin Roth
parent 24ad29e83c
commit 403458e7ec
5 changed files with 21 additions and 6 deletions

View File

@ -84,7 +84,7 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_NF(LPC_AD1, NONE, DEEP, NF1), /* LPC_AD1 */ PAD_CFG_NF(LPC_AD1, NONE, DEEP, NF1), /* LPC_AD1 */
PAD_CFG_NF(LPC_AD2, NONE, DEEP, NF1), /* LPC_AD2 */ PAD_CFG_NF(LPC_AD2, NONE, DEEP, NF1), /* LPC_AD2 */
PAD_CFG_NF(LPC_AD3, NONE, DEEP, NF1), /* LPC_AD3 */ PAD_CFG_NF(LPC_AD3, NONE, DEEP, NF1), /* LPC_AD3 */
PAD_CFG_GPI(LPC_CLKRUNB, NONE, DEEP), /* LPC_CLKRUN_N */ PAD_CFG_NF(LPC_CLKRUNB, NONE, DEEP, NF1), /* LPC_CLKRUN_N */
PAD_CFG_NF(LPC_FRAMEB, NONE, DEEP, NF1), /* LPC_FRAME_N */ PAD_CFG_NF(LPC_FRAMEB, NONE, DEEP, NF1), /* LPC_FRAME_N */
/* West Community */ /* West Community */
@ -402,7 +402,7 @@ static const struct pad_config early_gpio_table[] = {
PAD_CFG_NF(LPC_AD1, NONE, DEEP, NF1), /* LPC_AD1 */ PAD_CFG_NF(LPC_AD1, NONE, DEEP, NF1), /* LPC_AD1 */
PAD_CFG_NF(LPC_AD2, NONE, DEEP, NF1), /* LPC_AD2 */ PAD_CFG_NF(LPC_AD2, NONE, DEEP, NF1), /* LPC_AD2 */
PAD_CFG_NF(LPC_AD3, NONE, DEEP, NF1), /* LPC_AD3 */ PAD_CFG_NF(LPC_AD3, NONE, DEEP, NF1), /* LPC_AD3 */
PAD_CFG_GPI(LPC_CLKRUNB, NONE, DEEP), /* LPC_CLKRUN_N */ PAD_CFG_NF(LPC_CLKRUNB, NONE, DEEP, NF1), /* LPC_CLKRUN_N */
PAD_CFG_NF(LPC_FRAMEB, NONE, DEEP, NF1), /* LPC_FRAME_N */ PAD_CFG_NF(LPC_FRAMEB, NONE, DEEP, NF1), /* LPC_FRAME_N */
}; };

View File

@ -5,7 +5,6 @@ config BOARD_SIEMENS_MC_APL1_VAR
def_bool y def_bool y
select DRIVER_INTEL_I210 select DRIVER_INTEL_I210
select DRIVERS_I2C_RX6110SA select DRIVERS_I2C_RX6110SA
select DRIVERS_UART_8250IO
select DRIVER_SIEMENS_NC_FPGA select DRIVER_SIEMENS_NC_FPGA
select NC_FPGA_NOTIFY_CB_READY select NC_FPGA_NOTIFY_CB_READY
select APL_SKIP_SET_POWER_LIMITS select APL_SKIP_SET_POWER_LIMITS

View File

@ -42,9 +42,6 @@ void variant_mainboard_final(void)
else else
printk(BIOS_INFO, "LCD: Set up PTN was successful.\n"); printk(BIOS_INFO, "LCD: Set up PTN was successful.\n");
/* Enable additional I/O decoding range on LPC for COM 3 */
lpc_open_pmio_window(0x3e8, 8);
/* /*
* PIR6 register mapping for PCIe root ports * PIR6 register mapping for PCIe root ports
* INTA#->PIRQB#, INTB#->PIRQC#, INTC#->PIRQD#, INTD#-> PIRQA# * INTA#->PIRQB#, INTB#->PIRQC#, INTC#->PIRQD#, INTD#-> PIRQA#
@ -55,6 +52,17 @@ void variant_mainboard_final(void)
dev = dev_find_device(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2001, 0); dev = dev_find_device(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2001, 0);
if (dev) if (dev)
pci_write_config8(dev, 0xd8, 0x3e); pci_write_config8(dev, 0xd8, 0x3e);
/* Enable CLKRUN_EN for power gating LPC */
lpc_enable_pci_clk_cntl();
/*
* Enable LPC PCE (Power Control Enable) by setting IOSF-SB port 0xD2
* offset 0x341D bit3 and bit0.
* Enable LPC CCE (Clock Control Enable) by setting IOSF-SB port 0xD2
* offset 0x341C bit [3:0].
*/
pcr_or32(PID_LPC, PCR_LPC_PRC, (PCR_LPC_CCE_EN | PCR_LPC_PCE_EN));
} }
static void wait_for_legacy_dev(void *unused) static void wait_for_legacy_dev(void *unused)

View File

@ -2,6 +2,7 @@
* This file is part of the coreboot project. * This file is part of the coreboot project.
* *
* Copyright 2017 Intel Corporation. * Copyright 2017 Intel Corporation.
* Copyright (C) 2018 Siemens AG
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -31,6 +32,7 @@
#define PID_GPIO_N 0xC5 #define PID_GPIO_N 0xC5
#define PID_ITSS 0xD0 #define PID_ITSS 0xD0
#define PID_RTC 0xD1 #define PID_RTC 0xD1
#define PID_LPC 0xD2
#define PID_AUNIT 0x4d #define PID_AUNIT 0x4d
#define PID_BUNIT 0x4c #define PID_BUNIT 0x4c

View File

@ -2,6 +2,7 @@
* This file is part of the coreboot project. * This file is part of the coreboot project.
* *
* Copyright (C) 2017-2018 Intel Corp. * Copyright (C) 2017-2018 Intel Corp.
* Copyright (C) 2018 Siemens AG
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -47,6 +48,11 @@
#define PCR_DMI_LPCIOD 0x2770 #define PCR_DMI_LPCIOD 0x2770
#define PCR_DMI_LPCIOE 0x2774 #define PCR_DMI_LPCIOE 0x2774
/* LPC PCR configuration */
#define PCR_LPC_PRC 0x341c
#define PCR_LPC_CCE_EN 0xf
#define PCR_LPC_PCE_EN (9 << 8)
/* Serial IRQ control. SERIRQ_QUIET is the default (0). */ /* Serial IRQ control. SERIRQ_QUIET is the default (0). */
enum serirq_mode { enum serirq_mode {
SERIRQ_QUIET, SERIRQ_QUIET,