nyan: Move some pinmux and clock/reset configuration to ROM stage.

To enable EFS, we need to be able to talk to the TPM and the EC before the RAM
stage starts. That means we need to set up the pins for those busses, clock
those controllers and take them out of reset.

BUG=None
TEST=Built for nyan, nyan_big, and nyan_blaze. Booted on nyan. With other
changes which implement EFS on nyan, saw EC and TPM communication work when in
vboot.
BRANCH=None

Original-Change-Id: Ic65d69fd42beec5f03084c8cb970927c2f69dfb6
Original-Signed-off-by: Gabe Black <gabeblack@google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/191390
Original-Reviewed-by: Gabe Black <gabeblack@chromium.org>
Original-Commit-Queue: Gabe Black <gabeblack@chromium.org>
Original-Tested-by: Gabe Black <gabeblack@chromium.org>
(cherry picked from commit d9c176536b1e2eba47fdca90dd3346052573223e)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

Change-Id: Id3117bd0c36f8b92d85cc0cefde2bed9d8de90d0
Reviewed-on: http://review.coreboot.org/7456
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Tested-by: build bot (Jenkins)
Reviewed-by: David Hendricks <dhendrix@chromium.org>
This commit is contained in:
Gabe Black 2014-03-24 21:24:24 -07:00 committed by Marc Jones
parent bd5925ab2d
commit 4a12cfe759
6 changed files with 266 additions and 183 deletions

View File

