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 B918FA04DD; Tue, 20 Oct 2020 11:29:30 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CD1D2E27D; Tue, 20 Oct 2020 11:14:59 +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 C1762C7EC for ; Tue, 20 Oct 2020 11:14:11 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.60]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 9195260071 for ; Tue, 20 Oct 2020 09:14:11 +0000 (UTC) Received: from us4-mdac16-49.ut7.mdlocal (unknown [10.7.66.16]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 90DFE2009A for ; Tue, 20 Oct 2020 09:14:11 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.41]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 6415D1C0053 for ; Tue, 20 Oct 2020 09:14:10 +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 180964C0064 for ; Tue, 20 Oct 2020 09:14:10 +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 10:14:00 +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 10:14:00 +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 09K9E0FQ028406; Tue, 20 Oct 2020 10:14:00 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 120C11613AB; Tue, 20 Oct 2020 10:14:00 +0100 (BST) From: Andrew Rybchenko To: CC: Ivan Malov Date: Tue, 20 Oct 2020 10:13:03 +0100 Message-ID: <1603185222-14831-24-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603185222-14831-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> <1603185222-14831-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-0.765400-8.000000-10 X-TMASE-MatchedRID: qR7nF2Wf8maEQeXrAUW/pxIRh9wkXSlFE02Pr4CkNSNwkdIrVt8X1VDT Kayi2ZF6pVG0HeSt+ryWGRCs++FM0t1RkEnBFAu+nFVnNmvv47vr3E41VlKsfazG9MIKeG/GOvC 9T24J5iZONuFTUFBeosbWIXMKWGPD0rn1NhBG2mEJaVZHbbd1rlQhqd4OP4Y7R2YNIFh+clHT/p FzauZLmV963OSi68sDFYtQn4h9SJQE7MuQrZP2o8ewkPVzkoGNqb3/o5s+OcO1E+HbdRuHYHd7b ci/LVuNdR9IuTvvB94PtqKIlA3hYsP8NSaeQRaaF9p7X9UAWGXcVi8qZmJWcxyFieO3WgdPThZS O8+zLqri8zVgXoAltsIJ+4gwXrEtWBd6ltyXuvujVG9LmisBxiFPLfnXbHE3XVNNLRBUfo1NlL6 BDHKPHE1HNRS7aAPNxQ+L0GDp1PKSsD7S3Gb632eM/fhCMOLfrJ/dTZLPtW69Tbikt9AWZ0CBSG S7bIBtA1B/p1SzcogrKiD/U8b7SaNbPJBuvLaLftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10-0.765400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603185250-CyD5EZd3S367 X-PPE-DISP: 1603185250;CyD5EZd3S367 Subject: [dpdk-dev] [PATCH v2 23/62] common/sfc_efx/base: add MAE action rule provisioning APIs 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 Add APIs for action rule insert / remove operations. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 29 ++++ drivers/common/sfc_efx/base/efx_mae.c | 150 ++++++++++++++++++ .../sfc_efx/rte_common_sfc_efx_version.map | 2 + 3 files changed, 181 insertions(+) diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 3053da75f8..d37850eda6 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -4193,6 +4193,11 @@ efx_mae_match_specs_class_cmp( #define EFX_MAE_RSRC_ID_INVALID UINT32_MAX +/* Rule ID */ +typedef struct efx_mae_rule_id_s { + uint32_t id; +} efx_mae_rule_id_t; + /* Action set ID */ typedef struct efx_mae_aset_id_s { uint32_t id; @@ -4211,6 +4216,30 @@ efx_mae_action_set_free( __in efx_nic_t *enp, __in const efx_mae_aset_id_t *aset_idp); +/* Action set list ID */ +typedef struct efx_mae_aset_list_id_s { + uint32_t id; +} efx_mae_aset_list_id_t; + +/* + * Either action set list ID or action set ID must be passed to this API, + * but not both. + */ +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_rule_insert( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec, + __in const efx_mae_aset_list_id_t *asl_idp, + __in const efx_mae_aset_id_t *as_idp, + __out efx_mae_rule_id_t *ar_idp); + +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mae_action_rule_remove( + __in efx_nic_t *enp, + __in const efx_mae_rule_id_t *ar_idp); + #endif /* EFSYS_OPT_MAE */ #ifdef __cplusplus diff --git a/drivers/common/sfc_efx/base/efx_mae.c b/drivers/common/sfc_efx/base/efx_mae.c index 2626710216..1715cdc4fb 100644 --- a/drivers/common/sfc_efx/base/efx_mae.c +++ b/drivers/common/sfc_efx/base/efx_mae.c @@ -1005,6 +1005,156 @@ efx_mae_action_set_free( return (0); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_action_rule_insert( + __in efx_nic_t *enp, + __in const efx_mae_match_spec_t *spec, + __in const efx_mae_aset_list_id_t *asl_idp, + __in const efx_mae_aset_id_t *as_idp, + __out efx_mae_rule_id_t *ar_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMAX_MCDI2, + MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN); + efx_oword_t *rule_response; + efx_mae_rule_id_t ar_id; + size_t offset; + efx_rc_t rc; + + EFX_STATIC_ASSERT(sizeof (ar_idp->id) == + MC_CMD_MAE_ACTION_RULE_INSERT_OUT_AR_ID_LEN); + + EFX_STATIC_ASSERT(EFX_MAE_RSRC_ID_INVALID == + MC_CMD_MAE_ACTION_RULE_INSERT_OUT_ACTION_RULE_ID_NULL); + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + if (spec->emms_type != EFX_MAE_RULE_ACTION || + (asl_idp != NULL && as_idp != NULL) || + (asl_idp == NULL && as_idp == NULL)) { + rc = EINVAL; + goto fail2; + } + + req.emr_cmd = MC_CMD_MAE_ACTION_RULE_INSERT; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_ACTION_RULE_INSERT_IN_LENMAX_MCDI2; + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN; + + EFX_STATIC_ASSERT(sizeof (*rule_response) <= + MC_CMD_MAE_ACTION_RULE_INSERT_IN_RESPONSE_LEN); + offset = MC_CMD_MAE_ACTION_RULE_INSERT_IN_RESPONSE_OFST; + rule_response = (efx_oword_t *)(payload + offset); + EFX_POPULATE_OWORD_3(*rule_response, + MAE_ACTION_RULE_RESPONSE_ASL_ID, + (asl_idp != NULL) ? asl_idp->id : EFX_MAE_RSRC_ID_INVALID, + MAE_ACTION_RULE_RESPONSE_AS_ID, + (as_idp != NULL) ? as_idp->id : EFX_MAE_RSRC_ID_INVALID, + MAE_ACTION_RULE_RESPONSE_COUNTER_ID, EFX_MAE_RSRC_ID_INVALID); + + MCDI_IN_SET_DWORD(req, MAE_ACTION_RULE_INSERT_IN_PRIO, spec->emms_prio); + + /* + * Mask-value pairs have been stored in the byte order needed for the + * MCDI request and are thus safe to be copied directly to the buffer. + */ + EFX_STATIC_ASSERT(sizeof (spec->emms_mask_value_pairs.action) >= + MAE_FIELD_MASK_VALUE_PAIRS_LEN); + offset = MC_CMD_MAE_ACTION_RULE_INSERT_IN_MATCH_CRITERIA_OFST; + memcpy(payload + offset, spec->emms_mask_value_pairs.action, + MAE_FIELD_MASK_VALUE_PAIRS_LEN); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail3; + } + + if (req.emr_out_length_used < MC_CMD_MAE_ACTION_RULE_INSERT_OUT_LEN) { + rc = EMSGSIZE; + goto fail4; + } + + ar_id.id = MCDI_OUT_DWORD(req, MAE_ACTION_RULE_INSERT_OUT_AR_ID); + if (ar_id.id == EFX_MAE_RSRC_ID_INVALID) { + rc = ENOENT; + goto fail5; + } + + ar_idp->id = ar_id.id; + + return (0); + +fail5: + EFSYS_PROBE(fail5); +fail4: + EFSYS_PROBE(fail4); +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + return (rc); +} + + __checkReturn efx_rc_t +efx_mae_action_rule_remove( + __in efx_nic_t *enp, + __in const efx_mae_rule_id_t *ar_idp) +{ + const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp); + efx_mcdi_req_t req; + EFX_MCDI_DECLARE_BUF(payload, + MC_CMD_MAE_ACTION_RULE_DELETE_IN_LEN(1), + MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LEN(1)); + efx_rc_t rc; + + if (encp->enc_mae_supported == B_FALSE) { + rc = ENOTSUP; + goto fail1; + } + + req.emr_cmd = MC_CMD_MAE_ACTION_RULE_DELETE; + req.emr_in_buf = payload; + req.emr_in_length = MC_CMD_MAE_ACTION_RULE_DELETE_IN_LEN(1); + req.emr_out_buf = payload; + req.emr_out_length = MC_CMD_MAE_ACTION_RULE_DELETE_OUT_LEN(1); + + MCDI_IN_SET_DWORD(req, MAE_ACTION_RULE_DELETE_IN_AR_ID, ar_idp->id); + + efx_mcdi_execute(enp, &req); + + if (req.emr_rc != 0) { + rc = req.emr_rc; + goto fail2; + } + + if (MCDI_OUT_DWORD(req, MAE_ACTION_RULE_DELETE_OUT_DELETED_AR_ID) != + ar_idp->id) { + /* Firmware failed to delete the action rule. */ + rc = EAGAIN; + goto fail3; + } + + return (0); + fail3: EFSYS_PROBE(fail3); fail2: diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map index 643b3bab52..0e0d058c8f 100644 --- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map +++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map @@ -85,6 +85,8 @@ INTERNAL { efx_mac_stats_upload; efx_mac_up; + efx_mae_action_rule_insert; + efx_mae_action_rule_remove; efx_mae_action_set_alloc; efx_mae_action_set_free; efx_mae_action_set_populate_deliver; -- 2.17.1