mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Nikhil P. Rao" <nikhil.rao@amd.com>
To: Brett Creeley <brett.creeley@amd.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>,
	"David S. Miller" <davem@davemloft.net>,
	"Eric Dumazet" <edumazet@kernel.org>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Guenter Roeck <linux@roeck-us.net>,
	Jonathan Corbet <corbet@lwn.net>,
	Shuah Khan <skhan@linuxfoundation.org>,
	Randy Dunlap <rdunlap@infradead.org>, Kees Cook <kees@kernel.org>,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: <netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-hwmon@vger.kernel.org>, <linux-doc@vger.kernel.org>,
	<linux-hardening@vger.kernel.org>,
	Abhijit Gangurde <abhijit.gangurde@amd.com>,
	"Nikhil P. Rao" <nikhil.rao@amd.com>
Subject: [PATCH net-next 1/4] ionic: register auxiliary devices from a table of device types
Date: Tue, 3 Nov 2026 18:14:46 +0000	[thread overview]
Message-ID: <20261103-pr46-b4-v1-1-850ab7fbec19@amd.com> (raw)
In-Reply-To: <20261103-pr46-b4-v1-0-850ab7fbec19@amd.com>

A later patch adds a hardware monitoring auxiliary device alongside the
rdma one. Describe the auxiliary device types in a table, so that adding
one takes an enum value and a table entry.

Allocate the auxiliary device id once per ionic device instead of on
every add, so all of a device's auxiliary devices share one id, for
example ionic.rdma.0 and ionic.hwmon.0.

Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Signed-off-by: Nikhil P. Rao <nikhil.rao@amd.com>
---
 drivers/net/ethernet/pensando/ionic/ionic.h        |  1 +
 drivers/net/ethernet/pensando/ionic/ionic_aux.c    | 94 +++++++++++++++-------
 drivers/net/ethernet/pensando/ionic/ionic_aux.h    |  2 +-
 .../net/ethernet/pensando/ionic/ionic_bus_pci.c    | 14 +++-
 drivers/net/ethernet/pensando/ionic/ionic_lif.h    |  7 +-
 5 files changed, 86 insertions(+), 32 deletions(-)

diff --git a/drivers/net/ethernet/pensando/ionic/ionic.h b/drivers/net/ethernet/pensando/ionic/ionic.h
index 85198e6a806e6..555a77db1b1e7 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic.h
@@ -49,6 +49,7 @@ struct ionic {
 	struct ionic_identity ident;
 	struct workqueue_struct *wq;
 	struct ionic_lif *lif;
+	int aux_id;
 	unsigned int nnqs_per_lif;
 	unsigned int neqs_per_lif;
 	unsigned int ntxqs_per_lif;
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_aux.c b/drivers/net/ethernet/pensando/ionic/ionic_aux.c
index 4f193d0ee87ad..370a7eff3e283 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_aux.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_aux.c
@@ -6,41 +6,47 @@
 #include "ionic_lif.h"
 #include "ionic_aux.h"
 
-static DEFINE_IDA(aux_ida);
+struct ionic_aux_type_info {
+	const char *name;
+	bool (*supported)(struct ionic *ionic);
+	int (*prepare)(struct ionic *ionic);
+};
+
+static bool ionic_rdma_supported(struct ionic *ionic)
+{
+	return le64_to_cpu(ionic->ident.lif.capabilities) & IONIC_LIF_CAP_RDMA;
+}
+
+static const struct ionic_aux_type_info ionic_aux_types[IONIC_AUX_MAX] = {
+	[IONIC_AUX_RDMA] = {
+		.name = "rdma",
+		.supported = ionic_rdma_supported,
+	},
+};
 
 static void ionic_auxbus_release(struct device *dev)
 {
 	struct ionic_aux_dev *ionic_adev;
 
 	ionic_adev = container_of(dev, struct ionic_aux_dev, adev.dev);
-	ida_free(&aux_ida, ionic_adev->adev.id);
 	kfree(ionic_adev);
 }
 
-int ionic_auxbus_register(struct ionic_lif *lif)
+static struct ionic_aux_dev *ionic_auxbus_add(struct ionic_lif *lif,
+					      const char *name)
 {
 	struct ionic_aux_dev *ionic_adev;
 	struct auxiliary_device *aux_dev;
-	int err, id;
-
-	if (!(le64_to_cpu(lif->ionic->ident.lif.capabilities) & IONIC_LIF_CAP_RDMA))
-		return 0;
+	int err;
 
 	ionic_adev = kzalloc_obj(*ionic_adev);
 	if (!ionic_adev)
-		return -ENOMEM;
+		return ERR_PTR(-ENOMEM);
 
 	aux_dev = &ionic_adev->adev;
 
-	id = ida_alloc(&aux_ida, GFP_KERNEL);
-	if (id < 0) {
-		dev_err(lif->ionic->dev, "Failed to allocate aux id: %d\n", id);
-		kfree(ionic_adev);
-		return id;
-	}
-
-	aux_dev->id = id;
-	aux_dev->name = "rdma";
+	aux_dev->id = lif->ionic->aux_id;
+	aux_dev->name = name;
 	aux_dev->dev.parent = &lif->ionic->pdev->dev;
 	aux_dev->dev.release = ionic_auxbus_release;
 	ionic_adev->lif = lif;
@@ -48,9 +54,8 @@ int ionic_auxbus_register(struct ionic_lif *lif)
 	if (err) {
 		dev_err(lif->ionic->dev, "Failed to initialize %s aux device: %d\n",
 			aux_dev->name, err);
-		ida_free(&aux_ida, id);
 		kfree(ionic_adev);
-		return err;
+		return ERR_PTR(err);
 	}
 
 	err = auxiliary_device_add(aux_dev);
@@ -58,24 +63,57 @@ int ionic_auxbus_register(struct ionic_lif *lif)
 		dev_err(lif->ionic->dev, "Failed to add %s aux device: %d\n",
 			aux_dev->name, err);
 		auxiliary_device_uninit(aux_dev);
-		return err;
+		return ERR_PTR(err);
+	}
+
+	return ionic_adev;
+}
+
+static void ionic_auxbus_del(struct ionic_aux_dev *ionic_adev)
+{
+	auxiliary_device_delete(&ionic_adev->adev);
+	auxiliary_device_uninit(&ionic_adev->adev);
+}
+
+void ionic_auxbus_register(struct ionic_lif *lif)
+{
+	const struct ionic_aux_type_info *type;
+	struct ionic_aux_dev *ionic_adev;
+	int i;
+
+	mutex_lock(&lif->adev_lock);
+
+	for (i = 0; i < IONIC_AUX_MAX; i++) {
+		type = &ionic_aux_types[i];
+
+		if (!type->supported(lif->ionic))
+			continue;
+
+		if (type->prepare && type->prepare(lif->ionic))
+			continue;
+
+		ionic_adev = ionic_auxbus_add(lif, type->name);
+		if (!IS_ERR(ionic_adev))
+			lif->aux_devs[i] = ionic_adev;
 	}
 
-	lif->ionic_adev = ionic_adev;
-	return 0;
+	mutex_unlock(&lif->adev_lock);
 }
 
 void ionic_auxbus_unregister(struct ionic_lif *lif)
 {
+	int i;
+
 	mutex_lock(&lif->adev_lock);
-	if (!lif->ionic_adev)
-		goto out;
 
-	auxiliary_device_delete(&lif->ionic_adev->adev);
-	auxiliary_device_uninit(&lif->ionic_adev->adev);
+	for (i = IONIC_AUX_MAX - 1; i >= 0; i--) {
+		if (!lif->aux_devs[i])
+			continue;
+
+		ionic_auxbus_del(lif->aux_devs[i]);
+		lif->aux_devs[i] = NULL;
+	}
 
-	lif->ionic_adev = NULL;
-out:
 	mutex_unlock(&lif->adev_lock);
 }
 
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_aux.h b/drivers/net/ethernet/pensando/ionic/ionic_aux.h
index f5528a9f187db..215f2f67646be 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_aux.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic_aux.h
@@ -4,7 +4,7 @@
 #ifndef _IONIC_AUX_H_
 #define _IONIC_AUX_H_
 
