3f8679534e9334637eb5fcefc00c3fa9ea8c2f46
[dpdk.git] / drivers / raw / cnxk_bphy / cnxk_bphy.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4 #include <rte_bus_pci.h>
5 #include <rte_common.h>
6 #include <rte_dev.h>
7 #include <rte_eal.h>
8 #include <rte_lcore.h>
9 #include <rte_pci.h>
10 #include <rte_rawdev.h>
11 #include <rte_rawdev_pmd.h>
12
13 #include <roc_api.h>
14
15 #include "cnxk_bphy_irq.h"
16 #include "rte_pmd_bphy.h"
17
18 static const struct rte_pci_id pci_bphy_map[] = {
19         {RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_BPHY)},
20         {
21                 .vendor_id = 0,
22         },
23 };
24
25 static void
26 bphy_rawdev_get_name(char *name, struct rte_pci_device *pci_dev)
27 {
28         snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "BPHY:%x:%02x.%x",
29                  pci_dev->addr.bus, pci_dev->addr.devid,
30                  pci_dev->addr.function);
31 }
32
33 static int
34 cnxk_bphy_irq_enqueue_bufs(struct rte_rawdev *dev,
35                            struct rte_rawdev_buf **buffers, unsigned int count,
36                            rte_rawdev_obj_t context)
37 {
38         struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
39         struct cnxk_bphy_irq_msg *msg = buffers[0]->buf_addr;
40         unsigned int queue = (size_t)context;
41         int ret = 0;
42
43         if (queue >= RTE_DIM(bphy_dev->queues))
44                 return -EINVAL;
45
46         if (count == 0)
47                 return 0;
48
49         switch (msg->type) {
50         case CNXK_BPHY_IRQ_MSG_TYPE_INIT:
51                 ret = cnxk_bphy_intr_init(dev->dev_id);
52                 break;
53         case CNXK_BPHY_IRQ_MSG_TYPE_FINI:
54                 cnxk_bphy_intr_fini(dev->dev_id);
55                 break;
56         default:
57                 ret = -EINVAL;
58         }
59
60         return ret;
61 }
62
63 static int
64 cnxk_bphy_irq_dequeue_bufs(struct rte_rawdev *dev,
65                            struct rte_rawdev_buf **buffers, unsigned int count,
66                            rte_rawdev_obj_t context)
67 {
68         struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
69         unsigned int queue = (size_t)context;
70
71         if (queue >= RTE_DIM(bphy_dev->queues))
72                 return -EINVAL;
73
74         if (count == 0)
75                 return 0;
76
77         buffers[0]->buf_addr = bphy_dev->queues[queue].rsp;
78
79         return 0;
80 }
81
82 static uint16_t
83 cnxk_bphy_irq_queue_count(struct rte_rawdev *dev)
84 {
85         struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
86
87         return RTE_DIM(bphy_dev->queues);
88 }
89
90 static int
91 cnxk_bphy_irq_queue_def_conf(struct rte_rawdev *dev, uint16_t queue_id,
92                              rte_rawdev_obj_t queue_conf,
93                              size_t queue_conf_size)
94 {
95         RTE_SET_USED(dev);
96         RTE_SET_USED(queue_id);
97
98         if (queue_conf_size != sizeof(unsigned int))
99                 return -EINVAL;
100
101         *(unsigned int *)queue_conf = 1;
102
103         return 0;
104 }
105
106 static const struct rte_rawdev_ops bphy_rawdev_ops = {
107         .queue_def_conf = cnxk_bphy_irq_queue_def_conf,
108         .enqueue_bufs = cnxk_bphy_irq_enqueue_bufs,
109         .dequeue_bufs = cnxk_bphy_irq_dequeue_bufs,
110         .queue_count = cnxk_bphy_irq_queue_count,
111 };
112
113 static int
114 bphy_rawdev_probe(struct rte_pci_driver *pci_drv,
115                   struct rte_pci_device *pci_dev)
116 {
117         struct bphy_device *bphy_dev = NULL;
118         char name[RTE_RAWDEV_NAME_MAX_LEN];
119         struct rte_rawdev *bphy_rawdev;
120         int ret;
121
122         RTE_SET_USED(pci_drv);
123
124         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
125                 return 0;
126
127         if (!pci_dev->mem_resource[0].addr) {
128                 plt_err("BARs have invalid values: BAR0 %p\n BAR2 %p",
129                         pci_dev->mem_resource[0].addr,
130                         pci_dev->mem_resource[2].addr);
131                 return -ENODEV;
132         }
133
134         ret = roc_plt_init();
135         if (ret)
136                 return ret;
137
138         bphy_rawdev_get_name(name, pci_dev);
139         bphy_rawdev = rte_rawdev_pmd_allocate(name, sizeof(*bphy_dev),
140                                               rte_socket_id());
141         if (bphy_rawdev == NULL) {
142                 plt_err("Failed to allocate rawdev");
143                 return -ENOMEM;
144         }
145
146         bphy_rawdev->dev_ops = &bphy_rawdev_ops;
147         bphy_rawdev->device = &pci_dev->device;
148         bphy_rawdev->driver_name = pci_dev->driver->driver.name;
149
150         bphy_dev = (struct bphy_device *)bphy_rawdev->dev_private;
151         bphy_dev->mem.res0 = pci_dev->mem_resource[0];
152         bphy_dev->mem.res2 = pci_dev->mem_resource[2];
153
154         return 0;
155 }
156
157 static int
158 bphy_rawdev_remove(struct rte_pci_device *pci_dev)
159 {
160         char name[RTE_RAWDEV_NAME_MAX_LEN];
161         struct rte_rawdev *rawdev;
162
163         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
164                 return 0;
165
166         if (pci_dev == NULL) {
167                 plt_err("invalid pci_dev");
168                 return -EINVAL;
169         }
170
171         rawdev = rte_rawdev_pmd_get_named_dev(name);
172         if (rawdev == NULL) {
173                 plt_err("invalid device name (%s)", name);
174                 return -EINVAL;
175         }
176
177         bphy_rawdev_get_name(name, pci_dev);
178
179         return rte_rawdev_pmd_release(rawdev);
180 }
181
182 static struct rte_pci_driver cnxk_bphy_rawdev_pmd = {
183         .id_table = pci_bphy_map,
184         .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
185         .probe = bphy_rawdev_probe,
186         .remove = bphy_rawdev_remove,
187 };
188
189 RTE_PMD_REGISTER_PCI(bphy_rawdev_pci_driver, cnxk_bphy_rawdev_pmd);
190 RTE_PMD_REGISTER_PCI_TABLE(bphy_rawdev_pci_driver, pci_bphy_map);
191 RTE_PMD_REGISTER_KMOD_DEP(bphy_rawdev_pci_driver, "vfio-pci");