@ -39,14 +39,6 @@ static void set_clock_sources(void)
* can both run at 400 KHz, but the kernel sets the bus to 100 KHz. * can both run at 400 KHz, but the kernel sets the bus to 100 KHz.
*/ */
clock_configure_i2c_scl_freq(i2c1, PLLP, 100); clock_configure_i2c_scl_freq(i2c1, PLLP, 100);
/*
* The TPM is on I2C3 and can theoretically run at 400 KHz but doesn't
* seem to work above around 40 KHz. It's set to run at 100 KHz in the
* kernel.
*/
clock_configure_i2c_scl_freq(i2c3, PLLP, 40);
clock_configure_source(sbc1, PLLP, 5000);
/* /*
* MMC3 and MMC4: Set base clock frequency for SD Clock to Tegra MMC's * MMC3 and MMC4: Set base clock frequency for SD Clock to Tegra MMC's
@ -78,47 +70,6 @@ static void set_clock_sources(void)
static void setup_pinmux(void) static void setup_pinmux(void)
{ {
// Write protect.
gpio_input_pullup(GPIO(R1));
// Recovery mode.
gpio_input_pullup(GPIO(Q7));
// Lid switch.
gpio_input_pullup(GPIO(R4));
// Power switch.
gpio_input_pullup(GPIO(Q0));
// Developer mode.
gpio_input_pullup(GPIO(Q6));
// EC in RW.
gpio_input_pullup(GPIO(U4));
// SOC and TPM reset GPIO, active low.
gpio_output(GPIO(I5), 1);
// SPI1 MOSI
pinmux_set_config(PINMUX_ULPI_CLK_INDEX, PINMUX_ULPI_CLK_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 MISO
pinmux_set_config(PINMUX_ULPI_DIR_INDEX, PINMUX_ULPI_DIR_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 SCLK
pinmux_set_config(PINMUX_ULPI_NXT_INDEX, PINMUX_ULPI_NXT_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 CS0
pinmux_set_config(PINMUX_ULPI_STP_INDEX, PINMUX_ULPI_STP_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// switch unused pin to GPIO
gpio_set_mode(GPIO(X3), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X4), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X5), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X6), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X7), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(W3), GPIO_MODE_GPIO);
// I2C1 clock. // I2C1 clock.
pinmux_set_config(PINMUX_GEN1_I2C_SCL_INDEX, pinmux_set_config(PINMUX_GEN1_I2C_SCL_INDEX,
PINMUX_GEN1_I2C_SCL_FUNC_I2C1 | PINMUX_INPUT_ENABLE); PINMUX_GEN1_I2C_SCL_FUNC_I2C1 | PINMUX_INPUT_ENABLE);
@ -131,12 +82,6 @@ static void setup_pinmux(void)
// I2C2 data. // I2C2 data.
pinmux_set_config(PINMUX_GEN2_I2C_SDA_INDEX, pinmux_set_config(PINMUX_GEN2_I2C_SDA_INDEX,
PINMUX_GEN2_I2C_SDA_FUNC_I2C2 | PINMUX_INPUT_ENABLE); PINMUX_GEN2_I2C_SDA_FUNC_I2C2 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) clock.
pinmux_set_config(PINMUX_CAM_I2C_SCL_INDEX,
PINMUX_CAM_I2C_SCL_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) data.
pinmux_set_config(PINMUX_CAM_I2C_SDA_INDEX,
PINMUX_CAM_I2C_SDA_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C4 (DDC) clock. // I2C4 (DDC) clock.
pinmux_set_config(PINMUX_DDC_SCL_INDEX, pinmux_set_config(PINMUX_DDC_SCL_INDEX,
PINMUX_DDC_SCL_FUNC_I2C4 | PINMUX_INPUT_ENABLE); PINMUX_DDC_SCL_FUNC_I2C4 | PINMUX_INPUT_ENABLE);
@ -271,10 +216,9 @@ static void mainboard_init(device_t dev)
CLK_L_SPDIF | CLK_L_USBD | CLK_L_DISP1 | CLK_L_SPDIF | CLK_L_USBD | CLK_L_DISP1 |
CLK_L_HOST1X | CLK_L_PWM, CLK_L_HOST1X | CLK_L_PWM,
CLK_H_I2C2 | CLK_H_SBC1 | CLK_H_PMC | CLK_H_I2C2 | CLK_H_PMC | CLK_H_USB3,
CLK_H_USB3,
CLK_U_I2C3 | CLK_U_CSITE | CLK_U_SDMMC3, CLK_U_CSITE | CLK_U_SDMMC3,
CLK_V_I2C4 | CLK_V_EXTPERIPH1 | CLK_V_APBIF | CLK_V_I2C4 | CLK_V_EXTPERIPH1 | CLK_V_APBIF |
CLK_V_AUDIO | CLK_V_I2S3 | CLK_V_I2S4 | CLK_V_AUDIO | CLK_V_I2S3 | CLK_V_I2S4 |
@ -295,7 +239,6 @@ static void mainboard_init(device_t dev)
i2c_init(0); i2c_init(0);
i2c_init(1); i2c_init(1);
i2c_init(2);
i2c_init(3); i2c_init(3);
setup_kernel_info(); setup_kernel_info();

View File

@ -20,17 +20,24 @@
#include <arch/cache.h> #include <arch/cache.h>
#include <arch/cpu.h> #include <arch/cpu.h>
#include <arch/exception.h> #include <arch/exception.h>
#include <arch/io.h>
#include <arch/stages.h> #include <arch/stages.h>
#include <device/device.h> #include <device/device.h>
#include <cbfs.h> #include <cbfs.h>
#include <cbmem.h> #include <cbmem.h>
#include <console/console.h> #include <console/console.h>
#include "sdram_configs.h" #include "sdram_configs.h"
#include "soc/nvidia/tegra124/chip.h" #include <soc/nvidia/tegra/i2c.h>
#include "soc/nvidia/tegra124/sdram.h" #include <soc/nvidia/tegra124/chip.h>
#include <soc/nvidia/tegra124/clk_rst.h>
#include <soc/nvidia/tegra124/sdram.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
#include <soc/display.h> #include <soc/display.h>
#include <timestamp.h> #include <timestamp.h>
static struct clk_rst_ctlr *clk_rst = (void *)TEGRA_CLK_RST_BASE;
enum { enum {
L2CTLR_ECC_PARITY = 0x1 << 21, L2CTLR_ECC_PARITY = 0x1 << 21,
L2CTLR_TAG_RAM_LATENCY_MASK = 0x7 << 6, L2CTLR_TAG_RAM_LATENCY_MASK = 0x7 << 6,
@ -69,6 +76,74 @@ static void configure_l2actlr(void)
write_l2actlr(val); write_l2actlr(val);
} }
static void setup_pinmux(void)
{
// Write protect.
gpio_input_pullup(GPIO(R1));
// Recovery mode.
gpio_input_pullup(GPIO(Q7));
// Lid switch.
gpio_input_pullup(GPIO(R4));
// Power switch.
gpio_input_pullup(GPIO(Q0));
// Developer mode.
gpio_input_pullup(GPIO(Q6));
// EC in RW.
gpio_input_pullup(GPIO(U4));
// SOC and TPM reset GPIO, active low.
gpio_output(GPIO(I5), 1);
// SPI1 MOSI
pinmux_set_config(PINMUX_ULPI_CLK_INDEX, PINMUX_ULPI_CLK_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 MISO
pinmux_set_config(PINMUX_ULPI_DIR_INDEX, PINMUX_ULPI_DIR_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 SCLK
pinmux_set_config(PINMUX_ULPI_NXT_INDEX, PINMUX_ULPI_NXT_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 CS0
pinmux_set_config(PINMUX_ULPI_STP_INDEX, PINMUX_ULPI_STP_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// I2C3 (cam) clock.
pinmux_set_config(PINMUX_CAM_I2C_SCL_INDEX,
PINMUX_CAM_I2C_SCL_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) data.
pinmux_set_config(PINMUX_CAM_I2C_SDA_INDEX,
PINMUX_CAM_I2C_SDA_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// switch unused pin to GPIO
gpio_set_mode(GPIO(X3), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X4), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X5), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X6), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X7), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(W3), GPIO_MODE_GPIO);
}
static void configure_ec_spi_bus(void)
{
clock_configure_source(sbc1, PLLP, 5000);
}
static void configure_tpm_i2c_bus(void)
{
/*
* The TPM is on I2C3 and can theoretically run at 400 KHz but doesn't
* seem to work above around 40 KHz. It's set to run at 100 KHz in the
* kernel.
*/
clock_configure_i2c_scl_freq(i2c3, PLLP, 40);
i2c_init(2);
}
static void __attribute__((noinline)) romstage(void) static void __attribute__((noinline)) romstage(void)
{ {
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS
@ -130,6 +205,15 @@ static void __attribute__((noinline)) romstage(void)
timestamp_add(TS_START_ROMSTAGE, romstage_start_time); timestamp_add(TS_START_ROMSTAGE, romstage_start_time);
timestamp_add(TS_START_COPYRAM, timestamp_get()); timestamp_add(TS_START_COPYRAM, timestamp_get());
#endif #endif
// Enable additional peripherals we need for ROM stage.
clock_enable_clear_reset(0, CLK_H_SBC1, CLK_U_I2C3, 0, 0, 0);
setup_pinmux();
configure_ec_spi_bus();
configure_tpm_i2c_bus();
void *entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, void *entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA,
"fallback/coreboot_ram"); "fallback/coreboot_ram");
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS

