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_internal 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 event_dev_probing_finish(eventdev); 72 return 0; 73 } 74 75 RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)" 76 " failed", pci_drv->driver.name, 77 (unsigned int) pci_dev->id.vendor_id, 78 (unsigned int) pci_dev->id.device_id); 79 80 rte_event_pmd_release(eventdev); 81 82 return -ENXIO; 83 } 84 85 /** 86 * @internal 87 * Wrapper for use by pci drivers as a .probe function to attach to a event 88 * interface. 89 */ 90 __rte_internal 91 static inline int 92 rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv, 93 struct rte_pci_device *pci_dev, 94 size_t private_data_size, 95 eventdev_pmd_pci_callback_t devinit) 96 { 97 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; 98 99 rte_pci_device_name(&pci_dev->addr, eventdev_name, 100 sizeof(eventdev_name)); 101 102 return rte_event_pmd_pci_probe_named(pci_drv, 103 pci_dev, 104 private_data_size, 105 devinit, 106 eventdev_name); 107 } 108 109 /** 110 * @internal 111 * Wrapper for use by pci drivers as a .remove function to detach a event 112 * interface. 113 */ 114 __rte_internal 115 static inline int 116 rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev, 117 eventdev_pmd_pci_callback_t devuninit) 118 { 119 struct rte_eventdev *eventdev; 120 char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; 121 int ret = 0; 122 123 if (pci_dev == NULL) 124 return -EINVAL; 125 126 rte_pci_device_name(&pci_dev->addr, eventdev_name, 127 sizeof(eventdev_name)); 128 129 eventdev = rte_event_pmd_get_named_dev(eventdev_name); 130 if (eventdev == NULL) 131 return -ENODEV; 132 133 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 134 ret = rte_event_dev_close(eventdev->data->dev_id); 135 if (ret < 0) 136 return ret; 137 } 138 139 /* Invoke PMD device un-init function */ 140 if (devuninit) 141 ret = devuninit(eventdev); 142 if (ret) 143 return ret; 144 145 /* Free event device */ 146 rte_event_pmd_release(eventdev); 147 148 eventdev->dev = NULL; 149 150 return 0; 151 } 152 153 #endif /* _RTE_EVENTDEV_PMD_PCI_H_ */ 154