mb/google/herobrine: Initialize EC and TPM devices

Initialize EC and H1/TPM instances on herobrine devices.

BUG=b:182963902
BRANCH=None
TEST=Validated on qualcomm sc7280 development board
     and verified booting on herobrine.

Change-Id: I8cbdd1d59a0166688d52d61646db1b6764879a7c
Signed-off-by: Roja Rani Yarubandi <rojay@codeaurora.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50581
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Shelley Chen 2022-01-05 17:15:31 -08:00
parent f00680afc5
commit 3538461468
4 changed files with 81 additions and 8 deletions

View File

@ -5,7 +5,7 @@ if BOARD_GOOGLE_HEROBRINE_COMMON
config HEROBRINE_HAS_FINGERPRINT
bool
default y if BOARD_GOOGLE_HEROBRINE
default y if BOARD_GOOGLE_HEROBRINE || BOARD_GOOGLE_HEROBRINE_REV0
default n
config BOARD_SPECIFIC_OPTIONS
@ -24,7 +24,8 @@ config BOARD_SPECIFIC_OPTIONS
select SPI_FLASH_WINBOND
select SPI_FLASH_MACRONIX
select MAINBOARD_HAS_CHROMEOS
select MAINBOARD_HAS_SPI_TPM_CR50 if !BOARD_GOOGLE_SENOR
select MAINBOARD_HAS_SPI_TPM_CR50 if BOARD_GOOGLE_PIGLIN || BOARD_GOOGLE_HOGLIN
select MAINBOARD_HAS_I2C_TPM_CR50 if BOARD_GOOGLE_HEROBRINE_REV0 || BOARD_GOOGLE_HEROBRINE
select MAINBOARD_HAS_TPM2 if !BOARD_GOOGLE_SENOR
config VBOOT
@ -52,4 +53,23 @@ config MAINBOARD_PART_NUMBER
default "Piglin" if BOARD_GOOGLE_PIGLIN
default "Hoglin" if BOARD_GOOGLE_HOGLIN
config DRIVER_TPM_I2C_BUS
depends on MAINBOARD_HAS_I2C_TPM_CR50
hex
default 0xC if BOARD_GOOGLE_HEROBRINE_REV0
default 0xE
config DRIVER_TPM_I2C_ADDR
default 0x50
config DRIVER_TPM_SPI_BUS
depends on MAINBOARD_HAS_SPI_TPM_CR50
hex
default 0xE
config EC_GOOGLE_CHROMEEC_SPI_BUS
hex
default 0x8 if BOARD_GOOGLE_HEROBRINE_REV0
default 0xA
endif # BOARD_GOOGLE_HEROBRINE_COMMON

View File

@ -7,13 +7,28 @@
#include <boardid.h>
#include <gpio.h>
#if CONFIG(BOARD_GOOGLE_HEROBRINE_REV0)
#define GPIO_EC_IN_RW GPIO(68)
#define GPIO_AP_EC_INT GPIO(142)
#define GPIO_H1_AP_INT GPIO(54)
#elif CONFIG(BOARD_GOOGLE_SENOR)
#define GPIO_EC_IN_RW dead_code_t(gpio_t)
#define GPIO_AP_EC_INT dead_code_t(gpio_t)
#define GPIO_H1_AP_INT dead_code_t(gpio_t)
#else
#define GPIO_EC_IN_RW GPIO(156)
#define GPIO_AP_EC_INT GPIO(18)
#define GPIO_H1_AP_INT GPIO(104)
#endif
#define GPIO_SD_CD_L GPIO(91)
#if CONFIG(BOARD_GOOGLE_SENOR) || CONFIG(BOARD_GOOGLE_PIGLIN) || CONFIG(BOARD_GOOGLE_HOGLIN)
#define USB_HUB_LDO_EN GPIO(157)
#if CONFIG(BOARD_GOOGLE_HEROBRINE_REV0)
#define USB_HUB_LDO_EN GPIO(24)
#else
/* For Herobrine board and all variants */
#define USB_HUB_LDO_EN GPIO(24)
#define USB_HUB_LDO_EN GPIO(157)
#endif
#define QCOM_SC7280_SKU1 0x0

View File

@ -2,8 +2,20 @@
#include <bootblock_common.h>
#include "board.h"
#include <soc/qupv3_i2c_common.h>
#include <soc/qcom_qup_se.h>
#include <soc/qupv3_spi_common.h>
void bootblock_mainboard_init(void)
{
setup_chromeos_gpios();
if (CONFIG(MAINBOARD_HAS_I2C_TPM_CR50))
i2c_init(CONFIG_DRIVER_TPM_I2C_BUS, I2C_SPEED_FAST); /* H1/TPM I2C */
if (CONFIG(MAINBOARD_HAS_SPI_TPM_CR50))
qup_spi_init(CONFIG_DRIVER_TPM_SPI_BUS, 1010 * KHz); /* H1/TPM SPI */
if (CONFIG(EC_GOOGLE_CHROMEEC))
qup_spi_init(CONFIG_EC_GOOGLE_CHROMEEC_SPI_BUS, 1010 * KHz); /* EC SPI */
}

View File

@ -3,9 +3,17 @@
#include <boot/coreboot_tables.h>
#include <bootmode.h>
#include "board.h"
#include <security/tpm/tis.h>
void setup_chromeos_gpios(void)
{
if (CONFIG(EC_GOOGLE_CHROMEEC)) {
gpio_input_pullup(GPIO_EC_IN_RW);
gpio_input_pullup(GPIO_AP_EC_INT);
}
if (CONFIG(MAINBOARD_HAS_TPM2))
gpio_input_irq(GPIO_H1_AP_INT, IRQ_TYPE_RISING_EDGE, GPIO_PULL_UP);
gpio_input_pullup(GPIO_SD_CD_L);
if (CONFIG(HEROBRINE_HAS_FINGERPRINT)) {
@ -17,9 +25,19 @@ void setup_chromeos_gpios(void)
void fill_lb_gpios(struct lb_gpios *gpios)
{
struct lb_gpio chromeos_gpios[] = {
const struct lb_gpio chromeos_gpios[] = {
{GPIO_SD_CD_L.addr, ACTIVE_LOW, gpio_get(GPIO_SD_CD_L),
"SD card detect"},
#if CONFIG(EC_GOOGLE_CHROMEEC)
{GPIO_EC_IN_RW.addr, ACTIVE_LOW, gpio_get(GPIO_EC_IN_RW),
"EC in RW"},
{GPIO_AP_EC_INT.addr, ACTIVE_LOW, gpio_get(GPIO_AP_EC_INT),
"EC interrupt"},
#endif
#if CONFIG(MAINBOARD_HAS_TPM2)
{GPIO_H1_AP_INT.addr, ACTIVE_HIGH, gpio_get(GPIO_H1_AP_INT),
"TPM interrupt"},
#endif
};
lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios));
@ -27,6 +45,14 @@ void fill_lb_gpios(struct lb_gpios *gpios)
int get_ec_is_trusted(void)
{
/* Stub GPIO. */
return 0;
/* EC is trusted if not in RW. This is active low. */
if (CONFIG(EC_GOOGLE_CHROMEEC))
return !!gpio_get(GPIO_EC_IN_RW);
else /* If no EC, always return true */
return 1;
}
int tis_plat_irq_status(void)
{
return gpio_irq_status(GPIO_H1_AP_INT);
}