diff options
author | Reka Norman <rekanorman@google.com> | 2022-11-24 13:50:48 +1100 |
---|---|---|
committer | Martin L Roth <gaumless@gmail.com> | 2022-11-26 23:38:43 +0000 |
commit | 5aa98964fb4e2e8c10b1663f8d6a3faa2b700410 (patch) | |
tree | 199402f3e4ed2350b784ed298901c072a1f37617 /src | |
parent | fb970a43bd69e36e4fc8a98883d0525f6b071eb5 (diff) |
mb/google/nissa/var/craask: Add support for NVMe
Enable NVMe GPIOs based on fw_config and add NVMe to devicetree.
Note, eMMC and NVMe are not probed in devicetree. On first boot in
factory, the device needs to boot with unprovisioned fw_config, so all
storage devices should be enabled when unprovisioned. Currently,
devicetree disables all probed devices when unprovisioned. If we want
eMMC and NVMe to be probed, support needs to be added for enabling
probed devices when unprovisioned.
BUG=b:259211172
TEST=Verified by ODM. On craask, LTE and WCAM still work. On craaskneto,
eMMC and NVMe SKUs can both boot.
Change-Id: I76a056cddff2246cfb5bb26ddbdfc333b49d9aaf
Reviewed-on: https://review.coreboot.org/c/coreboot/+/69958
Reviewed-by: Kangheui Won <khwon@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/mainboard/google/brya/variants/craask/fw_config.c | 49 | ||||
-rw-r--r-- | src/mainboard/google/brya/variants/craask/gpio.c | 12 | ||||
-rw-r--r-- | src/mainboard/google/brya/variants/craask/overridetree.cb | 8 |
3 files changed, 69 insertions, 0 deletions
diff --git a/src/mainboard/google/brya/variants/craask/fw_config.c b/src/mainboard/google/brya/variants/craask/fw_config.c index 139f3eb820..d6679108f8 100644 --- a/src/mainboard/google/brya/variants/craask/fw_config.c +++ b/src/mainboard/google/brya/variants/craask/fw_config.c @@ -47,8 +47,42 @@ static const struct pad_config stylus_disable_pads[] = { PAD_NC_LOCK(GPP_F15, NONE, LOCK_CONFIG), }; +static const struct pad_config nvme_disable_pads[] = { + /* B4 : SSD_PERST_L */ + PAD_NC_LOCK(GPP_B4, NONE, LOCK_CONFIG), + /* D11 : EN_PP3300_SSD */ + PAD_NC_LOCK(GPP_D11, NONE, LOCK_CONFIG), + /* E17 : SSD_PLN_L */ + PAD_NC_LOCK(GPP_E17, NONE, LOCK_CONFIG), + /* + * Note: don't disable GPP_D6 = SSD_CLKREQ_ODL, since this is used as + * WWAN_EN on LTE variants. + */ +}; + +/* + * GPP_D6 is used as WWAN_EN on LTE variants and SSD_CLKREQ_ODL on NVMe + * variants (there is no craask variant supporting both LTE and NVMe). + * In craask/gpio.c, it's set to WWAN_EN since this needs to be done in + * bootblock. So we override it to SSD_CLKREQ_ODL here for NVMe variants. + */ +static const struct pad_config nvme_enable_pads[] = { + /* D6 : SRCCLKREQ1# ==> SSD_CLKREQ_ODL */ + PAD_CFG_NF(GPP_D6, NONE, DEEP, NF1), +}; + void fw_config_gpio_padbased_override(struct pad_config *padbased_table) { + /* + * Since GPP_D6 is used as WWAN_EN on LTE variants and SSD_CLKREQ_ODL on + * NVMe variants, we don't support both together. If there's a variant + * using both in the future, this GPIO handling will need to be updated. + */ + if (fw_config_probe(FW_CONFIG(DB_USB, DB_1C_LTE)) && + fw_config_probe(FW_CONFIG(STORAGE, STORAGE_NVME))) { + printk(BIOS_ERR, "LTE and NVMe together is not supported on craask\n"); + } + if (!fw_config_probe(FW_CONFIG(DB_USB, DB_1C_LTE))) { printk(BIOS_INFO, "Disable LTE-related GPIO pins on craask.\n"); gpio_padbased_override(padbased_table, lte_disable_pads, @@ -72,4 +106,19 @@ void fw_config_gpio_padbased_override(struct pad_config *padbased_table) gpio_padbased_override(padbased_table, stylus_disable_pads, ARRAY_SIZE(stylus_disable_pads)); } + + if (!fw_config_is_provisioned() || + fw_config_probe(FW_CONFIG(STORAGE, STORAGE_NVME))) { + /* + * Note: this must be done after lte_disable_pads, otherwise + * GPP_D6 will be disabled again. + */ + printk(BIOS_INFO, "Enable NVMe SSD GPIO pins.\n"); + gpio_padbased_override(padbased_table, nvme_enable_pads, + ARRAY_SIZE(nvme_enable_pads)); + } else { + printk(BIOS_INFO, "Disable NVMe SSD GPIO pins.\n"); + gpio_padbased_override(padbased_table, nvme_disable_pads, + ARRAY_SIZE(nvme_disable_pads)); + } } diff --git a/src/mainboard/google/brya/variants/craask/gpio.c b/src/mainboard/google/brya/variants/craask/gpio.c index 980b0bf358..5d0db35caa 100644 --- a/src/mainboard/google/brya/variants/craask/gpio.c +++ b/src/mainboard/google/brya/variants/craask/gpio.c @@ -9,10 +9,16 @@ static const struct pad_config override_gpio_table[] = { /* A8 : WWAN_RF_DISABLE_ODL */ PAD_CFG_GPO(GPP_A8, 1, DEEP), + /* B4 : SSD_PERST_L */ + PAD_CFG_GPO_LOCK(GPP_B4, 1, LOCK_CONFIG), /* D6 : WWAN_EN */ PAD_CFG_GPO(GPP_D6, 1, DEEP), /* D7 : WLAN_CLKREQ_ODL */ PAD_NC(GPP_D7, NONE), + /* D11 : EN_PP3300_SSD */ + PAD_CFG_GPO_LOCK(GPP_D11, 1, LOCK_CONFIG), + /* E17 : SSD_PLN_L */ + PAD_CFG_GPO_LOCK(GPP_E17, 1, LOCK_CONFIG), /* F12 : WWAN_RST_L */ PAD_CFG_GPO_LOCK(GPP_F12, 1, LOCK_CONFIG), /* H3 : WLAN_PCIE_WAKE_ODL */ @@ -41,6 +47,8 @@ static const struct pad_config override_gpio_table[] = { /* Early pad configuration in bootblock */ static const struct pad_config early_gpio_table[] = { + /* B4 : SSD_PERST_L */ + PAD_CFG_GPO(GPP_B4, 0, DEEP), /* F12 : GSXDOUT ==> WWAN_RST_L */ PAD_CFG_GPO(GPP_F12, 0, DEEP), /* H12 : UART0_RTS# ==> SD_PERST_L */ @@ -61,11 +69,15 @@ static const struct pad_config early_gpio_table[] = { PAD_CFG_NF(GPP_H10, NONE, DEEP, NF2), /* H11 : UART0_TXD ==> UART_SOC_TX_DBG_RX */ PAD_CFG_NF(GPP_H11, NONE, DEEP, NF2), + /* D11 : EN_PP3300_SSD */ + PAD_CFG_GPO(GPP_D11, 1, DEEP), /* H13 : UART0_CTS# ==> EN_PP3300_SD_X */ PAD_CFG_GPO(GPP_H13, 1, DEEP), }; static const struct pad_config romstage_gpio_table[] = { + /* B4 : SSD_PERST_L */ + PAD_CFG_GPO(GPP_B4, 1, DEEP), /* H12 : UART0_RTS# ==> SD_PERST_L */ PAD_CFG_GPO(GPP_H12, 1, DEEP), }; diff --git a/src/mainboard/google/brya/variants/craask/overridetree.cb b/src/mainboard/google/brya/variants/craask/overridetree.cb index 0687bf5cda..bf05d255d1 100644 --- a/src/mainboard/google/brya/variants/craask/overridetree.cb +++ b/src/mainboard/google/brya/variants/craask/overridetree.cb @@ -445,6 +445,14 @@ chip soc/intel/alderlake end probe SD_CARD SD_GL9750S end + device ref pcie_rp9 on + # Enable NVMe SSD PCIe 9-12 using clk 1 + register "pch_pcie_rp[PCH_RP(9)]" = "{ + .clk_src = 1, + .clk_req = 1, + .flags = PCIE_RP_LTR | PCIE_RP_AER, + }" + end device ref pch_espi on chip ec/google/chromeec use conn0 as mux_conn[0] |