sfc: determine representee m-port for EF100 representors
An MAE port, or m-port, is a port (source/destination for traffic) on the Match-Action Engine (the internal switch on EF100). Representors will use their representee's m-port for two purposes: as a destination override on TX from the representor, and as a source match in 'default rules' to steer representee traffic (when not matched by e.g. a TC flower rule) to representor RX via the parent PF's receive queue. Signed-off-by: Edward Cree <ecree.xilinx@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e1479556f8
commit
da56552d04
5 changed files with 96 additions and 1 deletions
|
@ -8,7 +8,7 @@ sfc-y += efx.o efx_common.o efx_channels.o nic.o \
|
|||
ef100.o ef100_nic.o ef100_netdev.o \
|
||||
ef100_ethtool.o ef100_rx.o ef100_tx.o
|
||||
sfc-$(CONFIG_SFC_MTD) += mtd.o
|
||||
sfc-$(CONFIG_SFC_SRIOV) += sriov.o ef10_sriov.o ef100_sriov.o ef100_rep.o
|
||||
sfc-$(CONFIG_SFC_SRIOV) += sriov.o ef10_sriov.o ef100_sriov.o ef100_rep.o mae.o
|
||||
|
||||
obj-$(CONFIG_SFC) += sfc.o
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include "ef100_rep.h"
|
||||
#include "ef100_nic.h"
|
||||
#include "mae.h"
|
||||
|
||||
#define EFX_EF100_REP_DRIVER "efx_ef100_rep"
|
||||
|
||||
|
@ -124,6 +125,25 @@ fail1:
|
|||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
static int efx_ef100_configure_rep(struct efx_rep *efv)
|
||||
{
|
||||
struct efx_nic *efx = efv->parent;
|
||||
u32 selector;
|
||||
int rc;
|
||||
|
||||
/* Construct mport selector for corresponding VF */
|
||||
efx_mae_mport_vf(efx, efv->idx, &selector);
|
||||
/* Look up actual mport ID */
|
||||
rc = efx_mae_lookup_mport(efx, selector, &efv->mport);
|
||||
if (rc)
|
||||
return rc;
|
||||
pci_dbg(efx->pci_dev, "VF %u has mport ID %#x\n", efv->idx, efv->mport);
|
||||
/* mport label should fit in 16 bits */
|
||||
WARN_ON(efv->mport >> 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void efx_ef100_rep_destroy_netdev(struct efx_rep *efv)
|
||||
{
|
||||
struct efx_nic *efx = efv->parent;
|
||||
|
@ -147,6 +167,13 @@ int efx_ef100_vfrep_create(struct efx_nic *efx, unsigned int i)
|
|||
rc);
|
||||
return rc;
|
||||
}
|
||||
rc = efx_ef100_configure_rep(efv);
|
||||
if (rc) {
|
||||
pci_err(efx->pci_dev,
|
||||
"Failed to configure representor for VF %d, rc %d\n",
|
||||
i, rc);
|
||||
goto fail;
|
||||
}
|
||||
rc = register_netdev(efv->net_dev);
|
||||
if (rc) {
|
||||
pci_err(efx->pci_dev,
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
* @parent: the efx PF which manages this representor
|
||||
* @net_dev: representor netdevice
|
||||
* @msg_enable: log message enable flags
|
||||
* @mport: m-port ID of corresponding VF
|
||||
* @idx: VF index
|
||||
* @list: entry on efx->vf_reps
|
||||
*/
|
||||
|
@ -28,6 +29,7 @@ struct efx_rep {
|
|||
struct efx_nic *parent;
|
||||
struct net_device *net_dev;
|
||||
u32 msg_enable;
|
||||
u32 mport;
|
||||
unsigned int idx;
|
||||
struct list_head list;
|
||||
};
|
||||
|
|
44
drivers/net/ethernet/sfc/mae.c
Normal file
44
drivers/net/ethernet/sfc/mae.c
Normal file
|
@ -0,0 +1,44 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/****************************************************************************
|
||||
* Driver for Solarflare network controllers and boards
|
||||
* Copyright 2019 Solarflare Communications Inc.
|
||||
* Copyright 2020-2022 Xilinx Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation, incorporated herein by reference.
|
||||
*/
|
||||
|
||||
#include "mae.h"
|
||||
#include "mcdi.h"
|
||||
#include "mcdi_pcol.h"
|
||||
|
||||
void efx_mae_mport_vf(struct efx_nic *efx __always_unused, u32 vf_id, u32 *out)
|
||||
{
|
||||
efx_dword_t mport;
|
||||
|
||||
EFX_POPULATE_DWORD_3(mport,
|
||||
MAE_MPORT_SELECTOR_TYPE, MAE_MPORT_SELECTOR_TYPE_FUNC,
|
||||
MAE_MPORT_SELECTOR_FUNC_PF_ID, MAE_MPORT_SELECTOR_FUNC_PF_ID_CALLER,
|
||||
MAE_MPORT_SELECTOR_FUNC_VF_ID, vf_id);
|
||||
*out = EFX_DWORD_VAL(mport);
|
||||
}
|
||||
|
||||
/* id is really only 24 bits wide */
|
||||
int efx_mae_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id)
|
||||
{
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_MAE_MPORT_LOOKUP_OUT_LEN);
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_MAE_MPORT_LOOKUP_IN_LEN);
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, MAE_MPORT_LOOKUP_IN_MPORT_SELECTOR, selector);
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_MAE_MPORT_LOOKUP, inbuf, sizeof(inbuf),
|
||||
outbuf, sizeof(outbuf), &outlen);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (outlen < sizeof(outbuf))
|
||||
return -EIO;
|
||||
*id = MCDI_DWORD(outbuf, MAE_MPORT_LOOKUP_OUT_MPORT_ID);
|
||||
return 0;
|
||||
}
|
22
drivers/net/ethernet/sfc/mae.h
Normal file
22
drivers/net/ethernet/sfc/mae.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/****************************************************************************
|
||||
* Driver for Solarflare network controllers and boards
|
||||
* Copyright 2019 Solarflare Communications Inc.
|
||||
* Copyright 2020-2022 Xilinx Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation, incorporated herein by reference.
|
||||
*/
|
||||
|
||||
#ifndef EF100_MAE_H
|
||||
#define EF100_MAE_H
|
||||
/* MCDI interface for the ef100 Match-Action Engine */
|
||||
|
||||
#include "net_driver.h"
|
||||
|
||||
void efx_mae_mport_vf(struct efx_nic *efx, u32 vf_id, u32 *out);
|
||||
|
||||
int efx_mae_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id);
|
||||
|
||||
#endif /* EF100_MAE_H */
|
Loading…
Add table
Reference in a new issue