From patchwork Wed Nov 15 14:00:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 118948 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp4347947qgn; Wed, 15 Nov 2017 06:01:24 -0800 (PST) X-Google-Smtp-Source: AGs4zMZEsfzys6smN6m0JLxApVopZuUBCFbEmmXwyNLQyW+Vov/KHdhz2W1A1speydPxh3k6IX3w X-Received: by 10.237.62.240 with SMTP id o45mr10563230qtf.141.1510754484118; Wed, 15 Nov 2017 06:01:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510754484; cv=none; d=google.com; s=arc-20160816; b=zdtMDCKKG95MAZEJnpBI9vag5dqVzDxMG3bqTp3tVTnTVpqkMkmi6nFN4lLx2NW5lz DzgT/zFYuvnd6HC3TpxqMQP7x9MqXDE7pD4khfgBEAjGq+pILf3PACY5sJX17a6avnWy SPz09nvdezVEWAPXkVRVGfGClj61KBa6fFUaYzvkji8wIpsNrEHOzUPkdfnvT6Eto1Ri IDKVIEl4kvY6R1ZWK4WTNxFlZbU9teTfAYTCjZPYFvT7pXjM3GlRbyxdsPwPgihSWO7m ULQN4JmeEJh7oKG8mtLVutdxDRHkF3iYEwNQrOjm1jgfEghn8gzfRxBDZHXrXHtwMrRx iWRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=LUL/dWDC1NvvPIupsvHFU5cGVvp1x3+VM8h7pCSiD0A=; b=uRuVJ17a1GLUmKHMJli3IfpTGjNYOuuJABgwLQ3zxAUozfKMoTosrt6wSnBogrrN+2 qbDZ4HcR1bydw5faQqDp+fzmHgTguCKK04OQx64NbFxFrq57SKzXh+wahu701v9RLnLA RpCnmj5OPTxkI53viUE233VSfRB4HgWdbGr0NuSrWAAIPJWWI8oXf+048kFs8t5T6kOi /4bUooFIl+xJK4p/SeotWCRVkPck26GYdxoQ9kliQsaP0FJbwh2GRobQaiwRyxf/j8Si 9y84SaCPqRxFN1Aa2Lh2jBshAB+Z0IZJ5KqWHQLtG8GNXvsinctovDqA2mBX9L3VkxKy 3ZOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id u63si7131675qkf.3.2017.11.15.06.01.23; Wed, 15 Nov 2017 06:01:24 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id A02056069B; Wed, 15 Nov 2017 14:01:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id A6D5A606A8; Wed, 15 Nov 2017 14:00:23 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id D3CD360690; Wed, 15 Nov 2017 14:00:14 +0000 (UTC) Received: from forward100o.mail.yandex.net (forward100o.mail.yandex.net [37.140.190.180]) by lists.linaro.org (Postfix) with ESMTPS id E0F6060388 for ; Wed, 15 Nov 2017 14:00:11 +0000 (UTC) Received: from mxback6j.mail.yandex.net (mxback6j.mail.yandex.net [IPv6:2a02:6b8:0:1619::10f]) by forward100o.mail.yandex.net (Yandex) with ESMTP id C0DAC2A24291 for ; Wed, 15 Nov 2017 17:00:10 +0300 (MSK) Received: from smtp4j.mail.yandex.net (smtp4j.mail.yandex.net [2a02:6b8:0:1619::15:6]) by mxback6j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id p6GRLTdxLf-0AXW5USV; Wed, 15 Nov 2017 17:00:10 +0300 Received: by smtp4j.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id X7yJPuILUe-0AAKgb61; Wed, 15 Nov 2017 17:00:10 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Wed, 15 Nov 2017 17:00:07 +0300 Message-Id: <1510754407-26001-2-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1510754407-26001-1-git-send-email-odpbot@yandex.ru> References: <1510754407-26001-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 295 Subject: [lng-odp] [PATCH 2.0 v1 1/1] driver.h: add parameter when registering enumerators X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Josep Puigdemont If a class registers more than once the same enumerator, as it could happen for different PCI platforms, we need to provide information for the enumerator probe function to know where to act. This information shall be provided in the odpdrv_enumr_param_t structure as a void pointer, which will be passed to the probe() function of the enumerator. Signed-off-by: Josep Puigdemont --- /** Email created from pull request 295 (joseppc:add-enumr-param) ** https://github.com/Linaro/odp/pull/295 ** Patch: https://github.com/Linaro/odp/pull/295.patch ** Base sha: 6cd43041e55bd73a02ca202f835e590b3ad5c354 ** Merge commit sha: cc280a5b4bf3aa7e93683c44cf1f215dfc33070e **/ example/ddf_ifs/ddf_ifs_enumr_dpdk.c | 4 +- example/ddf_ifs/ddf_ifs_enumr_generic.c | 4 +- include/odp/drv/spec/driver.h | 10 ++++- platform/linux-generic/drv_driver.c | 4 +- test/validation/drv/drvdriver/drvdriver_device.c | 11 ++--- test/validation/drv/drvdriver/drvdriver_driver.c | 18 ++++---- test/validation/drv/drvdriver/drvdriver_enumr.c | 52 ++++++++++++++---------- 7 files changed, 61 insertions(+), 42 deletions(-) diff --git a/example/ddf_ifs/ddf_ifs_enumr_dpdk.c b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c index 782f7b745..258865dfc 100644 --- a/example/ddf_ifs/ddf_ifs_enumr_dpdk.c +++ b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c @@ -17,7 +17,7 @@ static odpdrv_enumr_t dpdk_enumr; static odpdrv_device_t dpdk_dev[DDF_DPDK_DEV_MAX]; static int dpdk_dev_cnt; -static int dpdk_enumr_probe(void) +static int dpdk_enumr_probe(void *data __attribute__((__unused__))) { int dpdk_dev_cnt_detected = TEST_DPDK_DEV_CNT; /* detected with dpdk APIs*/ @@ -46,7 +46,7 @@ static int dpdk_enumr_probe(void) return 0; } -static int dpdk_enumr_remove(void) +static int dpdk_enumr_remove(void *data __attribute__((__unused__))) { printf("%s()\n", __func__); return 0; diff --git a/example/ddf_ifs/ddf_ifs_enumr_generic.c b/example/ddf_ifs/ddf_ifs_enumr_generic.c index f5e1a2cbb..5cfa1d9ae 100644 --- a/example/ddf_ifs/ddf_ifs_enumr_generic.c +++ b/example/ddf_ifs/ddf_ifs_enumr_generic.c @@ -11,13 +11,13 @@ static odpdrv_enumr_t gen_enumr; -static int gen_enumr_probe(void) +static int gen_enumr_probe(void *data __attribute__((__unused__))) { printf("%s() - no devices found\n", __func__); return 0; } -static int gen_enumr_remove(void) +static int gen_enumr_remove(void *data __attribute__((__unused__))) { printf("%s()\n", __func__); return 0; diff --git a/include/odp/drv/spec/driver.h b/include/odp/drv/spec/driver.h index 224baf4fe..51baedb5a 100644 --- a/include/odp/drv/spec/driver.h +++ b/include/odp/drv/spec/driver.h @@ -205,12 +205,12 @@ struct odpdrv_enumr_param_t { * Called by ODP when it is ready for device creation/deletion * returns an negative value on error or 0 on success. */ - int (*probe)(void); + int (*probe)(void *enumr_data); /** Remove function: * destroy all enumerated devices and release all resources */ - int (*remove)(void); + int (*remove)(void *enumr_data); /** Register event notifier function for hotplug events: * register_notifier(fcnt,event_mask) registers fcnt as a callback when @@ -218,6 +218,12 @@ struct odpdrv_enumr_param_t { */ int (*register_notifier)(void (*event_handler) (uint64_t event), int64_t event_mask); + + /** Class dependent part + * This part is allocated by the enumerator class for use by the + * enumerator, it is passed as a parameter to the probe function. + */ + void *enumr_data; }; /* The following events are supported by enumerators */ diff --git a/platform/linux-generic/drv_driver.c b/platform/linux-generic/drv_driver.c index ecf75ab9d..cfb42f119 100644 --- a/platform/linux-generic/drv_driver.c +++ b/platform/linux-generic/drv_driver.c @@ -851,7 +851,7 @@ void _odpdrv_driver_probe_drv_items(void) enumr = enumr_lst.head; while (enumr) { if (!enumr->probed) { - enumr->param.probe(); + enumr->param.probe(enumr->param.enumr_data); enumr->probed = 1; } enumr = enumr->next; @@ -1055,7 +1055,7 @@ int _odpdrv_driver_term_global(void) while (enumr_lst.head) { enumr = enumr_lst.head; if (enumr->param.remove) { /* run remove callback, if any */ - if (enumr->param.remove()) + if (enumr->param.remove(enumr->param.enumr_data)) ODP_ERR("Enumerator (API %s) removal failed.\n", enumr->param.api_name); } diff --git a/test/validation/drv/drvdriver/drvdriver_device.c b/test/validation/drv/drvdriver/drvdriver_device.c index d010026ff..eaf7dcfa5 100644 --- a/test/validation/drv/drvdriver/drvdriver_device.c +++ b/test/validation/drv/drvdriver/drvdriver_device.c @@ -22,8 +22,8 @@ typedef struct dev_enumr_data_t { /* enumerator data for registered devices */ #define NB_DEVICES 5 /* forward declaration */ -static int enumr1_probe(void); -static int enumr1_remove(void); +static int enumr1_probe(void *); +static int enumr1_remove(void *); static int enumr_class1_probe(void); static int enumr_class1_remove(void); @@ -68,7 +68,8 @@ static odpdrv_enumr_t enumr1_register(void) .api_version = 1, .probe = enumr1_probe, .remove = enumr1_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL }; enumr1 = odpdrv_enumr_register(¶m); @@ -76,7 +77,7 @@ static odpdrv_enumr_t enumr1_register(void) } /*enumerator probe functions, just making sure they have been run: */ -static int enumr1_probe(void) +static int enumr1_probe(void *enumr_data __attribute__((__unused__))) { int dev; odpdrv_shm_t shm; @@ -128,7 +129,7 @@ static void enumr5_device_destroy_terminate(void *priv_data) } /*enumerator remove functions, to remove the enumerated devices: */ -static int enumr1_remove(void) +static int enumr1_remove(void *data __attribute__((__unused__))) { odpdrv_device_t *my_devices; odpdrv_device_t *dev; diff --git a/test/validation/drv/drvdriver/drvdriver_driver.c b/test/validation/drv/drvdriver/drvdriver_driver.c index edcb0f43f..eeb424cc7 100644 --- a/test/validation/drv/drvdriver/drvdriver_driver.c +++ b/test/validation/drv/drvdriver/drvdriver_driver.c @@ -56,10 +56,10 @@ static int driver1_probed_index; static int driver2_probed_index; /* forward declaration */ -static int enumr1_probe(void); -static int enumr2_probe(void); -static int enumr1_remove(void); -static int enumr2_remove(void); +static int enumr1_probe(void *); +static int enumr2_probe(void *); +static int enumr1_remove(void *); +static int enumr2_remove(void *); static int enumr_class1_probe(void); static int enumr_class2_probe(void); static int driver1_probe(odpdrv_device_t dev, odpdrv_devio_t devio, int idx); @@ -167,8 +167,10 @@ static int enumr_class2_probe(void) return 0; } +#define UNUSED __attribute__((__unused__)) + /*enumerator probe functions, creating four devices each: */ -static int enumr1_probe(void) +static int enumr1_probe(void *enumr_data UNUSED) { int dev; @@ -189,7 +191,7 @@ static int enumr1_probe(void) return 0; } -static int enumr2_probe(void) +static int enumr2_probe(void *enumr_data UNUSED) { int dev; @@ -211,7 +213,7 @@ static int enumr2_probe(void) } /*enumerator remove functions, to remove the enumerated devices: */ -static int enumr1_remove(void) +static int enumr1_remove(void *data UNUSED) { odpdrv_device_t *my_devices; odpdrv_device_t *dev; @@ -231,7 +233,7 @@ static int enumr1_remove(void) return 0; } -static int enumr2_remove(void) +static int enumr2_remove(void *data UNUSED) { odpdrv_device_t *my_devices; odpdrv_device_t *dev; diff --git a/test/validation/drv/drvdriver/drvdriver_enumr.c b/test/validation/drv/drvdriver/drvdriver_enumr.c index 38aac3d03..58d0e42cb 100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr.c +++ b/test/validation/drv/drvdriver/drvdriver_enumr.c @@ -20,15 +20,15 @@ static int enumr3_probed; static int enumr4_probed; /* forward declaration */ -static int enumr1_probe(void); -static int enumr2_probe(void); -static int enumr3_probe(void); -static int enumr4_probe(void); +static int enumr1_probe(void *); +static int enumr2_probe(void *); +static int enumr3_probe(void *); +static int enumr4_probe(void *); -static int enumr1_remove(void); -static int enumr2_remove(void); -static int enumr3_remove(void); -static int enumr4_remove(void); +static int enumr1_remove(void *); +static int enumr2_remove(void *); +static int enumr3_remove(void *); +static int enumr4_remove(void *); static int enumr_class1_probe(void); static int enumr_class2_probe(void); @@ -68,6 +68,8 @@ static int tests_global_term(void) return 0; } +#define ENUMR1_PROBE_DATA (void *)0x1000 + /*enumerator register functions */ static odpdrv_enumr_t enumr1_register(void) { @@ -77,7 +79,8 @@ static odpdrv_enumr_t enumr1_register(void) .api_version = 1, .probe = enumr1_probe, .remove = enumr1_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = ENUMR1_PROBE_DATA }; return odpdrv_enumr_register(¶m); @@ -91,7 +94,8 @@ static odpdrv_enumr_t enumr2_register(void) .api_version = 1, .probe = enumr2_probe, .remove = enumr2_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL }; return odpdrv_enumr_register(¶m); @@ -105,7 +109,8 @@ static odpdrv_enumr_t enumr3_register(void) .api_version = 1, .probe = enumr3_probe, .remove = enumr3_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL }; return odpdrv_enumr_register(¶m); @@ -119,7 +124,8 @@ static odpdrv_enumr_t enumr4_register(void) .api_version = 1, .probe = enumr4_probe, .remove = enumr4_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL }; return odpdrv_enumr_register(¶m); @@ -133,57 +139,61 @@ static odpdrv_enumr_t enumr_invalid_register(void) .api_version = 1, .probe = enumr4_probe, .remove = enumr4_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL }; return odpdrv_enumr_register(¶m); } /*enumerator probe functions, just making sure they have been run: */ -static int enumr1_probe(void) +static int enumr1_probe(void *data) { + CU_ASSERT(data == ENUMR1_PROBE_DATA); enumr1_probed = 1; return 0; } -static int enumr2_probe(void) +#define UNUSED __attribute__((__unused__)) + +static int enumr2_probe(void *data UNUSED) { enumr2_probed = 1; return 0; } -static int enumr3_probe(void) +static int enumr3_probe(void *data UNUSED) { enumr3_probed = 1; return 0; } -static int enumr4_probe(void) +static int enumr4_probe(void *data UNUSED) { enumr4_probed = 1; return 0; } /*enumerator remove functions, just making sure they have been run: */ -static int enumr1_remove(void) +static int enumr1_remove(void *data UNUSED) { enumr1_probed = -1; return 0; } -static int enumr2_remove(void) +static int enumr2_remove(void *data UNUSED) { enumr2_probed = -1; return 0; } -static int enumr3_remove(void) +static int enumr3_remove(void *data UNUSED) { enumr3_probed = -1; return 0; } -static int enumr4_remove(void) +static int enumr4_remove(void *data UNUSED) { enumr4_probed = -1; return 0;