pds_core: set up the VIF definitions and defaults
authorShannon Nelson <shannon.nelson@amd.com>
Wed, 19 Apr 2023 17:04:21 +0000 (10:04 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Apr 2023 07:29:13 +0000 (08:29 +0100)
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>
drivers/net/ethernet/amd/pds_core/core.c
drivers/net/ethernet/amd/pds_core/core.h
drivers/net/ethernet/amd/pds_core/debugfs.c
include/linux/pds/pds_common.h

index 59daf8a67ac60b0a7298ea6057e9031da34598c0..b2fca3b99f02d819b8988f4c6e701b4c6f98fe6b 100644 (file)
@@ -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);
index 7eb02b359f3af49d3dc1cc124a45776e0134332d..ac0480d7f0f1f2129298c1bc102916c58200c5f0 100644 (file)
@@ -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);
index b83e5016644b808477f523edc3e4512db8531634..8ec392299b7dcff9b74a0b08f45a5ccd25986cf1 100644 (file)
@@ -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, },
index f0798ce01acfb7b8c8cd7644e5d310665ad440d4..b2be14ebadb6d4979a35d6f51c51e1e4f1f25db2 100644 (file)
@@ -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
 
 /**