net/mlx5: move Linux-specific functions
[dpdk.git] / drivers / net / sfc / base / ef10_proxy.c
index 6b1afcc..19c11c6 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- * Copyright (c) 2018-2019 Solarflare Communications Inc.
- * All rights reserved.
+ * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2018-2019 Solarflare Communications Inc.
  */
 
 #include "efx.h"
@@ -13,9 +13,7 @@
 ef10_proxy_auth_init(
        __in            efx_nic_t *enp)
 {
-       EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
-               enp->en_family == EFX_FAMILY_MEDFORD ||
-               enp->en_family == EFX_FAMILY_MEDFORD2);
+       EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
 
        return (0);
 }
@@ -24,9 +22,7 @@ ef10_proxy_auth_init(
 ef10_proxy_auth_fini(
        __in            efx_nic_t *enp)
 {
-       EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
-               enp->en_family == EFX_FAMILY_MEDFORD ||
-               enp->en_family == EFX_FAMILY_MEDFORD2);
+       EFSYS_ASSERT(EFX_FAMILY_IS_EF10(enp));
 }
 
 static __checkReturn   efx_rc_t
@@ -252,4 +248,223 @@ ef10_proxy_auth_privilege_modify(
        return (efx_mcdi_privilege_modify(enp, fn_group, pf_index, vf_index,
                        add_privileges_mask, remove_privileges_mask));
 }
