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 87919A0527; Mon, 9 Nov 2020 12:46:38 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 66FF1697A; Mon, 9 Nov 2020 12:46:37 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by dpdk.org (Postfix) with ESMTP id BCB326883 for ; Mon, 9 Nov 2020 12:46:34 +0100 (CET) Received: from localhost.localdomain (unknown [188.242.7.54]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id 5A5C27F537; Mon, 9 Nov 2020 14:46:33 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 5A5C27F537 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1604922393; bh=VHUugzO+mTSFc95MmE01fx+l7aICI22pw9ltEq16opw=; h=From:To:Cc:Subject:Date; b=srxZX0QqgVsmwj5Nv7mW/MwocYfzAR4w0TvR2WEok7RAnSGrJUPjymHkCN54mq7S+ yAGl+NuYt7dI6pZ3YI5xG+UD+oQn4M5rJIuZBrVCpemsA/rH5j0j9LB7egDvHmhZae rWwGBtCFS1eB5+TXazztDTGB4K7BPAzwMPPz4tZ8= From: Ivan Malov To: dev@dpdk.org Cc: Andrew Rybchenko Date: Mon, 9 Nov 2020 14:46:05 +0300 Message-Id: <20201109114606.23876-1-ivan.malov@oktetlabs.ru> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH 1/2] common/sfc_efx/base: apply MCDI version/boot clarity fixes 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" Improve the clarity of the code. Fixes: 833cfcd590e2 ("common/sfc_efx/base: add API for querying board info") Fixes: 312191e86eb0 ("common/sfc_efx/base: refactor version / boot info get helper") Signed-off-by: Ivan Malov --- drivers/common/sfc_efx/base/efx_mcdi.c | 61 ++++++++++++++------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c index 8c984d8ca..ca4426772 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.c +++ b/drivers/common/sfc_efx/base/efx_mcdi.c @@ -964,15 +964,17 @@ efx_mcdi_ev_death( __checkReturn efx_rc_t efx_mcdi_get_version( __in efx_nic_t *enp, - __in uint32_t flags_req, + __in uint32_t flags, __out efx_mcdi_version_t *verp) { efx_nic_board_info_t *board_infop = &verp->emv_board_info; EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_VERSION_EXT_IN_LEN, MC_CMD_GET_VERSION_V2_OUT_LEN); - size_t min_resp_len_required; + efx_word_t *ver_words; + uint16_t version[4]; efx_mcdi_req_t req; + uint32_t firmware; efx_rc_t rc; EFX_STATIC_ASSERT(sizeof (verp->emv_version) == @@ -996,18 +998,14 @@ efx_mcdi_get_version( req.emr_in_buf = payload; req.emr_out_buf = payload; - if (flags_req != 0) { + if ((flags & EFX_MCDI_VERSION_BOARD_INFO) != 0) { /* Request basic + extended version information. */ req.emr_in_length = MC_CMD_GET_VERSION_EXT_IN_LEN; req.emr_out_length = MC_CMD_GET_VERSION_V2_OUT_LEN; - - min_resp_len_required = MC_CMD_GET_VERSION_V2_OUT_LEN; } else { /* Request only basic version information. */ 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); @@ -1017,33 +1015,36 @@ efx_mcdi_get_version( goto fail1; } - if (req.emr_out_length_used < min_resp_len_required) { + /* bootrom support */ + if (req.emr_out_length_used == MC_CMD_GET_VERSION_V0_OUT_LEN) { + version[0] = version[1] = version[2] = version[3] = 0; + firmware = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + goto out; + } + + if (req.emr_out_length_used < req.emr_out_length) { rc = EMSGSIZE; goto fail2; } - memset(verp, 0, sizeof (*verp)); - - 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); + 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); + firmware = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); - 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); - } +out: + memset(verp, 0, sizeof (*verp)); - verp->emv_firmware = MCDI_OUT_DWORD(req, GET_VERSION_OUT_FIRMWARE); + verp->emv_version[0] = version[0]; + verp->emv_version[1] = version[1]; + verp->emv_version[2] = version[2]; + verp->emv_version[3] = version[3]; + verp->emv_firmware = firmware; verp->emv_flags = MCDI_OUT_DWORD(req, GET_VERSION_V2_OUT_FLAGS); - verp->emv_flags &= flags_req; + verp->emv_flags &= flags; if ((verp->emv_flags & EFX_MCDI_VERSION_BOARD_INFO) != 0) { memcpy(board_infop->enbi_serial, @@ -1058,8 +1059,6 @@ efx_mcdi_get_version( return (0); -fail3: - EFSYS_PROBE(fail3); fail2: EFSYS_PROBE(fail2); fail1: @@ -1089,6 +1088,12 @@ efx_mcdi_get_boot_status( efx_mcdi_execute_quiet(enp, &req); + /* + * NOTE: Unprivileged functions cannot access boot status, + * so the MCDI request will return EACCES. This is + * also checked in efx_mcdi_version. + */ + if (req.emr_rc != 0) { rc = req.emr_rc; goto fail1; -- 2.20.1