coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
bootblock.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <bootblock_common.h>
5 #include <device/i2c_simple.h>
6 #include <soc/addressmap.h>
7 #include <soc/clk_rst.h>
8 #include <soc/clock.h>
9 #include <soc/funitcfg.h>
10 #include <soc/nvidia/tegra/i2c.h>
11 #include <soc/padconfig.h>
12 #include <soc/pmc.h>
13 #include <soc/power.h>
14 #include <soc/spi.h>
15 
16 #include "pmic.h"
17 
18 /********************** PMIC **********************************/
19 static const struct pad_config pmic_pads[] = {
20  PAD_CFG_SFIO(PWR_I2C_SCL, PINMUX_INPUT_ENABLE, I2CPMU),
21  PAD_CFG_SFIO(PWR_I2C_SDA, PINMUX_INPUT_ENABLE, I2CPMU),
22 };
23 
24 /********************** SPI Flash *****************************/
25 static const struct pad_config spiflash_pads[] = {
26  /* QSPI fLash: mosi, miso, clk, cs0, hold, wp */
28  PINMUX_DRIVE_2X, QSPI),
30  PINMUX_DRIVE_2X, QSPI),
34  PINMUX_DRIVE_2X, QSPI),
36  PINMUX_DRIVE_2X, QSPI),
37 };
38 
39 /********************* TPM ************************************/
40 static const struct pad_config tpm_pads[] = {
41  PAD_CFG_SFIO(GEN3_I2C_SCL, PINMUX_INPUT_ENABLE, I2C3),
42  PAD_CFG_SFIO(GEN3_I2C_SDA, PINMUX_INPUT_ENABLE, I2C3),
43 };
44 
45 /********************* EC *************************************/
46 static const struct pad_config ec_i2c_pads[] = {
47  PAD_CFG_SFIO(GEN2_I2C_SCL, PINMUX_INPUT_ENABLE, I2C2),
48  PAD_CFG_SFIO(GEN2_I2C_SDA, PINMUX_INPUT_ENABLE, I2C2),
49 };
50 
51 /********************* Funits *********************************/
52 static const struct funit_cfg funits[] = {
53  /* PMIC on I2C5 (PWR_I2C* pads) at 400kHz. */
55  /* SPI flash at 24MHz on QSPI controller. */
57  /* TPM on I2C3 @ 400kHz */
59  /* EC on I2C2 - pulled to 3.3V @ 100kHz */
61 };
62 
63 /********************* UART ***********************************/
64 static const struct pad_config uart_console_pads[] = {
65  /* UARTA: tx, rx, rts, cts */
66  PAD_CFG_SFIO(UART1_TX, PINMUX_PULL_NONE, UARTA),
68  PAD_CFG_SFIO(UART1_RTS, PINMUX_PULL_UP, UARTA),
69  PAD_CFG_SFIO(UART1_CTS, PINMUX_PULL_UP, UARTA),
70 };
71 
73 {
75 }
76 
77 static void set_clock_sources(void)
78 {
79  /* UARTA gets PLLP, deactivate CLK_UART_DIV_OVERRIDE */
80  write32(CLK_RST_REG(clk_src_uarta), PLLP << CLK_SOURCE_SHIFT);
81 }
82 
83 /********************* PADs ***********************************/
84 static const struct pad_config padcfgs[] = {
85  /* Board build id bits 1:0 */
88 };
89 
91 {
93 
94  /* Set up the pads required to load romstage. */
97 
98  /* PMIC */
101 
102  /* TPM */
104 
105  /* EC */
107 
108  /*
109  * Set power detect override for GPIO, audio & sdmmc3 rails.
110  * GPIO rail override is required to put it into 1.8V mode.
111  */
116 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
#define ARRAY_SIZE(a)
Definition: helpers.h:12
void pmic_init(unsigned int bus)
Definition: pmic.c:34
void soc_configure_funits(const struct funit_cfg *const entries, size_t num)
Definition: funitcfg.c:132
#define FUNIT_CFG(_funit, _clk_src, _clk_freq, _cfg, _cfg_size)
Definition: funitcfg.h:55
@ I2C3_BUS
Definition: funitcfg.h:36
@ I2CPWR_BUS
Definition: funitcfg.h:38
@ I2C2_BUS
Definition: funitcfg.h:35
__weak void bootblock_mainboard_init(void)
Definition: bootblock.c:19
__weak void bootblock_mainboard_early_init(void)
Definition: bootblock.c:16
static const struct pad_config spiflash_pads[]
Definition: bootblock.c:25
static const struct pad_config pmic_pads[]
Definition: bootblock.c:19
static const struct funit_cfg funits[]
Definition: bootblock.c:52
static const struct pad_config ec_i2c_pads[]
Definition: bootblock.c:46
static const struct pad_config tpm_pads[]
Definition: bootblock.c:40
static void set_clock_sources(void)
Definition: bootblock.c:77
static const struct pad_config padcfgs[]
Definition: bootblock.c:84
static const struct pad_config uart_console_pads[]
Definition: bootblock.c:64
@ PINMUX_INPUT_ENABLE
Definition: pinmux.h:17
@ PINMUX_PULL_NONE
Definition: pinmux.h:12
@ PINMUX_PULL_UP
Definition: pinmux.h:14
@ PINMUX_DRIVE_2X
Definition: pinmux.h:28
@ PMC_GPIO_RAIL_AO_MASK
Definition: pmc.h:668
@ PMC_SDMMC3_RAIL_AO_MASK
Definition: pmc.h:678
@ PMC_AUDIO_RAIL_AO_DISABLE
Definition: pmc.h:674
@ PMC_AUDIO_RAIL_AO_MASK
Definition: pmc.h:673
@ PMC_GPIO_RAIL_AO_DISABLE
Definition: pmc.h:669
@ PMC_SDMMC3_RAIL_AO_DISABLE
Definition: pmc.h:679
void pmc_override_pwr_det(uint32_t bits, uint32_t override)
Definition: power.c:113
#define PAD_CFG_GPIO_INPUT(ball_, pinmux_flgs_)
Definition: padconfig.h:21
#define PAD_CFG_SFIO(ball_, pinmux_flgs_, sfio_)
Definition: padconfig.h:50
void soc_configure_pads(const struct pad_config *const entries, size_t num)
Definition: padconfig.c:105
@ I2C5
Definition: i2c.h:55
@ I2C3
Definition: i2c.h:53
@ I2C2
Definition: i2c.h:52
@ PLLP
Definition: clock.h:245
void i2c_init(unsigned int bus)
Definition: i2c.c:198
#define CLK_SOURCE_SHIFT
Definition: clk_rst.h:410
#define CLK_RST_REG(field_)
Definition: clk_rst.h:303