+
+static __checkReturn   efx_rc_t
+efx_mcdi_privilege_mask_set(
+       __in            efx_nic_t *enp,
+       __in            uint32_t vf_index,
+       __in            uint32_t mask,
+       __in            uint32_t value)
+{
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_PRIVILEGE_MASK_IN_LEN,
+               MC_CMD_PRIVILEGE_MASK_OUT_LEN);
+       efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+       efx_mcdi_req_t req;
+       efx_rc_t rc;
+       uint32_t old_mask = 0;
+       uint32_t new_mask = 0;
+
+       EFSYS_ASSERT((value & ~mask) == 0);
+
+       req.emr_cmd = MC_CMD_PRIVILEGE_MASK;
+       req.emr_in_buf = payload;
+       req.emr_in_length = MC_CMD_PRIVILEGE_MASK_IN_LEN;
+       req.emr_out_buf = payload;
+       req.emr_out_length = MC_CMD_PRIVILEGE_MASK_OUT_LEN;
+
+       /* Get privilege mask */
+       MCDI_IN_POPULATE_DWORD_2(req, PRIVILEGE_MASK_IN_FUNCTION,
+               PRIVILEGE_MASK_IN_FUNCTION_PF, encp->enc_pf,
+               PRIVILEGE_MASK_IN_FUNCTION_VF, vf_index);
+
+       efx_mcdi_execute(enp, &req);
+
+       if (req.emr_rc != 0) {
+               rc = req.emr_rc;
+               goto fail1;
+       }
+
+       if (req.emr_out_length_used != MC_CMD_PRIVILEGE_MASK_OUT_LEN) {
+               rc = EMSGSIZE;
+               goto fail2;
+       }
+
+       old_mask = *MCDI_OUT2(req, uint32_t, PRIVILEGE_MASK_OUT_OLD_MASK);
+       new_mask = old_mask & ~mask;
+       new_mask |= (value & mask);
+
+       if (new_mask == old_mask)
+               return (0);
+
+       new_mask |= MC_CMD_PRIVILEGE_MASK_IN_DO_CHANGE;
+       memset(payload, 0, sizeof (payload));
+
+       req.emr_cmd = MC_CMD_PRIVILEGE_MASK;
+       req.emr_in_buf = payload;
+       req.emr_in_length = MC_CMD_PRIVILEGE_MASK_IN_LEN;
+       req.emr_out_buf = payload;
+       req.emr_out_length = MC_CMD_PRIVILEGE_MASK_OUT_LEN;
+
+       /* Set privilege mask */
+       MCDI_IN_SET_DWORD(req, PRIVILEGE_MASK_IN_NEW_MASK, new_mask);
+
+       efx_mcdi_execute(enp, &req);
+       if (req.emr_rc != 0) {
+               rc = req.emr_rc;
+               goto fail3;
+       }
+
+       if (req.emr_out_length_used != MC_CMD_PRIVILEGE_MASK_OUT_LEN) {
+               rc = EMSGSIZE;
+               goto fail4;
+       }
+
+       return (0);
+
+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
+ef10_proxy_auth_set_privilege_mask(
+       __in            efx_nic_t *enp,
+       __in            uint32_t vf_index,
+       __in            uint32_t mask,
+       __in            uint32_t value)
+{
+       return (efx_mcdi_privilege_mask_set(enp, vf_index,
+                       mask, value));
+}
+
+static __checkReturn   efx_rc_t
+efx_mcdi_proxy_complete(
+       __in            efx_nic_t *enp,
+       __in            uint32_t fn_index,
+       __in            uint32_t proxy_result,
+       __in            uint32_t handle)
+{
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_PROXY_COMPLETE_IN_LEN,
+               MC_CMD_PROXY_COMPLETE_OUT_LEN);
+       efx_mcdi_req_t req;
+       efx_rc_t rc;
+
+       req.emr_cmd = MC_CMD_PROXY_COMPLETE;
+       req.emr_in_buf = payload;
+       req.emr_in_length = MC_CMD_PROXY_COMPLETE_IN_LEN;
+       req.emr_out_buf = payload;
+       req.emr_out_length = MC_CMD_PROXY_COMPLETE_OUT_LEN;
+
+       MCDI_IN_SET_DWORD(req, PROXY_COMPLETE_IN_BLOCK_INDEX, fn_index);
+       MCDI_IN_SET_DWORD(req, PROXY_COMPLETE_IN_STATUS, proxy_result);
+       MCDI_IN_SET_DWORD(req, PROXY_COMPLETE_IN_HANDLE, handle);
+
+       efx_mcdi_execute(enp, &req);
+
+       if (req.emr_rc != 0) {
+               rc = req.emr_rc;
+               goto fail1;
+       }
+
+       return (0);
+
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+       return (rc);
+}
+
+       __checkReturn   efx_rc_t
+ef10_proxy_auth_complete_request(
+       __in            efx_nic_t *enp,
+       __in            uint32_t fn_index,
+       __in            uint32_t proxy_result,
+       __in            uint32_t handle)
+{
+       return (efx_mcdi_proxy_complete(enp, fn_index,
+                       proxy_result, handle));
+}
+
+static __checkReturn                   efx_rc_t
+efx_mcdi_proxy_cmd(
+       __in                            efx_nic_t *enp,
+       __in                            uint32_t pf_index,
+       __in                            uint32_t vf_index,
+       __in_bcount(request_size)       uint8_t *request_bufferp,
+       __in                            size_t request_size,
+       __out_bcount(response_size)     uint8_t *response_bufferp,
+       __in                            size_t response_size,
+       __out_opt                       size_t *response_size_actualp)
+{
+       efx_dword_t *inbufp;
+       efx_mcdi_req_t req;
+       efx_rc_t rc;
+
+       if (request_size % sizeof (*inbufp) != 0) {
+               rc = EINVAL;
+               goto fail1;
+       }
+
+       EFSYS_KMEM_ALLOC(enp, (MC_CMD_PROXY_CMD_IN_LEN + request_size), inbufp);
+
+       req.emr_cmd = MC_CMD_PROXY_CMD;
+       req.emr_in_buf = (uint8_t *) inbufp;
+       req.emr_in_length = MC_CMD_PROXY_CMD_IN_LEN + request_size;
+       req.emr_out_buf = response_bufferp;
+       req.emr_out_length = response_size;
+
+       MCDI_IN_POPULATE_DWORD_2(req, PROXY_CMD_IN_TARGET,
+                PROXY_CMD_IN_TARGET_PF, pf_index,
+                PROXY_CMD_IN_TARGET_VF, vf_index);
+
+       /* Proxied command should be located just after PROXY_CMD */
+       memcpy(&inbufp[MC_CMD_PROXY_CMD_IN_LEN / sizeof (*inbufp)],
+               request_bufferp, request_size);
+
+       efx_mcdi_execute(enp, &req);
+
+       EFSYS_KMEM_FREE(enp, (MC_CMD_PROXY_CMD_IN_LEN + request_size), inbufp);
+       if (req.emr_rc != 0) {
+               rc = req.emr_rc;
+               goto fail2;
+       }
+
+       if (response_size_actualp != NULL)
+               *response_size_actualp = req.emr_out_length_used;
+
+       return (0);
+
+fail2:
+       EFSYS_PROBE(fail2);
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+       return (rc);
+}
+
+       __checkReturn   efx_rc_t
+ef10_proxy_auth_get_privilege_mask(
+       __in            efx_nic_t *enp,
+       __in            uint32_t pf_index,
+       __in            uint32_t vf_index,
+       __out           uint32_t *maskp)
+{
+       return (efx_mcdi_privilege_mask(enp, pf_index, vf_index, maskp));
+}
+
+
+       __checkReturn   efx_rc_t
+ef10_proxy_auth_exec_cmd(
+       __in            efx_nic_t *enp,
+       __inout         efx_proxy_cmd_params_t *paramsp)
+{
+       return (efx_mcdi_proxy_cmd(enp, paramsp->pf_index, paramsp->vf_index,
+                       paramsp->request_bufferp, paramsp->request_size,
+                       paramsp->response_bufferp, paramsp->response_size,
+                       paramsp->response_size_actualp));
+}
 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */