aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorReka Norman <rekanorman@google.com>2022-11-24 13:50:48 +1100
committerMartin L Roth <gaumless@gmail.com>2022-11-26 23:38:43 +0000
commit5aa98964fb4e2e8c10b1663f8d6a3faa2b700410 (patch)
tree199402f3e4ed2350b784ed298901c072a1f37617 /src
parentfb970a43bd69e36e4fc8a98883d0525f6b071eb5 (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.c49
-rw-r--r--src/mainboard/google/brya/variants/craask/gpio.c12
-rw-r--r--src/mainboard/google/brya/variants/craask/overridetree.cb8
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]