net/cnxk: add multi-segment Tx for CN10K
[dpdk.git] / drivers / raw / cnxk_bphy / cnxk_bphy_irq.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4 #include <rte_bus_pci.h>
5 #include <rte_pci.h>
6 #include <rte_rawdev.h>
7 #include <rte_rawdev_pmd.h>
8
9 #include <roc_api.h>
10 #include <roc_bphy_irq.h>
11
12 #include "cnxk_bphy_irq.h"
13
14 static struct bphy_device *
15 cnxk_bphy_get_bphy_dev_by_dev_id(uint16_t dev_id)
16 {
17         struct rte_rawdev *rawdev;
18
19         if (!rte_rawdev_pmd_is_valid_dev(dev_id))
20                 return NULL;
21
22         rawdev = &rte_rawdevs[dev_id];
23
24         return (struct bphy_device *)rawdev->dev_private;
25 }
26
27 uint64_t
28 cnxk_bphy_irq_max_get(uint16_t dev_id)
29 {
30         struct roc_bphy_irq_chip *irq_chip;
31         struct bphy_device *bphy_dev;
32
33         bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
34         irq_chip = bphy_dev->irq_chip;
35
36         return irq_chip->max_irq;
37 }
38
39 int
40 cnxk_bphy_intr_init(uint16_t dev_id)
41 {
42         struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
43
44         bphy_dev->irq_chip = roc_bphy_intr_init();
45         if (bphy_dev->irq_chip == NULL)
46                 return -ENOMEM;
47
48         return 0;
49 }
50
51 void
52 cnxk_bphy_intr_fini(uint16_t dev_id)
53 {
54         struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
55         struct roc_bphy_irq_chip *irq_chip = bphy_dev->irq_chip;
56
57         roc_bphy_intr_fini(irq_chip);
58         bphy_dev->irq_chip = NULL;
59 }
60
61 int
62 cnxk_bphy_intr_register(uint16_t dev_id, int irq_num,
63                         cnxk_bphy_intr_handler_t handler, void *data, int cpu)
64 {
65         struct roc_bphy_intr intr = {
66                 .irq_num = irq_num,
67                 .intr_handler = handler,
68                 .isr_data = data,
69                 .cpu = cpu
70         };
71
72         struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
73         struct roc_bphy_irq_chip *irq_chip = bphy_dev->irq_chip;
74
75         if (!irq_chip)
76                 return -ENODEV;
77         if (!handler || !data)
78                 return -EINVAL;
79
80         return roc_bphy_intr_register(irq_chip, &intr);
81 }
82
83 void
84 cnxk_bphy_intr_unregister(uint16_t dev_id, int irq_num)
85 {
86         struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
87
88         if (bphy_dev->irq_chip)
89                 roc_bphy_handler_clear(bphy_dev->irq_chip, irq_num);
90         else
91                 plt_err("Missing irq chip");
92 }
93
94 struct bphy_mem *
95 cnxk_bphy_mem_get(uint16_t dev_id)
96 {
97         struct bphy_device *bphy_dev = cnxk_bphy_get_bphy_dev_by_dev_id(dev_id);
98
99         return &bphy_dev->mem;
100 }