Add support for interrupt initialization and cleanup. Internally
interrupt initialization performs low level setup that allows
custom interrupt handler registration later on.
Interrupt initialization and cleanup are related hence they
are in the same patch.
Signed-off-by: Jakub Palider <jpalider@marvell.com>
Signed-off-by: Tomasz Duszynski <tduszynski@marvell.com>
---
drivers/raw/cnxk_bphy/cnxk_bphy.c | 13 ++++++++
drivers/raw/cnxk_bphy/cnxk_bphy_irq.c | 47 +++++++++++++++++++++++++++
drivers/raw/cnxk_bphy/cnxk_bphy_irq.h | 5 +++
drivers/raw/cnxk_bphy/meson.build | 1 +
drivers/raw/cnxk_bphy/rte_pmd_bphy.h | 7 ++++
drivers/raw/cnxk_bphy/version.map | 12 +++++++
6 files changed, 85 insertions(+)
create mode 100644 drivers/raw/cnxk_bphy/cnxk_bphy_irq.c
@@ -13,6 +13,7 @@
#include <roc_api.h>
#include "cnxk_bphy_irq.h"
+#include "rte_pmd_bphy.h"
static const struct rte_pci_id pci_bphy_map[] = {
{RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_BPHY)},
@@ -21,6 +22,18 @@ static const struct rte_pci_id pci_bphy_map[] = {
},
};
+int
+rte_pmd_bphy_intr_init(uint16_t dev_id)
+{
+ return cnxk_bphy_intr_init(dev_id);
+}
+
+void
+rte_pmd_bphy_intr_fini(uint16_t dev_id)
+{
+ return cnxk_bphy_intr_fini(dev_id);
+}
+
static const struct rte_rawdev_ops bphy_rawdev_ops = {
};
new file mode 100644
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell International Ltd.
+ */
+#include <rte_bus_pci.h>
+#include <rte_pci.h>
+#include <rte_rawdev.h>
+#include <rte_rawdev_pmd.h>
+
+#include <roc_api.h>
+#include <roc_bphy_irq.h>
+
+#include "cnxk_bphy_irq.h"
+
+static struct bphy_device *
+cnxk_bphy_get_bphy_dev_by_dev_id(uint16_t dev_id)
+{
+ struct rte_rawdev *rawdev;
+
+ if (!rte_rawdev_pmd_is_valid_dev(dev_id))
+ return NULL;
+
+ rawdev = &rte_rawdevs[dev_id];
+
+ return (struct bphy_device *)rawdev->dev_private;
+}
+
+int
+cnxk_bphy_intr_init(uint16_t dev_id)
+{
+ struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
+
+ bphy_dev->irq_chip = roc_bphy_intr_init();
+ if (bphy_dev->irq_chip == NULL)
+ return -ENOMEM;
+
+ return 0;
+}
+
+void
+cnxk_bphy_intr_fini(uint16_t dev_id)
+{
+ struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
+ struct roc_bphy_irq_chip *irq_chip = bphy_dev->irq_chip;
+
+ roc_bphy_intr_fini(irq_chip);
+ bphy_dev->irq_chip = NULL;
+}
@@ -20,4 +20,9 @@ struct bphy_device {
struct bphy_mem mem;
};
+__rte_internal
+int cnxk_bphy_intr_init(uint16_t dev_id);
+__rte_internal
+void cnxk_bphy_intr_fini(uint16_t dev_id);
+
#endif /* _CNXK_BPHY_IRQ_ */
@@ -6,6 +6,7 @@ deps += ['bus_pci', 'common_cnxk', 'rawdev']
sources = files(
'cnxk_bphy.c',
'cnxk_bphy_cgx.c',
+ 'cnxk_bphy_irq.c',
'cnxk_bphy_cgx_test.c'
)
headers = files('rte_pmd_bphy.h')
@@ -5,6 +5,8 @@
#ifndef _CNXK_BPHY_H_
#define _CNXK_BPHY_H_
+#include "cnxk_bphy_irq.h"
+
enum cnxk_bphy_cgx_msg_type {
CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO,
CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE,
@@ -101,4 +103,9 @@ struct cnxk_bphy_cgx_msg {
void *data;
};
+__rte_experimental
+int rte_pmd_bphy_intr_init(uint16_t dev_id);
+__rte_experimental
+void rte_pmd_bphy_intr_fini(uint16_t dev_id);
+
#endif /* _CNXK_BPHY_H_ */
@@ -1,3 +1,15 @@
DPDK_21 {
local: *;
};
+INTERNAL {
+ global:
+
+ cnxk_bphy_intr_init;
+ cnxk_bphy_intr_fini;
+};
+EXPERIMENTAL {
+ global:
+
+ rte_pmd_bphy_intr_fini;
+ rte_pmd_bphy_intr_init;
+};