From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2A239A04AF; Thu, 20 Aug 2020 16:38:42 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6936D1C026; Thu, 20 Aug 2020 16:38:41 +0200 (CEST) Received: from GBR01-LO2-obe.outbound.protection.outlook.com (mail-eopbgr100131.outbound.protection.outlook.com [40.107.10.131]) by dpdk.org (Postfix) with ESMTP id 8D8051BEC4 for ; Thu, 20 Aug 2020 16:38:39 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RkWbPwstHugN2Ee/CmrXbAqlzpnwwWbviZY4LbHI7rC1J+LEaTMC6Yp5ccIrTyIvMEGl8geGzNx2RtUi+Pq0aCp7S08hwSe00j6Th3o0ovE/gHT6yq8Qk1PzUqoItrc/ZXOWLxwF+rzKV8hFCkteOBGv5yShqeoD2DiwWKruCVGr80Jhvfwh2rbr3T9FcoudqFumkHIgIxk5gXmLsu+uRvFczqvW7xU/wJrYfC8Ylhld06Ann7qtoFq7NdGpcYM3lhDQedHzbpo2AP4gG3zOMx2dA5jCPEH1WnR/XD+Ed9zeABKp8+A7vSS1wWNJaPsKLYwVq6wrC0LmiBB2AuoHzw== 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-SenderADCheck; bh=yBmTKJwHbOHFwaanU3FF7zo0l6yBdbnPeCgDomFj8gs=; b=ML9cebFd+2WKdo/wFM6CvSZQI2kKtP6eyq9eMJpi8hPYbd821qE+A0s8v94SAssbq3xw2MG5GaWnr1tx3xoaZDi8vq5TZGFb0PagTEHE3oqmvN3qT6kWPUF5kj4gGYO9UL7n4bQBwlOswBlIE31KptRo7W+0vgW7GLH+/NpjcyMob3tnc8f8BzcHOqz3hGsGlNJA7ofVRM86zHAKwDjaI6siWpfIoN6HoJvmRFZ1aj9Af5bpuTAKVY9tBdnNdsmCZjoYkFhsiv/cz+G4qHibVfrj/khU0h2nC1V76J/pdEqJvFUrO3s8IsUWaj9vwmy7ORFV04qoK0c2kI7RyVlHpg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=accelercomm.com; dmarc=pass action=none header.from=accelercomm.com; dkim=pass header.d=accelercomm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=accelercomm.onmicrosoft.com; s=selector1-accelercomm-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yBmTKJwHbOHFwaanU3FF7zo0l6yBdbnPeCgDomFj8gs=; b=XzjQ5u3jSuGRRX/p+d0S7QLshAqmcODhe+xY2xK8mU4x+0+5YJXZr37Igd863+84C+1ZDbHre4vOS63J1KK513cuhtnUn6x2yA5j8c7IQcY/VghpkFRLS+ebBCZi6Q1vXLezHEQzfx9IQ7PKOA+5QEXRzfNBJRQPb5F/Pfz573c= Received: from LOYP265MB2174.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:114::11) by LO2P265MB1728.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:93::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3305.26; Thu, 20 Aug 2020 14:38:37 +0000 Received: from LOYP265MB2174.GBRP265.PROD.OUTLOOK.COM ([fe80::fd8e:7ab4:840b:fbcb]) by LOYP265MB2174.GBRP265.PROD.OUTLOOK.COM ([fe80::fd8e:7ab4:840b:fbcb%3]) with mapi id 15.20.3305.025; Thu, 20 Aug 2020 14:38:37 +0000 From: Dave Burley To: Nicolas Chautru , "dev@dpdk.org" CC: "bruce.richardson@intel.com" Thread-Topic: [dpdk-dev] [PATCH v3 05/11] baseband/acc100: add LDPC processing functions Thread-Index: AQHWdb+qCjhvM2dNJ06knjdffc9KoalBEyHM Date: Thu, 20 Aug 2020 14:38:37 +0000 Message-ID: References: <1597796731-57841-1-git-send-email-nicolas.chautru@intel.com>, <1597796731-57841-6-git-send-email-nicolas.chautru@intel.com> In-Reply-To: <1597796731-57841-6-git-send-email-nicolas.chautru@intel.com> Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=accelercomm.com; x-originating-ip: [2a00:23c4:cf2d:a200:6023:b810:2491:c6a9] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0fe114be-7e7d-4cc5-92d6-08d84516b991 x-ms-traffictypediagnostic: LO2P265MB1728: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3044; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: sJCIS+E58qSl55/Y/HWgt2BVdUf79j7fMmXQTRVdtyz58fWG5uVx01zrVL4/ohAcCd5UPZDSl/QvdHAC81PVPzlwT0A+L5dkgNEkvEzdmmG88Vg+xDh6ktLS8TUkYq3dlFAVzI/kRme+nPsrelaV6Z85qZRKR6uFd/UCm55oYV9UPUsC/McrFs39n45j2gBkGRjLGGrhatDQusTV+6TbzbtXRU61mEllUewBL7ToqjtXiSosGj8Rl1zRG9Ktcm3T5Ruk61LH2GOxnulId8D0h/BymKCT2LxrE/CKPn01lSBASM0mjLUjubDFa3ye1b4x3fssSqhWar2iqoy59ee+4fxMcdHXCyjNCjozoh9QEf5RW5viMCaK7e9K8FUdUQ9w x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:LOYP265MB2174.GBRP265.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(366004)(136003)(346002)(396003)(39830400003)(376002)(55016002)(30864003)(7696005)(9686003)(2906002)(33656002)(478600001)(316002)(110136005)(5660300002)(4326008)(53546011)(8936002)(6506007)(71200400001)(52536014)(83380400001)(66946007)(66446008)(64756008)(66556008)(66476007)(76116006)(186003)(44832011)(86362001)(461764006)(579004)(559001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata: KylZBm2Nfmc5cfDggYU4wQ5I4CqQBdpqI71067A6aAoZg5HJiWamrEyBBvo5Xjshqqa35FElrisbNmoiASx8MiBU1ZEWjQrCHmmUBOpUvhZaRxanl8V9022DJPmylKL/GivNlvMxU8HO+dIuUTH7WRYf52ViTtMt/qIh6QMgiFyZylw1IuykTUbUzN94NRObI25qXsrIjeaXkwpsXXuYfDCLx8towW5aUZbB74aH+PnHfuqAQq+hbjZXQyyuR1bdXPwRvBgP63lG1+8nCedy3oUKOp48MQmF9P5HzRDJ0ZKrQbK9xDglO34++B0TWe9M0cCYR5RbgGzxpmHb1u+nbJmQIM+YNahPhuV8RmDdrGKTR8LjHJnKn2926hRn0L36kqrul3EZ8m+dc1ruTbyq+pEK4hDB5DmK1uTgUWUzYuYXBxjntc1I24WETv5A57bNeYA8VZXxy+0RCIgilicNOVIuBXz42VCloIaT2S1v6HqHXYnoffY8qpFTWNixyvSLqc58VkBLG/UMAl6Idk/RgqmWCYPEFK/73YHa8NWAHaHK/Nx0UAgIam7NFu42MKWSOMVHYRNIhvpBCov0OpDQ/o9E6FFP/yICySxy4i3xgfeJiHOF9izL6Ov2RedfzzN7/ztoIB4Vq0zw4hR8RFIpLVagNMsLQso8xkZC5IhAw1h3w5r3ngx5F4VMPLB6PmdQxMhaurRZQ1PXEoM1+weJBw== x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: accelercomm.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: LOYP265MB2174.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 0fe114be-7e7d-4cc5-92d6-08d84516b991 X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Aug 2020 14:38:37.6901 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a4aefd0f-62ef-4258-bd2b-0b6f6112bf2c X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: XPH9LVDvX37Po9Jsoj/mtBjF5qYyun1zjusWMBe1sKlxyTEDR3XCRP6XwKnQ21I58RE4Fx2HvaKpTVARybXs/yGucE3b5EmtX+igefUfzM0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: LO2P265MB1728 Subject: Re: [dpdk-dev] [PATCH v3 05/11] baseband/acc100: add LDPC processing 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Nic,=0A= =0A= As you've now specified the use of RTE_BBDEV_LDPC_LLR_COMPRESSION for this = PMB, please could you confirm what the packed format of the LLRs in memory = looks like? =0A= =0A= Best Regards=0A= =0A= Dave Burley=0A= =0A= =0A= From: dev on behalf of Nicolas Chautru =0A= Sent: 19 August 2020 01:25=0A= To: dev@dpdk.org ; akhil.goyal@nxp.com = =0A= Cc: bruce.richardson@intel.com ; Nicolas Chautr= u =0A= Subject: [dpdk-dev] [PATCH v3 05/11] baseband/acc100: add LDPC processing f= unctions =0A= =A0=0A= Adding LDPC decode and encode processing operations=0A= =0A= Signed-off-by: Nicolas Chautru =0A= ---=0A= =A0drivers/baseband/acc100/rte_acc100_pmd.c | 1625 ++++++++++++++++++++++++= +++++-=0A= =A0drivers/baseband/acc100/rte_acc100_pmd.h |=A0=A0=A0 3 +=0A= =A02 files changed, 1626 insertions(+), 2 deletions(-)=0A= =0A= diff --git a/drivers/baseband/acc100/rte_acc100_pmd.c b/drivers/baseband/ac= c100/rte_acc100_pmd.c=0A= index 7a21c57..5f32813 100644=0A= --- a/drivers/baseband/acc100/rte_acc100_pmd.c=0A= +++ b/drivers/baseband/acc100/rte_acc100_pmd.c=0A= @@ -15,6 +15,9 @@=0A= =A0#include =0A= =A0#include =0A= =A0#include =0A= +#ifdef RTE_BBDEV_OFFLOAD_COST=0A= +#include =0A= +#endif=0A= =A0=0A= =A0#include =0A= =A0#include =0A= @@ -449,7 +452,6 @@=0A= =A0=A0=A0=A0=A0=A0=A0=A0 return 0;=0A= =A0}=0A= =A0=0A= -=0A= =A0/**=0A= =A0 * Report a ACC100 queue index which is free=0A= =A0 * Return 0 to 16k for a valid queue_idx or -1 when no queue is availabl= e=0A= @@ -634,6 +636,46 @@=0A= =A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_device *d =3D dev->data->dev_private= ;=0A= =A0=0A= =A0=A0=A0=A0=A0=A0=A0=A0 static const struct rte_bbdev_op_cap bbdev_capabil= ities[] =3D {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .type= =A0=A0 =3D RTE_BBDEV_OP_LDPC_ENC,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .cap.ld= pc_enc =3D {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 .capability_flags =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_RATE_MATCH |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_CRC_24B_ATTACH |= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_INTERLEAVER_BYPAS= S,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 .num_buffers_src =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDE= V_LDPC_MAX_CODE_BLOCKS,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 .num_buffers_dst =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDE= V_LDPC_MAX_CODE_BLOCKS,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 },=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .type= =A0=A0 =3D RTE_BBDEV_OP_LDPC_DEC,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .cap.ld= pc_dec =3D {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .capabi= lity_flags =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE |=0A= +#ifdef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE |=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_DECODE_BYPASS |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_DEC_SCATTER_GATHER |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION |=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_LLR_COMPRESSION,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .llr_si= ze =3D 8,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .llr_de= cimals =3D 1,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .num_bu= ffers_src =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_MAX_CODE_BLOCKS,= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .num_bu= ffers_hard_out =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_MAX_CODE_BLOCKS,= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 .num_bu= ffers_soft_out =3D 0,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 },=0A= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBDEV_END_OF_CAPABILIT= IES_LIST()=0A= =A0=A0=A0=A0=A0=A0=A0=A0 };=0A= =A0=0A= @@ -669,9 +711,14 @@=0A= =A0=A0=A0=A0=A0=A0=A0=A0 dev_info->cpu_flag_reqs =3D NULL;=0A= =A0=A0=A0=A0=A0=A0=A0=A0 dev_info->min_alignment =3D 64;=0A= =A0=A0=A0=A0=A0=A0=A0=A0 dev_info->capabilities =3D bbdev_capabilities;=0A= +#ifdef ACC100_EXT_MEM=0A= =A0=A0=A0=A0=A0=A0=A0=A0 dev_info->harq_buffer_size =3D d->ddr_size;=0A= +#else=0A= +=A0=A0=A0=A0=A0=A0 dev_info->harq_buffer_size =3D 0;=0A= +#endif=0A= =A0}=0A= =A0=0A= +=0A= =A0static const struct rte_bbdev_ops acc100_bbdev_ops =3D {=0A= =A0=A0=A0=A0=A0=A0=A0=A0 .setup_queues =3D acc100_setup_queues,=0A= =A0=A0=A0=A0=A0=A0=A0=A0 .close =3D acc100_dev_close,=0A= @@ -696,6 +743,1577 @@=0A= =A0=A0=A0=A0=A0=A0=A0=A0 {.device_id =3D 0},=0A= =A0};=0A= =A0=0A= +/* Read flag value 0/1 from bitmap */=0A= +static inline bool=0A= +check_bit(uint32_t bitmap, uint32_t bitmask)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 return bitmap & bitmask;=0A= +}=0A= +=0A= +static inline char *=0A= +mbuf_append(struct rte_mbuf *m_head, struct rte_mbuf *m, uint16_t len)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(len > rte_pktmbuf_tailroom(m)))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return NULL;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 char *tail =3D (char *)m->buf_addr + m->data_off + m->d= ata_len;=0A= +=A0=A0=A0=A0=A0=A0 m->data_len =3D (uint16_t)(m->data_len + len);=0A= +=A0=A0=A0=A0=A0=A0 m_head->pkt_len=A0 =3D (m_head->pkt_len + len);=0A= +=A0=A0=A0=A0=A0=A0 return tail;=0A= +}=0A= +=0A= +/* Compute value of k0.=0A= + * Based on 3GPP 38.212 Table 5.4.2.1-2=0A= + * Starting position of different redundancy versions, k0=0A= + */=0A= +static inline uint16_t=0A= +get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 if (rv_index =3D=3D 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t n =3D (bg =3D=3D 1 ? N_ZC_1 : N_ZC_2) * z_c;= =0A= +=A0=A0=A0=A0=A0=A0 if (n_cb =3D=3D n) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (rv_index =3D=3D 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = (bg =3D=3D 1 ? K0_1_1 : K0_1_2) * z_c;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else if (rv_index =3D=3D 2)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = (bg =3D=3D 1 ? K0_2_1 : K0_2_2) * z_c;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = (bg =3D=3D 1 ? K0_3_1 : K0_3_2) * z_c;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 /* LBRM case - includes a division by N */=0A= +=A0=A0=A0=A0=A0=A0 if (rv_index =3D=3D 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return (((bg =3D=3D 1 ? K0_1_1 = : K0_1_2) * n_cb)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 / n) * z_c;=0A= +=A0=A0=A0=A0=A0=A0 else if (rv_index =3D=3D 2)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return (((bg =3D=3D 1 ? K0_2_1 = : K0_2_2) * n_cb)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 / n) * z_c;=0A= +=A0=A0=A0=A0=A0=A0 else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return (((bg =3D=3D 1 ? K0_3_1 = : K0_3_2) * n_cb)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 / n) * z_c;=0A= +}=0A= +=0A= +/* Fill in a frame control word for LDPC encoding. */=0A= +static inline void=0A= +acc100_fcw_le_fill(const struct rte_bbdev_enc_op *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_fcw_le *fcw, int = num_cb)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 fcw->qm =3D op->ldpc_enc.q_m;=0A= +=A0=A0=A0=A0=A0=A0 fcw->nfiller =3D op->ldpc_enc.n_filler;=0A= +=A0=A0=A0=A0=A0=A0 fcw->BG =3D (op->ldpc_enc.basegraph - 1);=0A= +=A0=A0=A0=A0=A0=A0 fcw->Zc =3D op->ldpc_enc.z_c;=0A= +=A0=A0=A0=A0=A0=A0 fcw->ncb =3D op->ldpc_enc.n_cb;=0A= +=A0=A0=A0=A0=A0=A0 fcw->k0 =3D get_k0(fcw->ncb, fcw->Zc, op->ldpc_enc.base= graph,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->ldp= c_enc.rv_index);=0A= +=A0=A0=A0=A0=A0=A0 fcw->rm_e =3D op->ldpc_enc.cb_params.e;=0A= +=A0=A0=A0=A0=A0=A0 fcw->crc_select =3D check_bit(op->ldpc_enc.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_CRC_24B_ATTACH);=0A= +=A0=A0=A0=A0=A0=A0 fcw->bypass_intlv =3D check_bit(op->ldpc_enc.op_flags,= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_INTERLEAVER_BYPASS);=0A= +=A0=A0=A0=A0=A0=A0 fcw->mcb_count =3D num_cb;=0A= +}=0A= +=0A= +/* Fill in a frame control word for LDPC decoding. */=0A= +static inline void=0A= +acc100_fcw_ld_fill(const struct rte_bbdev_dec_op *op, struct acc100_fcw_ld= *fcw,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 union acc100_harq_layout_data *= harq_layout)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 uint16_t harq_out_length, harq_in_length, ncb_p, k0_p, = parity_offset;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t harq_index;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t l;=0A= +=A0=A0=A0=A0=A0=A0 bool harq_prun =3D false;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 fcw->qm =3D op->ldpc_dec.q_m;=0A= +=A0=A0=A0=A0=A0=A0 fcw->nfiller =3D op->ldpc_dec.n_filler;=0A= +=A0=A0=A0=A0=A0=A0 fcw->BG =3D (op->ldpc_dec.basegraph - 1);=0A= +=A0=A0=A0=A0=A0=A0 fcw->Zc =3D op->ldpc_dec.z_c;=0A= +=A0=A0=A0=A0=A0=A0 fcw->ncb =3D op->ldpc_dec.n_cb;=0A= +=A0=A0=A0=A0=A0=A0 fcw->k0 =3D get_k0(fcw->ncb, fcw->Zc, op->ldpc_dec.base= graph,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->ldp= c_dec.rv_index);=0A= +=A0=A0=A0=A0=A0=A0 if (op->ldpc_dec.code_block_mode =3D=3D 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->rm_e =3D op->ldpc_dec.cb_p= arams.e;=0A= +=A0=A0=A0=A0=A0=A0 else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->rm_e =3D (op->ldpc_dec.tb_= params.r <=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->ldpc_dec.tb_params.cab) ?=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->ldpc= _dec.tb_params.ea :=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->ldpc= _dec.tb_params.eb;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 fcw->hcin_en =3D check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_HQ_COMBINE_IN_ENABLE);=0A= +=A0=A0=A0=A0=A0=A0 fcw->hcout_en =3D check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_HQ_COMBINE_OUT_ENABLE);=0A= +=A0=A0=A0=A0=A0=A0 fcw->crc_select =3D check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_CRC_TYPE_24B_CHECK);=0A= +=A0=A0=A0=A0=A0=A0 fcw->bypass_dec =3D check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_DECODE_BYPASS);=0A= +=A0=A0=A0=A0=A0=A0 fcw->bypass_intlv =3D check_bit(op->ldpc_dec.op_flags,= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_DEINTERLEAVER_BYPASS);=0A= +=A0=A0=A0=A0=A0=A0 if (op->ldpc_dec.q_m =3D=3D 1) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->bypass_intlv =3D 1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->qm =3D 2;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 fcw->hcin_decomp_mode =3D check_bit(op->ldpc_dec.op_fla= gs,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_HARQ_6BIT_COMPRESSION);=0A= +=A0=A0=A0=A0=A0=A0 fcw->hcout_comp_mode =3D check_bit(op->ldpc_dec.op_flag= s,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_HARQ_6BIT_COMPRESSION);=0A= +=A0=A0=A0=A0=A0=A0 fcw->llr_pack_mode =3D check_bit(op->ldpc_dec.op_flags,= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_LLR_COMPRESSION);=0A= +=A0=A0=A0=A0=A0=A0 harq_index =3D op->ldpc_dec.harq_combined_output.offset= /=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ACC100_= HARQ_OFFSET;=0A= +#ifdef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0 /* Limit cases when HARQ pruning is valid */=0A= +=A0=A0=A0=A0=A0=A0 harq_prun =3D ((op->ldpc_dec.harq_combined_output.offse= t %=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ACC100_= HARQ_OFFSET) =3D=3D 0) &&=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (op->ld= pc_dec.harq_combined_output.offset <=3D UINT16_MAX=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 * ACC10= 0_HARQ_OFFSET);=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0 if (fcw->hcin_en > 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_in_length =3D op->ldpc_dec= .harq_combined_input.length;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (fcw->hcin_decomp_mode > 0)= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_in= _length =3D harq_in_length * 8 / 6;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_in_length =3D RTE_ALIGN(ha= rq_in_length, 64);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if ((harq_layout[harq_index].of= fset > 0) & harq_prun) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbd= ev_log_debug("HARQ IN offset unexpected for now\n");=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= in_size0 =3D harq_layout[harq_index].size0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= in_offset =3D harq_layout[harq_index].offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= in_size1 =3D harq_in_length -=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_layout[harq_index].offset;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= in_size0 =3D harq_in_length;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= in_offset =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= in_size1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hcin_size0 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hcin_offset =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hcin_size1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 fcw->itmax =3D op->ldpc_dec.iter_max;=0A= +=A0=A0=A0=A0=A0=A0 fcw->itstop =3D check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_ITERATION_STOP_ENABLE);=0A= +=A0=A0=A0=A0=A0=A0 fcw->synd_precoder =3D fcw->itstop;=0A= +=A0=A0=A0=A0=A0=A0 /*=0A= +=A0=A0=A0=A0=A0=A0=A0 * These are all implicitly set=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->synd_post =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->so_en =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->so_bypass_rm =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->so_bypass_intlv =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->dec_convllr =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->hcout_convllr =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->hcout_size1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->so_it =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->hcout_offset =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->negstop_th =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->negstop_it =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->negstop_en =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->gain_i =3D 1;=0A= +=A0=A0=A0=A0=A0=A0=A0 * fcw->gain_h =3D 1;=0A= +=A0=A0=A0=A0=A0=A0=A0 */=0A= +=A0=A0=A0=A0=A0=A0 if (fcw->hcout_en > 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 parity_offset =3D (op->ldpc_dec= .basegraph =3D=3D 1 ? 20 : 8)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 * op->l= dpc_dec.z_c - op->ldpc_dec.n_filler;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 k0_p =3D (fcw->k0 > parity_offs= et) ?=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 fcw->k0 - op->ldpc_dec.n_filler : fcw->k0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ncb_p =3D fcw->ncb - op->ldpc_d= ec.n_filler;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 l =3D k0_p + fcw->rm_e;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_out_length =3D (uint16_t) = fcw->hcin_size0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_out_length =3D RTE_MIN(RTE= _MAX(harq_out_length, l), ncb_p);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_out_length =3D (harq_out_l= ength + 0x3F) & 0xFFC0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if ((k0_p > fcw->hcin_size0 + A= CC100_HARQ_OFFSET_THRESHOLD) &&=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 harq_prun) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= out_size0 =3D (uint16_t) fcw->hcin_size0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= out_offset =3D k0_p & 0xFFC0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= out_size1 =3D harq_out_length - fcw->hcout_offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= out_size0 =3D harq_out_length;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= out_size1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hc= out_offset =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_layout[harq_index].offset = =3D fcw->hcout_offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_layout[harq_index].size0 = =3D fcw->hcout_size0;=0A= +=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hcout_size0 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hcout_size1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw->hcout_offset =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +}=0A= +=0A= +/**=0A= + * Fills descriptor with data pointers of one block type.=0A= + *=0A= + * @param desc=0A= + *=A0=A0 Pointer to DMA descriptor.=0A= + * @param input=0A= + *=A0=A0 Pointer to pointer to input data which will be encoded. It can be= changed=0A= + *=A0=A0 and points to next segment in scatter-gather case.=0A= + * @param offset=0A= + *=A0=A0 Input offset in rte_mbuf structure. It is used for calculating th= e point=0A= + *=A0=A0 where data is starting.=0A= + * @param cb_len=0A= + *=A0=A0 Length of currently processed Code Block=0A= + * @param seg_total_left=0A= + *=A0=A0 It indicates how many bytes still left in segment (mbuf) for furt= her=0A= + *=A0=A0 processing.=0A= + * @param op_flags=0A= + *=A0=A0 Store information about device capabilities=0A= + * @param next_triplet=0A= + *=A0=A0 Index for ACC100 DMA Descriptor triplet=0A= + *=0A= + * @return=0A= + *=A0=A0 Returns index of next triplet on success, other value if lengths = of=0A= + *=A0=A0 pkt and processed cb do not match.=0A= + *=0A= + */=0A= +static inline int=0A= +acc100_dma_fill_blk_type_in(struct acc100_dma_req_desc *desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_mbuf **input, uint32= _t *offset, uint32_t cb_len,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *seg_total_left, int n= ext_triplet)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 uint32_t part_len;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_mbuf *m =3D *input;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 part_len =3D (*seg_total_left < cb_len) ? *seg_total_le= ft : cb_len;=0A= +=A0=A0=A0=A0=A0=A0 cb_len -=3D part_len;=0A= +=A0=A0=A0=A0=A0=A0 *seg_total_left -=3D part_len;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_pkt= mbuf_iova_offset(m, *offset);=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].blen =3D part_len;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].blkid =3D ACC100_DMA_BLKI= D_IN;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].last =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 *offset +=3D part_len;=0A= +=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 while (cb_len > 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (next_triplet < ACC100_DMA_M= AX_NUM_POINTERS &&=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 m->next !=3D NULL) {=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 m =3D m= ->next;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 *seg_to= tal_left =3D rte_pktmbuf_data_len(m);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 part_le= n =3D (*seg_total_left < cb_len) ?=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 *seg_total_left :=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cb_len;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->d= ata_ptrs[next_triplet].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_pktmbuf_mtophys(m);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->d= ata_ptrs[next_triplet].blen =3D part_len;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->d= ata_ptrs[next_triplet].blkid =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ACC100_DMA_BLKID_IN;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->d= ata_ptrs[next_triplet].last =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->d= ata_ptrs[next_triplet].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cb_len = -=3D part_len;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 *seg_to= tal_left -=3D part_len;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Init= ializing offset for next segment (mbuf) */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 *offset= =3D part_len;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_tr= iplet++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbd= ev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Some data still left for processing: "=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "data_left: %u, next_triplet: %u, next_mbuf: %p",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 cb_len, next_triplet, m->next);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = -EINVAL;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 /* Storing new mbuf as it could be changed in scatter-g= ather case*/=0A= +=A0=A0=A0=A0=A0=A0 *input =3D m;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return next_triplet;=0A= +}=0A= +=0A= +/* Fills descriptor with data pointers of one block type.=0A= + * Returns index of next triplet on success, other value if lengths of=0A= + * output data and processed mbuf do not match.=0A= + */=0A= +static inline int=0A= +acc100_dma_fill_blk_type_out(struct acc100_dma_req_desc *desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_mbuf *output, uint32= _t out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t output_len, int next_t= riplet, int blk_id)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_pkt= mbuf_iova_offset(output, out_offset);=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].blen =3D output_len;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].blkid =3D blk_id;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].last =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return next_triplet;=0A= +}=0A= +=0A= +static inline int=0A= +acc100_dma_desc_le_fill(struct rte_bbdev_enc_op *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_dma_req_desc *des= c, struct rte_mbuf **input,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_mbuf *output, uint32= _t *in_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *out_offset, uint32_t = *out_length,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *mbuf_total_left, uint= 32_t *seg_total_left)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 int next_triplet =3D 1; /* FCW already done */=0A= +=A0=A0=A0=A0=A0=A0 uint16_t K, in_length_in_bits, in_length_in_bytes;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_op_ldpc_enc *enc =3D &op->ldpc_enc;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->word0 =3D ACC100_DMA_DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0 desc->word1 =3D 0; /**< Timestamp could be disabled */= =0A= +=A0=A0=A0=A0=A0=A0 desc->word2 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->word3 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->numCBs =3D 1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 K =3D (enc->basegraph =3D=3D 1 ? 22 : 10) * enc->z_c;= =0A= +=A0=A0=A0=A0=A0=A0 in_length_in_bits =3D K - enc->n_filler;=0A= +=A0=A0=A0=A0=A0=A0 if ((enc->op_flags & RTE_BBDEV_LDPC_CRC_24A_ATTACH) ||= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (enc->o= p_flags & RTE_BBDEV_LDPC_CRC_24B_ATTACH))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 in_length_in_bits -=3D 24;=0A= +=A0=A0=A0=A0=A0=A0 in_length_in_bytes =3D in_length_in_bits >> 3;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely((*mbuf_total_left =3D=3D 0) ||=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*mbuf_= total_left < in_length_in_bytes))) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Mismatch between mbuf length and included CB sizes: mbu= f len %u, cb len %u",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 *mbuf_total_left, in_length_in_bytes);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 next_triplet =3D acc100_dma_fill_blk_type_in(desc, inpu= t, in_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 in_leng= th_in_bytes,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 seg_tot= al_left, next_triplet);=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(next_triplet < 0)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Mismatch between data to process and mbuf data length i= n bbdev_op: %p",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet - 1].last =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->m2dlen =3D next_triplet;=0A= +=A0=A0=A0=A0=A0=A0 *mbuf_total_left -=3D in_length_in_bytes;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Set output length */=0A= +=A0=A0=A0=A0=A0=A0 /* Integer round up division by 8 */=0A= +=A0=A0=A0=A0=A0=A0 *out_length =3D (enc->cb_params.e + 7) >> 3;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 next_triplet =3D acc100_dma_fill_blk_type_out(desc, out= put, *out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 *out_le= ngth, next_triplet, ACC100_DMA_BLKID_OUT_ENC);=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(next_triplet < 0)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Mismatch between data to process and mbuf data length i= n bbdev_op: %p",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 op->ldpc_enc.output.length +=3D *out_length;=0A= +=A0=A0=A0=A0=A0=A0 *out_offset +=3D *out_length;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet - 1].last =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet - 1].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->d2mlen =3D next_triplet - desc->m2dlen;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->op_addr =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return 0;=0A= +}=0A= +=0A= +static inline int=0A= +acc100_dma_desc_ld_fill(struct rte_bbdev_dec_op *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_dma_req_desc *des= c,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_mbuf **input, struct= rte_mbuf *h_output,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *in_offset, uint32_t *= h_out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *h_out_length, uint32_= t *mbuf_total_left,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *seg_total_left,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_fcw_ld *fcw)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_op_ldpc_dec *dec =3D &op->ldpc_dec;=0A= +=A0=A0=A0=A0=A0=A0 int next_triplet =3D 1; /* FCW already done */=0A= +=A0=A0=A0=A0=A0=A0 uint32_t input_length;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t output_length, crc24_overlap =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t sys_cols, K, h_p_size, h_np_size;=0A= +=A0=A0=A0=A0=A0=A0 bool h_comp =3D check_bit(dec->op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_HARQ_6BIT_COMPRESSION);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->word0 =3D ACC100_DMA_DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0 desc->word1 =3D 0; /**< Timestamp could be disabled */= =0A= +=A0=A0=A0=A0=A0=A0 desc->word2 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->word3 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->numCBs =3D 1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_CRC_TYPE_24B_DROP))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 crc24_overlap =3D 24;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Compute some LDPC BG lengths */=0A= +=A0=A0=A0=A0=A0=A0 input_length =3D dec->cb_params.e;=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 RTE_BBD= EV_LDPC_LLR_COMPRESSION))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 input_length =3D (input_length = * 3 + 3) / 4;=0A= +=A0=A0=A0=A0=A0=A0 sys_cols =3D (dec->basegraph =3D=3D 1) ? 22 : 10;=0A= +=A0=A0=A0=A0=A0=A0 K =3D sys_cols * dec->z_c;=0A= +=A0=A0=A0=A0=A0=A0 output_length =3D K - dec->n_filler - crc24_overlap;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely((*mbuf_total_left =3D=3D 0) ||=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*mbuf_= total_left < input_length))) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Mismatch between mbuf length and included CB sizes: mbu= f len %u, cb len %u",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 *mbuf_total_left, input_length);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 next_triplet =3D acc100_dma_fill_blk_type_in(desc, inpu= t,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 in_offs= et, input_length,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 seg_tot= al_left, next_triplet);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(next_triplet < 0)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Mismatch between data to process and mbuf data length i= n bbdev_op: %p",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_p_size =3D fcw->hcin_size0 + = fcw->hcin_size1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (h_comp)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_p_siz= e =3D (h_p_size * 3 + 3) / 4;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].a= ddress =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 dec->harq_combined_input.offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].b= len =3D h_p_size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].b= lkid =3D ACC100_DMA_BLKID_IN_HARQ;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].d= ma_ext =3D 1;=0A= +#ifndef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_dma_fill_blk_type_out(= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->ldpc_dec.harq_combined_input.data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->ldpc_dec.harq_combined_input.offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 h_p_size,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 next_triplet,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ACC100_DMA_BLKID_IN_HARQ);=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet - 1].last =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->m2dlen =3D next_triplet;=0A= +=A0=A0=A0=A0=A0=A0 *mbuf_total_left -=3D input_length;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 next_triplet =3D acc100_dma_fill_blk_type_out(desc, h_o= utput,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 *h_out_= offset, output_length >> 3, next_triplet,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ACC100_= DMA_BLKID_OUT_HARD);=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(next_triplet < 0)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Mismatch between data to process and mbuf data length i= n bbdev_op: %p",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Pruned size of the HARQ */= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_p_size =3D fcw->hcout_size0 += fcw->hcout_size1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Non-Pruned size of the HARQ = */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_np_size =3D fcw->hcout_offset= > 0 ?=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 fcw->hcout_offset + fcw->hcout_size1 :=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 h_p_size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (h_comp) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_np_si= ze =3D (h_np_size * 3 + 3) / 4;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_p_siz= e =3D (h_p_size * 3 + 3) / 4;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dec->harq_combined_output.lengt= h =3D h_np_size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].a= ddress =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 dec->harq_combined_output.offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].b= len =3D h_p_size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].b= lkid =3D ACC100_DMA_BLKID_OUT_HARQ;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].d= ma_ext =3D 1;=0A= +#ifndef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_dma_fill_blk_type_out(= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 dec->harq_combined_output.data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 dec->harq_combined_output.offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 h_p_size,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 next_triplet,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ACC100_DMA_BLKID_OUT_HARQ);=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 *h_out_length =3D output_length >> 3;=0A= +=A0=A0=A0=A0=A0=A0 dec->hard_output.length +=3D *h_out_length;=0A= +=A0=A0=A0=A0=A0=A0 *h_out_offset +=3D *h_out_length;=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet - 1].last =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->d2mlen =3D next_triplet - desc->m2dlen;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->op_addr =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return 0;=0A= +}=0A= +=0A= +static inline void=0A= +acc100_dma_desc_ld_update(struct rte_bbdev_dec_op *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_dma_req_desc *des= c,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_mbuf *input, struct = rte_mbuf *h_output,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *in_offset, uint32_t *= h_out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t *h_out_length,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 union acc100_harq_layout_data *= harq_layout)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 int next_triplet =3D 1; /* FCW already done */=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_pkt= mbuf_iova_offset(input, *in_offset);=0A= +=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_op_data hi =3D= op->ldpc_dec.harq_combined_input;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].a= ddress =3D hi.offset;=0A= +#ifndef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].a= ddress =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rte_pktmbuf_iova_offset(hi.data, hi.offset);=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_pkt= mbuf_iova_offset(h_output, *h_out_offset);=0A= +=A0=A0=A0=A0=A0=A0 *h_out_length =3D desc->data_ptrs[next_triplet].blen;= =0A= +=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(op->ldpc_dec.op_flags,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].a= ddress =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->ldpc_dec.harq_combined_output.offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Adjust based on previous ope= ration */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op *prev_o= p =3D desc->op_addr;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->ldpc_dec.harq_combined_outp= ut.length =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 prev_op->ldpc_dec.harq_combined_output.length;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 int16_t hq_idx =3D op->ldpc_dec= .harq_combined_output.offset /=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ACC100_HARQ_OFFSET;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 int16_t prev_hq_idx =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 prev_op->ldpc_dec.harq_combined_output.offset=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 / ACC100_HARQ_OFFSET;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 harq_layout[hq_idx].val =3D har= q_layout[prev_hq_idx].val;=0A= +#ifndef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_op_data ho =3D= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->ldpc_dec.harq_combined_output;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->data_ptrs[next_triplet].a= ddress =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rte_pktmbuf_iova_offset(ho.data, ho.offset);=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 op->ldpc_dec.hard_output.length +=3D *h_out_length;=0A= +=A0=A0=A0=A0=A0=A0 desc->op_addr =3D op;=0A= +}=0A= +=0A= +=0A= +/* Enqueue a number of operations to HW and update software rings */=0A= +static inline void=0A= +acc100_dma_enqueue(struct acc100_queue *q, uint16_t n,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_stats *queue_s= tats)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_enqueue_reg_fmt enq_req;=0A= +#ifdef RTE_BBDEV_OFFLOAD_COST=0A= +=A0=A0=A0=A0=A0=A0 uint64_t start_time =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 queue_stats->acc_offload_cycles =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 RTE_SET_USED(queue_stats);=0A= +#else=0A= +=A0=A0=A0=A0=A0=A0 RTE_SET_USED(queue_stats);=0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0 enq_req.val =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 /* Setting offset, 100b for 256 DMA Desc */=0A= +=A0=A0=A0=A0=A0=A0 enq_req.addr_offset =3D ACC100_DESC_OFFSET;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Split ops into batches */=0A= +=A0=A0=A0=A0=A0=A0 do {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t enq_batch_size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint64_t offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_iova_t req_elem_addr;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_batch_size =3D RTE_MIN(n, M= AX_ENQ_BATCH_SIZE);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Set flag on last descriptor = in a batch */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw= _ring_head + enq_batch_size - 1) &=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 q->sw_ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.last_desc_in_batch = =3D 1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Calculate the 1st descriptor= 's address */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 offset =3D ((q->sw_ring_head & = q->sw_ring_wrap_mask) *=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 sizeof(union acc100_dma_desc));=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 req_elem_addr =3D q->ring_addr_= phys + offset;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Fill enqueue struct */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_req.num_elem =3D enq_batch_= size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* low 6 bits are not needed */= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_req.req_elem_addr =3D (uint= 32_t)(req_elem_addr >> 6);=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "Req sdone"= , desc, sizeof(*desc));=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log_debug(=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Enqueue %u reqs (phys %#"PRIx64") to reg %p",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 enq_batch_size,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 req_elem_addr,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 (void *)q->mmio_reg_enqueue);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_wmb();=0A= +=0A= +#ifdef RTE_BBDEV_OFFLOAD_COST=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Start time measurement for e= nqueue function offload. */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 start_time =3D rte_rdtsc_precis= e();=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(DEBUG, "Debug : M= MIO Enqueue");=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 mmio_write(q->mmio_reg_enqueue,= enq_req.val);=0A= +=0A= +#ifdef RTE_BBDEV_OFFLOAD_COST=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 queue_stats->acc_offload_cycles= +=3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rte_rdtsc_precise() - start_time;=0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 q->aq_enqueued++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 q->sw_ring_head +=3D enq_batch_= size;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 n -=3D enq_batch_size;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 } while (n);=0A= +=0A= +=0A= +}=0A= +=0A= +/* Enqueue one encode operations for ACC100 device in CB mode */=0A= +static inline int=0A= +enqueue_ldpc_enc_n_op_cb(struct acc100_queue *q, struct rte_bbdev_enc_op *= *ops,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t total_enqueued_cbs, in= t16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc =3D NULL;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t out_length;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_mbuf *output_head, *output;=0A= +=A0=A0=A0=A0=A0=A0 int i, next_triplet;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t=A0 in_length_in_bytes;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_op_ldpc_enc *enc =3D &ops[0]->ldpc_enc= ;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 uint16_t desc_idx =3D ((q->sw_ring_head + total_enqueue= d_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + desc_idx;=0A= +=A0=A0=A0=A0=A0=A0 acc100_fcw_le_fill(ops[0], &desc->req.fcw_le, num);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /** This could be done at polling */=0A= +=A0=A0=A0=A0=A0=A0 desc->req.word0 =3D ACC100_DMA_DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.word1 =3D 0; /**< Timestamp could be disabled= */=0A= +=A0=A0=A0=A0=A0=A0 desc->req.word2 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.word3 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.numCBs =3D num;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 in_length_in_bytes =3D ops[0]->ldpc_enc.input.data->dat= a_len;=0A= +=A0=A0=A0=A0=A0=A0 out_length =3D (enc->cb_params.e + 7) >> 3;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.m2dlen =3D 1 + num;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.d2mlen =3D num;=0A= +=A0=A0=A0=A0=A0=A0 next_triplet =3D 1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < num; i++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[next_triple= t].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_pkt= mbuf_iova_offset(ops[i]->ldpc_enc.input.data, 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[next_triple= t].blen =3D in_length_in_bytes;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[next_triple= t].address =3D=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rte_pktmbuf_iova_offset(=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ops[i]->ldpc_enc.output.data, 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[next_triple= t].blen =3D out_length;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 next_triplet++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ops[i]->ldpc_enc.output.length = =3D out_length;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 output_head =3D output =3D ops[= i]->ldpc_enc.output.data;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 mbuf_append(output_head, output= , out_length);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 output->data_len =3D out_length= ;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->req.op_addr =3D ops[0];=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "FCW", &desc->req.fcw_le,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sizeof(= desc->req.fcw_le) - 8);=0A= +=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "Req Desc.", desc, sizeof(*desc));= =0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* One CB (one op) was successfully prepared to enqueue= */=0A= +=A0=A0=A0=A0=A0=A0 return num;=0A= +}=0A= +=0A= +/* Enqueue one encode operations for ACC100 device in CB mode */=0A= +static inline int=0A= +enqueue_ldpc_enc_one_op_cb(struct acc100_queue *q, struct rte_bbdev_enc_op= *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t total_enqueued_cbs)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc =3D NULL;=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t in_offset, out_offset, out_length, mbuf_total_= left,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 seg_total_left;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_mbuf *input, *output_head, *output;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 uint16_t desc_idx =3D ((q->sw_ring_head + total_enqueue= d_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + desc_idx;=0A= +=A0=A0=A0=A0=A0=A0 acc100_fcw_le_fill(op, &desc->req.fcw_le, 1);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 input =3D op->ldpc_enc.input.data;=0A= +=A0=A0=A0=A0=A0=A0 output_head =3D output =3D op->ldpc_enc.output.data;=0A= +=A0=A0=A0=A0=A0=A0 in_offset =3D op->ldpc_enc.input.offset;=0A= +=A0=A0=A0=A0=A0=A0 out_offset =3D op->ldpc_enc.output.offset;=0A= +=A0=A0=A0=A0=A0=A0 out_length =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 mbuf_total_left =3D op->ldpc_enc.input.length;=0A= +=A0=A0=A0=A0=A0=A0 seg_total_left =3D rte_pktmbuf_data_len(op->ldpc_enc.in= put.data)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 - in_of= fset;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 ret =3D acc100_dma_desc_le_fill(op, &desc->req, &input,= output,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &in_off= set, &out_offset, &out_length, &mbuf_total_left,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &seg_to= tal_left);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(ret < 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return ret;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 mbuf_append(output_head, output, out_length);=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "FCW", &desc->req.fcw_le,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sizeof(= desc->req.fcw_le) - 8);=0A= +=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "Req Desc.", desc, sizeof(*desc));= =0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check if any data left after processing one CB */=0A= +=A0=A0=A0=A0=A0=A0 if (mbuf_total_left !=3D 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Some date still left after processing one CB: mbuf_tota= l_left =3D %u",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 mbuf_total_left);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -EINVAL;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0 /* One CB (one op) was successfully prepared to enqueue= */=0A= +=A0=A0=A0=A0=A0=A0 return 1;=0A= +}=0A= +=0A= +/** Enqueue one decode operations for ACC100 device in CB mode */=0A= +static inline int=0A= +enqueue_ldpc_dec_one_op_cb(struct acc100_queue *q, struct rte_bbdev_dec_op= *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t total_enqueued_cbs, bo= ol same_op)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t desc_idx =3D ((q->sw_ring_head + total_enqueue= d_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + desc_idx;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_mbuf *input, *h_output_head, *h_output;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t in_offset, h_out_offset, h_out_length, mbuf_to= tal_left;=0A= +=A0=A0=A0=A0=A0=A0 input =3D op->ldpc_dec.input.data;=0A= +=A0=A0=A0=A0=A0=A0 h_output_head =3D h_output =3D op->ldpc_dec.hard_output= .data;=0A= +=A0=A0=A0=A0=A0=A0 in_offset =3D op->ldpc_dec.input.offset;=0A= +=A0=A0=A0=A0=A0=A0 h_out_offset =3D op->ldpc_dec.hard_output.offset;=0A= +=A0=A0=A0=A0=A0=A0 mbuf_total_left =3D op->ldpc_dec.input.length;=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(input =3D=3D NULL)) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR, "Invalid mbu= f pointer");=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -EFAULT;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0 union acc100_harq_layout_data *harq_layout =3D q->d->ha= rq_layout;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (same_op) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *prev_des= c;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc_idx =3D ((q->sw_ring_head = + total_enqueued_cbs - 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 & q->sw_ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 prev_desc =3D q->ring_addr + de= sc_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint8_t *prev_ptr =3D (uint8_t = *) prev_desc;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint8_t *new_ptr =3D (uint8_t *= ) desc;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Copy first 4 words and BDESC= s */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_memcpy(new_ptr, prev_ptr, 1= 6);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_memcpy(new_ptr + 36, prev_p= tr + 36, 40);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.op_addr =3D prev_desc= ->req.op_addr;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Copy FCW */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_memcpy(new_ptr + ACC100_DES= C_FCW_OFFSET,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 prev_ptr + ACC100_DESC_FCW_OFFSET,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ACC100_FCW_LD_BLEN);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_dma_desc_ld_update(op, &= desc->req, input, h_output,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &in_offset, &h_out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &h_out_length, harq_layout);=0A= +=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_fcw_ld *fcw;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint32_t seg_total_left;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fcw =3D &desc->req.fcw_ld;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_fcw_ld_fill(op, fcw, har= q_layout);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Special handling when overus= ing mbuf */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (fcw->rm_e < MAX_E_MBUF)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 seg_tot= al_left =3D rte_pktmbuf_data_len(input)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 - in_offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 seg_tot= al_left =3D fcw->rm_e;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D acc100_dma_desc_ld_fill= (op, &desc->req, &input, h_output,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &in_offset, &h_out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &h_out_length, &mbuf_total_left,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &seg_total_left, fcw);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (unlikely(ret < 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = ret;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Hard output */=0A= +=A0=A0=A0=A0=A0=A0 mbuf_append(h_output_head, h_output, h_out_length);=0A= +#ifndef ACC100_EXT_MEM=0A= +=A0=A0=A0=A0=A0=A0 if (op->ldpc_dec.harq_combined_output.length > 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Push the HARQ output into ho= st memory */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_mbuf *hq_output_head= , *hq_output;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hq_output_head =3D op->ldpc_dec= .harq_combined_output.data;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hq_output =3D op->ldpc_dec.harq= _combined_output.data;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 mbuf_append(hq_output_head, hq_= output,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->ldpc_dec.harq_combined_output.length);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +#endif=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "FCW", &desc->req.fcw_ld,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sizeof(= desc->req.fcw_ld) - 8);=0A= +=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "Req Desc.", desc, sizeof(*desc));= =0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* One CB (one op) was successfully prepared to enqueue= */=0A= +=A0=A0=A0=A0=A0=A0 return 1;=0A= +}=0A= +=0A= +=0A= +/* Enqueue one decode operations for ACC100 device in TB mode */=0A= +static inline int=0A= +enqueue_ldpc_dec_one_op_tb(struct acc100_queue *q, struct rte_bbdev_dec_op= *op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t total_enqueued_cbs, ui= nt8_t cbs_in_tb)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc =3D NULL;=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=A0=A0=A0=A0=A0=A0 uint8_t r, c;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t in_offset, h_out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_out_length, mbuf_total_left, = seg_total_left;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_mbuf *input, *h_output_head, *h_output;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t current_enqueued_cbs =3D 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 uint16_t desc_idx =3D ((q->sw_ring_head + total_enqueue= d_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + desc_idx;=0A= +=A0=A0=A0=A0=A0=A0 uint64_t fcw_offset =3D (desc_idx << 8) + ACC100_DESC_F= CW_OFFSET;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_harq_layout_data *harq_layout =3D q->d->ha= rq_layout;=0A= +=A0=A0=A0=A0=A0=A0 acc100_fcw_ld_fill(op, &desc->req.fcw_ld, harq_layout);= =0A= +=0A= +=A0=A0=A0=A0=A0=A0 input =3D op->ldpc_dec.input.data;=0A= +=A0=A0=A0=A0=A0=A0 h_output_head =3D h_output =3D op->ldpc_dec.hard_output= .data;=0A= +=A0=A0=A0=A0=A0=A0 in_offset =3D op->ldpc_dec.input.offset;=0A= +=A0=A0=A0=A0=A0=A0 h_out_offset =3D op->ldpc_dec.hard_output.offset;=0A= +=A0=A0=A0=A0=A0=A0 h_out_length =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 mbuf_total_left =3D op->ldpc_dec.input.length;=0A= +=A0=A0=A0=A0=A0=A0 c =3D op->ldpc_dec.tb_params.c;=0A= +=A0=A0=A0=A0=A0=A0 r =3D op->ldpc_dec.tb_params.r;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 while (mbuf_total_left > 0 && r < c) {=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 seg_total_left =3D rte_pktmbuf_= data_len(input) - in_offset;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Set up DMA descriptor */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw= _ring_head + total_enqueued_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 & q->sw_ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].address = =3D q->ring_addr_phys + fcw_offset;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].blen =3D= ACC100_FCW_LD_BLEN;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D acc100_dma_desc_ld_fill= (op, &desc->req, &input,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 h_output, &in_offset, &h_out_offset,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &h_out_length,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &mbuf_total_left, &seg_total_left,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 &desc->req.fcw_ld);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (unlikely(ret < 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = ret;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Hard output */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 mbuf_append(h_output_head, h_ou= tput, h_out_length);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Set total number of CBs in T= B */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.cbs_in_tb =3D cbs_in_= tb;=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "FCW", &des= c->req.fcw_td,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 sizeof(desc->req.fcw_td) - 8);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_memdump(stderr, "Req Desc."= , desc, sizeof(*desc));=0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (seg_total_left =3D=3D 0) {= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Go t= o the next mbuf */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 input = =3D input->next;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 in_offs= et =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_outpu= t =3D h_output->next;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 h_out_o= ffset =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 total_enqueued_cbs++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 current_enqueued_cbs++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 r++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(desc =3D=3D NULL))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return current_enqueued_cbs;=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 /* Check if any CBs left for processing */=0A= +=A0=A0=A0=A0=A0=A0 if (mbuf_total_left !=3D 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 "Some date still left for processing: mbuf_total_left = =3D %u",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 mbuf_total_left);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -EINVAL;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0 /* Set SDone on last CB descriptor for TB mode */=0A= +=A0=A0=A0=A0=A0=A0 desc->req.sdone_enable =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.irq_enable =3D q->irq_enable;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return current_enqueued_cbs;=0A= +}=0A= +=0A= +=0A= +/* Calculates number of CBs in processed encoder TB based on 'r' and input= =0A= + * length.=0A= + */=0A= +static inline uint8_t=0A= +get_num_cbs_in_tb_enc(struct rte_bbdev_op_turbo_enc *turbo_enc)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 uint8_t c, c_neg, r, crc24_bits =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t k, k_neg, k_pos;=0A= +=A0=A0=A0=A0=A0=A0 uint8_t cbs_in_tb =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 int32_t length;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 length =3D turbo_enc->input.length;=0A= +=A0=A0=A0=A0=A0=A0 r =3D turbo_enc->tb_params.r;=0A= +=A0=A0=A0=A0=A0=A0 c =3D turbo_enc->tb_params.c;=0A= +=A0=A0=A0=A0=A0=A0 c_neg =3D turbo_enc->tb_params.c_neg;=0A= +=A0=A0=A0=A0=A0=A0 k_neg =3D turbo_enc->tb_params.k_neg;=0A= +=A0=A0=A0=A0=A0=A0 k_pos =3D turbo_enc->tb_params.k_pos;=0A= +=A0=A0=A0=A0=A0=A0 crc24_bits =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 if (check_bit(turbo_enc->op_flags, RTE_BBDEV_TURBO_CRC_= 24B_ATTACH))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 crc24_bits =3D 24;=0A= +=A0=A0=A0=A0=A0=A0 while (length > 0 && r < c) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 k =3D (r < c_neg) ? k_neg : k_p= os;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 length -=3D (k - crc24_bits) >>= 3;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 r++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cbs_in_tb++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return cbs_in_tb;=0A= +}=0A= +=0A= +/* Calculates number of CBs in processed decoder TB based on 'r' and input= =0A= + * length.=0A= + */=0A= +static inline uint16_t=0A= +get_num_cbs_in_tb_dec(struct rte_bbdev_op_turbo_dec *turbo_dec)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 uint8_t c, c_neg, r =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t kw, k, k_neg, k_pos, cbs_in_tb =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 int32_t length;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 length =3D turbo_dec->input.length;=0A= +=A0=A0=A0=A0=A0=A0 r =3D turbo_dec->tb_params.r;=0A= +=A0=A0=A0=A0=A0=A0 c =3D turbo_dec->tb_params.c;=0A= +=A0=A0=A0=A0=A0=A0 c_neg =3D turbo_dec->tb_params.c_neg;=0A= +=A0=A0=A0=A0=A0=A0 k_neg =3D turbo_dec->tb_params.k_neg;=0A= +=A0=A0=A0=A0=A0=A0 k_pos =3D turbo_dec->tb_params.k_pos;=0A= +=A0=A0=A0=A0=A0=A0 while (length > 0 && r < c) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 k =3D (r < c_neg) ? k_neg : k_p= os;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 kw =3D RTE_ALIGN_CEIL(k + 4, 32= ) * 3;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 length -=3D kw;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 r++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cbs_in_tb++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return cbs_in_tb;=0A= +}=0A= +=0A= +/* Calculates number of CBs in processed decoder TB based on 'r' and input= =0A= + * length.=0A= + */=0A= +static inline uint16_t=0A= +get_num_cbs_in_tb_ldpc_dec(struct rte_bbdev_op_ldpc_dec *ldpc_dec)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 uint16_t r, cbs_in_tb =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 int32_t length =3D ldpc_dec->input.length;=0A= +=A0=A0=A0=A0=A0=A0 r =3D ldpc_dec->tb_params.r;=0A= +=A0=A0=A0=A0=A0=A0 while (length > 0 && r < ldpc_dec->tb_params.c) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 length -=3D=A0 (r < ldpc_dec->t= b_params.cab) ?=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ldpc_dec->tb_params.ea :=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ldpc_dec->tb_params.eb;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 r++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cbs_in_tb++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 return cbs_in_tb;=0A= +}=0A= +=0A= +/* Check we can mux encode operations with common FCW */=0A= +static inline bool=0A= +check_mux(struct rte_bbdev_enc_op **ops, uint16_t num) {=0A= +=A0=A0=A0=A0=A0=A0 uint16_t i;=0A= +=A0=A0=A0=A0=A0=A0 if (num =3D=3D 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return false;=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 1; i < num; ++i) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Only mux compatible code blo= cks */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (memcmp((uint8_t *)(&ops[i]-= >ldpc_enc) + ENC_OFFSET,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 (uint8_t *)(&ops[0]->ldpc_enc) + ENC_OFFSET,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 CMP_ENC_SIZE) !=3D 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return = false;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 return true;=0A= +}=0A= +=0A= +/** Enqueue encode operations for ACC100 device in CB mode. */=0A= +static inline uint16_t=0A= +acc100_enqueue_ldpc_enc_cb(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_enc_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_queue *q =3D q_data->queue_private;=0A= +=A0=A0=A0=A0=A0=A0 int32_t avail =3D q->sw_ring_depth + q->sw_ring_tail - = q->sw_ring_head;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t i =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc;=0A= +=A0=A0=A0=A0=A0=A0 int ret, desc_idx =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 int16_t enq, left =3D num;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 while (left > 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (unlikely(avail - 1 < 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 avail--;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq =3D RTE_MIN(left, MUX_5GDL_= DESC);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (check_mux(&ops[i], enq)) {= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D= enqueue_ldpc_enc_n_op_cb(q, &ops[i],=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc_idx, enq);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (ret= < 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 break;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i +=3D = enq;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } else {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D= enqueue_ldpc_enc_one_op_cb(q, ops[i], desc_idx);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (ret= < 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 break;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc_idx++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 left =3D num - i;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(i =3D=3D 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0; /* Nothing to enqueue= */=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Set SDone in last CB in enqueued ops for CB mode*/= =0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_head + desc_idx - = 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 desc->req.sdone_enable =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.irq_enable =3D q->irq_enable;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 acc100_dma_enqueue(q, desc_idx, &q_data->queue_stats);= =0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Update stats */=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.enqueued_count +=3D i;=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.enqueue_err_count +=3D num - i;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return i;=0A= +}=0A= +=0A= +/* Enqueue encode operations for ACC100 device. */=0A= +static uint16_t=0A= +acc100_enqueue_ldpc_enc(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_enc_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(num =3D=3D 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0;=0A= +=A0=A0=A0=A0=A0=A0 return acc100_enqueue_ldpc_enc_cb(q_data, ops, num);=0A= +}=0A= +=0A= +/* Check we can mux encode operations with common FCW */=0A= +static inline bool=0A= +cmp_ldpc_dec_op(struct rte_bbdev_dec_op **ops) {=0A= +=A0=A0=A0=A0=A0=A0 /* Only mux compatible code blocks */=0A= +=A0=A0=A0=A0=A0=A0 if (memcmp((uint8_t *)(&ops[0]->ldpc_dec) + DEC_OFFSET,= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (uint8_= t *)(&ops[1]->ldpc_dec) +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 DEC_OFF= SET, CMP_DEC_SIZE) !=3D 0) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return false;=0A= +=A0=A0=A0=A0=A0=A0 } else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return true;=0A= +}=0A= +=0A= +=0A= +/* Enqueue decode operations for ACC100 device in TB mode */=0A= +static uint16_t=0A= +acc100_enqueue_ldpc_dec_tb(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_queue *q =3D q_data->queue_private;=0A= +=A0=A0=A0=A0=A0=A0 int32_t avail =3D q->sw_ring_depth + q->sw_ring_tail - = q->sw_ring_head;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t i, enqueued_cbs =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint8_t cbs_in_tb;=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < num; ++i) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cbs_in_tb =3D get_num_cbs_in_tb= _ldpc_dec(&ops[i]->ldpc_dec);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Check if there are available= space for further processing */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (unlikely(avail - cbs_in_tb = < 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 avail -=3D cbs_in_tb;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D enqueue_ldpc_dec_one_op= _tb(q, ops[i],=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 enqueued_cbs, cbs_in_tb);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (ret < 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enqueued_cbs +=3D ret;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 acc100_dma_enqueue(q, enqueued_cbs, &q_data->queue_stat= s);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Update stats */=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.enqueued_count +=3D i;=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.enqueue_err_count +=3D num - i;=0A= +=A0=A0=A0=A0=A0=A0 return i;=0A= +}=0A= +=0A= +/* Enqueue decode operations for ACC100 device in CB mode */=0A= +static uint16_t=0A= +acc100_enqueue_ldpc_dec_cb(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_queue *q =3D q_data->queue_private;=0A= +=A0=A0=A0=A0=A0=A0 int32_t avail =3D q->sw_ring_depth + q->sw_ring_tail - = q->sw_ring_head;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t i;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc;=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=A0=A0=A0=A0=A0=A0 bool same_op =3D false;=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < num; ++i) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Check if there are available= space for further processing */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (unlikely(avail - 1 < 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 avail -=3D 1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (i > 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 same_op= =3D cmp_ldpc_dec_op(&ops[i-1]);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(INFO, "Op %d %d %= d %d %d %d %d %d %d %d %d %d\n",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i, ops[= i]->ldpc_dec.op_flags, ops[i]->ldpc_dec.rv_index,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ops[i]-= >ldpc_dec.iter_max, ops[i]->ldpc_dec.iter_count,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ops[i]-= >ldpc_dec.basegraph, ops[i]->ldpc_dec.z_c,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ops[i]-= >ldpc_dec.n_cb, ops[i]->ldpc_dec.q_m,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ops[i]-= >ldpc_dec.n_filler, ops[i]->ldpc_dec.cb_params.e,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 same_op= );=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D enqueue_ldpc_dec_one_op= _cb(q, ops[i], i, same_op);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (ret < 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(i =3D=3D 0))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0; /* Nothing to enqueue= */=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Set SDone in last CB in enqueued ops for CB mode*/= =0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_head + i - 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->req.sdone_enable =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.irq_enable =3D q->irq_enable;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 acc100_dma_enqueue(q, i, &q_data->queue_stats);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Update stats */=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.enqueued_count +=3D i;=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.enqueue_err_count +=3D num - i;=0A= +=A0=A0=A0=A0=A0=A0 return i;=0A= +}=0A= +=0A= +/* Enqueue decode operations for ACC100 device. */=0A= +static uint16_t=0A= +acc100_enqueue_ldpc_dec(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_queue *q =3D q_data->queue_private;=0A= +=A0=A0=A0=A0=A0=A0 int32_t aq_avail =3D q->aq_depth +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (q->aq_= dequeued - q->aq_enqueued) / 128;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely((aq_avail =3D=3D 0) || (num =3D=3D 0)))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (ops[0]->ldpc_dec.code_block_mode =3D=3D 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return acc100_enqueue_ldpc_dec_= tb(q_data, ops, num);=0A= +=A0=A0=A0=A0=A0=A0 else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return acc100_enqueue_ldpc_dec_= cb(q_data, ops, num);=0A= +}=0A= +=0A= +=0A= +/* Dequeue one encode operations from ACC100 device in CB mode */=0A= +static inline int=0A= +dequeue_enc_one_op_cb(struct acc100_queue *q, struct rte_bbdev_enc_op **re= f_op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t total_dequeued_cbs, ui= nt32_t *aq_dequeued)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc, atom_desc;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_rsp_desc rsp;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_enc_op *op;=0A= +=A0=A0=A0=A0=A0=A0 int i;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_tail + total_deque= ued_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)desc= ,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check fdone bit */=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_FDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 rsp.val =3D atom_desc.rsp.val;=0A= +=A0=A0=A0=A0=A0=A0 rte_bbdev_log_debug("Resp. desc %p: %x", desc, rsp.val)= ;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Dequeue */=0A= +=A0=A0=A0=A0=A0=A0 op =3D desc->req.op_addr;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Clearing status, it will be set based on response */= =0A= +=A0=A0=A0=A0=A0=A0 op->status =3D 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.input_err)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ? (1 <<= RTE_BBDEV_DATA_ERROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.dma_err) ? (1 << RTE_BBDEV_DRV_ER= ROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.fcw_err) ? (1 << RTE_BBDEV_DRV_ER= ROR) : 0);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (desc->req.last_desc_in_batch) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*aq_dequeued)++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.last_desc_in_batch = =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.val =3D ACC100_DMA_DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_0 =3D 0; /*Reserved bits */=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_1 =3D 0; /*Reserved bits */=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Flag that the muxing cause loss of opaque data */=0A= +=A0=A0=A0=A0=A0=A0 op->opaque_data =3D (void *)-1;=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0 ; i < desc->req.numCBs; i++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ref_op[i] =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* One CB (op) was successfully dequeued */=0A= +=A0=A0=A0=A0=A0=A0 return desc->req.numCBs;=0A= +}=0A= +=0A= +/* Dequeue one encode operations from ACC100 device in TB mode */=0A= +static inline int=0A= +dequeue_enc_one_op_tb(struct acc100_queue *q, struct rte_bbdev_enc_op **re= f_op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t total_dequeued_cbs, ui= nt32_t *aq_dequeued)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc, *last_desc, atom_desc;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_rsp_desc rsp;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_enc_op *op;=0A= +=A0=A0=A0=A0=A0=A0 uint8_t i =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t current_dequeued_cbs =3D 0, cbs_in_tb;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_tail + total_deque= ued_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)desc= ,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check fdone bit */=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_FDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Get number of CBs in dequeued TB */=0A= +=A0=A0=A0=A0=A0=A0 cbs_in_tb =3D desc->req.cbs_in_tb;=0A= +=A0=A0=A0=A0=A0=A0 /* Get last CB */=0A= +=A0=A0=A0=A0=A0=A0 last_desc =3D q->ring_addr + ((q->sw_ring_tail=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 + total= _dequeued_cbs + cbs_in_tb - 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 /* Check if last CB in TB is ready to dequeue (and thus= =0A= +=A0=A0=A0=A0=A0=A0=A0 * the whole TB) - checking sdone bit. If not return.= =0A= +=A0=A0=A0=A0=A0=A0=A0 */=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)last= _desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_SDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Dequeue */=0A= +=A0=A0=A0=A0=A0=A0 op =3D desc->req.op_addr;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Clearing status, it will be set based on response */= =0A= +=A0=A0=A0=A0=A0=A0 op->status =3D 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 while (i < cbs_in_tb) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw= _ring_tail=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 + total_dequeued_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 & q->sw_ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic= _load_n((uint64_t *)desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 __ATOMIC_RELAXED);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rsp.val =3D atom_desc.rsp.val;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log_debug("Resp. desc= %p: %x", desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rsp.val);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.input_err= )=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ? (1 << RTE_BBDEV_DATA_ERROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.dma_err) = ? (1 << RTE_BBDEV_DRV_ERROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.fcw_err) = ? (1 << RTE_BBDEV_DRV_ERROR) : 0);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (desc->req.last_desc_in_batc= h) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*aq_de= queued)++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->r= eq.last_desc_in_batch =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->rsp.val =3D ACC100_DMA_DE= SC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_0 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 total_dequeued_cbs++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 current_dequeued_cbs++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 *ref_op =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return current_dequeued_cbs;=0A= +}=0A= +=0A= +/* Dequeue one decode operation from ACC100 device in CB mode */=0A= +static inline int=0A= +dequeue_dec_one_op_cb(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_queue *q, struct = rte_bbdev_dec_op **ref_op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t dequeued_cbs, uint32_t= *aq_dequeued)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc, atom_desc;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_rsp_desc rsp;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op *op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_tail + dequeued_cb= s)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)desc= ,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check fdone bit */=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_FDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 rsp.val =3D atom_desc.rsp.val;=0A= +=A0=A0=A0=A0=A0=A0 rte_bbdev_log_debug("Resp. desc %p: %x", desc, rsp.val)= ;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Dequeue */=0A= +=A0=A0=A0=A0=A0=A0 op =3D desc->req.op_addr;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Clearing status, it will be set based on response */= =0A= +=A0=A0=A0=A0=A0=A0 op->status =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.input_err)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ? (1 <<= RTE_BBDEV_DATA_ERROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.dma_err) ? (1 << RTE_BBDEV_DRV_ER= ROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.fcw_err) ? (1 << RTE_BBDEV_DRV_ER= ROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0 if (op->status !=3D 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 q_data->queue_stats.dequeue_err= _count++;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* CRC invalid if error exists */=0A= +=A0=A0=A0=A0=A0=A0 if (!op->status)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D rsp.crc_status = << RTE_BBDEV_CRC_ERROR;=0A= +=A0=A0=A0=A0=A0=A0 op->turbo_dec.iter_count =3D (uint8_t) rsp.iter_cnt / 2= ;=0A= +=A0=A0=A0=A0=A0=A0 /* Check if this is the last desc in batch (Atomic Queu= e) */=0A= +=A0=A0=A0=A0=A0=A0 if (desc->req.last_desc_in_batch) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*aq_dequeued)++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.last_desc_in_batch = =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.val =3D ACC100_DMA_DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_0 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 *ref_op =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* One CB (op) was successfully dequeued */=0A= +=A0=A0=A0=A0=A0=A0 return 1;=0A= +}=0A= +=0A= +/* Dequeue one decode operations from ACC100 device in CB mode */=0A= +static inline int=0A= +dequeue_ldpc_dec_one_op_cb(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_queue *q, struct = rte_bbdev_dec_op **ref_op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t dequeued_cbs, uint32_t= *aq_dequeued)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc, atom_desc;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_rsp_desc rsp;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op *op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_tail + dequeued_cb= s)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)desc= ,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check fdone bit */=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_FDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 rsp.val =3D atom_desc.rsp.val;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Dequeue */=0A= +=A0=A0=A0=A0=A0=A0 op =3D desc->req.op_addr;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Clearing status, it will be set based on response */= =0A= +=A0=A0=A0=A0=A0=A0 op->status =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D rsp.input_err << RTE_BBDEV_DATA_ERROR;= =0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D rsp.dma_err << RTE_BBDEV_DRV_ERROR;=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D rsp.fcw_err << RTE_BBDEV_DRV_ERROR;=0A= +=A0=A0=A0=A0=A0=A0 if (op->status !=3D 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 q_data->queue_stats.dequeue_err= _count++;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 op->status |=3D rsp.crc_status << RTE_BBDEV_CRC_ERROR;= =0A= +=A0=A0=A0=A0=A0=A0 if (op->ldpc_dec.hard_output.length > 0 && !rsp.synd_ok= )=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D 1 << RTE_BBDEV_= SYNDROME_ERROR;=0A= +=A0=A0=A0=A0=A0=A0 op->ldpc_dec.iter_count =3D (uint8_t) rsp.iter_cnt;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check if this is the last desc in batch (Atomic Queu= e) */=0A= +=A0=A0=A0=A0=A0=A0 if (desc->req.last_desc_in_batch) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*aq_dequeued)++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.last_desc_in_batch = =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.val =3D ACC100_DMA_DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_0 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_1 =3D 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 *ref_op =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* One CB (op) was successfully dequeued */=0A= +=A0=A0=A0=A0=A0=A0 return 1;=0A= +}=0A= +=0A= +/* Dequeue one decode operations from ACC100 device in TB mode. */=0A= +static inline int=0A= +dequeue_dec_one_op_tb(struct acc100_queue *q, struct rte_bbdev_dec_op **re= f_op,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 uint16_t dequeued_cbs, uint32_t= *aq_dequeued)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc, *last_desc, atom_desc;=0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_rsp_desc rsp;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op *op;=0A= +=A0=A0=A0=A0=A0=A0 uint8_t cbs_in_tb =3D 1, cb_idx =3D 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw_ring_tail + dequeued_cb= s)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)desc= ,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Check fdone bit */=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_FDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Dequeue */=0A= +=A0=A0=A0=A0=A0=A0 op =3D desc->req.op_addr;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Get number of CBs in dequeued TB */=0A= +=A0=A0=A0=A0=A0=A0 cbs_in_tb =3D desc->req.cbs_in_tb;=0A= +=A0=A0=A0=A0=A0=A0 /* Get last CB */=0A= +=A0=A0=A0=A0=A0=A0 last_desc =3D q->ring_addr + ((q->sw_ring_tail=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 + deque= ued_cbs + cbs_in_tb - 1)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0 /* Check if last CB in TB is ready to dequeue (and thus= =0A= +=A0=A0=A0=A0=A0=A0=A0 * the whole TB) - checking sdone bit. If not return.= =0A= +=A0=A0=A0=A0=A0=A0=A0 */=0A= +=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic_load_n((uint64_t *)last= _desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 __ATOMI= C_RELAXED);=0A= +=A0=A0=A0=A0=A0=A0 if (!(atom_desc.rsp.val & ACC100_SDONE))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Clearing status, it will be set based on response */= =0A= +=A0=A0=A0=A0=A0=A0 op->status =3D 0;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Read remaining CBs if exists */=0A= +=A0=A0=A0=A0=A0=A0 while (cb_idx < cbs_in_tb) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc =3D q->ring_addr + ((q->sw= _ring_tail + dequeued_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 & q->sw_ring_wrap_mask);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 atom_desc.atom_hdr =3D __atomic= _load_n((uint64_t *)desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 __ATOMIC_RELAXED);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rsp.val =3D atom_desc.rsp.val;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log_debug("Resp. desc= %p: %x", desc,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rsp.val);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.input_err= )=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ? (1 << RTE_BBDEV_DATA_ERROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.dma_err) = ? (1 << RTE_BBDEV_DRV_ERROR) : 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->status |=3D ((rsp.fcw_err) = ? (1 << RTE_BBDEV_DRV_ERROR) : 0);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* CRC invalid if error exists = */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (!op->status)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->sta= tus |=3D rsp.crc_status << RTE_BBDEV_CRC_ERROR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op->turbo_dec.iter_count =3D RT= E_MAX((uint8_t) rsp.iter_cnt,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 op->turbo_dec.iter_count);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Check if this is the last de= sc in batch (Atomic Queue) */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (desc->req.last_desc_in_batc= h) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (*aq_de= queued)++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->r= eq.last_desc_in_batch =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->rsp.val =3D ACC100_DMA_DE= SC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_0 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->rsp.add_info_1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dequeued_cbs++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 cb_idx++;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 *ref_op =3D op;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return cb_idx;=0A= +}=0A= +=0A= +/* Dequeue LDPC encode operations from ACC100 device. */=0A= +static uint16_t=0A= +acc100_dequeue_ldpc_enc(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_enc_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_queue *q =3D q_data->queue_private;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t avail =3D q->sw_ring_head - q->sw_ring_tail;= =0A= +=A0=A0=A0=A0=A0=A0 uint32_t aq_dequeued =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t dequeue_num, i, dequeued_cbs =3D 0, dequeued_d= escs =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(ops =3D=3D 0 && q =3D=3D NULL))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0;=0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0 dequeue_num =3D (avail < num) ? avail : num;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < dequeue_num; i++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D dequeue_enc_one_op_cb(q= , &ops[dequeued_cbs],=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 dequeued_descs, &aq_dequeued);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (ret < 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dequeued_cbs +=3D ret;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dequeued_descs++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (dequeued_cbs >=3D num)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 q->aq_dequeued +=3D aq_dequeued;=0A= +=A0=A0=A0=A0=A0=A0 q->sw_ring_tail +=3D dequeued_descs;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Update enqueue stats */=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.dequeued_count +=3D dequeued_cbs;= =0A= +=0A= +=A0=A0=A0=A0=A0=A0 return dequeued_cbs;=0A= +}=0A= +=0A= +/* Dequeue decode operations from ACC100 device. */=0A= +static uint16_t=0A= +acc100_dequeue_ldpc_dec(struct rte_bbdev_queue_data *q_data,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op **ops, = uint16_t num)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_queue *q =3D q_data->queue_private;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t dequeue_num;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t avail =3D q->sw_ring_head - q->sw_ring_tail;= =0A= +=A0=A0=A0=A0=A0=A0 uint32_t aq_dequeued =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t i;=0A= +=A0=A0=A0=A0=A0=A0 uint16_t dequeued_cbs =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev_dec_op *op;=0A= +=A0=A0=A0=A0=A0=A0 int ret;=0A= +=0A= +#ifdef RTE_LIBRTE_BBDEV_DEBUG=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(ops =3D=3D 0 && q =3D=3D NULL))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 0;=0A= +#endif=0A= +=0A= +=A0=A0=A0=A0=A0=A0 dequeue_num =3D (avail < num) ? avail : num;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < dequeue_num; ++i) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 op =3D (q->ring_addr + ((q->sw_= ring_tail + dequeued_cbs)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 & q->sw= _ring_wrap_mask))->req.op_addr;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (op->ldpc_dec.code_block_mod= e =3D=3D 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D= dequeue_dec_one_op_tb(q, &ops[i], dequeued_cbs,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &aq_dequeued);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D= dequeue_ldpc_dec_one_op_cb(=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 q_data, q, &ops[i], dequeued_cbs= ,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &aq_dequeued);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (ret < 0)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dequeued_cbs +=3D ret;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 q->aq_dequeued +=3D aq_dequeued;=0A= +=A0=A0=A0=A0=A0=A0 q->sw_ring_tail +=3D dequeued_cbs;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Update enqueue stats */=0A= +=A0=A0=A0=A0=A0=A0 q_data->queue_stats.dequeued_count +=3D i;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 return i;=0A= +}=0A= +=0A= =A0/* Initialization Function */=0A= =A0static void=0A= =A0acc100_bbdev_init(struct rte_bbdev *dev, struct rte_pci_driver *drv)=0A= @@ -703,6 +2321,10 @@=0A= =A0=A0=A0=A0=A0=A0=A0=A0 struct rte_pci_device *pci_dev =3D RTE_DEV_TO_PCI(= dev->device);=0A= =A0=0A= =A0=A0=A0=A0=A0=A0=A0=A0 dev->dev_ops =3D &acc100_bbdev_ops;=0A= +=A0=A0=A0=A0=A0=A0 dev->enqueue_ldpc_enc_ops =3D acc100_enqueue_ldpc_enc;= =0A= +=A0=A0=A0=A0=A0=A0 dev->enqueue_ldpc_dec_ops =3D acc100_enqueue_ldpc_dec;= =0A= +=A0=A0=A0=A0=A0=A0 dev->dequeue_ldpc_enc_ops =3D acc100_dequeue_ldpc_enc;= =0A= +=A0=A0=A0=A0=A0=A0 dev->dequeue_ldpc_dec_ops =3D acc100_dequeue_ldpc_dec;= =0A= =A0=0A= =A0=A0=A0=A0=A0=A0=A0=A0 ((struct acc100_device *) dev->data->dev_private)-= >pf_device =3D=0A= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 !s= trcmp(drv->driver.name,=0A= @@ -815,4 +2437,3 @@ static int acc100_pci_remove(struct rte_pci_device *pc= i_dev)=0A= =A0RTE_PMD_REGISTER_PCI_TABLE(ACC100PF_DRIVER_NAME, pci_id_acc100_pf_map);= =0A= =A0RTE_PMD_REGISTER_PCI(ACC100VF_DRIVER_NAME, acc100_pci_vf_driver);=0A= =A0RTE_PMD_REGISTER_PCI_TABLE(ACC100VF_DRIVER_NAME, pci_id_acc100_vf_map);= =0A= -=0A= diff --git a/drivers/baseband/acc100/rte_acc100_pmd.h b/drivers/baseband/ac= c100/rte_acc100_pmd.h=0A= index 0e2b79c..78686c1 100644=0A= --- a/drivers/baseband/acc100/rte_acc100_pmd.h=0A= +++ b/drivers/baseband/acc100/rte_acc100_pmd.h=0A= @@ -88,6 +88,8 @@=0A= =A0#define TMPL_PRI_3=A0=A0=A0=A0=A0 0x0f0e0d0c=0A= =A0#define QUEUE_ENABLE=A0=A0=A0 0x80000000=A0 /* Bit to mark Queue as Enab= led */=0A= =A0#define WORDS_IN_ARAM_SIZE (128 * 1024 / 4)=0A= +#define ACC100_FDONE=A0=A0=A0 0x80000000=0A= +#define ACC100_SDONE=A0=A0=A0 0x40000000=0A= =A0=0A= =A0#define ACC100_NUM_TMPL=A0 32=0A= =A0#define VF_OFFSET_QOS 16 /* offset in Memory Space specific to QoS Mon *= /=0A= @@ -398,6 +400,7 @@ struct __rte_packed acc100_dma_req_desc {=0A= =A0union acc100_dma_desc {=0A= =A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_dma_req_desc req;=0A= =A0=A0=A0=A0=A0=A0=A0=A0 union acc100_dma_rsp_desc rsp;=0A= +=A0=A0=A0=A0=A0=A0 uint64_t atom_hdr;=0A= =A0};=0A= =A0=0A= =A0=0A= -- =0A= 1.8.3.1=0A=