278e26af03a3fb9987b3d0ac242b42094a2645dd
[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         case CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET:
57                 bphy_dev->queues[queue].rsp = &bphy_dev->mem;
58                 break;
59         default:
60                 ret = -EINVAL;
61         }
62
63         return ret;
64 }
65
66 static int
67 cnxk_bphy_irq_dequeue_bufs(struct rte_rawdev *dev,
68                            struct rte_rawdev_buf **buffers, unsigned int count,
69                            rte_rawdev_obj_t context)
70 {
71         struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
72         unsigned int queue = (size_t)context;
73
74         if (queue >= RTE_DIM(bphy_dev->queues))
75                 return -EINVAL;
76
77         if (count == 0)
78                 return 0;
79
80         buffers[0]->buf_addr = bphy_dev->queues[queue].rsp;
81
82         return 0;
83 }
84
85 static uint16_t
86 cnxk_bphy_irq_queue_count(struct rte_rawdev *dev)
87 {
88         struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
89
90         return RTE_DIM(bphy_dev->queues);
91 }
92
93 static int
94 cnxk_bphy_irq_queue_def_conf(struct rte_rawdev *dev, uint16_t queue_id,
95                              rte_rawdev_obj_t queue_conf,
96                              size_t queue_conf_size)
97 {
98         RTE_SET_USED(dev);
99         RTE_SET_USED(queue_id);
100
101         if (queue_conf_size != sizeof(unsigned int))
102                 return -EINVAL;
103
104         *(unsigned int *)queue_conf = 1;
105
106         return 0;
107 }
108
109 static const struct rte_rawdev_ops bphy_rawdev_ops = {
110         .queue_def_conf = cnxk_bphy_irq_queue_def_conf,
111         .enqueue_bufs = cnxk_bphy_irq_enqueue_bufs,
112         .dequeue_bufs = cnxk_bphy_irq_dequeue_bufs,
113         .queue_count = cnxk_bphy_irq_queue_count,
114 };
115
116 static int
117 bphy_rawdev_probe(struct rte_pci_driver *pci_drv,
118                   struct rte_pci_device *pci_dev)
119 {
120         struct bphy_device *bphy_dev = NULL;
121         char name[RTE_RAWDEV_NAME_MAX_LEN];
122         struct rte_rawdev *bphy_rawdev;
123         int ret;
124
125         RTE_SET_USED(pci_drv);
126
127         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
128                 return 0;
129
130         if (!pci_dev->mem_resource[0].addr) {
131                 plt_err("BARs have invalid values: BAR0 %p\n BAR2 %p",
132                         pci_dev->mem_resource[0].addr,
133                         pci_dev->mem_resource[2].addr);
134                 return -ENODEV;
135         }
136
137         ret = roc_plt_init();
138         if (ret)
139                 return ret;
140
141         bphy_rawdev_get_name(name, pci_dev);
142         bphy_rawdev = rte_rawdev_pmd_allocate(name, sizeof(*bphy_dev),
143                                               rte_socket_id());
144         if (bphy_rawdev == NULL) {
145                 plt_err("Failed to allocate rawdev");
146                 return -ENOMEM;
147         }
148
149         bphy_rawdev->dev_ops = &bphy_rawdev_ops;
150         bphy_rawdev->device = &pci_dev->device;
151         bphy_rawdev->driver_name = pci_dev->driver->driver.name;
152
153         bphy_dev = (struct bphy_device *)bphy_rawdev->dev_private;
154         bphy_dev->mem.res0 = pci_dev->mem_resource[0];
155         bphy_dev->mem.res2 = pci_dev->mem_resource[2];
156
157         return 0;
158 }
159
160 static int
161 bphy_rawdev_remove(struct rte_pci_device *pci_dev)
162 {
163         char name[RTE_RAWDEV_NAME_MAX_LEN];
164         struct rte_rawdev *rawdev;
165
166         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
167                 return 0;
168
169         if (pci_dev == NULL) {
170                 plt_err("invalid pci_dev");
171                 return -EINVAL;
172         }
173
174         rawdev = rte_rawdev_pmd_get_named_dev(name);
175         if (rawdev == NULL) {
176                 plt_err("invalid device name (%s)", name);
177                 return -EINVAL;
178         }
179
180         bphy_rawdev_get_name(name, pci_dev);
181
182         return rte_rawdev_pmd_release(rawdev);
183 }
184
185 static struct rte_pci_driver cnxk_bphy_rawdev_pmd = {
186         .id_table = pci_bphy_map,
187         .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
188         .probe = bphy_rawdev_probe,
189         .remove = bphy_rawdev_remove,
190 };
191
192 RTE_PMD_REGISTER_PCI(bphy_rawdev_pci_driver, cnxk_bphy_rawdev_pmd);
193 RTE_PMD_REGISTER_PCI_TABLE(bphy_rawdev_pci_driver, pci_bphy_map);
194 RTE_PMD_REGISTER_KMOD_DEP(bphy_rawdev_pci_driver, "vfio-pci");