mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-11-01 09:13:37 +00:00
pds_core: set up the VIF definitions and defaults
The Virtual Interfaces (VIFs) supported by the DSC's configuration (vDPA, Eth, RDMA, etc) are reported in the dev_ident struct and made visible in debugfs. At this point only vDPA is supported in this driver so we only setup devices for that feature. Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Acked-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
49ce92fbee
commit
65e0185ad7
4 changed files with 102 additions and 0 deletions
|
|
@ -346,6 +346,43 @@ static int pdsc_core_init(struct pdsc *pdsc)
|
|||
return err;
|
||||
}
|
||||
|
||||
static struct pdsc_viftype pdsc_viftype_defaults[] = {
|
||||
[PDS_DEV_TYPE_VDPA] = { .name = PDS_DEV_TYPE_VDPA_STR,
|
||||
.vif_id = PDS_DEV_TYPE_VDPA,
|
||||
.dl_id = DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET },
|
||||
[PDS_DEV_TYPE_MAX] = {}
|
||||
};
|
||||
|
||||
static int pdsc_viftypes_init(struct pdsc *pdsc)
|
||||
{
|
||||
enum pds_core_vif_types vt;
|
||||
|
||||
pdsc->viftype_status = kzalloc(sizeof(pdsc_viftype_defaults),
|
||||
GFP_KERNEL);
|
||||
if (!pdsc->viftype_status)
|
||||
return -ENOMEM;
|
||||
|
||||
for (vt = 0; vt < PDS_DEV_TYPE_MAX; vt++) {
|
||||
bool vt_support;
|
||||
|
||||
if (!pdsc_viftype_defaults[vt].name)
|
||||
continue;
|
||||
|
||||
/* Grab the defaults */
|
||||
pdsc->viftype_status[vt] = pdsc_viftype_defaults[vt];
|
||||
|
||||
/* See what the Core device has for support */
|
||||
vt_support = !!le16_to_cpu(pdsc->dev_ident.vif_types[vt]);
|
||||
dev_dbg(pdsc->dev, "VIF %s is %ssupported\n",
|
||||
pdsc->viftype_status[vt].name,
|
||||
vt_support ? "" : "not ");
|
||||
|
||||
pdsc->viftype_status[vt].supported = vt_support;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pdsc_setup(struct pdsc *pdsc, bool init)
|
||||
{
|
||||
int numdescs;
|
||||
|
|
@ -388,6 +425,14 @@ int pdsc_setup(struct pdsc *pdsc, bool init)
|
|||
if (err)
|
||||
goto err_out_teardown;
|
||||
|
||||
/* Set up the VIFs */
|
||||
err = pdsc_viftypes_init(pdsc);
|
||||
if (err)
|
||||
goto err_out_teardown;
|
||||
|
||||
if (init)
|
||||
pdsc_debugfs_add_viftype(pdsc);
|
||||
|
||||
clear_bit(PDSC_S_FW_DEAD, &pdsc->state);
|
||||
return 0;
|
||||
|
||||
|
|
@ -404,6 +449,9 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)
|
|||
pdsc_qcq_free(pdsc, &pdsc->notifyqcq);
|
||||
pdsc_qcq_free(pdsc, &pdsc->adminqcq);
|
||||
|
||||
kfree(pdsc->viftype_status);
|
||||
pdsc->viftype_status = NULL;
|
||||
|
||||
if (pdsc->intr_info) {
|
||||
for (i = 0; i < pdsc->nintrs; i++)
|
||||
pdsc_intr_free(pdsc, i);
|
||||
|
|
|
|||
|
|
@ -123,6 +123,15 @@ struct pdsc_qcq {
|
|||
struct dentry *dentry;
|
||||
};
|
||||
|
||||
struct pdsc_viftype {
|
||||
char *name;
|
||||
bool supported;
|
||||
bool enabled;
|
||||
int dl_id;
|
||||
int vif_id;
|
||||
struct pds_auxiliary_dev *padev;
|
||||
};
|
||||
|
||||
/* No state flags set means we are in a steady running state */
|
||||
enum pdsc_state_flags {
|
||||
PDSC_S_FW_DEAD, /* stopped, wait on startup or recovery */
|
||||
|
|
@ -174,6 +183,7 @@ struct pdsc {
|
|||
struct pdsc_qcq adminqcq;
|
||||
struct pdsc_qcq notifyqcq;
|
||||
u64 last_eid;
|
||||
struct pdsc_viftype *viftype_status;
|
||||
};
|
||||
|
||||
/** enum pds_core_dbell_bits - bitwise composition of dbell values.
|
||||
|
|
@ -237,6 +247,7 @@ void pdsc_debugfs_destroy(void);
|
|||
void pdsc_debugfs_add_dev(struct pdsc *pdsc);
|
||||
void pdsc_debugfs_del_dev(struct pdsc *pdsc);
|
||||
void pdsc_debugfs_add_ident(struct pdsc *pdsc);
|
||||
void pdsc_debugfs_add_viftype(struct pdsc *pdsc);
|
||||
void pdsc_debugfs_add_irqs(struct pdsc *pdsc);
|
||||
void pdsc_debugfs_add_qcq(struct pdsc *pdsc, struct pdsc_qcq *qcq);
|
||||
void pdsc_debugfs_del_qcq(struct pdsc_qcq *qcq);
|
||||
|
|
|
|||
|
|
@ -68,6 +68,30 @@ void pdsc_debugfs_add_ident(struct pdsc *pdsc)
|
|||
pdsc, &identity_fops);
|
||||
}
|
||||
|
||||
static int viftype_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct pdsc *pdsc = seq->private;
|
||||
int vt;
|
||||
|
||||
for (vt = 0; vt < PDS_DEV_TYPE_MAX; vt++) {
|
||||
if (!pdsc->viftype_status[vt].name)
|
||||
continue;
|
||||
|
||||
seq_printf(seq, "%s\t%d supported %d enabled\n",
|
||||
pdsc->viftype_status[vt].name,
|
||||
pdsc->viftype_status[vt].supported,
|
||||
pdsc->viftype_status[vt].enabled);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(viftype);
|
||||
|
||||
void pdsc_debugfs_add_viftype(struct pdsc *pdsc)
|
||||
{
|
||||
debugfs_create_file("viftypes", 0400, pdsc->dentry,
|
||||
pdsc, &viftype_fops);
|
||||
}
|
||||
|
||||
static const struct debugfs_reg32 intr_ctrl_regs[] = {
|
||||
{ .name = "coal_init", .offset = 0, },
|
||||
{ .name = "mask", .offset = 4, },
|
||||
|
|
|
|||
|
|
@ -20,6 +20,25 @@ enum pds_core_driver_type {
|
|||
PDS_DRIVER_ESXI = 6,
|
||||
};
|
||||
|
||||
enum pds_core_vif_types {
|
||||
PDS_DEV_TYPE_CORE = 0,
|
||||
PDS_DEV_TYPE_VDPA = 1,
|
||||
PDS_DEV_TYPE_VFIO = 2,
|
||||
PDS_DEV_TYPE_ETH = 3,
|
||||
PDS_DEV_TYPE_RDMA = 4,
|
||||
PDS_DEV_TYPE_LM = 5,
|
||||
|
||||
/* new ones added before this line */
|
||||
PDS_DEV_TYPE_MAX = 16 /* don't change - used in struct size */
|
||||
};
|
||||
|
||||
#define PDS_DEV_TYPE_CORE_STR "Core"
|
||||
#define PDS_DEV_TYPE_VDPA_STR "vDPA"
|
||||
#define PDS_DEV_TYPE_VFIO_STR "VFio"
|
||||
#define PDS_DEV_TYPE_ETH_STR "Eth"
|
||||
#define PDS_DEV_TYPE_RDMA_STR "RDMA"
|
||||
#define PDS_DEV_TYPE_LM_STR "LM"
|
||||
|
||||
#define PDS_CORE_IFNAMSIZ 16
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue