1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation
7 #include <rte_common.h>
10 #include <rte_malloc.h>
11 #include <rte_mempool.h>
12 #include <rte_errno.h>
14 #include <rte_bus_pci.h>
15 #include <rte_byteorder.h>
17 #include <rte_bbdev.h>
18 #include <rte_bbdev_pmd.h>
20 #include "fpga_5gnr_fec.h"
22 /* 5GNR SW PMD logging ID */
23 static int fpga_5gnr_fec_logtype;
26 fpga_dev_close(struct rte_bbdev *dev __rte_unused)
31 static const struct rte_bbdev_ops fpga_ops = {
32 .close = fpga_dev_close,
35 /* Initialization Function */
37 fpga_5gnr_fec_init(struct rte_bbdev *dev, struct rte_pci_driver *drv)
39 struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(dev->device);
41 dev->dev_ops = &fpga_ops;
43 ((struct fpga_5gnr_fec_device *) dev->data->dev_private)->pf_device =
44 !strcmp(drv->driver.name,
45 RTE_STR(FPGA_5GNR_FEC_PF_DRIVER_NAME));
46 ((struct fpga_5gnr_fec_device *) dev->data->dev_private)->mmio_base =
47 pci_dev->mem_resource[0].addr;
50 "Init device %s [%s] @ virtaddr %p phyaddr %#"PRIx64,
51 dev->device->driver->name, dev->data->name,
52 (void *)pci_dev->mem_resource[0].addr,
53 pci_dev->mem_resource[0].phys_addr);
57 fpga_5gnr_fec_probe(struct rte_pci_driver *pci_drv,
58 struct rte_pci_device *pci_dev)
60 struct rte_bbdev *bbdev = NULL;
61 char dev_name[RTE_BBDEV_NAME_MAX_LEN];
63 if (pci_dev == NULL) {
64 rte_bbdev_log(ERR, "NULL PCI device");
68 rte_pci_device_name(&pci_dev->addr, dev_name, sizeof(dev_name));
70 /* Allocate memory to be used privately by drivers */
71 bbdev = rte_bbdev_allocate(pci_dev->device.name);
75 /* allocate device private memory */
76 bbdev->data->dev_private = rte_zmalloc_socket(dev_name,
77 sizeof(struct fpga_5gnr_fec_device),
79 pci_dev->device.numa_node);
81 if (bbdev->data->dev_private == NULL) {
83 "Allocate of %zu bytes for device \"%s\" failed",
84 sizeof(struct fpga_5gnr_fec_device), dev_name);
85 rte_bbdev_release(bbdev);
89 /* Fill HW specific part of device structure */
90 bbdev->device = &pci_dev->device;
91 bbdev->intr_handle = &pci_dev->intr_handle;
92 bbdev->data->socket_id = pci_dev->device.numa_node;
94 /* Invoke FEC FPGA device initialization function */
95 fpga_5gnr_fec_init(bbdev, pci_drv);
97 rte_bbdev_log_debug("bbdev id = %u [%s]",
98 bbdev->data->dev_id, dev_name);
104 fpga_5gnr_fec_remove(struct rte_pci_device *pci_dev)
106 struct rte_bbdev *bbdev;
114 bbdev = rte_bbdev_get_named_dev(pci_dev->device.name);
117 "Couldn't find HW dev \"%s\" to uninitialise it",
118 pci_dev->device.name);
121 dev_id = bbdev->data->dev_id;
123 /* free device private memory before close */
124 rte_free(bbdev->data->dev_private);
127 ret = rte_bbdev_close(dev_id);
130 "Device %i failed to close during uninit: %i",
133 /* release bbdev from library */
134 ret = rte_bbdev_release(bbdev);
136 rte_bbdev_log(ERR, "Device %i failed to uninit: %i", dev_id,
139 rte_bbdev_log_debug("Destroyed bbdev = %u", dev_id);
144 /* FPGA 5GNR FEC PCI PF address map */
145 static struct rte_pci_id pci_id_fpga_5gnr_fec_pf_map[] = {
147 RTE_PCI_DEVICE(FPGA_5GNR_FEC_VENDOR_ID,
148 FPGA_5GNR_FEC_PF_DEVICE_ID)
153 static struct rte_pci_driver fpga_5gnr_fec_pci_pf_driver = {
154 .probe = fpga_5gnr_fec_probe,
155 .remove = fpga_5gnr_fec_remove,
156 .id_table = pci_id_fpga_5gnr_fec_pf_map,
157 .drv_flags = RTE_PCI_DRV_NEED_MAPPING
160 /* FPGA 5GNR FEC PCI VF address map */
161 static struct rte_pci_id pci_id_fpga_5gnr_fec_vf_map[] = {
163 RTE_PCI_DEVICE(FPGA_5GNR_FEC_VENDOR_ID,
164 FPGA_5GNR_FEC_VF_DEVICE_ID)
169 static struct rte_pci_driver fpga_5gnr_fec_pci_vf_driver = {
170 .probe = fpga_5gnr_fec_probe,
171 .remove = fpga_5gnr_fec_remove,
172 .id_table = pci_id_fpga_5gnr_fec_vf_map,
173 .drv_flags = RTE_PCI_DRV_NEED_MAPPING
177 RTE_PMD_REGISTER_PCI(FPGA_5GNR_FEC_PF_DRIVER_NAME, fpga_5gnr_fec_pci_pf_driver);
178 RTE_PMD_REGISTER_PCI_TABLE(FPGA_5GNR_FEC_PF_DRIVER_NAME,
179 pci_id_fpga_5gnr_fec_pf_map);
180 RTE_PMD_REGISTER_PCI(FPGA_5GNR_FEC_VF_DRIVER_NAME, fpga_5gnr_fec_pci_vf_driver);
181 RTE_PMD_REGISTER_PCI_TABLE(FPGA_5GNR_FEC_VF_DRIVER_NAME,
182 pci_id_fpga_5gnr_fec_vf_map);
184 RTE_INIT(fpga_5gnr_fec_init_log)
186 fpga_5gnr_fec_logtype = rte_log_register("pmd.bb.fpga_5gnr_fec");
187 if (fpga_5gnr_fec_logtype >= 0)
188 #ifdef RTE_LIBRTE_BBDEV_DEBUG
189 rte_log_set_level(fpga_5gnr_fec_logtype, RTE_LOG_DEBUG);
191 rte_log_set_level(fpga_5gnr_fec_logtype, RTE_LOG_NOTICE);