-int ionic_auxbus_register(struct ionic_lif *lif);
+void ionic_auxbus_register(struct ionic_lif *lif);
 void ionic_auxbus_unregister(struct ionic_lif *lif);
 
 #endif /* _IONIC_AUX_H_ */
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
index ddc2f9770df45..9bedcb7224abc 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
@@ -20,6 +20,8 @@ static const struct pci_device_id ionic_id_table[] = {
 };
 MODULE_DEVICE_TABLE(pci, ionic_id_table);
 
+static DEFINE_IDA(ionic_ida);
+
 int ionic_bus_get_irq(struct ionic *ionic, unsigned int num)
 {
 	return pci_irq_vector(ionic->pdev, num);
@@ -321,12 +323,17 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	pci_set_drvdata(pdev, ionic);
 	mutex_init(&ionic->dev_cmd_lock);
 
+	err = ida_alloc(&ionic_ida, GFP_KERNEL);
+	if (err < 0)
+		goto err_out;
+	ionic->aux_id = err;
+
 	/* Query system for DMA addressing limitation for the device. */
 	err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(IONIC_ADDR_LEN));
 	if (err) {
 		dev_err(dev, "Unable to obtain 64-bit DMA for consistent allocations, aborting.  err=%d\n",
 			err);
-		goto err_out;
+		goto err_out_free_id;
 	}
 
 #ifdef CONFIG_PPC64
@@ -336,7 +343,7 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	err = ionic_setup_one(ionic);
 	if (err)
-		goto err_out;
+		goto err_out_free_id;
 
 	/* Allocate and init the LIF */
 	err = ionic_lif_size(ionic);
@@ -401,6 +408,8 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	ionic_dev_teardown(ionic);
 	ionic_clear_pci(ionic);
 	ionic_debugfs_del_dev(ionic);
+err_out_free_id:
+	ida_free(&ionic_ida, ionic->aux_id);
 err_out:
 	mutex_destroy(&ionic->dev_cmd_lock);
 	ionic_devlink_free(ionic);
@@ -437,6 +446,7 @@ static void ionic_remove(struct pci_dev *pdev)
 	ionic_dev_teardown(ionic);
 	ionic_clear_pci(ionic);
 	ionic_debugfs_del_dev(ionic);
+	ida_free(&ionic_ida, ionic->aux_id);
 	mutex_destroy(&ionic->dev_cmd_lock);
 	ionic_devlink_free(ionic);
 }
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
index e790f6b9441e2..d04503b19c513 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
@@ -180,6 +180,11 @@ struct ionic_qtype_info {
 
 struct ionic_phc;
 
+enum ionic_aux_type {
+	IONIC_AUX_RDMA,
+	IONIC_AUX_MAX,
+};
+
 #define IONIC_LIF_NAME_MAX_SZ		32
 struct ionic_lif {
 	struct net_device *netdev;
@@ -225,7 +230,7 @@ struct ionic_lif {
 	dma_addr_t info_pa;
 	u32 info_sz;
 	struct ionic_qtype_info qtype_info[IONIC_QTYPE_MAX];
-	struct ionic_aux_dev *ionic_adev;
+	struct ionic_aux_dev *aux_devs[IONIC_AUX_MAX];
 	struct mutex adev_lock;	/* lock for aux_dev actions */
 
 	u8 rss_hash_key[IONIC_RSS_HASH_KEY_SIZE];

-- 
2.43.0


  reply	other threads:[~2026-11-03 18:15 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-03 18:14 [PATCH net-next 0/4] ionic: report on-board sensors through an hwmon auxiliary driver Nikhil P. Rao
2026-11-03 18:14 ` Nikhil P. Rao [this message]
2026-11-03 18:14 ` [PATCH net-next 2/4] ionic: add device interface definitions for hardware monitoring Nikhil P. Rao
2026-11-03 18:14 ` [PATCH net-next 3/4] ionic: add an auxiliary device " Nikhil P. Rao
2026-11-03 18:14 ` [PATCH net-next 4/4] hwmon: add AMD Pensando ionic sensor driver Nikhil P. Rao
2026-11-03 20:50   ` Guenter Roeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261103-pr46-b4-v1-1-850ab7fbec19@amd.com \
    --to=nikhil.rao@amd.com \
    --cc=abhijit.gangurde@amd.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=brett.creeley@amd.com \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@kernel.org \
    --cc=gustavoars@kernel.org \
    --cc=kees@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=rdunlap@infradead.org \
    --cc=skhan@linuxfoundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®