common/sfc_efx/base: use EF10 MCDI methods for Riverhead
authorAndrew Rybchenko <arybchenko@solarflare.com>
Thu, 24 Sep 2020 12:11:42 +0000 (13:11 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 30 Sep 2020 17:19:12 +0000 (19:19 +0200)
MCDI on Riverhead is very close to the EF10 and there is no
point to duplicate the code.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/common/sfc_efx/base/ef10_mcdi.c
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/efx_impl.h
drivers/common/sfc_efx/base/efx_mcdi.c

index 9e8a0c1..727f148 100644 (file)
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 
 #if EFSYS_OPT_MCDI
 
@@ -27,7 +27,7 @@ ef10_mcdi_init(
        efx_dword_t dword;
        efx_rc_t rc;
 
-       EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+       EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
        EFSYS_ASSERT(enp->en_features & EFX_FEATURE_MCDI_DMA);
 
        /*
@@ -53,7 +53,16 @@ ef10_mcdi_init(
                goto fail2;
        }
        EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0, 1);
-       EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+       switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+       case EFX_FAMILY_RIVERHEAD:
+               EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+               break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+       default:
+               EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+               break;
+       }
 
        /* Save initial MC reboot status */
        (void) ef10_mcdi_poll_reboot(enp);
@@ -133,7 +142,7 @@ ef10_mcdi_send_request(
        efx_dword_t dword;
        unsigned int pos;
 
-       EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+       EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
        /* Write the header */
        for (pos = 0; pos < hdr_len; pos += sizeof (efx_dword_t)) {
@@ -154,11 +163,29 @@ ef10_mcdi_send_request(
        /* Ring the doorbell to post the command DMA address to the MC */
        EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
            EFSYS_MEM_ADDR(esmp) >> 32);
-       EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+       switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+       case EFX_FAMILY_RIVERHEAD:
+               EFX_BAR_WRITED(enp, ER_GZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+               break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+       default:
+               EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
+               break;
+       }
 
        EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
            EFSYS_MEM_ADDR(esmp) & 0xffffffff);
-       EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+       switch (enp->en_family) {
+#if EFSYS_OPT_RIVERHEAD
+       case EFX_FAMILY_RIVERHEAD:
+               EFX_BAR_WRITED(enp, ER_GZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+               break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+       default:
+               EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
+               break;
+       }
 }
 
        __checkReturn   boolean_t
@@ -210,6 +237,9 @@ ef10_mcdi_poll_reboot(
 
        old_status = emip->emi_mc_reboot_status;
 
+       EFX_STATIC_ASSERT(ER_DZ_BIU_MC_SFT_STATUS_REG_OFST ==
+           ER_GZ_MC_SFT_STATUS_OFST);
+
        /* Update MC reboot status word */
        EFX_BAR_TBL_READD(enp, ER_DZ_BIU_MC_SFT_STATUS_REG, 0, &dword, B_FALSE);
        new_status = dword.ed_u32[0];
@@ -255,7 +285,7 @@ ef10_mcdi_feature_supported(
        uint32_t privilege_mask = encp->enc_privilege_mask;
        efx_rc_t rc;
 
-       EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
+       EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
 
        /*
         * Use privilege mask state at MCDI attach.
@@ -316,4 +346,4 @@ fail1:
 
 #endif /* EFSYS_OPT_MCDI */
 
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
index 2082efe..c7fe814 100644 (file)
@@ -243,8 +243,8 @@ efx_nic_check_pcie_link_speed(
 
 #if EFSYS_OPT_MCDI
 
-#if EFX_OPTS_EF10()
-/* EF10 architecture NICs require MCDIv2 commands */
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
+/* EF10 architecture and Riverhead NICs require MCDIv2 commands */
 #define        WITH_MCDI_V2 1
 #endif
 
@@ -1438,11 +1438,11 @@ typedef struct efx_nic_cfg_s {
 #if EFSYS_OPT_BIST
        uint32_t                enc_bist_mask;
 #endif /* EFSYS_OPT_BIST */
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
        uint32_t                enc_pf;
        uint32_t                enc_vf;
        uint32_t                enc_privilege_mask;
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
        boolean_t               enc_bug26807_workaround;
        boolean_t               enc_bug35388_workaround;
        boolean_t               enc_bug41750_workaround;
index f891172..c7edeaa 100644 (file)
@@ -37,9 +37,9 @@
 #include "medford2_impl.h"
 #endif /* EFSYS_OPT_MEDFORD2 */
 
-#if EFX_OPTS_EF10()
+#if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
 #include "ef10_impl.h"
-#endif /* EFX_OPTS_EF10() */
+#endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
 
 #ifdef __cplusplus
 extern "C" {
index 8cd651f..dec3a17 100644 (file)
@@ -60,6 +60,21 @@ static const efx_mcdi_ops_t  __efx_mcdi_ef10_ops = {
 
 #endif /* EFX_OPTS_EF10() */
 
+#if EFSYS_OPT_RIVERHEAD
+
+static const efx_mcdi_ops_t    __efx_mcdi_rhead_ops = {
+       ef10_mcdi_init,                 /* emco_init */
+       ef10_mcdi_send_request,         /* emco_send_request */
+       ef10_mcdi_poll_reboot,          /* emco_poll_reboot */
+       ef10_mcdi_poll_response,        /* emco_poll_response */
+       ef10_mcdi_read_response,        /* emco_read_response */
+       ef10_mcdi_fini,                 /* emco_fini */
+       ef10_mcdi_feature_supported,    /* emco_feature_supported */
+       ef10_mcdi_get_timeout,          /* emco_get_timeout */
+};
+
+#endif /* EFSYS_OPT_RIVERHEAD */
+
 
 
        __checkReturn   efx_rc_t
@@ -98,6 +113,12 @@ efx_mcdi_init(
                break;
 #endif /* EFSYS_OPT_MEDFORD2 */
 
+#if EFSYS_OPT_RIVERHEAD
+       case EFX_FAMILY_RIVERHEAD:
+               emcop = &__efx_mcdi_rhead_ops;
+               break;
+#endif /* EFSYS_OPT_RIVERHEAD */
+
        default:
                EFSYS_ASSERT(0);
                rc = ENOTSUP;