From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0042.outbound.protection.outlook.com [104.47.42.42]) by dpdk.org (Postfix) with ESMTP id A38FB10BB8 for ; Wed, 21 Dec 2016 10:26:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=9H7v+NlahSTbDY5j3fHpWfFACJ7SqyiA1zpQuutY6DQ=; b=jwyZcrjvovgWHZqKxSMQOPtXvQJnp4bXFdOwYLRxzIlEKRlU7geJ4K/tge1X8O4MDJQs17ys8FpY0Jaly5MhkqFqeFScyQLASrscLJTy1bulA+HsvODsrd6Ixjd1j23LhYqpf3egloKmDTrcqSVVcF6kMAM/aO4+mYqGRD65yWc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Jerin.Jacob@cavium.com; Received: from localhost.localdomain.localdomain (14.140.2.178) by CY1PR0701MB1728.namprd07.prod.outlook.com (10.163.21.142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.789.14; Wed, 21 Dec 2016 09:26:34 +0000 From: Jerin Jacob To: CC: , , , , , Jerin Jacob Date: Wed, 21 Dec 2016 14:55:24 +0530 Message-ID: <1482312326-2589-5-git-send-email-jerin.jacob@caviumnetworks.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1482312326-2589-1-git-send-email-jerin.jacob@caviumnetworks.com> References: <1480996340-29871-1-git-send-email-jerin.jacob@caviumnetworks.com> <1482312326-2589-1-git-send-email-jerin.jacob@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: PN1PR01CA0075.INDPRD01.PROD.OUTLOOK.COM (10.174.144.143) To CY1PR0701MB1728.namprd07.prod.outlook.com (10.163.21.142) X-MS-Office365-Filtering-Correlation-Id: 432228b7-38fb-486c-80c2-08d4298376b8 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:CY1PR0701MB1728; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1728; 3:FuE6R4qZsbWvph3FTq/SzuGquCqxECM+sjUtatY4lPEZnnHiDWZvs+zrAr+GDoB9xd+41fFlx8IBh3lMfAsAmr7NjrkEIhRbosVaneI2vIUlasVFlQJdvOr3oI0O27wxxn8XeyU3cpbJ8cUvkqw24dL4elwvMzElhkt31CPGEMnisWZ1mIzvee3/eR+/CQUQbtIrJU94ph0t+9PiT7O0gXxOZ/Qo3mdXA7KLJLiQlb5FgfuppLYLonvY7XgDOP9EWxiqUTgn/BecBZDsIoLHZQ==; 25:EddGCk9Gm/XLV32W8eqcHOD3orimA/71yxb6BlrqR61+TTv+39rIShc1SwTUNMi7y1XbHyKtlnxP9gK3shESJdbY6XGL+N5l0Rgsyemx3Mx+H+N9gt/Jvs1bU3hpicZNL1eNBkWoSOsh6nLbRti1x6j+/VxOfgYbhYzFRR4nxJZwEf8N0siNTTEZe+2vpkpG7WMOnP38B03fS+CmK61hveAENtB6Gud2FRBQR1taYCoqBTZsNdMAUeSeLMmb4pcBf8vYTDMiaED+/sNc8mW57Tz+kzL8VlK0KUciFrH0NvbDq4tRGwbDjvcv/6ZDwIr2djHM9DV8SfJHQ4frCKGihTGY94jEYbSLID9wB8ptB6EpNXDtky+0jgkms3sU1umAqpBfV4NnRU5m5lv3DMS8ojdkHdkc8Ulir4DcqPnRjRMYfuoB6ZuYjqAsD6G6dnDzoK9n1wAsqWotZPoW1zICtA== X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1728; 31:bKnUSivKDMwhhJxd2XTotY0BBUa+lwA8stmMcoSg75Hx1SU13r/FhLbNFUHxPyhtyFqdSK7UIdXgCBUCiaC3fpBPghjMVSy81JhxBPiWx7dkyy2ixJ2ukYgXmQaY/UGXtnkwDrKQf+HrGL1MdgSCNcTozMkA9a0Nq5YJ4Wbjy1hQ/VLYVMNTT8yzkKncqCPgNSp5Bp5NRJzxIB5uxk0MrTgcmaoXhheUaH7PxrmXu3tRju6Pgg+9umSFt4yhhnK+XR0ce28vt85PTFH6glmwoA==; 20:yH/8frnHgCJDwMzJ9nyYu+EuJQKJCb2dNEo/dJ24pzA3HvlAqPfLy+/aORnFswjSKW9LmbJGVx5daPN3FbIXSg1bDqo4NfB/xCrLb2Q4dQF7HMll63oGBn/U2GR39ZeQfHYfxvA5eVZJbDchkR/EkIxh5WyQOQimkDFXV6vY8w50L10ndOfpUNcnqRTc8/eCeA53ZJAsuKsaW31fBSetUK8AYtjQ8QUy72ctVNl/ofemVB7SdhgBLo7Tja1BLyEiEbD7jmYRCPs8lJe5rs8Os1Z14XHIdq6rZ6/WijIdSveFhYEWqjeJyrILfNCyIHGecJnuXzdMjBWFyC+MSzyDnuo87Mr9dkmIuaqFewspKkedAP7uvbDnVTC44UB+GcccexIHb2FwCopM3kgsnhOQ9wcYizp0sjkRy0r0kZq22d7OOmk9MJ5AxXa0HOQ1QL49r7imMLmpY92guaC6Cu95Xo5RKFYyfywJNqHjYpkKHL1Zmlg10SsSek7KP7Am7ZcUCxGx0x23/d4wNESdZSJ3pdV6pEx0LzJ8x2ChFkz3je+5kgCoIK3RPQXXTqMFHBVSp+HcnC8hL1hmaWHaMZbo7xZl7gYwz/RM/jOMbEGlbmo= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041248)(20161123560025)(20161123564025)(20161123562025)(20161123555025)(6072148); SRVR:CY1PR0701MB1728; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0701MB1728; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1728; 4:XZqB+hUM6ndi2X0GgBXjc1WDc6fFgbdAjvUTFp4ErlI3QUF7UxGCgt7Bedw5LcjjmY/ii12pmBYHP4Z03WiSs6dK4J6zRHyZxZez/qP8NNwhB5HAieOfO6134H4IDDiHxb/9iUMfgP91K00gzhbM/iAD03b/3incs3ZrvuHsNcCi6q/s3zQFZTQa8CELSBYJGEURZ9tM/E6xyCZUoXIY+s+unYg5Zc2eME5kKn5+aUBozqljacFgbyrfw5iGBTIHWPHTi1eNDiCjUDCSotynbzcelk2CSfVh7qBU76n22HqWwiluz0o96awHMGTMabmDmdxVjTKx8wuzOmxG1UVlWfzQaFbzZhjkhDq4yHRiW73YTlIaVrixQydGLdFkCBNPK7RKopsiyMCe4JS+7mxzmciZGMLNoV8eE/BAnPqkPQ/lKRnrPA4aVle5BWV6BJtPchNJD0a7er007U2mSSzIsjRMpH4yo9zj+r+yuu1miLlnGB44KolCV6i4woPr/nki2OPLYTziPFVT2wJGubREfrLJuH3NDBH3dVhYAJAjysGD77fduuJ08cWqtserQO3jgit3nPbr5UZG2TjUbCMlWd5mH5AJps6mTeQWIWQ49cCzILVK4spzaZ3BMptwmTWZ X-Forefront-PRVS: 01630974C0 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6069001)(6009001)(7916002)(39450400003)(199003)(189002)(7736002)(68736007)(92566002)(36756003)(105586002)(38730400001)(305945005)(4001430100002)(5009440100003)(106356001)(8676002)(81166006)(50226002)(8666006)(33646002)(81156014)(42186005)(5890100001)(2351001)(4326007)(76176999)(66066001)(101416001)(48376002)(50466002)(189998001)(110136003)(107886002)(6116002)(5003940100001)(5660300001)(47776003)(42882006)(97736004)(6916009)(2950100002)(6506006)(6512006)(2906002)(25786008)(6486002)(50986999)(3846002)(6666003)(7099028)(110426004)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB1728; H:localhost.localdomain.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0701MB1728; 23:N5B2yD+Lxoi6SS7bfgiS3obhEu9aqwys3Zi5jaP?= =?us-ascii?Q?MAQNA4XSESu48z0rLKITB7N3pJemCaVGC9sFcFk/dUzYAt/In+PMbh+GpYVm?= =?us-ascii?Q?YJ6vIPQqD6VYyREsGVLyd2dx1zghb1u5cvfvPZ7bgzguLAQBVHJqYiyOK1pi?= =?us-ascii?Q?BNavK95gzjQ3Z+zt7YYaG6Xdck3/hmBksafPjw6EP/t7JYebhHeHDzRmvpQb?= =?us-ascii?Q?KVVdgldVanjn+My4ony9lg+DHLHjiKwASCPc7kBJohqM1Vw1vG1I/SkJdEal?= =?us-ascii?Q?s9vwnEPWUcwBvsspP0YpFF6/hohGcc0qwtExh5VI/4dP9x42FWWL07raArq3?= =?us-ascii?Q?BweZvHpvYF0SnO0XOSeQrYB2wMzNjLVS+OgYJgwcMhHpEsAz9OUB1SxGdZco?= =?us-ascii?Q?7WUKSrxphJmMZ2iJT+uarG/H5AQSOnhvCnEPrXLHzJytpGmVoA43MVrlDZl5?= =?us-ascii?Q?DLfnyyNIQc42e4f75aZLqJCiWzxy1tXz5Pao9wVjg6YWd8AaMGgb7BlrYpDO?= =?us-ascii?Q?mQc89Ywy//RSfVSWMYLLjy+yZnrMwhLaoq0LbZyVpivxB1mE4HJMjYFjlwJW?= =?us-ascii?Q?bUhkD4M4iv4HYgdFim2vLwzZhTdERm4UwFKRR8yeC1RCv8YS3wgwjcLZrsIv?= =?us-ascii?Q?KvPbbNP6VLBIC2kR42yam6QofLOHfmYXAAtG77/GvJGoXUwdkmKac1u7F98N?= =?us-ascii?Q?T5BBjKUG2it1EJpN+zCEW84Aws8IfFdwVqf3uGUJ9zsmprdAxwQOgj6/JWM4?= =?us-ascii?Q?7xVeiqWrmWrafsEek+kIMpBPxeaSozCgbMuGNvUeP4C6l1SgT/zQKo7il3z1?= =?us-ascii?Q?BqfF/+93ZXdLjvYj+mSTkeTpMn15sBCwOltFxs33gQg40QoDuqclRfRMIgqN?= =?us-ascii?Q?h9x9mCASvG8pfrprSJuagw24AOdQFnEUmEjfmCh42QhgvY6SU235D3+MzBMg?= =?us-ascii?Q?9YrtLPxHARJdLx8ADkl+bufnCfs0uvuD3FcH6ZyDs48PFNHP4E2V/2MX11qZ?= =?us-ascii?Q?Is3gI7w9jNYjtfCQpoYxzIC3arA6lFmzS7tnQMRWw+sV9t6XFdafJgkTazqL?= =?us-ascii?Q?+jceB4A7hsq+PkUnjdNZYvv92Uwqg4YkFuOVhG7xz7SYHVrxMMvmTy98OJn/?= =?us-ascii?Q?b4ESb50iqYi1K3U7P0SI69g+EaJ9F5o1EJaRBVyM4c8zzlxdnrDt5nhA43MI?= =?us-ascii?Q?MhkhJs/RNWTKeVTZ8eoub3qigdQ9n/TiVbZY9pS5uujoeMX+2OcTW+wWtV1d?= =?us-ascii?Q?GyznxvHpeIPKPx7Rk9aCnHv8NbmprPP2N/UyNhuHdI/hRz20EeEzcTiqn1y7?= =?us-ascii?Q?RElNApAdB5OCKcSdL2frIL98=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1728; 6:Iq7MOly/BmO9KZJZDYk5sX6XQj2xkIoYIjzUns85B9Ak30oJH56LXxHRUTWZwcSUVFk6oBlRPinrfQlE/EQe6jzAoejucZFcyab6Js9doC/xXfIvG9cnSk5TFOtCFhGvuizHQXE6+vNhgalhr/TIyy/wcaVgm8AGW6s2e2R0Wh//1HDETag8ZBzPAr0IH83qy8j+U1CrqG5YqxzEgeiXeQXDJZ+qWEYM7pKiCG58y1W/2PNaqknxTlBGFXibKtT75MAE2719AOKyNkWkQDSqYbCZywYfB0wo54jQQEpGLkHtnw4Lgdziezd5wMS/RIzM5zckhixY7L5ahpSsTwxdYCTwpNUq6sbYrY8JW/MB2fEp2cb7PQ8Yem1rSqrVDDypY4QQNMAD8HwCGoKcLD7hE93/e/LjLY7yLb0sb3Ew5OE=; 5:gMKL1ECW9jH5+OpwJ1rttO8JhvqedVbQDSM/FwfrXDFE8EuRU9X08+AxfM6vUe5MjbCi5QyeQ3ykEi66MKheEl2qklg5vAdomO64VLjin9FhWZktOoUcgaVjWiJfZycYpRdyzeKSX+0y3EkTvf8Rsg==; 24:hVJ6y0VMX9eV33IffsmrxkQRn3IsOw/dC7qdFj9bIrEydTM+P5j9/XgPr4bXEFC9Gi6DTET95sKh/cMCgSctQRQeRhOzBqhdVqHJm9rpTh0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1728; 7:mrxeC/Gp0ndb/EiozThqDZMOcM05m7AM/nlmtM6e8csMaAcypkBAOeW3fdit39UUQSxiDpRKQvAxLMBEk9Mn4Y6DwdWmeNlu/skm5mouEiSNyDuM4rsFZqi4KvWEiQOBYHkNLpiLfM7whISvrt3Jo/b+vy2gcmY2Erg2oVEU68kje0jGH1OQOFBsuz6xdo43/59tS6WFgk93I/VkM9FGK8Tv1sSn6/ERy61BFhnFUqhINWOhA87NB7Cd9V46dJz9+b2LuUvTGwM2mFKjKzXRjZ/dY9XU22jFTRQWKIJeGwAIU0Idqh8HYxuw3voKy8VR93HR0RoLQBpJhJ5AY6RXQce2Ulc0eioT4iUha0CDZJS6ar9YXeXEX4iQN0LFVMYGRvw9NYTJG1CTVjjeiEyem2u/VIDjJ4b1vHoVuyICqmW0P4k1JuOTq/vgstCOW8tTNbPw/NY788yyMoI8SaaeXg== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Dec 2016 09:26:34.3574 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0701MB1728 Subject: [dpdk-dev] [PATCH v4 4/6] eventdev: implement PMD registration functions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Dec 2016 09:26:40 -0000 This patch adds infrastructure for registering the vdev or the PCI based event device. Signed-off-by: Jerin Jacob Acked-by: Bruce Richardson --- lib/librte_eventdev/rte_eventdev.c | 236 +++++++++++++++++++++++++++ lib/librte_eventdev/rte_eventdev_pmd.h | 111 +++++++++++++ lib/librte_eventdev/rte_eventdev_version.map | 6 + 3 files changed, 353 insertions(+) diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c index b13eb00..c8f3e94 100644 --- a/lib/librte_eventdev/rte_eventdev.c +++ b/lib/librte_eventdev/rte_eventdev.c @@ -126,6 +126,8 @@ rte_event_dev_info_get(uint8_t dev_id, struct rte_event_dev_info *dev_info) dev_info->dequeue_timeout_ns = dev->data->dev_conf.dequeue_timeout_ns; dev_info->pci_dev = dev->pci_dev; + if (dev->driver) + dev_info->driver_name = dev->driver->pci_drv.driver.name; return 0; } @@ -984,3 +986,237 @@ rte_event_dev_close(uint8_t dev_id) return (*dev->dev_ops->dev_close)(dev); } + +static inline int +rte_eventdev_data_alloc(uint8_t dev_id, struct rte_eventdev_data **data, + int socket_id) +{ + char mz_name[RTE_EVENTDEV_NAME_MAX_LEN]; + const struct rte_memzone *mz; + int n; + + /* Generate memzone name */ + n = snprintf(mz_name, sizeof(mz_name), "rte_eventdev_data_%u", dev_id); + if (n >= (int)sizeof(mz_name)) + return -EINVAL; + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + mz = rte_memzone_reserve(mz_name, + sizeof(struct rte_eventdev_data), + socket_id, 0); + } else + mz = rte_memzone_lookup(mz_name); + + if (mz == NULL) + return -ENOMEM; + + *data = mz->addr; + if (rte_eal_process_type() == RTE_PROC_PRIMARY) + memset(*data, 0, sizeof(struct rte_eventdev_data)); + + return 0; +} + +static inline uint8_t +rte_eventdev_find_free_device_index(void) +{ + uint8_t dev_id; + + for (dev_id = 0; dev_id < RTE_EVENT_MAX_DEVS; dev_id++) { + if (rte_eventdevs[dev_id].attached == + RTE_EVENTDEV_DETACHED) + return dev_id; + } + return RTE_EVENT_MAX_DEVS; +} + +struct rte_eventdev * +rte_event_pmd_allocate(const char *name, int socket_id) +{ + struct rte_eventdev *eventdev; + uint8_t dev_id; + + if (rte_event_pmd_get_named_dev(name) != NULL) { + RTE_EDEV_LOG_ERR("Event device with name %s already " + "allocated!", name); + return NULL; + } + + dev_id = rte_eventdev_find_free_device_index(); + if (dev_id == RTE_EVENT_MAX_DEVS) { + RTE_EDEV_LOG_ERR("Reached maximum number of event devices"); + return NULL; + } + + eventdev = &rte_eventdevs[dev_id]; + + if (eventdev->data == NULL) { + struct rte_eventdev_data *eventdev_data = NULL; + + int retval = rte_eventdev_data_alloc(dev_id, &eventdev_data, + socket_id); + + if (retval < 0 || eventdev_data == NULL) + return NULL; + + eventdev->data = eventdev_data; + + snprintf(eventdev->data->name, RTE_EVENTDEV_NAME_MAX_LEN, + "%s", name); + + eventdev->data->dev_id = dev_id; + eventdev->data->socket_id = socket_id; + eventdev->data->dev_started = 0; + + eventdev->attached = RTE_EVENTDEV_ATTACHED; + + eventdev_globals.nb_devs++; + } + + return eventdev; +} + +int +rte_event_pmd_release(struct rte_eventdev *eventdev) +{ + int ret; + + if (eventdev == NULL) + return -EINVAL; + + ret = rte_event_dev_close(eventdev->data->dev_id); + if (ret < 0) + return ret; + + eventdev->attached = RTE_EVENTDEV_DETACHED; + eventdev_globals.nb_devs--; + eventdev->data = NULL; + + return 0; +} + +struct rte_eventdev * +rte_event_pmd_vdev_init(const char *name, size_t dev_private_size, + int socket_id) +{ + struct rte_eventdev *eventdev; + + /* Allocate device structure */ + eventdev = rte_event_pmd_allocate(name, socket_id); + if (eventdev == NULL) + return NULL; + + /* Allocate private device structure */ + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + eventdev->data->dev_private = + rte_zmalloc_socket("eventdev device private", + dev_private_size, + RTE_CACHE_LINE_SIZE, + socket_id); + + if (eventdev->data->dev_private == NULL) + rte_panic("Cannot allocate memzone for private device" + " data"); + } + + return eventdev; +} + +int +rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv, + struct rte_pci_device *pci_dev) +{ + struct rte_eventdev_driver *eventdrv; + struct rte_eventdev *eventdev; + + char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; + + int retval; + + eventdrv = (struct rte_eventdev_driver *)pci_drv; + if (eventdrv == NULL) + return -ENODEV; + + rte_eal_pci_device_name(&pci_dev->addr, eventdev_name, + sizeof(eventdev_name)); + + eventdev = rte_event_pmd_allocate(eventdev_name, + pci_dev->device.numa_node); + if (eventdev == NULL) + return -ENOMEM; + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + eventdev->data->dev_private = + rte_zmalloc_socket( + "eventdev private structure", + eventdrv->dev_private_size, + RTE_CACHE_LINE_SIZE, + rte_socket_id()); + + if (eventdev->data->dev_private == NULL) + rte_panic("Cannot allocate memzone for private " + "device data"); + } + + eventdev->pci_dev = pci_dev; + eventdev->driver = eventdrv; + + /* Invoke PMD device initialization function */ + retval = (*eventdrv->eventdev_init)(eventdev); + if (retval == 0) + return 0; + + RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)" + " failed", pci_drv->driver.name, + (unsigned int) pci_dev->id.vendor_id, + (unsigned int) pci_dev->id.device_id); + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) + rte_free(eventdev->data->dev_private); + + eventdev->attached = RTE_EVENTDEV_DETACHED; + eventdev_globals.nb_devs--; + + return -ENXIO; +} + +int +rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev) +{ + const struct rte_eventdev_driver *eventdrv; + struct rte_eventdev *eventdev; + char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN]; + int ret; + + if (pci_dev == NULL) + return -EINVAL; + + rte_eal_pci_device_name(&pci_dev->addr, eventdev_name, + sizeof(eventdev_name)); + + eventdev = rte_event_pmd_get_named_dev(eventdev_name); + if (eventdev == NULL) + return -ENODEV; + + eventdrv = (const struct rte_eventdev_driver *)pci_dev->driver; + if (eventdrv == NULL) + return -ENODEV; + + /* Invoke PMD device un-init function */ + if (*eventdrv->eventdev_uninit) { + ret = (*eventdrv->eventdev_uninit)(eventdev); + if (ret) + return ret; + } + + /* Free event device */ + rte_event_pmd_release(eventdev); + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) + rte_free(eventdev->data->dev_private); + + eventdev->pci_dev = NULL; + eventdev->driver = NULL; + + return 0; +} diff --git a/lib/librte_eventdev/rte_eventdev_pmd.h b/lib/librte_eventdev/rte_eventdev_pmd.h index e60eca9..c84c9a2 100644 --- a/lib/librte_eventdev/rte_eventdev_pmd.h +++ b/lib/librte_eventdev/rte_eventdev_pmd.h @@ -92,6 +92,60 @@ extern "C" { #define RTE_EVENTDEV_DETACHED (0) #define RTE_EVENTDEV_ATTACHED (1) +/** + * Initialisation function of a event driver invoked for each matching + * event PCI device detected during the PCI probing phase. + * + * @param dev + * The dev pointer is the address of the *rte_eventdev* structure associated + * with the matching device and which has been [automatically] allocated in + * the *rte_event_devices* array. + * + * @return + * - 0: Success, the device is properly initialised by the driver. + * In particular, the driver MUST have set up the *dev_ops* pointer + * of the *dev* structure. + * - <0: Error code of the device initialisation failure. + */ +typedef int (*eventdev_init_t)(struct rte_eventdev *dev); + +/** + * Finalisation function of a driver invoked for each matching + * PCI device detected during the PCI closing phase. + * + * @param dev + * The dev pointer is the address of the *rte_eventdev* structure associated + * with the matching device and which has been [automatically] allocated in + * the *rte_event_devices* array. + * + * @return + * - 0: Success, the device is properly finalised by the driver. + * In particular, the driver MUST free the *dev_ops* pointer + * of the *dev* structure. + * - <0: Error code of the device initialisation failure. + */ +typedef int (*eventdev_uninit_t)(struct rte_eventdev *dev); + +/** + * The structure associated with a PMD driver. + * + * Each driver acts as a PCI driver and is represented by a generic + * *event_driver* structure that holds: + * + * - An *rte_pci_driver* structure (which must be the first field). + * + * - The *eventdev_init* function invoked for each matching PCI device. + * + * - The size of the private data to allocate for each matching device. + */ +struct rte_eventdev_driver { + struct rte_pci_driver pci_drv; /**< The PMD is also a PCI driver. */ + unsigned int dev_private_size; /**< Size of device private data. */ + + eventdev_init_t eventdev_init; /**< Device init function. */ + eventdev_uninit_t eventdev_uninit; /**< Device uninit function. */ +}; + /** Global structure used for maintaining state of allocated event devices */ struct rte_eventdev_global { uint8_t nb_devs; /**< Number of devices found */ @@ -396,6 +450,63 @@ struct rte_eventdev_ops { /* Dump internal information */ }; +/** + * Allocates a new eventdev slot for an event device and returns the pointer + * to that slot for the driver to use. + * + * @param name + * Unique identifier name for each device + * @param socket_id + * Socket to allocate resources on. + * @return + * - Slot in the rte_dev_devices array for a new device; + */ +struct rte_eventdev * +rte_event_pmd_allocate(const char *name, int socket_id); + +/** + * Release the specified eventdev device. + * + * @param eventdev + * The *eventdev* pointer is the address of the *rte_eventdev* structure. + * @return + * - 0 on success, negative on error + */ +int +rte_event_pmd_release(struct rte_eventdev *eventdev); + +/** + * Creates a new virtual event device and returns the pointer to that device. + * + * @param name + * PMD type name + * @param dev_private_size + * Size of event PMDs private data + * @param socket_id + * Socket to allocate resources on. + * + * @return + * - Eventdev pointer if device is successfully created. + * - NULL if device cannot be created. + */ +struct rte_eventdev * +rte_event_pmd_vdev_init(const char *name, size_t dev_private_size, + int socket_id); + + +/** + * Wrapper for use by pci drivers as a .probe function to attach to a event + * interface. + */ +int rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv, + struct rte_pci_device *pci_dev); + +/** + * Wrapper for use by pci drivers as a .remove function to detach a event + * interface. + */ +int rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev); + #ifdef __cplusplus } #endif diff --git a/lib/librte_eventdev/rte_eventdev_version.map b/lib/librte_eventdev/rte_eventdev_version.map index 3cae03d..68b8c81 100644 --- a/lib/librte_eventdev/rte_eventdev_version.map +++ b/lib/librte_eventdev/rte_eventdev_version.map @@ -29,5 +29,11 @@ DPDK_17.02 { rte_event_dequeue_timeout_ticks; + rte_event_pmd_allocate; + rte_event_pmd_release; + rte_event_pmd_vdev_init; + rte_event_pmd_pci_probe; + rte_event_pmd_pci_remove; + local: *; }; -- 2.5.5