Commit 65e0185a authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller
Browse files

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: default avatarShannon Nelson <shannon.nelson@amd.com>
Acked-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 49ce92fb
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -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);
+11 −0
Original line number Diff line number Diff line
@@ -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);
+24 −0
Original line number Diff line number Diff line
@@ -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, },
+19 −0
Original line number Diff line number Diff line
@@ -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

/**