]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: mvebu: turris_omnia: Allow to configure mSATA slot via env variable
authorPali Rohár <pali@kernel.org>
Wed, 2 Mar 2022 11:47:55 +0000 (12:47 +0100)
committerStefan Roese <sr@denx.de>
Mon, 2 May 2022 05:28:25 +0000 (07:28 +0200)
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 <pali@kernel.org>
board/CZ.NIC/turris_omnia/turris_omnia.c

index 25902742e3d3fc6ad99e826ff58e0e3e1def51f1..4753f9b2c834ba111dd391821d1460c1e1068a1c 100644 (file)
@@ -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",
@@ -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;