View File

@ -39,14 +39,6 @@ static void set_clock_sources(void)
* can both run at 400 KHz, but the kernel sets the bus to 100 KHz. * can both run at 400 KHz, but the kernel sets the bus to 100 KHz.
*/ */
clock_configure_i2c_scl_freq(i2c1, PLLP, 100); clock_configure_i2c_scl_freq(i2c1, PLLP, 100);
/*
* The TPM is on I2C3 and can theoretically run at 400 KHz but doesn't
* seem to work above around 40 KHz. It's set to run at 100 KHz in the
* kernel.
*/
clock_configure_i2c_scl_freq(i2c3, PLLP, 40);
clock_configure_source(sbc1, PLLP, 5000);
/* /*
* MMC3 and MMC4: Set base clock frequency for SD Clock to Tegra MMC's * MMC3 and MMC4: Set base clock frequency for SD Clock to Tegra MMC's
@ -78,47 +70,6 @@ static void set_clock_sources(void)
static void setup_pinmux(void) static void setup_pinmux(void)
{ {
// Write protect.
gpio_input_pullup(GPIO(R1));
// Recovery mode.
gpio_input_pullup(GPIO(Q7));
// Lid switch.
gpio_input_pullup(GPIO(R4));
// Power switch.
gpio_input_pullup(GPIO(Q0));
// Developer mode.
gpio_input_pullup(GPIO(Q6));
// EC in RW.
gpio_input_pullup(GPIO(U4));
// SOC and TPM reset GPIO, active low.
gpio_output(GPIO(I5), 1);
// SPI1 MOSI
pinmux_set_config(PINMUX_ULPI_CLK_INDEX, PINMUX_ULPI_CLK_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 MISO
pinmux_set_config(PINMUX_ULPI_DIR_INDEX, PINMUX_ULPI_DIR_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 SCLK
pinmux_set_config(PINMUX_ULPI_NXT_INDEX, PINMUX_ULPI_NXT_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 CS0
pinmux_set_config(PINMUX_ULPI_STP_INDEX, PINMUX_ULPI_STP_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// switch unused pin to GPIO
gpio_set_mode(GPIO(X3), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X4), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X5), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X6), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X7), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(W3), GPIO_MODE_GPIO);
// I2C1 clock. // I2C1 clock.
pinmux_set_config(PINMUX_GEN1_I2C_SCL_INDEX, pinmux_set_config(PINMUX_GEN1_I2C_SCL_INDEX,
PINMUX_GEN1_I2C_SCL_FUNC_I2C1 | PINMUX_INPUT_ENABLE); PINMUX_GEN1_I2C_SCL_FUNC_I2C1 | PINMUX_INPUT_ENABLE);
@ -131,12 +82,6 @@ static void setup_pinmux(void)
// I2C2 data. // I2C2 data.
pinmux_set_config(PINMUX_GEN2_I2C_SDA_INDEX, pinmux_set_config(PINMUX_GEN2_I2C_SDA_INDEX,
PINMUX_GEN2_I2C_SDA_FUNC_I2C2 | PINMUX_INPUT_ENABLE); PINMUX_GEN2_I2C_SDA_FUNC_I2C2 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) clock.
pinmux_set_config(PINMUX_CAM_I2C_SCL_INDEX,
PINMUX_CAM_I2C_SCL_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) data.
pinmux_set_config(PINMUX_CAM_I2C_SDA_INDEX,
PINMUX_CAM_I2C_SDA_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C4 (DDC) clock. // I2C4 (DDC) clock.
pinmux_set_config(PINMUX_DDC_SCL_INDEX, pinmux_set_config(PINMUX_DDC_SCL_INDEX,
PINMUX_DDC_SCL_FUNC_I2C4 | PINMUX_INPUT_ENABLE); PINMUX_DDC_SCL_FUNC_I2C4 | PINMUX_INPUT_ENABLE);
@ -268,10 +213,10 @@ static void mainboard_init(device_t dev)
CLK_L_SPDIF | CLK_L_USBD | CLK_L_DISP1 | CLK_L_SPDIF | CLK_L_USBD | CLK_L_DISP1 |
CLK_L_HOST1X | CLK_L_PWM, CLK_L_HOST1X | CLK_L_PWM,
CLK_H_EMC | CLK_H_I2C2 | CLK_H_SBC1 | CLK_H_EMC | CLK_H_I2C2 | CLK_H_PMC |
CLK_H_PMC | CLK_H_MEM | CLK_H_USB3, CLK_H_MEM | CLK_H_USB3,
CLK_U_I2C3 | CLK_U_CSITE | CLK_U_SDMMC3, CLK_U_CSITE | CLK_U_SDMMC3,
CLK_V_I2C4 | CLK_V_EXTPERIPH1 | CLK_V_APBIF | CLK_V_I2C4 | CLK_V_EXTPERIPH1 | CLK_V_APBIF |
CLK_V_AUDIO | CLK_V_I2S3 | CLK_V_I2S4 | CLK_V_AUDIO | CLK_V_I2S3 | CLK_V_I2S4 |
@ -292,7 +237,6 @@ static void mainboard_init(device_t dev)
i2c_init(0); i2c_init(0);
i2c_init(1); i2c_init(1);
i2c_init(2);
i2c_init(3); i2c_init(3);
setup_kernel_info(); setup_kernel_info();

View File

@ -20,17 +20,24 @@
#include <arch/cache.h> #include <arch/cache.h>
#include <arch/cpu.h> #include <arch/cpu.h>
#include <arch/exception.h> #include <arch/exception.h>
#include <arch/io.h>
#include <arch/stages.h> #include <arch/stages.h>
#include <device/device.h> #include <device/device.h>
#include <cbfs.h> #include <cbfs.h>
#include <cbmem.h> #include <cbmem.h>
#include <console/console.h> #include <console/console.h>
#include "sdram_configs.h" #include "sdram_configs.h"
#include "soc/nvidia/tegra124/chip.h" #include <soc/nvidia/tegra/i2c.h>
#include "soc/nvidia/tegra124/sdram.h" #include <soc/nvidia/tegra124/chip.h>
#include <soc/nvidia/tegra124/clk_rst.h>
#include <soc/nvidia/tegra124/sdram.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
#include <soc/display.h> #include <soc/display.h>
#include <timestamp.h> #include <timestamp.h>
static struct clk_rst_ctlr *clk_rst = (void *)TEGRA_CLK_RST_BASE;
enum { enum {
L2CTLR_ECC_PARITY = 0x1 << 21, L2CTLR_ECC_PARITY = 0x1 << 21,
L2CTLR_TAG_RAM_LATENCY_MASK = 0x7 << 6, L2CTLR_TAG_RAM_LATENCY_MASK = 0x7 << 6,
@ -69,6 +76,74 @@ static void configure_l2actlr(void)
write_l2actlr(val); write_l2actlr(val);
} }
static void setup_pinmux(void)
{
// Write protect.
gpio_input_pullup(GPIO(R1));
// Recovery mode.
gpio_input_pullup(GPIO(Q7));
// Lid switch.
gpio_input_pullup(GPIO(R4));
// Power switch.
gpio_input_pullup(GPIO(Q0));
// Developer mode.
gpio_input_pullup(GPIO(Q6));
// EC in RW.
gpio_input_pullup(GPIO(U4));
// SOC and TPM reset GPIO, active low.
gpio_output(GPIO(I5), 1);
// SPI1 MOSI
pinmux_set_config(PINMUX_ULPI_CLK_INDEX, PINMUX_ULPI_CLK_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 MISO
pinmux_set_config(PINMUX_ULPI_DIR_INDEX, PINMUX_ULPI_DIR_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 SCLK
pinmux_set_config(PINMUX_ULPI_NXT_INDEX, PINMUX_ULPI_NXT_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 CS0
pinmux_set_config(PINMUX_ULPI_STP_INDEX, PINMUX_ULPI_STP_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// I2C3 (cam) clock.
pinmux_set_config(PINMUX_CAM_I2C_SCL_INDEX,
PINMUX_CAM_I2C_SCL_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) data.
pinmux_set_config(PINMUX_CAM_I2C_SDA_INDEX,
PINMUX_CAM_I2C_SDA_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// switch unused pin to GPIO
gpio_set_mode(GPIO(X3), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X4), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X5), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X6), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X7), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(W3), GPIO_MODE_GPIO);
}
static void configure_ec_spi_bus(void)
{
clock_configure_source(sbc1, PLLP, 5000);
}
static void configure_tpm_i2c_bus(void)
{
/*
* The TPM is on I2C3 and can theoretically run at 400 KHz but doesn't
* seem to work above around 40 KHz. It's set to run at 100 KHz in the
* kernel.
*/
clock_configure_i2c_scl_freq(i2c3, PLLP, 40);
i2c_init(2);
}
static void __attribute__((noinline)) romstage(void) static void __attribute__((noinline)) romstage(void)
{ {
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS
@ -130,6 +205,15 @@ static void __attribute__((noinline)) romstage(void)
timestamp_add(TS_START_ROMSTAGE, romstage_start_time); timestamp_add(TS_START_ROMSTAGE, romstage_start_time);
timestamp_add(TS_START_COPYRAM, timestamp_get()); timestamp_add(TS_START_COPYRAM, timestamp_get());
#endif #endif
// Enable additional peripherals we need for ROM stage.
clock_enable_clear_reset(0, CLK_H_SBC1, CLK_U_I2C3, 0, 0, 0);
setup_pinmux();
configure_ec_spi_bus();
configure_tpm_i2c_bus();
void *entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, void *entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA,
"fallback/coreboot_ram"); "fallback/coreboot_ram");
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS

View File

@ -39,14 +39,6 @@ static void set_clock_sources(void)
* can both run at 400 KHz, but the kernel sets the bus to 100 KHz. * can both run at 400 KHz, but the kernel sets the bus to 100 KHz.
*/ */
clock_configure_i2c_scl_freq(i2c1, PLLP, 100); clock_configure_i2c_scl_freq(i2c1, PLLP, 100);
/*
* The TPM is on I2C3 and can theoretically run at 400 KHz but doesn't
* seem to work above around 40 KHz. It's set to run at 100 KHz in the
* kernel.
*/
clock_configure_i2c_scl_freq(i2c3, PLLP, 40);
clock_configure_source(sbc1, PLLP, 5000);
/* /*
* MMC3 and MMC4: Set base clock frequency for SD Clock to Tegra MMC's * MMC3 and MMC4: Set base clock frequency for SD Clock to Tegra MMC's
@ -78,47 +70,6 @@ static void set_clock_sources(void)
static void setup_pinmux(void) static void setup_pinmux(void)
{ {
// Write protect.
gpio_input_pullup(GPIO(R1));
// Recovery mode.
gpio_input_pullup(GPIO(Q7));
// Lid switch.
gpio_input_pullup(GPIO(R4));
// Power switch.
gpio_input_pullup(GPIO(Q0));
// Developer mode.
gpio_input_pullup(GPIO(Q6));
// EC in RW.
gpio_input_pullup(GPIO(U4));
// SOC and TPM reset GPIO, active low.
gpio_output(GPIO(I5), 1);
// SPI1 MOSI
pinmux_set_config(PINMUX_ULPI_CLK_INDEX, PINMUX_ULPI_CLK_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 MISO
pinmux_set_config(PINMUX_ULPI_DIR_INDEX, PINMUX_ULPI_DIR_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 SCLK
pinmux_set_config(PINMUX_ULPI_NXT_INDEX, PINMUX_ULPI_NXT_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 CS0
pinmux_set_config(PINMUX_ULPI_STP_INDEX, PINMUX_ULPI_STP_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// switch unused pin to GPIO
gpio_set_mode(GPIO(X3), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X4), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X5), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X6), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X7), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(W3), GPIO_MODE_GPIO);
// I2C1 clock. // I2C1 clock.
pinmux_set_config(PINMUX_GEN1_I2C_SCL_INDEX, pinmux_set_config(PINMUX_GEN1_I2C_SCL_INDEX,
PINMUX_GEN1_I2C_SCL_FUNC_I2C1 | PINMUX_INPUT_ENABLE); PINMUX_GEN1_I2C_SCL_FUNC_I2C1 | PINMUX_INPUT_ENABLE);
@ -131,12 +82,6 @@ static void setup_pinmux(void)
// I2C2 data. // I2C2 data.
pinmux_set_config(PINMUX_GEN2_I2C_SDA_INDEX, pinmux_set_config(PINMUX_GEN2_I2C_SDA_INDEX,
PINMUX_GEN2_I2C_SDA_FUNC_I2C2 | PINMUX_INPUT_ENABLE); PINMUX_GEN2_I2C_SDA_FUNC_I2C2 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) clock.
pinmux_set_config(PINMUX_CAM_I2C_SCL_INDEX,
PINMUX_CAM_I2C_SCL_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) data.
pinmux_set_config(PINMUX_CAM_I2C_SDA_INDEX,
PINMUX_CAM_I2C_SDA_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C4 (DDC) clock. // I2C4 (DDC) clock.
pinmux_set_config(PINMUX_DDC_SCL_INDEX, pinmux_set_config(PINMUX_DDC_SCL_INDEX,
PINMUX_DDC_SCL_FUNC_I2C4 | PINMUX_INPUT_ENABLE); PINMUX_DDC_SCL_FUNC_I2C4 | PINMUX_INPUT_ENABLE);
@ -268,10 +213,10 @@ static void mainboard_init(device_t dev)
CLK_L_SPDIF | CLK_L_USBD | CLK_L_DISP1 | CLK_L_SPDIF | CLK_L_USBD | CLK_L_DISP1 |
CLK_L_HOST1X | CLK_L_PWM, CLK_L_HOST1X | CLK_L_PWM,
CLK_H_EMC | CLK_H_I2C2 | CLK_H_SBC1 | CLK_H_EMC | CLK_H_I2C2 | CLK_H_PMC |
CLK_H_PMC | CLK_H_MEM | CLK_H_USB3, CLK_H_MEM | CLK_H_USB3,
CLK_U_I2C3 | CLK_U_CSITE | CLK_U_SDMMC3, CLK_U_CSITE | CLK_U_SDMMC3,
CLK_V_I2C4 | CLK_V_EXTPERIPH1 | CLK_V_APBIF | CLK_V_I2C4 | CLK_V_EXTPERIPH1 | CLK_V_APBIF |
CLK_V_AUDIO | CLK_V_I2S3 | CLK_V_I2S4 | CLK_V_AUDIO | CLK_V_I2S3 | CLK_V_I2S4 |
@ -292,7 +237,6 @@ static void mainboard_init(device_t dev)
i2c_init(0); i2c_init(0);
i2c_init(1); i2c_init(1);
i2c_init(2);
i2c_init(3); i2c_init(3);
setup_kernel_info(); setup_kernel_info();

View File

@ -20,17 +20,24 @@
#include <arch/cache.h> #include <arch/cache.h>
#include <arch/cpu.h> #include <arch/cpu.h>
#include <arch/exception.h> #include <arch/exception.h>
#include <arch/io.h>
#include <arch/stages.h> #include <arch/stages.h>
#include <device/device.h> #include <device/device.h>
#include <cbfs.h> #include <cbfs.h>
#include <cbmem.h> #include <cbmem.h>
#include <console/console.h> #include <console/console.h>
#include "sdram_configs.h" #include "sdram_configs.h"
#include "soc/nvidia/tegra124/chip.h" #include <soc/nvidia/tegra/i2c.h>
#include "soc/nvidia/tegra124/sdram.h" #include <soc/nvidia/tegra124/chip.h>
#include <soc/nvidia/tegra124/clk_rst.h>
#include <soc/nvidia/tegra124/sdram.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
#include <soc/display.h> #include <soc/display.h>
#include <timestamp.h> #include <timestamp.h>
static struct clk_rst_ctlr *clk_rst = (void *)TEGRA_CLK_RST_BASE;
enum { enum {
L2CTLR_ECC_PARITY = 0x1 << 21, L2CTLR_ECC_PARITY = 0x1 << 21,
L2CTLR_TAG_RAM_LATENCY_MASK = 0x7 << 6, L2CTLR_TAG_RAM_LATENCY_MASK = 0x7 << 6,
@ -69,6 +76,74 @@ static void configure_l2actlr(void)
write_l2actlr(val); write_l2actlr(val);
} }
static void setup_pinmux(void)
{
// Write protect.
gpio_input_pullup(GPIO(R1));
// Recovery mode.
gpio_input_pullup(GPIO(Q7));
// Lid switch.
gpio_input_pullup(GPIO(R4));
// Power switch.
gpio_input_pullup(GPIO(Q0));
// Developer mode.
gpio_input_pullup(GPIO(Q6));
// EC in RW.
gpio_input_pullup(GPIO(U4));
// SOC and TPM reset GPIO, active low.
gpio_output(GPIO(I5), 1);
// SPI1 MOSI
pinmux_set_config(PINMUX_ULPI_CLK_INDEX, PINMUX_ULPI_CLK_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 MISO
pinmux_set_config(PINMUX_ULPI_DIR_INDEX, PINMUX_ULPI_DIR_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 SCLK
pinmux_set_config(PINMUX_ULPI_NXT_INDEX, PINMUX_ULPI_NXT_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// SPI1 CS0
pinmux_set_config(PINMUX_ULPI_STP_INDEX, PINMUX_ULPI_STP_FUNC_SPI1 |
PINMUX_PULL_NONE |
PINMUX_INPUT_ENABLE);
// I2C3 (cam) clock.
pinmux_set_config(PINMUX_CAM_I2C_SCL_INDEX,
PINMUX_CAM_I2C_SCL_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// I2C3 (cam) data.
pinmux_set_config(PINMUX_CAM_I2C_SDA_INDEX,
PINMUX_CAM_I2C_SDA_FUNC_I2C3 | PINMUX_INPUT_ENABLE);
// switch unused pin to GPIO
gpio_set_mode(GPIO(X3), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X4), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X5), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X6), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(X7), GPIO_MODE_GPIO);
gpio_set_mode(GPIO(W3), GPIO_MODE_GPIO);
}
static void configure_ec_spi_bus(void)
{
clock_configure_source(sbc1, PLLP, 5000);
}
static void configure_tpm_i2c_bus(void)
{
/*
* The TPM is on I2C3 and can theoretically run at 400 KHz but doesn't
* seem to work above around 40 KHz. It's set to run at 100 KHz in the
* kernel.
*/
clock_configure_i2c_scl_freq(i2c3, PLLP, 40);
i2c_init(2);
}
static void __attribute__((noinline)) romstage(void) static void __attribute__((noinline)) romstage(void)
{ {
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS
@ -130,6 +205,15 @@ static void __attribute__((noinline)) romstage(void)
timestamp_add(TS_START_ROMSTAGE, romstage_start_time); timestamp_add(TS_START_ROMSTAGE, romstage_start_time);
timestamp_add(TS_START_COPYRAM, timestamp_get()); timestamp_add(TS_START_COPYRAM, timestamp_get());
#endif #endif
// Enable additional peripherals we need for ROM stage.
clock_enable_clear_reset(0, CLK_H_SBC1, CLK_U_I2C3, 0, 0, 0);
setup_pinmux();
configure_ec_spi_bus();
configure_tpm_i2c_bus();
void *entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, void *entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA,
"fallback/coreboot_ram"); "fallback/coreboot_ram");
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS