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:
parent
24ad29e83c
commit
403458e7ec
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue