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 05BE7A0352; Mon, 7 Feb 2022 18:21:51 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A47C141104; Mon, 7 Feb 2022 18:21:41 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 741A741144 for ; Mon, 7 Feb 2022 18:21:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1644254500; x=1675790500; h=message-id:date:to:cc:references:from:subject: in-reply-to:content-transfer-encoding:mime-version; bh=KcHbE7gQaABP9uIIQkq1XY0RNGDeMQW01eVALmq3vik=; b=nVJQ5TyzNk3pME/elGvr5FH5vtJkiXKvXAGsEul89lSX/tFRseNpNcJo mygdpr9SgBegm8tl8vcq2A3/cTTFltnAEauV4aRRpkE2eoEN/zVYQTRmm MQL0PpUZjiuRE1cEzj+AYTcfg4Pyn1PvYAz6eVpEGEWO6TZv3gSqjqJJa lYlzX+S7U//eEJIKIxaIxkHU6T+9YRim1tGN2e44sViitldw8egV7vVvn IFNrvR/G9vAItWwvE2uB/GdwuPQg/y0JIBeLZDfebde3TyPcZuC4lRnn1 hFXlBTwDY6DyGi42zmezxvW9ZvBq9fHnUUrOf5x6qf2K70Uz8OYmRyfU2 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10250"; a="309509270" X-IronPort-AV: E=Sophos;i="5.88,350,1635231600"; d="scan'208";a="309509270" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Feb 2022 09:21:33 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,350,1635231600"; d="scan'208";a="567552761" Received: from orsmsx604.amr.corp.intel.com ([10.22.229.17]) by orsmga001.jf.intel.com with ESMTP; 07 Feb 2022 09:21:32 -0800 Received: from orsmsx608.amr.corp.intel.com (10.22.229.21) by ORSMSX604.amr.corp.intel.com (10.22.229.17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20; Mon, 7 Feb 2022 09:21:32 -0800 Received: from orsmsx603.amr.corp.intel.com (10.22.229.16) by ORSMSX608.amr.corp.intel.com (10.22.229.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20; Mon, 7 Feb 2022 09:21:32 -0800 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20 via Frontend Transport; Mon, 7 Feb 2022 09:21:32 -0800 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.43) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2308.20; Mon, 7 Feb 2022 09:21:30 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=W6mlE17IzhweXEJrTxHeD1dUQr/lAT7sLpq3eaR2UW2uvIiXGWDyXZlauS6ghnRCxYA8F72s+oPRNo22v0xM8Yk2rYbbpoA1TvXPwFkqewyCF09WKEsjfzvmojh3G3eL2EbIh+Db7Blp+vjbLxr3D58uqtd0LBGmy+WeYW/OmTnTmtnYG/1xEu5N1yr3rsI5CEDQW/IcwjORO02QiJcAjpXn4CgafyZCwLDp/0k41NvY7qfhDyNLbzKv4unsVGC+jRhlsU3YMU6O480DSrSCJ0aX+OsduCpJv9/XuhFS8gyM1ykCrR5BJa+UYBsIrEiZ6fp/QnnQuJjP1SsSl89XTA== 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=yqaySzrrkMM3ZCkYs1Q3gdoOl86DAHKW6IyxvFLmXfc=; b=Minkoy8AV7BQj0q/lDBR4hfDN5mjQlnrWIs0v4aSIlJf0BJjg/VZUUD0L/h/BsrYd0cKw1RawweVoW2p7LGGk+SfllNmCLZYodW2tgWkOXF+XBlXqmVspffzs5i97c3XhwVqIxmBi//1oKrcaUMKuMp8+c6gtMGx+MlO8KkRg0AwGVv6YWSvCnaDmNK4hiZfjh0bNXNdffluMwkqEseQHz0+rFqUFwGccNH5LWnVZmxRwZmvVTGFiVFYw/cO3BYgrgfyuAjJd08CaJU6LFmKg6wUtvcUxtLg+e6nOPfjX9dQ/ZTzIbjx4lyoQHYCgTAmge213ErZdZylNcUSSpO25w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH0PR11MB5000.namprd11.prod.outlook.com (2603:10b6:510:41::19) by PH0PR11MB4773.namprd11.prod.outlook.com (2603:10b6:510:33::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.12; Mon, 7 Feb 2022 17:21:25 +0000 Received: from PH0PR11MB5000.namprd11.prod.outlook.com ([fe80::5046:8550:928d:850e]) by PH0PR11MB5000.namprd11.prod.outlook.com ([fe80::5046:8550:928d:850e%7]) with mapi id 15.20.4951.019; Mon, 7 Feb 2022 17:21:25 +0000 Message-ID: <51168b54-75c3-4507-3582-25183095d9fd@intel.com> Date: Mon, 7 Feb 2022 17:21:09 +0000 Content-Language: en-US To: , , Thomas Monjalon , Andrew Rybchenko , "Ray Kinsella" CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , References: <20220131180859.2662034-1-jerinj@marvell.com> <20220207135511.3012285-1-jerinj@marvell.com> From: Ferruh Yigit Subject: Re: [dpdk-dev] [PATCH v4 1/2] ethdev: support queue-based priority flow control X-User: ferruhy In-Reply-To: <20220207135511.3012285-1-jerinj@marvell.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO4P123CA0280.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:195::15) To PH0PR11MB5000.namprd11.prod.outlook.com (2603:10b6:510:41::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 85d1bf41-a1fb-464b-bb8d-08d9ea5e4487 X-MS-TrafficTypeDiagnostic: PH0PR11MB4773:EE_ X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dFGBgzxjTYUFh9AVCTnmiCFolHKJYZ3cJXFRKJkKy6juqa/9Furs7lXbIC0EzV+bWpZFgjtABGiDGF3jzMPsI/g3uJydUnzjs3wUNiSGS9wcDvdCLAx2hJFseXOHubE3Ophrjl8eSkRoz5Xs36Fy2sbZ21MBuojFoRW+oyTMo8peruZBCrfzYLXlzax0T8UF5FnwV7yFkWWkKWgusPajrdeX+Li1NlQ7XSB1m3PIFtD7TUZhp3UOEWDHYmi//Rx1xEAJ/pTldTJygw/DQX41tndOx0TSK2Asn6LB0mLSdry+pj4kX0cD+urDayONqtLQ+bWXsoo///bGpv1zJYUYEp/dJeur3Y7Z3yUO5wLHi9KVDCtYGVSDHMjn7/sIn88aFZtDtwDOHQ/mUCiHyAn1KPT4GRQ9LlZ0I9eNv0XNI/06AaijelhauleMJngjs4fmrC0mGGxPZQY9dZ/714ABi3fcPaR2zO+dkuHIun+hysF8sZ1+gs6q7Zw5hL0WTBhiu9VfckJTfAB1zggCeY5LuZGWbvz0WruAlfn/hmHIKUlLr3rDwQBMWawQMGaIHmG9T+Z42Y/uSLEb1KKIJyJzWFPdJfCS7jHQkhY6vHSZFrka+PwFdoh/0e5zHc3/bri5UUcCdyCiu3Z/1zi25Or+4bx+tNyMM/jPLSLBllD53PlMlCektV/qvP+ogIyvME0/vGbviRCJUr+1biDKqtL/XKd65AQ2DYA6k6n0WpfE2Xb8jlQfsKyD51lxRxfFgNbcL17jGcwXb3gUMCUw9r8f6NoOyrWGowIerMqFaMzP1HkNp/3BEpBY5XfnA7mXtmCc783abyayaIJLJZMyyf8Iow== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR11MB5000.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(366004)(66946007)(8676002)(110136005)(53546011)(55236004)(38100700002)(8936002)(66556008)(6666004)(4326008)(6506007)(82960400001)(66476007)(86362001)(83380400001)(31696002)(6486002)(6512007)(7416002)(7366002)(36756003)(316002)(186003)(26005)(508600001)(7406005)(5660300002)(966005)(30864003)(2906002)(44832011)(2616005)(31686004)(45980500001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UWN6Wm9xK2dxRkRxUEc1SHJFOVRtSnMrRjJBWWFoS3dINVJkNGppMFVDOHEx?= =?utf-8?B?T2NXUDNGdms1L1Juemwzdks5YmwreDZrN3AzYVo1Vi82RkcybzlWdjVhM29l?= =?utf-8?B?TVhRcTdkcm83ZjJHcWQ1WWRWWUtXTUYrWlRuZGlUN3IwQ2t2OW05SUhHaEZK?= =?utf-8?B?dWtmV2VXdlk1d0JqM1g0WmVuSXlub1loeHNnN3FlcEFndXVkS25JN1RUUFFt?= =?utf-8?B?Z0MxNnB2aWlDY0FDK2YwNUhJQ1FkTUZOVTU0OE9ZSE45dzQ1eHd6bDhlSWsz?= =?utf-8?B?aGkra0tnanhvL245aEVZaDNTNjFxUXJYN2FESzh4OTBkVHlIazB4VTYyVW4x?= =?utf-8?B?KzRYeUovOUxIbkI1L0RHUXVrWFVveUVJSGV1bnlrL0hacHdFRVNlTFM5MXo4?= =?utf-8?B?a3VVbWZNbldPR2FsQUcrYlYzKy9ZQWVER2NmT2lDOEI1QXJkN1g3Nlh4RXFK?= =?utf-8?B?dG1KcTJBdmZxZkxsaVkwOUhuUTJ5YkErZWpLaGxEQ0hZdzZ5MzFxak1Cb2JT?= =?utf-8?B?N2docE1kQjdiMlVPTDE5WEFJM3lWWU5kVmhLTWxRc21mWlVNODVrV2hIVWNV?= =?utf-8?B?d1pPbDNXS0ozcDRJcVd6MDYvV3J5SkRQd2YrdVpBWG5BRnkxWURBZXNiMGw1?= =?utf-8?B?YXhDZFdhWGVEUlJXZm13djVvUXVGalg1WW5ibEhuYURQZWFQN3dEUCs5bFpj?= =?utf-8?B?U2hDZE1HRUxsYTRidFlyQkppL0xxdGs1QVN1UWJIMk9jV1k0L3pQTFZ2TE5E?= =?utf-8?B?MFZCQVFIcjIwdXB6TnJaYjFpR3J0SVNLNnRwR1I0MVhtcHpwYkdyVnQwZXRJ?= =?utf-8?B?NkxhTGU1NElIUWszazhwaWxta0tlV0Eyd00ycG1manlSaDFDc0gwSkZmNUJJ?= =?utf-8?B?czh1YWF5b3RPdVY3cU5lemhVbmg4ZWxjbWxBK00vRmlYWnJPcm1WWU4rUDV2?= =?utf-8?B?WHFaenhzd3k4ekZxeUl0WlJFTC9vem1iSjhLa2Mwck5pdHZWVS9hYVRrbUtm?= =?utf-8?B?dUExKzZMZk13Q1RWc0grZG9CQ0x5ckRsNi8wbWV3UkV0QklWb21GRWZCUjZh?= =?utf-8?B?UkIydGhWNW1zazluSVFpYlYxZW50K2dLZHlMV1pjRnE1UHhJdWVUeElVRVZ2?= =?utf-8?B?NEZCdElOOUhRTlp2b1J4UEZ4Tk9FeVNyMWVHZkhUd2FFSytQazhZcGtDeFpz?= =?utf-8?B?bkJGZU9lWlVVLzRnWElQL0VyQnlxWDNXb1huMVJwaVh1RE5LS05rcjU0Y2tG?= =?utf-8?B?WWFxNXBnWndySVFoenB6aVhzYm5PY0dYVFY3NGowbUlld1Z6NElPdE5Oc3U3?= =?utf-8?B?UXlISUYzbndiUUxrcDArbHQ2ZUk4cS9VWGphcGMwSDRWOVl4RDdtMzFlWnVJ?= =?utf-8?B?QUNWNVJXWFU2YWd6OWNhV0hVU3N4eGZ0U3dqYWJOYVYyaXVoVk1aUHBQdVFv?= =?utf-8?B?cUlkL3hsNDg2VmQrZTFXc3hXRzdlY2ZiSGU0M2d1dDZJVjVNdHZWYnlIM3Q4?= =?utf-8?B?ekZBOFJvK3ZZdktadTlRaVd3Ny9rTXBiZWt5TzBFay92dFNvb2F3NFQ0Sy8x?= =?utf-8?B?bFhBelFud3FnL0hhYkJ0c3RZS0RzN1o5SkNyV1ZVZWJmWjBzeXRzY2pqcVdh?= =?utf-8?B?dVNVY3ZXYzR1MHBzYkFWMUJoSjFJSVBLSE5GL0JQRHArV2pnZENXY0xOYjFt?= =?utf-8?B?ZUdia1VYVDdwcFEyOTZYaVJGbGxudCtweitncGhxL0JONFI2aDlibkNFa3Ev?= =?utf-8?B?R2dEeVlDQStWWmlkbkR5emdSS2pUaGdhWFdKUzBMbGM5bVpXK0xYcjRWd2Ns?= =?utf-8?B?SzRqL0pxTEZyVlZWZHVnYXhjWjhrejZZQkRXM2lYRE1pb1RvVVlGNUY5dnJL?= =?utf-8?B?ZlJ0SkVueVBWSTRNV2k5Q1hsb1ZMbzdCZFpCK1Q1NVp6V3hoa21oNEVzOHl3?= =?utf-8?B?d09vQVZRbTNvM0QxcXRqTHk2NVM2azhYd1NaaHNOUHpNSldLWlREMGNTSzdN?= =?utf-8?B?VzdVOElITmt4UHpxZUFiUzBmK1p3aktZYjRQcmx1M2U1T25LRzg1Zk9BNCs5?= =?utf-8?B?YnFWSGZRQnJYYkRLaUJMRG9kWXk4cGpJSkVmZHpLSVgzaDNob2ZSTXQwcldM?= =?utf-8?B?Tjc3bFJGekZRdHF1dDRPMGJKdmJGckhJWFFaQ3h2OGNtL3Z5aE16d2FpQjBQ?= =?utf-8?Q?EU36G++kQ8M92qJe1qJkoP4=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 85d1bf41-a1fb-464b-bb8d-08d9ea5e4487 X-MS-Exchange-CrossTenant-AuthSource: PH0PR11MB5000.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2022 17:21:25.5174 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: BAD5vxE9/rY8M9F4ziQMpNMItFloC0UogSRPJ+3s+Smgv8jkzRxYAXrDVzrnhnXyvRkoSb91rfrMaXORxvD5ng== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4773 X-OriginatorOrg: intel.com 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: , Errors-To: dev-bounces@dpdk.org On 2/7/2022 1:55 PM, jerinj@marvell.com wrote: > From: Jerin Jacob > > Based on device support and use-case need, there are two different ways > to enable PFC. The first case is the port level PFC configuration, in > this case, rte_eth_dev_priority_flow_ctrl_set() API shall be used to > configure the PFC, and PFC frames will be generated using based on VLAN > TC value. > > The second case is the queue level PFC configuration, in this > case, Any packet field content can be used to steer the packet to the > specific queue using rte_flow or RSS and then use > rte_eth_dev_priority_flow_ctrl_queue_configure() to configure the > TC mapping on each queue. > Based on congestion selected on the specific queue, configured TC > shall be used to generate PFC frames. > I put only some syntax comments, can you please check below? patch lgtm except syntax issues. > Signed-off-by: Jerin Jacob > Signed-off-by: Sunil Kumar Kori > --- > > v4..v3: > > - Remove RTE_ETH_PFC_QUEUE_CAPA_* and replace with enum rte_eth_fc_mode mode_capa > - More documentaion > - Address the comment from Ferruh in > http://patches.dpdk.org/project/dpdk/patch/20220131180859.2662034-1-jerinj@marvell.com/ > > v3..v1: > > - Introduce rte_eth_dev_priority_flow_ctrl_queue_info_get() to > avoid updates to rte_eth_dev_info > > - Removed devtools/libabigail.abignore changes > - Address the comment from Ferruh in > http://patches.dpdk.org/project/dpdk/patch/20220113102718.3167282-1-jerinj@marvell.com/ > > > doc/guides/nics/features.rst | 7 +- > doc/guides/rel_notes/release_22_03.rst | 5 + > lib/ethdev/ethdev_driver.h | 11 ++ > lib/ethdev/rte_ethdev.c | 139 +++++++++++++++++++++++++ > lib/ethdev/rte_ethdev.h | 100 ++++++++++++++++++ > lib/ethdev/version.map | 4 + > 6 files changed, 264 insertions(+), 2 deletions(-) > > diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst > index 27be2d2576..1cacdc883a 100644 > --- a/doc/guides/nics/features.rst > +++ b/doc/guides/nics/features.rst > @@ -379,9 +379,12 @@ Flow control > Supports configuring link flow control. > > * **[implements] eth_dev_ops**: ``flow_ctrl_get``, ``flow_ctrl_set``, > - ``priority_flow_ctrl_set``. > + ``priority_flow_ctrl_set``, ``priority_flow_ctrl_queue_info_get``, > + ``priority_flow_ctrl_queue_configure`` > * **[related] API**: ``rte_eth_dev_flow_ctrl_get()``, ``rte_eth_dev_flow_ctrl_set()``, > - ``rte_eth_dev_priority_flow_ctrl_set()``. > + ``rte_eth_dev_priority_flow_ctrl_set()``, > + ``rte_eth_dev_priority_flow_ctrl_queue_info_get()``, > + ``rte_eth_dev_priority_flow_ctrl_queue_configure()``. > > > .. _nic_features_rate_limitation: > diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst > index 746f50e84f..2ec6f53efe 100644 > --- a/doc/guides/rel_notes/release_22_03.rst > +++ b/doc/guides/rel_notes/release_22_03.rst > @@ -55,6 +55,11 @@ New Features > Also, make sure to start the actual text at the margin. > ======================================================= > > +* **Added an API to enable queue based priority flow ctrl(PFC).** > + > + New APIs, ``rte_eth_dev_priority_flow_ctrl_queue_info_get()`` and > + ``rte_eth_dev_priority_flow_ctrl_queue_configure()``, was added. > + > * **Updated Cisco enic driver.** > > * Added rte_flow support for matching GENEVE packets. > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index d95605a355..d4d396468c 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -533,6 +533,13 @@ typedef int (*flow_ctrl_set_t)(struct rte_eth_dev *dev, > typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev, > struct rte_eth_pfc_conf *pfc_conf); > > +/** @internal Get info for queue based PFC on an Ethernet device. */ > +typedef int (*priority_flow_ctrl_queue_info_get_t)(struct rte_eth_dev *dev, > + struct rte_eth_pfc_queue_info *pfc_queue_info); > +/** @internal Configure queue based PFC parameter on an Ethernet device. */ > +typedef int (*priority_flow_ctrl_queue_config_t)(struct rte_eth_dev *dev, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf); > + > /** @internal Update RSS redirection table on an Ethernet device. */ > typedef int (*reta_update_t)(struct rte_eth_dev *dev, > struct rte_eth_rss_reta_entry64 *reta_conf, > @@ -1080,6 +1087,10 @@ struct eth_dev_ops { > flow_ctrl_set_t flow_ctrl_set; /**< Setup flow control */ > /** Setup priority flow control */ > priority_flow_ctrl_set_t priority_flow_ctrl_set; > + /** Priority flow control queue info get */ > + priority_flow_ctrl_queue_info_get_t priority_flow_ctrl_queue_info_get; > + /** Priority flow control queue configure */ > + priority_flow_ctrl_queue_config_t priority_flow_ctrl_queue_config; > > /** Set Unicast Table Array */ > eth_uc_hash_table_set_t uc_hash_table_set; > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index 29e21ad580..882f231e42 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -4022,6 +4022,145 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, > return -ENOTSUP; > } > > +static int > +validate_rx_pause_config(struct rte_eth_dev_info *dev_info, uint8_t tc_max, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf) Instead of alligning to the '(', can you just put two tabs? > +{ > + if ((pfc_queue_conf->mode == RTE_ETH_FC_RX_PAUSE) || > + (pfc_queue_conf->mode == RTE_ETH_FC_FULL)) { > + if (pfc_queue_conf->rx_pause.tx_qid >= dev_info->nb_tx_queues) { > + RTE_ETHDEV_LOG(ERR, "PFC Tx queue not in range for Rx pause requested:%d configured:%d\n", > + pfc_queue_conf->rx_pause.tx_qid, Same here, no need to allign to upper line. Also can you please break the line after 'ERR,' to reduce the line length: RTE_ETHDEV_LOG(ERR, "PFC Tx queue not in range for Rx pause requested:%d configured:%d\n", .... > + dev_info->nb_tx_queues); > + return -EINVAL; > + } > + > + if (pfc_queue_conf->rx_pause.tc >= tc_max) { > + RTE_ETHDEV_LOG(ERR, "PFC TC not in range for Rx pause requested:%d max:%d\n", > + pfc_queue_conf->rx_pause.tc, tc_max); same here > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +static int > +validate_tx_pause_config(struct rte_eth_dev_info *dev_info, uint8_t tc_max, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf) ditto > +{ > + if ((pfc_queue_conf->mode == RTE_ETH_FC_TX_PAUSE) || > + (pfc_queue_conf->mode == RTE_ETH_FC_FULL)) { > + if (pfc_queue_conf->tx_pause.rx_qid >= dev_info->nb_rx_queues) { > + RTE_ETHDEV_LOG(ERR, "PFC Rx queue not in range for Tx pause requested:%d configured:%d\n", > + pfc_queue_conf->tx_pause.rx_qid, > + dev_info->nb_rx_queues); ditto > + return -EINVAL; > + } > + > + if (pfc_queue_conf->tx_pause.tc >= tc_max) { > + RTE_ETHDEV_LOG(ERR, "PFC TC not in range for Tx pause requested:%d max:%d\n", > + pfc_queue_conf->tx_pause.tc, tc_max); ditto > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +int > +rte_eth_dev_priority_flow_ctrl_queue_info_get( Please don't end the line with '(', can you move the 'uint16_t port_id' to this line? > + uint16_t port_id, struct rte_eth_pfc_queue_info *pfc_queue_info) > +{ > + struct rte_eth_dev *dev; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > + dev = &rte_eth_devices[port_id]; > + > + if (pfc_queue_info == NULL) { > + RTE_ETHDEV_LOG(ERR, "PFC info param is NULL for port (%u)\n", > + port_id); no align > + return -EINVAL; > + } > + > + if (*dev->dev_ops->priority_flow_ctrl_queue_info_get) > + return eth_err(port_id, (*dev->dev_ops->priority_flow_ctrl_queue_info_get) > + (dev, pfc_queue_info)); ditto > + return -ENOTSUP; > +} > + > +int > +rte_eth_dev_priority_flow_ctrl_queue_configure( no line ending with '(' please > + uint16_t port_id, struct rte_eth_pfc_queue_conf *pfc_queue_conf) > +{ > + struct rte_eth_pfc_queue_info pfc_info; > + struct rte_eth_dev_info dev_info; > + struct rte_eth_dev *dev; > + int ret; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > + dev = &rte_eth_devices[port_id]; > + > + if (pfc_queue_conf == NULL) { > + RTE_ETHDEV_LOG(ERR, "PFC parameters are NULL for port (%u)\n", > + port_id); no align > + return -EINVAL; > + } > + > + ret = rte_eth_dev_info_get(port_id, &dev_info); > + if (ret != 0) > + return ret; > + > + ret = rte_eth_dev_priority_flow_ctrl_queue_info_get(port_id, &pfc_info); > + if (ret != 0) > + return ret; > + > + if (pfc_info.tc_max == 0) { > + RTE_ETHDEV_LOG(ERR, "Ethdev port %u does not support PFC TC values\n", > + port_id); ditto > + return -ENOTSUP; > + } > + > + /* Check requested mode supported or not */ > + if (pfc_info.mode_capa == RTE_ETH_FC_RX_PAUSE && > + pfc_queue_conf->mode == RTE_ETH_FC_TX_PAUSE) { > + RTE_ETHDEV_LOG(ERR, "PFC Tx pause unsupported for port (%d)\n", > + port_id); ditto > + return -EINVAL; > + } > + > + if (pfc_info.mode_capa == RTE_ETH_FC_TX_PAUSE && > + pfc_queue_conf->mode == RTE_ETH_FC_RX_PAUSE) { > + RTE_ETHDEV_LOG(ERR, "PFC Rx pause unsupported for port (%d)\n", > + port_id); ditto > + return -EINVAL; > + } > + > + /* Validate Rx pause parameters */ > + if (pfc_info.mode_capa == RTE_ETH_FC_FULL || > + pfc_info.mode_capa == RTE_ETH_FC_RX_PAUSE) { > + ret = validate_rx_pause_config(&dev_info, pfc_info.tc_max, > + pfc_queue_conf); ditto > + if (ret != 0) > + return ret; > + } > + > + /* Validate Tx pause parameters */ > + if (pfc_info.mode_capa == RTE_ETH_FC_FULL || > + pfc_info.mode_capa == RTE_ETH_FC_TX_PAUSE) { > + ret = validate_tx_pause_config(&dev_info, pfc_info.tc_max, > + pfc_queue_conf); ditto > + if (ret != 0) > + return ret; > + } > + > + if (*dev->dev_ops->priority_flow_ctrl_queue_config) > + return eth_err(port_id, > + (*dev->dev_ops->priority_flow_ctrl_queue_config)( ditto > + dev, pfc_queue_conf)); > + return -ENOTSUP; > +} > + > static int > eth_check_reta_mask(struct rte_eth_rss_reta_entry64 *reta_conf, > uint16_t reta_size) > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h > index 147cc1ced3..c526c8fc0a 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -1408,6 +1408,59 @@ struct rte_eth_pfc_conf { > uint8_t priority; /**< VLAN User Priority. */ > }; > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice > + * > + * A structure used to retrieve information of queue based PFC. > + */ > +struct rte_eth_pfc_queue_info { > + /** > + * Maximum supported traffic class as per PFC (802.1Qbb) specification. > + */ > + uint8_t tc_max; > + /** PFC queue mode capabilities. */ > + enum rte_eth_fc_mode mode_capa; > +}; > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice > + * > + * A structure used to configure Ethernet priority flow control parameter for > + * ethdev queues. > + * > + * rte_eth_pfc_queue_conf::rx_pause structure shall used to configure given > + * tx_qid with corresponding tc. When ethdev device receives PFC frame with > + * rte_eth_pfc_queue_conf::rx_pause::tc, traffic will be paused on > + * rte_eth_pfc_queue_conf::rx_pause::tx_qid for that tc. > + * > + * rte_eth_pfc_queue_conf::tx_pause structure shall used to configure given > + * rx_qid. When rx_qid is congested, PFC frames are generated with > + * rte_eth_pfc_queue_conf::rx_pause::tc and > + * rte_eth_pfc_queue_conf::rx_pause::pause_time to the peer. > + */ > +struct rte_eth_pfc_queue_conf { > + enum rte_eth_fc_mode mode; /**< Link flow control mode */ > + > + struct { > + uint16_t tx_qid; /**< Tx queue ID */ > + uint8_t tc; > + /**< Traffic class as per PFC (802.1Qbb) spec. The value must be > + * in the range [0, rte_eth_pfc_queue_info::tx_max - 1] > + */ Can you please move multi line doxygen comments above the variable? > + } rx_pause; /* Valid when (mode == FC_RX_PAUSE || mode == FC_FULL) */ > + > + struct { > + uint16_t pause_time; /**< Pause quota in the Pause frame */ > + uint16_t rx_qid; /**< Rx queue ID */ > + uint8_t tc; > + /**< Traffic class as per PFC (802.1Qbb) spec. The value must be > + * in the range [0, rte_eth_pfc_queue_info::tx_max - 1] > + */ ditto > + } tx_pause; /* Valid when (mode == FC_TX_PAUSE || mode == FC_FULL) */ > +}; > + > /** > * Tunnel type for device-specific classifier configuration. > * @see rte_eth_udp_tunnel > @@ -4158,6 +4211,53 @@ int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, > int rte_eth_dev_mac_addr_add(uint16_t port_id, struct rte_ether_addr *mac_addr, > uint32_t pool); > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Retrieve the information for queue based PFC. > + * > + * @param port_id > + * The port identifier of the Ethernet device. > + * @param pfc_queue_info > + * A pointer to a structure of type *rte_eth_pfc_queue_info* to be filled with > + * the information about queue based PFC. > + * @return > + * - (0) if successful. > + * - (-ENOTSUP) if support for priority_flow_ctrl_queue_info_get does not exist. > + * - (-ENODEV) if *port_id* invalid. > + * - (-EINVAL) if bad parameter. > + */ > +__rte_experimental > +int rte_eth_dev_priority_flow_ctrl_queue_info_get(uint16_t port_id, > + struct rte_eth_pfc_queue_info *pfc_queue_info); 2/3 tabs is OK for the next line Can you please put an empty line between functions? > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Configure the queue based priority flow control for a given queue > + * for Ethernet device. > + * > + * @note When an ethdev port switches to queue based PFC mode, the > + * unconfigured queues shall be configured by the driver with > + * default values such as lower priority value for TC etc. > + * > + * @param port_id > + * The port identifier of the Ethernet device. > + * @param pfc_queue_conf > + * The pointer to the structure of the priority flow control parameters > + * for the queue. > + * @return > + * - (0) if successful. > + * - (-ENOTSUP) if hardware doesn't support queue based PFC mode. > + * - (-ENODEV) if *port_id* invalid. > + * - (-EINVAL) if bad parameter > + * - (-EIO) if flow control setup queue failure > + */ > +__rte_experimental > +int rte_eth_dev_priority_flow_ctrl_queue_configure(uint16_t port_id, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf); > + ditto > /** > * Remove a MAC address from the internal array of addresses. > * > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map > index c2fb0669a4..49523ebc45 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -256,6 +256,10 @@ EXPERIMENTAL { > rte_flow_flex_item_create; > rte_flow_flex_item_release; > rte_flow_pick_transfer_proxy; > + > + # added in 22.03 > + rte_eth_dev_priority_flow_ctrl_queue_configure; > + rte_eth_dev_priority_flow_ctrl_queue_info_get; > }; > > INTERNAL {