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 #include #include +#include +#include #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