summaryrefslogtreecommitdiff
path: root/src/mainboard
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainboard')
-rw-r--r--src/mainboard/scaleway/tagada/hsio.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/mainboard/scaleway/tagada/hsio.c b/src/mainboard/scaleway/tagada/hsio.c
index 78599230d7..d305427f02 100644
--- a/src/mainboard/scaleway/tagada/hsio.c
+++ b/src/mainboard/scaleway/tagada/hsio.c
@@ -5,6 +5,8 @@
#include <hsio.h>
#include <gpio_defs.h>
#include <soc/fiamux.h>
+#include <string.h>
+#include <fast_spi_def.h>
#ifdef __RAMSTAGE__
static void update_hsio_info_for_m2_slots(size_t num_of_entry, BL_HSIO_INFORMATION *config)
@@ -12,6 +14,14 @@ static void update_hsio_info_for_m2_slots(size_t num_of_entry, BL_HSIO_INFORMATI
uint32_t reg32;
bool m2a_pcie, m2b_pcie;
uint8_t entry;
+ BL_FIA_MUX_CONFIG_HOB *fiamux_hob_data = get_fiamux_hob_data();
+ uint16_t supported_hsio_lanes;
+ void *spibar = fast_spi_get_bar();
+ uint32_t hsfs;
+
+ /* Configure FIA MUX PCD */
+ supported_hsio_lanes =
+ (uint16_t)fiamux_hob_data->FiaMuxConfig.SkuNumLanesAllowed;
/* Detects modules type */
// _GPIO_4 : LFFF: M2A_CFGn : M2A_SATAn : 0 SATA, 1 PCIe
@@ -29,7 +39,12 @@ static void update_hsio_info_for_m2_slots(size_t num_of_entry, BL_HSIO_INFORMATI
// HSIO default config is for PCIe, only update for SATA
// (also secondary PCIe lines are already set depending on SKU)
for (entry = 0; entry < num_of_entry; entry++) {
- BL_ME_FIA_MUX_CONFIG *mux_config = &(config[entry].FiaConfig.MuxConfiguration);
+ /* only update the active config */
+ if (config[entry].NumLanesSupported != supported_hsio_lanes)
+ continue;
+ BL_ME_FIA_CONFIG *fia_config = &(config[entry].FiaConfig);
+ BL_ME_FIA_MUX_CONFIG *mux_config =
+ &(config[entry].FiaConfig.MuxConfiguration);
BL_ME_FIA_SATA_CONFIG *sata_config =
&(config[entry].FiaConfig.SataLaneConfiguration);
if (!m2a_pcie) {
@@ -46,6 +61,25 @@ static void update_hsio_info_for_m2_slots(size_t num_of_entry, BL_HSIO_INFORMATI
sata_config->BL_MeFiaSataLaneSataSel.Lane12SataSel =
BL_ME_FIA_SATA_CONTROLLER_LANE_ASSIGNED;
}
+
+ /* Check SPIBAR for security override
+ at least one M2 slot is populated with SATA
+ the configuration is different form ME current one */
+ hsfs = read32(spibar + SPIBAR_HSFSTS_CTL);
+ if ((!(hsfs & SPIBAR_HSFSTS_FDOPSS))
+ && (!m2a_pcie || !m2b_pcie)
+ && memcmp(fia_config,
+ &fiamux_hob_data->FiaMuxConfig.FiaMuxConfig,
+ sizeof(BL_ME_FIA_CONFIG))) {
+ /* update configuration to NOT change ME config
+ as it will fail with security override set. */
+ memcpy(fia_config,
+ &fiamux_hob_data->FiaMuxConfig.FiaMuxConfig,
+ sizeof(BL_ME_FIA_CONFIG));
+ printk(BIOS_CRIT, "FLASH SECURITY OVERRIDE SET: "
+ "M2 SATA Slots are not available!\n");
+
+ }
}
}
#endif