Custom irq handlers may be registered/removed on demand.
This adds support for doing that. Since registration
and removal are related 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 | 14 ++++++++++++
drivers/raw/cnxk_bphy/cnxk_bphy_irq.c | 33 +++++++++++++++++++++++++++
drivers/raw/cnxk_bphy/cnxk_bphy_irq.h | 12 ++++++++--
drivers/raw/cnxk_bphy/rte_pmd_bphy.h | 6 +++++
drivers/raw/cnxk_bphy/version.map | 4 ++++
5 files changed, 67 insertions(+), 2 deletions(-)
@@ -40,6 +40,20 @@ rte_pmd_bphy_intr_mem_get(uint16_t dev_id)
return cnxk_bphy_mem_get(dev_id);
}
+int
+rte_pmd_bphy_intr_register(uint16_t dev_id, int irq_num,
+ cnxk_bphy_intr_handler_t handler, void *data,
+ int cpu)
+{
+ return cnxk_bphy_intr_register(dev_id, irq_num, handler, data, cpu);
+}
+
+void
+rte_pmd_bphy_intr_unregister(uint16_t dev_id, int irq_num)
+{
+ cnxk_bphy_intr_unregister(dev_id, irq_num);
+}
+
static const struct rte_rawdev_ops bphy_rawdev_ops = {
};
@@ -58,6 +58,39 @@ cnxk_bphy_intr_fini(uint16_t dev_id)
bphy_dev->irq_chip = NULL;
}
+int
+cnxk_bphy_intr_register(uint16_t dev_id, int irq_num,
+ cnxk_bphy_intr_handler_t handler, void *data, int cpu)
+{
+ struct roc_bphy_intr intr = {
+ .irq_num = irq_num,
+ .intr_handler = handler,
+ .isr_data = data,
+ .cpu = cpu
+ };
+
+ 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;
+
+ if (!irq_chip)
+ return -ENODEV;
+ if (!handler || !data)
+ return -EINVAL;
+
+ return roc_bphy_intr_register(irq_chip, &intr);
+}
+
+void
+cnxk_bphy_intr_unregister(uint16_t dev_id, int irq_num)
+{
+ struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
+
+ if (bphy_dev->irq_chip)
+ roc_bphy_handler_clear(bphy_dev->irq_chip, irq_num);
+ else
+ plt_err("Missing irq chip");
+}
+
struct bphy_mem *
cnxk_bphy_mem_get(uint16_t dev_id)
{
@@ -10,6 +10,8 @@
#include <roc_api.h>
+typedef void (*cnxk_bphy_intr_handler_t)(int irq_num, void *isr_data);
+
struct bphy_mem {
struct rte_mem_resource res0;
struct rte_mem_resource res2;
@@ -25,8 +27,14 @@ int cnxk_bphy_intr_init(uint16_t dev_id);
__rte_internal
void cnxk_bphy_intr_fini(uint16_t dev_id);
__rte_internal
-uint64_t cnxk_bphy_irq_max_get(uint16_t dev_id);
-__rte_internal
struct bphy_mem *cnxk_bphy_mem_get(uint16_t dev_id);
+__rte_internal
+int cnxk_bphy_intr_register(uint16_t dev_id, int irq_num,
+ cnxk_bphy_intr_handler_t handler, void *isr_data,
+ int cpu);
+__rte_internal
+void cnxk_bphy_intr_unregister(uint16_t dev_id, int irq_num);
+__rte_internal
+uint64_t cnxk_bphy_irq_max_get(uint16_t dev_id);
#endif /* _CNXK_BPHY_IRQ_ */
@@ -110,6 +110,12 @@ int rte_pmd_bphy_intr_init(uint16_t dev_id);
__rte_experimental
struct cnxk_bphy_mem *rte_pmd_bphy_intr_mem_get(uint16_t dev_id);
__rte_experimental
+int rte_pmd_bphy_intr_register(uint16_t dev_id, int irq_num,
+ cnxk_bphy_intr_handler_t handler, void *isr_data,
+ int cpu);
+__rte_experimental
void rte_pmd_bphy_intr_fini(uint16_t dev_id);
+__rte_experimental
+void rte_pmd_bphy_intr_unregister(uint16_t dev_id, int irq_num);
#endif /* _CNXK_BPHY_H_ */
@@ -6,6 +6,8 @@ INTERNAL {
cnxk_bphy_intr_init;
cnxk_bphy_intr_fini;
+ cnxk_bphy_intr_register;
+ cnxk_bphy_intr_unregister;
cnxk_bphy_irq_max_get;
cnxk_bphy_mem_get;
};
@@ -15,4 +17,6 @@ EXPERIMENTAL {
rte_pmd_bphy_intr_fini;
rte_pmd_bphy_intr_init;
rte_pmd_bphy_intr_mem_get;
+ rte_pmd_bphy_intr_register;
+ rte_pmd_bphy_intr_unregister;
};