From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E246BA04DD; Tue, 20 Oct 2020 11:05:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0214FBBC2; Tue, 20 Oct 2020 10:50:10 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id B7AE2BBA0 for ; Tue, 20 Oct 2020 10:49:06 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.61]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 82D1A60089 for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from us4-mdac16-42.ut7.mdlocal (unknown [10.7.64.24]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 81EA08009E for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.200]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 055288005D for ; Tue, 20 Oct 2020 08:49:06 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id AF69A800058 for ; Tue, 20 Oct 2020 08:49:05 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 09:48:50 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K8mnI3030800; Tue, 20 Oct 2020 09:48:50 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id D28101613A9; Tue, 20 Oct 2020 09:48:49 +0100 (BST) From: Andrew Rybchenko To: CC: , Ivan Malov Date: Tue, 20 Oct 2020 09:48:07 +0100 Message-ID: <1603183709-23420-41-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-1.143800-8.000000-10 X-TMASE-MatchedRID: S9Ceak9KoSgdqirDt7KDjMeuFL5UpINx66i2vtqzeKX5+tteD5RzhamE 6sikRTtfuA9fFHhyLzywgcHDNo5AtCHhSBQfglfsA9lly13c/gGrlTqw7wfC06jxqhyDxmYjM74 8GW9lTth1/2ejr+BWJnug5fIqIMi3lW8+jFKPmuajGOtqnkAZC/fjx7YIT/BiGlfXMQvierfjLK PupB6SI6P4tSedQfydN8eHxrg3vgIEIbfwCb92vZ4CIKY/Hg3AGdQnQSTrKGPEQdG7H66TyJ8TM nmE+d0ZMZKyPnlHaGefE5OShXLriM1ov2rmo4g7eczzwAdnPmgrbsVQSwOPc8cME+FNINstctHd Jx5wkFarVCyHXe6rPfbLITVN89Mvk3UkV5Qp4wSI45Rd9ORJwFlJvEhEss3fvN+d4ahMo5NWXGv UUmKP2w== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--1.143800-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603183746-v_RwHpSrJZJJ X-PPE-DISP: 1603183746;v_RwHpSrJZJJ Subject: [dpdk-dev] [PATCH 40/62] common/sfc_efx/base: refactor version / boot info get helper X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Refactor MCDI helper for version information and boot status retrieval; it should comprise two dedicated helper functions. A later patch will extend and reuse version retrieval helper. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/efx_mcdi.c | 156 ++++++++++++++++--------- drivers/common/sfc_efx/base/efx_mcdi.h | 12 ++ 2 files changed, 116 insertions(+), 52 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c index ede052a26a..edd069c969 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.c +++ b/drivers/common/sfc_efx/base/efx_mcdi.c @@ -962,31 +962,32 @@ efx_mcdi_ev_death( } __checkReturn efx_rc_t -efx_mcdi_version( +efx_mcdi_get_version( __in efx_nic_t *enp, - __out_ecount_opt(4) uint16_t versionp[4], - __out_opt uint32_t *buildp, - __out_opt efx_mcdi_boot_t *statusp) + __out efx_mcdi_version_t *verp) { - efx_mcdi_req_t req; EFX_MCDI_DECLARE_BUF(payload, - MAX(MC_CMD_GET_VERSION_IN_LEN, MC_CMD_GET_BOOT_STATUS_IN_LEN), - MAX(MC_CMD_GET_VERSION_OUT_LEN, - MC_CMD_GET_BOOT_STATUS_OUT_LEN)); - efx_word_t *ver_words; - uint16_t version[4]; - uint32_t build; - efx_mcdi_boot_t status; + MC_CMD_GET_VERSION_IN_LEN, + MC_CMD_GET_VERSION_OUT_LEN); + size_t min_resp_len_required; + efx_mcdi_req_t req; efx_rc_t rc; + EFX_STATIC_ASSERT(sizeof (verp->emv_version) == + MC_CMD_GET_VERSION_OUT_VERSION_LEN); + EFX_STATIC_ASSERT(sizeof (verp->emv_firmware) == + MC_CMD_GET_VERSION_OUT_FIRMWARE_LEN); + EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); req.emr_cmd = MC_CMD_GET_VERSION; req.emr_in_buf = payload; - req.emr_in_length = MC_CMD_GET_VERSION_IN_LEN; req.emr_out_buf = payload; + req.emr_in_length = MC_CMD_GET_VERSION_IN_LEN; req.emr_out_length = MC_CMD_GET_VERSION_OUT_LEN; + min_resp_len_required = MC_CMD_GET_VERSION_V0_OUT_LEN; + efx_mcdi_execute(enp, &req); if (req.emr_rc != 0) { @@ -994,34 +995,56 @@ efx_mcdi_version( goto fail1; } - /* bootrom support */ - if (req.emr_out_length_used == MC_CMD_GET_VERSION_V0_OUT_LEN) { - version[0] = version[1] = version[2] = version[3] = 0; - build = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); - - goto version; - } - - if (req.emr_out_length_used < MC_CMD_GET_VERSION_OUT_LEN) { + if (req.emr_out_length_used < min_resp_len_required) { rc = EMSGSIZE; goto fail2; } - ver_words = MCDI_OUT2(req, efx_word_t, GET_VERSION_OUT_VERSION); - version[0] = EFX_WORD_FIELD(ver_words[0], EFX_WORD_0); - version[1] = EFX_WORD_FIELD(ver_words[1], EFX_WORD_0); - version[2] = EFX_WORD_FIELD(ver_words[2], EFX_WORD_0); - version[3] = EFX_WORD_FIELD(ver_words[3], EFX_WORD_0); - build = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + memset(verp, 0, sizeof (*verp)); -version: - /* The bootrom doesn't understand BOOT_STATUS */ - if (MC_FW_VERSION_IS_BOOTLOADER(build)) { - status = EFX_MCDI_BOOT_ROM; - goto out; + if (req.emr_out_length_used > min_resp_len_required) { + efx_word_t *ver_words; + + if (req.emr_out_length_used < MC_CMD_GET_VERSION_OUT_LEN) { + rc = EMSGSIZE; + goto fail3; + } + + ver_words = MCDI_OUT2(req, efx_word_t, GET_VERSION_OUT_VERSION); + + verp->emv_version[0] = EFX_WORD_FIELD(ver_words[0], EFX_WORD_0); + verp->emv_version[1] = EFX_WORD_FIELD(ver_words[1], EFX_WORD_0); + verp->emv_version[2] = EFX_WORD_FIELD(ver_words[2], EFX_WORD_0); + verp->emv_version[3] = EFX_WORD_FIELD(ver_words[3], EFX_WORD_0); } - (void) memset(payload, 0, sizeof (payload)); + verp->emv_firmware = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + + return (0); + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + +static __checkReturn efx_rc_t +efx_mcdi_get_boot_status( + __in efx_nic_t *enp, + __out efx_mcdi_boot_t *statusp) +{ + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_GET_BOOT_STATUS_IN_LEN, + MC_CMD_GET_BOOT_STATUS_OUT_LEN); + efx_mcdi_req_t req; + efx_rc_t rc; + + EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); + req.emr_cmd = MC_CMD_GET_BOOT_STATUS; req.emr_in_buf = payload; req.emr_in_length = MC_CMD_GET_BOOT_STATUS_IN_LEN; @@ -1030,44 +1053,73 @@ efx_mcdi_version( efx_mcdi_execute_quiet(enp, &req); - if (req.emr_rc == EACCES) { - /* Unprivileged functions cannot access BOOT_STATUS */ - status = EFX_MCDI_BOOT_PRIMARY; - version[0] = version[1] = version[2] = version[3] = 0; - build = 0; - goto out; - } - if (req.emr_rc != 0) { rc = req.emr_rc; - goto fail3; + goto fail1; } if (req.emr_out_length_used < MC_CMD_GET_BOOT_STATUS_OUT_LEN) { rc = EMSGSIZE; - goto fail4; + goto fail2; } if (MCDI_OUT_DWORD_FIELD(req, GET_BOOT_STATUS_OUT_FLAGS, GET_BOOT_STATUS_OUT_FLAGS_PRIMARY)) - status = EFX_MCDI_BOOT_PRIMARY; + *statusp = EFX_MCDI_BOOT_PRIMARY; else - status = EFX_MCDI_BOOT_SECONDARY; + *statusp = EFX_MCDI_BOOT_SECONDARY; + + return (0); + +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + + __checkReturn efx_rc_t +efx_mcdi_version( + __in efx_nic_t *enp, + __out_ecount_opt(4) uint16_t versionp[4], + __out_opt uint32_t *buildp, + __out_opt efx_mcdi_boot_t *statusp) +{ + efx_mcdi_version_t ver; + efx_mcdi_boot_t status; + efx_rc_t rc; + + rc = efx_mcdi_get_version(enp, &ver); + if (rc != 0) + goto fail1; + + /* The bootrom doesn't understand BOOT_STATUS */ + if (MC_FW_VERSION_IS_BOOTLOADER(ver.emv_firmware)) { + status = EFX_MCDI_BOOT_ROM; + goto out; + } + + rc = efx_mcdi_get_boot_status(enp, &status); + if (rc == EACCES) { + /* Unprivileged functions cannot access BOOT_STATUS */ + status = EFX_MCDI_BOOT_PRIMARY; + memset(ver.emv_version, 0, sizeof (ver.emv_version)); + ver.emv_firmware = 0; + } else if (rc != 0) { + goto fail2; + } out: if (versionp != NULL) - memcpy(versionp, version, sizeof (version)); + memcpy(versionp, ver.emv_version, sizeof (ver.emv_version)); if (buildp != NULL) - *buildp = build; + *buildp = ver.emv_firmware; if (statusp != NULL) *statusp = status; return (0); -fail4: - EFSYS_PROBE(fail4); -fail3: - EFSYS_PROBE(fail3); fail2: EFSYS_PROBE(fail2); fail1: diff --git a/drivers/common/sfc_efx/base/efx_mcdi.h b/drivers/common/sfc_efx/base/efx_mcdi.h index 9dd0a23862..8b50b8a949 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.h +++ b/drivers/common/sfc_efx/base/efx_mcdi.h @@ -118,6 +118,18 @@ efx_mcdi_raise_exception( __in_opt efx_mcdi_req_t *emrp, __in int rc); +typedef struct efx_mcdi_version_s { + /* Basic version information */ + uint16_t emv_version[4]; + uint32_t emv_firmware; +} efx_mcdi_version_t; + +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +efx_mcdi_get_version( + __in efx_nic_t *enp, + __out efx_mcdi_version_t *verp); + typedef enum efx_mcdi_boot_e { EFX_MCDI_BOOT_PRIMARY, EFX_MCDI_BOOT_SECONDARY, -- 2.17.1