From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9C0C6A0557; Thu, 26 May 2022 08:05:44 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 42A1D40E64; Thu, 26 May 2022 08:05:44 +0200 (CEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2048.outbound.protection.outlook.com [40.107.22.48]) by mails.dpdk.org (Postfix) with ESMTP id 5BED740DF7 for ; Thu, 26 May 2022 08:05:43 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JENsMGMAlZJXod6LeAiKGlRx5Cu6nxF43JBK++frfe6DGxO/zPl9rXt0tLuaTlK6kcSNkJnRJ8nRSYThrs1/CPrMvvNBXIbve4XydBNkR/YANBFlyy+AChzukTyk2RFE8bW4ff9eVpSqNvHoyXVGvlNW8tBZC+cl7kNrxoeiY7+VGxfWNvzc9CSJIjwLqjj95eE1WZzzzDB3MMq8yHuiuizu+kCdejVxlSBeTTCgrq0TkzGgfG5GvPICm4o+F+UEoIHsHLiftqoyTarJq5JggNu+RIhAQY8lrpbfrAoekcAR2GN3tUW6mAV/Tjm9ECtR0bm/3bffz60iwi1kHMlCsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=as3ebGCPj1N6rhN3vDI2sJaajPkbMUZQyR4g8kXfGmY=; b=BVM+Q7yxMusx7ofxQHtQbfJ2l65HiISfDCG46hMlAjjkpSbr7jAsaU8Zi1Po+eu1XAC8rtdE/N1DV3BbgMS/p02PfZZc8Tik5OkqaDyyrG0stsKG6aq7/pZZghPVuC0oicev1fP9BZ5XdhowqD4ap+oFdAxC+xXJ/9160lDBY9IMyWeVGbETu9U1X29Cpgd9Scxu/73Z4TWE2aeWb3UMMRRmtEkcW4qZfXkmQHedDCF7Hs8KkpVE2iUnpBe2y5M3/7TS3lfnS/uhwKrcuOoYwzGloeifO+kQtfQsHe1uIUKjQdOd8EyylT/UH89x25Mnhb40gVC8/i6z0nfx+ekczw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=as3ebGCPj1N6rhN3vDI2sJaajPkbMUZQyR4g8kXfGmY=; b=Z74de+Ku0xHMMcMbvh/u7qZ5zTYB22HWTQuoAmyuBtQXHGUbC3K0k8nm7GhX15dpCd3TBlDbIcUKZvAh7y2F8OAD2nzDfLwNIdNyNr++zsqv44I5masIJtcA2y6+WQ2lpzPGscHLnQGqSKmahBYtzjq221w2TGE1u2aNe7CSEb8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS8PR04MB9064.eurprd04.prod.outlook.com (2603:10a6:20b:447::17) by DB7PR04MB5996.eurprd04.prod.outlook.com (2603:10a6:10:84::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5293.13; Thu, 26 May 2022 06:05:41 +0000 Received: from AS8PR04MB9064.eurprd04.prod.outlook.com ([fe80::4444:8f6f:d2ac:fb04]) by AS8PR04MB9064.eurprd04.prod.outlook.com ([fe80::4444:8f6f:d2ac:fb04%7]) with mapi id 15.20.5273.017; Thu, 26 May 2022 06:05:40 +0000 Message-ID: <02d1bd6c-b86f-bf81-3fb8-c2007497c1a5@oss.nxp.com> Date: Thu, 26 May 2022 11:35:32 +0530 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH v1] bbdev: add new operation for FFT processing Content-Language: en-US To: "Chautru, Nicolas" , "hemant.agrawal@nxp.com" Cc: "thomas@monjalon.net" , "Zhang, Mingshan" , "david.marchand@redhat.com" , "dev@dpdk.org" , "gakhil@marvell.com" , "trix@redhat.com" , "Vargas, Hernan" References: <1646956157-245769-1-git-send-email-nicolas.chautru@intel.com> <1646956157-245769-2-git-send-email-nicolas.chautru@intel.com> From: Hemant Agrawal In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SG2PR01CA0188.apcprd01.prod.exchangelabs.com (2603:1096:4:189::10) To AS8PR04MB9064.eurprd04.prod.outlook.com (2603:10a6:20b:447::17) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3824d3f2-2ae7-40fe-d0e0-08da3eddc2e3 X-MS-TrafficTypeDiagnostic: DB7PR04MB5996:EE_ X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4tiBsRo8sHkhdMu3HtN6XZ73p52wfrIN/sMQeAGNuUsntnio7fZUNHBWH131S89Zh5C/2aOdgAdFZVwTDX3Evl+dsT/TjjMr0PctLsdPJoHrVQp1LTvNW88+PIU2n+ldp63s/m1lB0+i7R32fhk+vfPH398M8gWId8mUl37vzR8KqSesT8LQNXTWh6R5/vkd0XszqoIEmg+Vfr+AsenOCgBu1Dlzryy+O9wXSlN6lvcTLwnCInygkWUn64d51iusQe8e6/0+loaahIrETMfmD0mBhk6AGw4P3ICJADYS+JrQaOw9+W8b2P5vN7eCKPLs7ggkx0AxUS10/Be10sbsjrZd2mvM0QfKZA2yIhCVE9o1HyubwTSO/fx+oL67ItKFEFXkhyZqAs+Gtun+YpSeD3am1x2XkoG7HH0EmJOZrdXX4hsYQDXEK74CANZSfG6i/5a6gFQz5xKxDQlbIv3nQjed8d5UvQ+xVnRcZKbdG9Kp/B2++iVdbV7fMrAWhI2PbNVHQRFk4D86fsnPDTu/tn5o1g7fWqppQVOdhUeuzJG5SntjoUtZErgUq5hbWLeIUBE0GdjvDoTPIVjbqP0cqIvQzLzt/W9nSGowvMue53k7XqrvIEba0f/mGC5aHDsL9rhb0nzj2JXwGA/7YdngVub/hiJnQNYCsGzqc+YWkOF0z6ejjhbNW1MAxJdzFtHz0xHd4n2Ny/7Xa8K+/csVCgrrBTBZ9oVoBjiqlkoUHpApgt/RsXBV1I4tQia6yZz7PNNxaXmPBjb82V+4pSiYwA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AS8PR04MB9064.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(53546011)(6506007)(31696002)(2616005)(86362001)(26005)(6512007)(52116002)(6666004)(83380400001)(508600001)(186003)(8676002)(4326008)(38350700002)(31686004)(316002)(66476007)(66946007)(38100700002)(54906003)(110136005)(8936002)(66556008)(6486002)(44832011)(5660300002)(30864003)(2906002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?N29QRkhTYUlHRXVTSW9hVDNiVWhmMzFMOUFFRTNuZm9maThSOXVOOWZYc00z?= =?utf-8?B?SkJzUXpxdktRaVNDOGRiVHJKVFBDTjkyRFNBbGJsR0trdU5tbUdYb3IzQXJO?= =?utf-8?B?YnJZRUR0VmFoMWlsaldEQkRLbU5FSjJXeE1tLzhQcC9hakw4ZWxNK2diRUZj?= =?utf-8?B?WHArdE4yNG12TGhQOG1NUlhqNU5HeTBRMUdqT3RIMVYya0RYYTI1R2d3U05O?= =?utf-8?B?UVIwNnNURllnL052MVNRNVFDVjdiS1ZxOEZPYmd3alNKcHBGSWtPSUI1Vk9D?= =?utf-8?B?dUJETVdLSGVvU21pRkdPZGtXaW44aktJbW5PYTVWUG1SMThyYjVLTm1ZVnZi?= =?utf-8?B?ZjBpRlZIMlAwWEdjRHcyclBpZlFIMk0vVzJEOUZwVGZDUTRrL0NUM2s4d1NB?= =?utf-8?B?c1o1SlJVZERZQ3BVbWVvS011WDNDNi9KMFRnOHFjelZJMnZGaEczVXU2Y3I2?= =?utf-8?B?Uko2a3kvNkgxejNSdlZvVWhnWkoxLzJZL3hGSmMvN1QvdkJxWUN0dGNQRWtr?= =?utf-8?B?MWU5RUFqbm5NRkc0c0ZKM2RSNXdLRHBQUHJ4RG5ucVJQQ0k1K3hBVFpiQ3Bm?= =?utf-8?B?bnFtdlV5REoyMFFuU1Y0eGoyM3hneXZsaFloVnpaVUJ5MDhJamMwZ1ZFMk9Z?= =?utf-8?B?Yko4TVpoNkQ0RE5MOWxDNXR0UWlkdEwxZ3lMa1ZQeVo3OXNNTEhtME5takFF?= =?utf-8?B?cEsrc3k4U1F2d1Q5VnNXckpsbHpzK1pnRjlPbTBrRENoQnptQnpyL2NEd01v?= =?utf-8?B?djc1bERFSmhaVmdnUE1ZUVZJMDhXd0lGbTJ1ZlkxY1dheno2ckRscVFVK0U3?= =?utf-8?B?OEZXeEJmQVRLdndsZzBYM1B4Tk1pQkYrL0RQRVhzUEpyVkR1eXcwaTdtWndr?= =?utf-8?B?bFE3ZVRCR3V5OHhVN0FjTlZjekMrdmYxMzN3ZTViQ2JwbFVWMUUxcCtqcUxh?= =?utf-8?B?UE0wQUJZL2sxZlJjc2dNbitDYTZrL1Zpc0cydE82STgwMWxvUlhpR3cwZXZS?= =?utf-8?B?a0tkTTRjR2tobGJCYU5LR05aYk4xc0tRSUVZM3RVK0hNTFh0QmVmcThWYVFB?= =?utf-8?B?eVErUDFaelc3Yk5VRzhYZzhoK1dMN0FZdXZScmZTMytTVSs1TkdzQkFwa2RO?= =?utf-8?B?S3I4R3BhWFc2ZDJQQjBkbTFRdUpBVGJqTjlyMUpqTjdFTHY3S2lJSFJHa2R4?= =?utf-8?B?SnkvdHNHZ3NBMEtOSmhreDRtZTd3N3VNdnU1STZXTHFzZ29SQnlCc3FFYy83?= =?utf-8?B?NXpvc0VBTjRzRGJVZlAvSk5uUG4yUi9VT3Q2dzZia255WEFoMDZqMUlia2ZR?= =?utf-8?B?anJSa0FPc3NWZGprd0JROHBwR1c0akxMNDU0V0FKL0lSYlEwMUZzenBnSjIy?= =?utf-8?B?MTBWeFY1L0hmdm92QWRIRkE1cmZvNWl2NlRFRnA1VTlHZGNBUWJ0a3BUc2R4?= =?utf-8?B?OUhZMUptMXdsWEUwbnFBd2hWb3dXWU0zK3E5eXpFRFplZzRtZ2RzRk52YjMy?= =?utf-8?B?Mkp4QXpjM21ObXcxUjlMeDh3d0VYd0FZbDlsMkI4bVVhWmN5VG5VZlFESkwy?= =?utf-8?B?bUZyV3N3bU9qZzdvUVVuMzlzNHUwTS9DN2szanE2QXdodGxKMEdFcUJMd0JH?= =?utf-8?B?YWxGRkZ4VjJpblpzVXl3K2ZpZEQzYzYwMkhqRVFHY0JKcGxOK1o5eVMrQlMr?= =?utf-8?B?OHNvR1pTb0pUaW1RbytaZmRiNzRhNldiaWhVbkpFWXZzd2VXanFpUmVyR0RV?= =?utf-8?B?V2JnenJ0VTNEdldzdnEycUZmLzYrNEpxWFV0N1Q4NE5mU0hrNWVWbHBNcXVa?= =?utf-8?B?MGUvNGhJWjJoOUtHMkwxbkVKZXAyS0xUMWZBTGc3WFVJT1VtYyszSUh1WEtm?= =?utf-8?B?RUFhbUlzSnpPSDRtRGpMa2hsRHg5K2QwWHhleGRKalBldHAxMmw5VFJpNExD?= =?utf-8?B?MXhHMk1vbW0zbTRCMEVRUFZvbDFkczczYWJaS1IwcEIzRU9uSmdJNEp6MHhH?= =?utf-8?B?ZWQxR1gxZVBFbGZIRG94OXM3MUtXWG94WS96YmthQk5xYkQ3ekpJTkxJRkRC?= =?utf-8?B?OGJTZllvbUJHYjdMZG9PYU1Jc0xTYUFPNmdOb21RclJMQWpjSnpWSThVdU83?= =?utf-8?B?eFE2a0ppNm5vbnM2UGg4bERmRGYvdTVNZGpaOThRbi9vYmhwbkJhdW56MTR3?= =?utf-8?B?Rm00OTZhV3hQU3R6NHZzOGlnTmxUczN2VCtLL25YQlVlU29Md0xYd1pXR3dO?= =?utf-8?B?WndvMzR3OXhIZ3A3MDZSTnZJeGFFRUh3aEp2K3pqQUcwVnVNVTVDMllFWTJY?= =?utf-8?B?YWgyMDhBYkZPbG5qMnBwK1RCZkVScmtxRHNtNk5DS1hmSE9LbDYyT09tcCtD?= =?utf-8?Q?0aOFtiVkRL8o+R4s=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3824d3f2-2ae7-40fe-d0e0-08da3eddc2e3 X-MS-Exchange-CrossTenant-AuthSource: AS8PR04MB9064.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2022 06:05:40.8344 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: v2L1g5ceparIm0CQ8YJ/4D9Zu0VA8+0tUrePB+50XN40+sYnWt6xf/VyTGBoUiDb4uS321QKwUuA67rglGWTfA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR04MB5996 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: hemant.agrawal@nxp.com Errors-To: dev-bounces@dpdk.org On 5/26/2022 3:37 AM, Chautru, Nicolas wrote: > Hi Hernant, > Gentle reminder in case you can find the time. Could please have a look this patch for bbdev api extension. This is targeting 22.11. > New operation type for FFT processing (On top of 4 existing operations types). There is no impact to the la12xx PMD but would be good to get review/feedback. > This can be used for vanilla FFT and/or chained FFT/iFFT + point-wise multiplication making it applicable for SRS processing. > Thanks, > Nic Acked-by:  Hemant Agrawal HI Nicolas,     Yes, I had a look into it.  I see no issue in it. This is fairly independent feature addition to BBDEV. Regards, Hemant >> -----Original Message----- >> From: Chautru, Nicolas >> Sent: Thursday, March 10, 2022 3:49 PM >> To: dev@dpdk.org; gakhil@marvell.com; trix@redhat.com >> Cc: thomas@monjalon.net; hemant.agrawal@nxp.com; Zhang, Mingshan >> ; david.marchand@redhat.com; Chautru, >> Nicolas >> Subject: [PATCH v1] bbdev: add new operation for FFT processing >> >> Extension of bbdev operation to support FFT based operations. >> >> Signed-off-by: Nicolas Chautru >> --- >> doc/guides/prog_guide/bbdev.rst | 130 >> +++++++++++++++++++++++++++++++++++ >> lib/bbdev/rte_bbdev.c | 8 +++ >> lib/bbdev/rte_bbdev.h | 76 ++++++++++++++++++++ >> lib/bbdev/rte_bbdev_op.h | 149 >> ++++++++++++++++++++++++++++++++++++++++ >> lib/bbdev/version.map | 10 +++ >> 5 files changed, 373 insertions(+) >> >> diff --git a/doc/guides/prog_guide/bbdev.rst >> b/doc/guides/prog_guide/bbdev.rst index 70fa01a..2791286 100644 >> --- a/doc/guides/prog_guide/bbdev.rst >> +++ b/doc/guides/prog_guide/bbdev.rst >> @@ -1118,6 +1118,136 @@ Figure :numref:`figure_turbo_tb_decode` above >> showing the Turbo decoding of CBs using BBDEV interface in TB-mode is also >> valid for LDPC decode. >> >> +BBDEV FFT Operation >> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> + >> +This operation allows to run a combination of DFT and/or IDFT and/or time- >> domain windowing. >> +These can be used in a modular fashion (using bypass modes) or as a >> +processing pipeline which can be used for FFT-based baseband signal >> processing. >> +In more details it allows : >> +- to process the data first through an IDFT of adjustable size and >> +padding; >> +- to perform the windowing as a programmable cyclic shift offset of the >> +data followed by a pointwise multiplication by a time domain window; >> +- to process the related data through a DFT of adjustable size and >> +depadding for each such cyclic shift output. >> + >> +A flexible number of Rx antennas are being processed in parallel with the >> same configuration. >> +The API allows more generally for flexibility in what the PMD may >> +support (cabability flags) and flexibility to adjust some of the parameters of >> the processing. >> + >> +The operation/capability flags that can be set for each FFT operation are >> given below. >> + >> + **NOTE:** The actual operation flags that may be used with a specific >> + BBDEV PMD are dependent on the driver capabilities as reported via >> + ``rte_bbdev_info_get()``, and may be a subset of those below. >> + >> ++--------------------------------------------------------------------+ >> +|Description of FFT capability flags | >> ++============================================================== >> ======+ >> +|RTE_BBDEV_FFT_WINDOWING | >> +| Set to enable/support windowing in time domain | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_CS_ADJUSTMENT | >> +| Set to enable/support the cyclic shift time offset adjustment | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_DFT_BYPASS | >> +| Set to bypass the DFT and use directly the IDFT as an option | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_IDFT_BYPASS | >> +| Set to bypass the IDFT and use directly the DFT as an option | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_WINDOWING_BYPASS | >> +| Set to bypass the time domain windowing as an option | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_POWER_MEAS | >> +| Set to provide an optional power measument of the DFT output | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_FP16_INPUT | >> +| Set if the input data shall use FP16 format instead of INT16 | >> ++--------------------------------------------------------------------+ >> +|RTE_BBDEV_FFT_FP16_OUTPUT | >> +| Set if the output data shall use FP16 format instead of INT16 | >> ++--------------------------------------------------------------------+ >> + >> +The structure passed for each FFT operation is given below, with the >> +operation flags forming a bitmask in the ``op_flags`` field. >> + >> +.. code-block:: c >> + >> + struct rte_bbdev_op_fft { >> + struct rte_bbdev_op_data base_input; >> + struct rte_bbdev_op_data base_output; >> + struct rte_bbdev_op_data power_meas_output; >> + uint32_t op_flags; >> + uint16_t input_sequence_size; >> + uint16_t input_leading_padding; >> + uint16_t output_sequence_size; >> + uint16_t output_leading_depadding; >> + uint8_t window_index[RTE_BBDEV_MAX_CS_2]; >> + uint16_t cs_bitmap; >> + uint8_t num_antennas_log2; >> + uint8_t idft_log2; >> + uint8_t dft_log2; >> + int8_t cs_time_adjustment; >> + int8_t idft_shift; >> + int8_t dft_shift; >> + uint16_t ncs_reciprocal; >> + uint16_t power_shift; >> + uint16_t fp16_exp_adjust; >> + }; >> + >> +The FFT parameters are set out in the table below. >> + >> ++----------------------+--------------------------------------------------------------+ >> +|Parameter |Description | >> ++======================+======================================= >> ======== >> ++===============+ >> +|base_input |input data | >> ++----------------------+--------------------------------------------------------------+ >> +|base_output |output data | >> ++----------------------+--------------------------------------------------------------+ >> +|power_meas_output |optional output data with power measurement >> on DFT output | | >> ++----------------------+--------------------------------------------------------------+ >> +|op_flags |bitmask of all active operation capabilities | >> ++----------------------+--------------------------------------------------------------+ >> +|input_sequence_size |size of the input sequence in 32-bits points per >> antenna | >> ++----------------------+--------------------------------------------------------------+ >> +|input_leading_padding |number of points padded at the start of input >> data | >> ++----------------------+--------------------------------------------------------------+ >> +|output_sequence_size |size of the output sequence per antenna and >> cyclic shift | >> ++----------------------+--------------------------------------------------------------+ >> +|output_depadding |number of points depadded at the start of output >> data | >> ++----------------------+--------------------------------------------------------------+ >> +|window_index |optional windowing profile index used for each cyclic >> shift | >> ++----------------------+--------------------------------------------------------------+ >> +|cs_bitmap |bitmap of the cyclic shift output requested (LSB for >> index 0) | >> ++----------------------+--------------------------------------------------------------+ >> +|num_antennas_log2 |number of antennas as a log2 (10 maps to 1024...) >> | >> ++----------------------+--------------------------------------------------------------+ >> +|idft_log2 |iDFT size as a log2 | >> ++----------------------+--------------------------------------------------------------+ >> +|dft_log2 |DFT size as a log2 | >> ++----------------------+--------------------------------------------------------------+ >> +|cs_time_adjustment |adjustment of time position of all the cyclic shift >> output | >> ++----------------------+--------------------------------------------------------------+ >> +|idft_shift |shift down of signal level post iDFT | >> ++----------------------+--------------------------------------------------------------+ >> +|dft_shift |shift down of signal level post DFT | >> ++----------------------+--------------------------------------------------------------+ >> +|ncs_reciprocal |inverse of max number of CS normalized to 15b (ie. >> 231 for 12)| >> ++----------------------+--------------------------------------------------------------+ >> +|power_shift |shift down of level of power measurement when >> enabled | >> ++----------------------+--------------------------------------------------------------+ >> +|fp16_exp_adjust |value added to FP16 exponent at conversion from >> INT16 | >> ++----------------------+--------------------------------------------------------------+ >> + >> +The mbuf input ``base_input`` is mandatory for all BBDEV PMDs and is >> +the incoming data for the processing. Its size may not fit into an >> +actual mbuf, but the stucture is used to pass iova address. >> +The mbuf output ``output`` is mandatory and is output of the FFT processing >> chain. >> +Each point is a complex number of 32bits : either as 2 INT16 or as 2 >> +FP16 based when the option supported. >> +The data layout is based on contiguous concatenation of output data >> +first by cyclic shift then by antenna. >> >> Sample code >> ----------- >> diff --git a/lib/bbdev/rte_bbdev.c b/lib/bbdev/rte_bbdev.c index >> aaee7b7..a72ecba 100644 >> --- a/lib/bbdev/rte_bbdev.c >> +++ b/lib/bbdev/rte_bbdev.c >> @@ -850,6 +850,9 @@ struct rte_bbdev * >> case RTE_BBDEV_OP_LDPC_ENC: >> result = sizeof(struct rte_bbdev_enc_op); >> break; >> + case RTE_BBDEV_OP_FFT: >> + result = sizeof(struct rte_bbdev_fft_op); >> + break; >> default: >> break; >> } >> @@ -873,6 +876,10 @@ struct rte_bbdev * >> struct rte_bbdev_enc_op *op = element; >> memset(op, 0, mempool->elt_size); >> op->mempool = mempool; >> + } else if (type == RTE_BBDEV_OP_FFT) { >> + struct rte_bbdev_fft_op *op = element; >> + memset(op, 0, mempool->elt_size); >> + op->mempool = mempool; >> } >> } >> >> @@ -1123,6 +1130,7 @@ struct rte_mempool * >> "RTE_BBDEV_OP_TURBO_ENC", >> "RTE_BBDEV_OP_LDPC_DEC", >> "RTE_BBDEV_OP_LDPC_ENC", >> + "RTE_BBDEV_OP_FFT", >> }; >> >> if (op_type < RTE_BBDEV_OP_TYPE_COUNT) diff --git >> a/lib/bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h index b88c881..e9ca673 >> 100644 >> --- a/lib/bbdev/rte_bbdev.h >> +++ b/lib/bbdev/rte_bbdev.h >> @@ -380,6 +380,12 @@ typedef uint16_t >> (*rte_bbdev_enqueue_dec_ops_t)( >> struct rte_bbdev_dec_op **ops, >> uint16_t num); >> >> +/** @internal Enqueue fft operations for processing on queue of a >> +device. */ typedef uint16_t (*rte_bbdev_enqueue_fft_ops_t)( >> + struct rte_bbdev_queue_data *q_data, >> + struct rte_bbdev_fft_op **ops, >> + uint16_t num); >> + >> /** @internal Dequeue encode operations from a queue of a device. */ >> typedef uint16_t (*rte_bbdev_dequeue_enc_ops_t)( >> struct rte_bbdev_queue_data *q_data, >> @@ -390,6 +396,11 @@ typedef uint16_t >> (*rte_bbdev_dequeue_dec_ops_t)( >> struct rte_bbdev_queue_data *q_data, >> struct rte_bbdev_dec_op **ops, uint16_t num); >> >> +/** @internal Dequeue fft operations from a queue of a device. */ >> +typedef uint16_t (*rte_bbdev_dequeue_fft_ops_t)( >> + struct rte_bbdev_queue_data *q_data, >> + struct rte_bbdev_fft_op **ops, uint16_t num); >> + >> #define RTE_BBDEV_NAME_MAX_LEN 64 /**< Max length of device name >> */ >> >> /** >> @@ -438,6 +449,10 @@ struct __rte_cache_aligned rte_bbdev { >> rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; >> /** Dequeue decode function */ >> rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; >> + /** Enqueue FFT function */ >> + rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops; >> + /** Dequeue FFT function */ >> + rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops; >> const struct rte_bbdev_ops *dev_ops; /**< Functions exported by >> PMD */ >> struct rte_bbdev_data *data; /**< Pointer to device data */ >> enum rte_bbdev_state state; /**< If device is currently used or not >> */ @@ -570,6 +585,36 @@ struct __rte_cache_aligned rte_bbdev { >> return dev->enqueue_ldpc_dec_ops(q_data, ops, num_ops); } >> >> +/** >> + * Enqueue a burst of fft operations to a queue of the device. >> + * This functions only enqueues as many operations as currently >> +possible and >> + * does not block until @p num_ops entries in the queue are available. >> + * This function does not provide any error notification to avoid the >> + * corresponding overhead. >> + * >> + * @param dev_id >> + * The identifier of the device. >> + * @param queue_id >> + * The index of the queue. >> + * @param ops >> + * Pointer array containing operations to be enqueued Must have at least >> + * @p num_ops entries >> + * @param num_ops >> + * The maximum number of operations to enqueue. >> + * >> + * @return >> + * The number of operations actually enqueued (this is the number of >> processed >> + * entries in the @p ops array). >> + */ >> +__rte_experimental >> +static inline uint16_t >> +rte_bbdev_enqueue_fft_ops(uint16_t dev_id, uint16_t queue_id, >> + struct rte_bbdev_fft_op **ops, uint16_t num_ops) { >> + struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; >> + struct rte_bbdev_queue_data *q_data = &dev->data- >>> queues[queue_id]; >> + return dev->enqueue_fft_ops(q_data, ops, num_ops); } >> >> /** >> * Dequeue a burst of processed encode operations from a queue of the >> device. >> @@ -695,6 +740,37 @@ struct __rte_cache_aligned rte_bbdev { >> return dev->dequeue_ldpc_dec_ops(q_data, ops, num_ops); } >> >> +/** >> + * Dequeue a burst of fft operations from a queue of the device. >> + * This functions returns only the current contents of the queue, and >> +does not >> + * block until @ num_ops is available. >> + * This function does not provide any error notification to avoid the >> + * corresponding overhead. >> + * >> + * @param dev_id >> + * The identifier of the device. >> + * @param queue_id >> + * The index of the queue. >> + * @param ops >> + * Pointer array where operations will be dequeued to. Must have at least >> + * @p num_ops entries >> + * @param num_ops >> + * The maximum number of operations to dequeue. >> + * >> + * @return >> + * The number of operations actually dequeued (this is the number of >> entries >> + * copied into the @p ops array). >> + */ >> +__rte_experimental >> +static inline uint16_t >> +rte_bbdev_dequeue_fft_ops(uint16_t dev_id, uint16_t queue_id, >> + struct rte_bbdev_fft_op **ops, uint16_t num_ops) { >> + struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; >> + struct rte_bbdev_queue_data *q_data = &dev->data- >>> queues[queue_id]; >> + return dev->dequeue_fft_ops(q_data, ops, num_ops); } >> + >> /** Definitions of device event types */ enum rte_bbdev_event_type { >> RTE_BBDEV_EVENT_UNKNOWN, /**< unknown event type */ diff -- >> git a/lib/bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h index >> 6d56133..57e35f4 100644 >> --- a/lib/bbdev/rte_bbdev_op.h >> +++ b/lib/bbdev/rte_bbdev_op.h >> @@ -47,6 +47,8 @@ >> #define RTE_BBDEV_TURBO_MAX_CODE_BLOCKS (64) >> /* LDPC: Maximum number of Code Blocks in Transport Block.*/ #define >> RTE_BBDEV_LDPC_MAX_CODE_BLOCKS (256) >> +/* 12 CS maximum */ >> +#define RTE_BBDEV_MAX_CS_2 (6) >> >> /** Flags for turbo decoder operation and capability structure */ enum >> rte_bbdev_op_td_flag_bitmasks { @@ -211,6 +213,26 @@ enum >> rte_bbdev_op_ldpcenc_flag_bitmasks { >> RTE_BBDEV_LDPC_ENC_CONCATENATION = (1ULL << 7) }; >> >> +/** Flags for DFT operation and capability structure */ enum >> +rte_bbdev_op_fft_flag_bitmasks { >> + /** Flexible windowing capability */ >> + RTE_BBDEV_FFT_WINDOWING = (1ULL << 0), >> + /** Flexible adjustment of Cyclic Shift time offset */ >> + RTE_BBDEV_FFT_CS_ADJUSTMENT = (1ULL << 1), >> + /** Set for bypass the DFT and get directly into iDFT input */ >> + RTE_BBDEV_FFT_DFT_BYPASS = (1ULL << 2), >> + /** Set for bypass the IDFT and get directly the DFT output */ >> + RTE_BBDEV_FFT_IDFT_BYPASS = (1ULL << 3), >> + /** Set for bypass time domain windowing */ >> + RTE_BBDEV_FFT_WINDOWING_BYPASS = (1ULL << 4), >> + /** Set for optional power measurement on DFT output */ >> + RTE_BBDEV_FFT_POWER_MEAS = (1ULL << 5), >> + /** Set if the the input data used FP16 format */ >> + RTE_BBDEV_FFT_FP16_INPUT = (1ULL << 6), >> + /** Set if the the output data uses FP16 format */ >> + RTE_BBDEV_FFT_FP16_OUTPUT = (1ULL << 7) }; >> + >> /** Flags for the Code Block/Transport block mode */ enum >> rte_bbdev_op_cb_mode { >> /** One operation is one or fraction of one transport block */ @@ - >> 689,6 +711,55 @@ struct rte_bbdev_op_ldpc_enc { >> }; >> }; >> >> +/** Operation structure for FFT processing. >> + * >> + * The operation processes the data for multiple antennas in a single >> +call >> + * (.i.e for all the REs belonging to a given SRS sequence for >> +instance) >> + * >> + * The output mbuf data structure is expected to be allocated by the >> + * application with enough room for the output data. >> + */ >> +struct rte_bbdev_op_fft { >> + /** Input data starting from first antenna */ >> + struct rte_bbdev_op_data base_input; >> + /** Output data starting from first antenna and first cyclic shift */ >> + struct rte_bbdev_op_data base_output; >> + /** Optional power measurement output data */ >> + struct rte_bbdev_op_data power_meas_output; >> + /** Flags from rte_bbdev_op_fft_flag_bitmasks */ >> + uint32_t op_flags; >> + /** Input sequence size in 32-bits points */ >> + uint16_t input_sequence_size; >> + /** Padding at the start of the sequence */ >> + uint16_t input_leading_padding; >> + /** Output sequence size in 32-bits points */ >> + uint16_t output_sequence_size; >> + /** Depadding at the start of the DFT output */ >> + uint16_t output_leading_depadding; >> + /** Window index being used for each cyclic shift output */ >> + uint8_t window_index[RTE_BBDEV_MAX_CS_2]; >> + /** Bitmap of the cyclic shift output requested */ >> + uint16_t cs_bitmap; >> + /** Number of antennas as a log2 – 8 to 128 */ >> + uint8_t num_antennas_log2; >> + /** iDFT size as a log2 - 32 to 2048 */ >> + uint8_t idft_log2; >> + /** DFT size as a log2 - 8 to 2048 */ >> + uint8_t dft_log2; >> + /** Adjustment of position of the cyclic shifts - -31 to 31 */ >> + int8_t cs_time_adjustment; >> + /** iDFT shift down */ >> + int8_t idft_shift; >> + /** DFT shift down */ >> + int8_t dft_shift; >> + /** NCS reciprocal factor */ >> + uint16_t ncs_reciprocal; >> + /** power measurement out shift down */ >> + uint16_t power_shift; >> + /** Adjust the FP6 exponent for INT<->FP16 conversion */ >> + uint16_t fp16_exp_adjust; >> +}; >> + >> /** List of the capabilities for the Turbo Decoder */ struct >> rte_bbdev_op_cap_turbo_dec { >> /** Flags from rte_bbdev_op_td_flag_bitmasks */ @@ -741,6 >> +812,16 @@ struct rte_bbdev_op_cap_ldpc_enc { >> uint16_t num_buffers_dst; >> }; >> >> +/** List of the capabilities for the FFT */ struct rte_bbdev_op_cap_fft >> +{ >> + /** Flags from rte_bbdev_op_ldpcenc_flag_bitmasks */ >> + uint32_t capability_flags; >> + /** Num input code block buffers */ >> + uint16_t num_buffers_src; >> + /** Num output code block buffers */ >> + uint16_t num_buffers_dst; >> +}; >> + >> /** Different operation types supported by the device */ enum >> rte_bbdev_op_type { >> RTE_BBDEV_OP_NONE, /**< Dummy operation that does nothing */ >> @@ -748,6 +829,7 @@ enum rte_bbdev_op_type { >> RTE_BBDEV_OP_TURBO_ENC, /**< Turbo encode */ >> RTE_BBDEV_OP_LDPC_DEC, /**< LDPC decode */ >> RTE_BBDEV_OP_LDPC_ENC, /**< LDPC encode */ >> + RTE_BBDEV_OP_FFT, /**< FFT */ >> RTE_BBDEV_OP_TYPE_COUNT, /**< Count of different op types */ >> }; >> >> @@ -791,6 +873,18 @@ struct rte_bbdev_dec_op { >> }; >> }; >> >> +/** Structure specifying a single fft operation */ struct >> +rte_bbdev_fft_op { >> + /** Status of operation that was performed */ >> + int status; >> + /** Mempool which op instance is in */ >> + struct rte_mempool *mempool; >> + /** Opaque pointer for user data */ >> + void *opaque_data; >> + /** Contains turbo decoder specific parameters */ >> + struct rte_bbdev_op_fft fft; >> +}; >> + >> /** Operation capabilities supported by a device */ struct >> rte_bbdev_op_cap { >> enum rte_bbdev_op_type type; /**< Type of operation */ @@ - >> 799,6 +893,7 @@ struct rte_bbdev_op_cap { >> struct rte_bbdev_op_cap_turbo_enc turbo_enc; >> struct rte_bbdev_op_cap_ldpc_dec ldpc_dec; >> struct rte_bbdev_op_cap_ldpc_enc ldpc_enc; >> + struct rte_bbdev_op_cap_fft fft; >> } cap; /**< Operation-type specific capabilities */ }; >> >> @@ -918,6 +1013,42 @@ struct rte_mempool * } >> >> /** >> + * Bulk allocate fft operations from a mempool with parameter defaults >> reset. >> + * >> + * @param mempool >> + * Operation mempool, created by rte_bbdev_op_pool_create(). >> + * @param ops >> + * Output array to place allocated operations >> + * @param num_ops >> + * Number of operations to allocate >> + * >> + * @returns >> + * - 0 on success >> + * - EINVAL if invalid mempool is provided >> + */ >> +__rte_experimental >> +static inline int >> +rte_bbdev_fft_op_alloc_bulk(struct rte_mempool *mempool, >> + struct rte_bbdev_fft_op **ops, uint16_t num_ops) { >> + struct rte_bbdev_op_pool_private *priv; >> + int ret; >> + >> + /* Check type */ >> + priv = (struct rte_bbdev_op_pool_private *) >> + rte_mempool_get_priv(mempool); >> + if (unlikely(priv->type != RTE_BBDEV_OP_FFT)) >> + return -EINVAL; >> + >> + /* Get elements */ >> + ret = rte_mempool_get_bulk(mempool, (void **)ops, num_ops); >> + if (unlikely(ret < 0)) >> + return ret; >> + >> + return 0; >> +} >> + >> +/** >> * Free decode operation structures that were allocated by >> * rte_bbdev_dec_op_alloc_bulk(). >> * All structures must belong to the same mempool. >> @@ -951,6 +1082,24 @@ struct rte_mempool * >> rte_mempool_put_bulk(ops[0]->mempool, (void **)ops, >> num_ops); } >> >> +/** >> + * Free encode operation structures that were allocated by >> + * rte_bbdev_fft_op_alloc_bulk(). >> + * All structures must belong to the same mempool. >> + * >> + * @param ops >> + * Operation structures >> + * @param num_ops >> + * Number of structures >> + */ >> +__rte_experimental >> +static inline void >> +rte_bbdev_fft_op_free_bulk(struct rte_bbdev_fft_op **ops, unsigned int >> +num_ops) { >> + if (num_ops > 0) >> + rte_mempool_put_bulk(ops[0]->mempool, (void **)ops, >> num_ops); } >> + >> #ifdef __cplusplus >> } >> #endif >> diff --git a/lib/bbdev/version.map b/lib/bbdev/version.map index >> cce3f3c..16a16dc 100644 >> --- a/lib/bbdev/version.map >> +++ b/lib/bbdev/version.map >> @@ -39,3 +39,13 @@ DPDK_22 { >> >> local: *; >> }; >> + >> +EXPERIMENTAL { >> + global: >> + >> + # added in 22.06 >> + rte_bbdev_enqueue_fft_ops; >> + rte_bbdev_dequeue_fft_ops; >> + rte_bbdev_fft_op_alloc_bulk; >> + rte_bbdev_fft_op_free_bulk; >> +}; >> -- >> 1.8.3.1