Skip to content

Commit

Permalink
arm: mvebu: turris_omnia: Allow to configure mSATA slot via env variable
Browse files Browse the repository at this point in the history
Some PCIe-based MiniPCIe cards are broken and they do not ground PIN 43
which is required by PCIe mini CEM specs. Such broken cards are incorrectly
detected as mSATA cards because SATA specs requires that PIN 43 on mSATA
cards has to be disconnected.

PIN 43 on Turris Omnia is used only for MiniPCIe/mSATA card detection by
software in U-Boot SPL. Allow to override that U-Boot SPL detection by a
new "omnia_msata_slot" env variable (to value "pcie" or "sata") so broken
MiniPCIe cards can be used in combo mSATA/MiniPCIe slot too.

As configuration of PCIe vs SATA functionality is done in U-Boot SPL,
it is required to change env variable in permanent storage and reset the
board to take effect.

To force PCIe mode for broken MiniPCIe cards, call U-Boot commands:

  => setenv omnia_msata_slot pcie
  => saveenv
  => reset

Signed-off-by: Pali Rohár <[email protected]>
  • Loading branch information
pali authored and stroese committed May 2, 2022
1 parent 8ead243 commit 1da19dc
Showing 1 changed file with 25 additions and 2 deletions.
27 changes: 25 additions & 2 deletions board/CZ.NIC/turris_omnia/turris_omnia.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,25 @@ static bool disable_mcu_watchdog(void)
return true;
}

static bool omnia_detect_sata(void)
static bool omnia_detect_sata(const char *msata_slot)
{
int ret;
u16 stsword;

puts("MiniPCIe/mSATA card detection... ");

if (msata_slot) {
if (strcmp(msata_slot, "pcie") == 0) {
puts("forced to MiniPCIe via env\n");
return false;
} else if (strcmp(msata_slot, "sata") == 0) {
puts("forced to mSATA via env\n");
return true;
} else if (strcmp(msata_slot, "auto") != 0) {
printf("unsupported env value '%s', fallback to... ", msata_slot);
}
}

ret = omnia_mcu_read(CMD_GET_STATUS_WORD, &stsword, sizeof(stsword));
if (ret) {
printf("omnia_mcu_read failed: %i, defaulting to MiniPCIe card\n",
Expand Down Expand Up @@ -239,7 +251,18 @@ void *env_sf_get_env_addr(void)

int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
{
if (omnia_detect_sata()) {
#ifdef CONFIG_SPL_ENV_SUPPORT
/* Do not use env_load() as malloc() pool is too small at this stage */
bool has_env = (env_init() == 0);
#endif
const char *env_value = NULL;

#ifdef CONFIG_SPL_ENV_SUPPORT
/* beware that env_get() returns static allocated memory */
env_value = has_env ? env_get("omnia_msata_slot") : NULL;
#endif

if (omnia_detect_sata(env_value)) {
/* Change SerDes for first mPCIe port (mSATA) from PCIe to SATA */
board_serdes_map[0].serdes_type = SATA0;
board_serdes_map[0].serdes_speed = SERDES_SPEED_6_GBPS;
Expand Down

0 comments on commit 1da19dc

Please sign in to comment.