1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2016-2017 Cavium, Inc 3 */ 4 5 #ifndef _RTE_EVENTDEV_PMD_PCI_H_ 6 #define _RTE_EVENTDEV_PMD_PCI_H_ 7 8 /** @file 9 * RTE Eventdev PCI PMD APIs 10 * 11 * @note 12 * These API are from event PCI PMD only and user applications should not call 13 * them directly. 14 */ 15 16 #include <string.h> 17 18 #include <rte_config.h> 19 #include <rte_eal.h> 20 #include <rte_lcore.h> 21 #include <rte_pci.h> 22 #include <rte_bus_pci.h> 23 24 #include "eventdev_pmd.h" 25 26 typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev); 27 28 /** 29 * @internal 30 * Wrapper for use by pci drivers as a .probe function to attach to an event 31 * interface. Same as rte_event_pmd_pci_probe, except caller can specify 32 * the name. 33 */ 34 __rte_experimental 35 static inline int 36 rte_event_pmd_pci_probe_named(struct rte_pci_driver *pci_drv, 37 struct rte_pci_device *pci_dev, 38 size_t private_data_size, 39 eventdev_pmd_pci_callback_t devinit, 40 const char *name) 41 { 42 struct rte_eventdev *eventdev; 43 int retval; 44 45 if (devinit == NULL) 46 return -EINVAL; 47 48 eventdev = rte_event_pmd_allocate(name, 49 pci_dev->device.numa_node); 50 if (eventdev == NULL) 51 return -ENOMEM; 52 53 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 54 eventdev->data->dev_private = 55 rte_zmalloc_socket( 56 "eventdev private structure", 57 private_data_size, 58 RTE_CACHE_LINE_SIZE, 59 rte_socket_id()); 60 61 if (eventdev->data->dev_private == NULL) 62 rte_panic("Cannot allocate memzone for private " 63 "device data"); 64 } 65 66 eventdev->dev = &pci_dev->device; 67 68 /* Invoke PMD device initialization function */ 69 retval = devinit(eventdev); 70 if (retval == 0) 71 return 0; 72 73 RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)" 74 " failed", pci_drv->driver.name, 75 (unsigned int) pci_dev->id.vendor_id, 76 (unsigned int) pci_dev->id.device_id); 77 78 rte_event_pmd_release(eventdev); 79 80 return -ENXIO; 81 } 82 83 /** 84 * @internal 85 * Wrapper for use by pci drivers as a .probe function to attach to a event 86 * interface. 87 */ 88 static inline int 89 rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv, 90 struct rte_pci_device *pci_dev, 91 size_t private_data_size, 92 eventdev_pmd_pci_callback_t devinit) 93 { 94 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; 95 96 rte_pci_device_name(&pci_dev->addr, eventdev_name, 97 sizeof(eventdev_name)); 98 99 return rte_event_pmd_pci_probe_named(pci_drv, 100 pci_dev, 101 private_data_size, 102 devinit, 103 eventdev_name); 104 } 105 106 /** 107 * @internal 108 * Wrapper for use by pci drivers as a .remove function to detach a event 109 * interface. 110 */ 111 static inline int 112 rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev, 113 eventdev_pmd_pci_callback_t devuninit) 114 { 115 struct rte_eventdev *eventdev; 116 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; 117 int ret = 0; 118 119 if (pci_dev == NULL) 120 return -EINVAL; 121 122 rte_pci_device_name(&pci_dev->addr, eventdev_name, 123 sizeof(eventdev_name)); 124 125 eventdev = rte_event_pmd_get_named_dev(eventdev_name); 126 if (eventdev == NULL) 127 return -ENODEV; 128 129 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 130 ret = rte_event_dev_close(eventdev->data->dev_id); 131 if (ret < 0) 132 return ret; 133 } 134 135 /* Invoke PMD device un-init function */ 136 if (devuninit) 137 ret = devuninit(eventdev); 138 if (ret) 139 return ret; 140 141 /* Free event device */ 142 rte_event_pmd_release(eventdev); 143 144 eventdev->dev = NULL; 145 146 return 0; 147 } 148 149 #endif /* _RTE_EVENTDEV_PMD_PCI_H_ */ 150