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 4D9A7A04DB; Thu, 3 Sep 2020 12:06:53 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AC5591C0B4; Thu, 3 Sep 2020 12:06:52 +0200 (CEST) Received: from GBR01-LO2-obe.outbound.protection.outlook.com (mail-eopbgr100132.outbound.protection.outlook.com [40.107.10.132]) by dpdk.org (Postfix) with ESMTP id 270AF1BEAF for ; Thu, 3 Sep 2020 12:06:51 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OhLCR7rR76LhKIKHyFxFN+eOsXus/n4Nw+y9Y/bA3hwM5Hsl+iHjy4erSATxUpobh8YrWxoXpY/vd4M2c0tpCnbWIBY0ACIPTSsQHAFXYB8fS8i/AOcGMzMuv2hdEA3Vin3tYVTGyIV+SsUUf8jXnJtQ3bXkh/jhzBnM55B7n5ykdnbDwV+dk5IOuUcmVLu3AG3Ech/NKVC/UZ0ZnY5rNz/GB73ES1vmxOSKSe2XClOWLuiZI8VMPIMe6b43klQHZIvOWFjJW5plcXo1WeeYmX8plLKATM2KcAWir52mEBW+1cXGk3x3KeH1giVBF15z33VFthyt4Pi5UALsql84bw== 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=qtpRePme8oZx1guZSOVDwQrjL898kWkDyIREZSpBIFU=; b=UL3Le4rxQ5P8Q3/RqpnzwMvmwouoRhkbIFTZliLcsLR9rkf9/+ju7i//4ekHplhe9AVmeB2goWlzMZCD3fdVQ8FGM4iWRh7OaYEmoFmlLpfL8rzaqznDDZpXxKeO8NIDUdHEiOoUgik7KIAs886yf41ENHti7KJYyGtTT1HhkIivJDZuRMDaDGg8esTKiRVQIKZnbAorcoVJh2mUQJQS/0/XtqoDFzRIz5+xEfvP6lrtsTDVOd6LUXVx8RkytXALDhUiKI53wfj6tf6hT9i8CGNiRZIikFy3i4PN47C3qapviYTAKsoLfXX/M5K9remwRD8VQqmEmGPnjx+I+rlrdQ== 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=qtpRePme8oZx1guZSOVDwQrjL898kWkDyIREZSpBIFU=; b=RbFdySFwtnwb/naik3tryoA84J0pb9l6+wwEwgv05dIRMtzzVYRjj4jR6LdT0hLduT6/IMKo1f/ovAMl8C9F1HPzYYX4mNJud8xuG0LSXUSZlLyY92HIa8uIwPJleLWzs6mtwoIpzO+NS3R4EwONhOLu45D3U88Ebp/oJqKSItM= Received: from CWXP265MB0824.GBRP265.PROD.OUTLOOK.COM (2603:10a6:400:2f::23) by CWLP265MB0131.GBRP265.PROD.OUTLOOK.COM (2603:10a6:401:1f::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3348.16; Thu, 3 Sep 2020 10:06:49 +0000 Received: from CWXP265MB0824.GBRP265.PROD.OUTLOOK.COM ([fe80::d981:378e:5380:8c2a]) by CWXP265MB0824.GBRP265.PROD.OUTLOOK.COM ([fe80::d981:378e:5380:8c2a%7]) with mapi id 15.20.3326.024; Thu, 3 Sep 2020 10:06:49 +0000 From: Aidan Goddard To: Nicolas Chautru , "dev@dpdk.org" , "akhil.goyal@nxp.com" CC: "bruce.richardson@intel.com" , Dave Burley Thread-Topic: [dpdk-dev] [PATCH v3 10/11] baseband/acc100: add configure function Thread-Index: AQHWdb/NYEUCTulo5kKgHvR8JLlZNqlWx+xx Date: Thu, 3 Sep 2020 10:06:49 +0000 Message-ID: References: <1597796731-57841-1-git-send-email-nicolas.chautru@intel.com>, <1597796731-57841-11-git-send-email-nicolas.chautru@intel.com> In-Reply-To: <1597796731-57841-11-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: [86.13.78.5] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 1a08aefe-a164-4366-e40d-08d84ff112f8 x-ms-traffictypediagnostic: CWLP265MB0131: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:7219; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: BsWJ/oq7rR84F481at6n1jnJ6XKbOiFnJkUFhHoJbx6v1UDA7/CqE2N53ynj/7xN8uvYiLKXV1v4LCIXJEufuEEBgTv2Kv+K+UO1OiJyaRUsospAfVgWjOPJ2Q0e5xiorrpj4c0QXCm4zaCiskNB46RrQvCchGEV447cUj/FTBJTXhnEwDUjeju8BSwSEhFr1+s6MZQyJtLxatPjK2X72lvzZ5BesXqDa3DvktZb+hcXgAgxKjCAlLN0V/0v82/ogPmyuI9V6XNrnt8gRCSdsxzMYhb96iFX2P9f349rvk9syVfmPFNJKhM4fGOcN/hs x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CWXP265MB0824.GBRP265.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(396003)(136003)(346002)(366004)(39830400003)(376002)(4326008)(9686003)(55016002)(8676002)(2906002)(44832011)(8936002)(110136005)(54906003)(107886003)(19627235002)(66556008)(71200400001)(66446008)(66476007)(66946007)(33656002)(86362001)(53546011)(6506007)(26005)(478600001)(186003)(83380400001)(5660300002)(7696005)(316002)(64756008)(52536014)(76116006)(30864003)(579004)(559001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata: qIugxA6JXp3UV8MH7beqnzWeeTbg4DZWlz9has/T9lKWLfz9X7qHf0ooCBC/Nkxyn3DlW1uYU2s7DIftIN4W1YsF5/Pv/jBKmH425D4QidKONFoIl69TvPZ5z+Wy+Q8NaEUpxQ8FT9Nxv0ySRxgkx+AH//HLadLpYrNtUsnEr97vwdTLRrTGL6pTRVjx1L/3G6Q3fqBIMLQQhqlaBMOThY/Zh/yd7JXoxjGAGwFkVTyACSGQE2b99PNBwl+tTyfwex/eQGnyxqHQpphkyzWmUSLWbsr87heAWoQumT/rOX4s91jvQwufp/3o/Gfqqgaz73zCd51O0FHZd8aUGfBWDutH9jthncexOhc0dSOxHYDowmg/OfAMkkIky/Bygw/qC5TIY2Md4h8Srfwk28MtNPcU7SWc5cGdNz2uRLAlE3UdxgtnwvAnSK4pvd0FCrSlMJDl2I2R2G0LaKnm3AYn3obm//sVO10n+2SztP9KsBHJGhMjaNuNU/vxXpSRq1x3OtDIsZNCBGyG3ItrWUBon4LYtzEFbxMFpOcg64s3qxAbVC9BN8Blr7c3zQoAO5rODv8FxYPl/u8pkn2D8o20BTNZS7+ci9/LWkgHWXxCIgVZ+xh2aBfL2p02DJdT03KQnBh8evw7b11DBZPKb5oUvg== 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: CWXP265MB0824.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 1a08aefe-a164-4366-e40d-08d84ff112f8 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Sep 2020 10:06:49.5569 (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: /ZFqxFYq9vsn6op4FVoI+OqLAEl8aKHX7pyDEfRDTUTeT49RGr2czyAwOwswREACl0hJ8o5DuBe+Xjtdyw6uW9gHUU87x1GYMyWEij40EQ8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB0131 Subject: Re: [dpdk-dev] [PATCH v3 10/11] baseband/acc100: add configure function 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= Does the ACC100-specific configuration code have to go into test_bbdev_perf= .c? Would it be better to avoid having this device specific code in test-bb= dev or is there a good reason for doing so?=0A= =0A= Thanks,=0A= =0A= Aidan Goddard=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 10/11] baseband/acc100: add configure functio= n =0A= =A0=0A= Add configure function to configure the PF from within=0A= the bbdev-test itself without external application=0A= configuration the device.=0A= =0A= Signed-off-by: Nicolas Chautru =0A= ---=0A= =A0app/test-bbdev/test_bbdev_perf.c=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 |=A0 72 +++=0A= =A0drivers/baseband/acc100/Makefile=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 |=A0=A0 3 +=0A= =A0drivers/baseband/acc100/meson.build=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0 |=A0=A0 2 +=0A= =A0drivers/baseband/acc100/rte_acc100_cfg.h=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |= =A0 17 +=0A= =A0drivers/baseband/acc100/rte_acc100_pmd.c=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |= 505 +++++++++++++++++++++=0A= =A0.../acc100/rte_pmd_bbdev_acc100_version.map=A0=A0=A0=A0=A0=A0=A0 |=A0=A0= 7 +=0A= =A06 files changed, 606 insertions(+)=0A= =0A= diff --git a/app/test-bbdev/test_bbdev_perf.c b/app/test-bbdev/test_bbdev_p= erf.c=0A= index 45c0d62..32f23ff 100644=0A= --- a/app/test-bbdev/test_bbdev_perf.c=0A= +++ b/app/test-bbdev/test_bbdev_perf.c=0A= @@ -52,6 +52,18 @@=0A= =A0#define FLR_5G_TIMEOUT 610=0A= =A0#endif=0A= =A0=0A= +#ifdef RTE_LIBRTE_PMD_BBDEV_ACC100=0A= +#include =0A= +#define ACC100PF_DRIVER_NAME=A0=A0 ("intel_acc100_pf")=0A= +#define ACC100VF_DRIVER_NAME=A0=A0 ("intel_acc100_vf")=0A= +#define ACC100_QMGR_NUM_AQS 16=0A= +#define ACC100_QMGR_NUM_QGS 2=0A= +#define ACC100_QMGR_AQ_DEPTH 5=0A= +#define ACC100_QMGR_INVALID_IDX -1=0A= +#define ACC100_QMGR_RR 1=0A= +#define ACC100_QOS_GBR 0=0A= +#endif=0A= +=0A= =A0#define OPS_CACHE_SIZE 256U=0A= =A0#define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */=0A= =A0=0A= @@ -653,6 +665,66 @@ typedef int (test_case_function)(struct active_device = *ad,=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 info->dev_name);=0A= =A0=A0=A0=A0=A0=A0=A0=A0 }=0A= =A0#endif=0A= +#ifdef RTE_LIBRTE_PMD_BBDEV_ACC100=0A= +=A0=A0=A0=A0=A0=A0 if ((get_init_device() =3D=3D true) &&=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (!strcmp(info->drv.driver_name,= ACC100PF_DRIVER_NAME))) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_conf conf;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 unsigned int i;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf("Configure ACC100 FEC Dr= iver %s with default values\n",=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 info->drv.driver_name);=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* clear default configuration = before initialization */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 memset(&conf, 0, sizeof(struct = acc100_conf));=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Always set in PF mode for bu= ilt-in configuration */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.pf_mode_en =3D true;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < RTE_ACC100_NU= M_VFS; ++i) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_dl_4g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_dl_4g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_dl_4g[i].round_robin_weight =3D ACC100_QMGR_RR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_ul_4g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_ul_4g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_ul_4g[i].round_robin_weight =3D ACC100_QMGR_RR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_dl_5g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_dl_5g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_dl_5g[i].round_robin_weight =3D ACC100_QMGR_RR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_ul_5g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_ul_5g[i].gbr_threshold1 =3D ACC100_QOS_GBR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.ar= b_ul_5g[i].round_robin_weight =3D ACC100_QMGR_RR;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.input_pos_llr_1_bit =3D tr= ue;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.output_pos_llr_1_bit =3D t= rue;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.num_vf_bundles =3D 1; /**<= Number of VF bundles to setup */=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_4g.num_qgroups =3D AC= C100_QMGR_NUM_QGS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_4g.first_qgroup_index= =3D ACC100_QMGR_INVALID_IDX;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_4g.num_aqs_per_groups= =3D ACC100_QMGR_NUM_AQS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_4g.aq_depth_log2 =3D = ACC100_QMGR_AQ_DEPTH;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_4g.num_qgroups =3D AC= C100_QMGR_NUM_QGS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_4g.first_qgroup_index= =3D ACC100_QMGR_INVALID_IDX;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_4g.num_aqs_per_groups= =3D ACC100_QMGR_NUM_AQS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_4g.aq_depth_log2 =3D = ACC100_QMGR_AQ_DEPTH;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_5g.num_qgroups =3D AC= C100_QMGR_NUM_QGS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_5g.first_qgroup_index= =3D ACC100_QMGR_INVALID_IDX;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_5g.num_aqs_per_groups= =3D ACC100_QMGR_NUM_AQS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_ul_5g.aq_depth_log2 =3D = ACC100_QMGR_AQ_DEPTH;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_5g.num_qgroups =3D AC= C100_QMGR_NUM_QGS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_5g.first_qgroup_index= =3D ACC100_QMGR_INVALID_IDX;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_5g.num_aqs_per_groups= =3D ACC100_QMGR_NUM_AQS;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf.q_dl_5g.aq_depth_log2 =3D = ACC100_QMGR_AQ_DEPTH;=0A= +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* setup PF with configuration = information */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ret =3D acc100_configure(info->= dev_name, &conf);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 TEST_ASSERT_SUCCESS(ret,=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 "Failed to configure ACC100 PF for bbdev %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 info->dev_name);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Let's refresh this now this = is configured */=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 rte_bbdev_info_get(dev_id, info);=0A= +#endif=0A= +=0A= =A0=A0=A0=A0=A0=A0=A0=A0 nb_queues =3D RTE_MIN(rte_lcore_count(), info->drv= .max_num_queues);=0A= =A0=A0=A0=A0=A0=A0=A0=A0 nb_queues =3D RTE_MIN(nb_queues, (unsigned int) MA= X_QUEUES);=0A= =A0=0A= diff --git a/drivers/baseband/acc100/Makefile b/drivers/baseband/acc100/Mak= efile=0A= index c79e487..37e73af 100644=0A= --- a/drivers/baseband/acc100/Makefile=0A= +++ b/drivers/baseband/acc100/Makefile=0A= @@ -22,4 +22,7 @@ LIBABIVER :=3D 1=0A= =A0# library source files=0A= =A0SRCS-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_ACC100) +=3D rte_acc100_pmd.c=0A= =A0=0A= +# export include files=0A= +SYMLINK-$(CONFIG_RTE_LIBRTE_PMD_BBDEV_ACC100)-include +=3D rte_acc100_cfg.= h=0A= +=0A= =A0include $(RTE_SDK)/mk/rte.lib.mk=0A= diff --git a/drivers/baseband/acc100/meson.build b/drivers/baseband/acc100/= meson.build=0A= index 8afafc2..7ac44dc 100644=0A= --- a/drivers/baseband/acc100/meson.build=0A= +++ b/drivers/baseband/acc100/meson.build=0A= @@ -4,3 +4,5 @@=0A= =A0deps +=3D ['bbdev', 'bus_vdev', 'ring', 'pci', 'bus_pci']=0A= =A0=0A= =A0sources =3D files('rte_acc100_pmd.c')=0A= +=0A= +install_headers('rte_acc100_cfg.h')=0A= diff --git a/drivers/baseband/acc100/rte_acc100_cfg.h b/drivers/baseband/ac= c100/rte_acc100_cfg.h=0A= index 73bbe36..7f523bc 100644=0A= --- a/drivers/baseband/acc100/rte_acc100_cfg.h=0A= +++ b/drivers/baseband/acc100/rte_acc100_cfg.h=0A= @@ -89,6 +89,23 @@ struct acc100_conf {=0A= =A0=A0=A0=A0=A0=A0=A0=A0 struct rte_arbitration_t arb_dl_5g[RTE_ACC100_NUM_= VFS];=0A= =A0};=0A= =A0=0A= +/**=0A= + * Configure a ACC100 device=0A= + *=0A= + * @param dev_name=0A= + *=A0=A0 The name of the device. This is the short form of PCI BDF, e.g. 0= 0:01.0.=0A= + *=A0=A0 It can also be retrieved for a bbdev device from the dev_name fie= ld in the=0A= + *=A0=A0 rte_bbdev_info structure returned by rte_bbdev_info_get().=0A= + * @param conf=0A= + *=A0=A0 Configuration to apply to ACC100 HW.=0A= + *=0A= + * @return=0A= + *=A0=A0 Zero on success, negative value on failure.=0A= + */=0A= +__rte_experimental=0A= +int=0A= +acc100_configure(const char *dev_name, struct acc100_conf *conf);=0A= +=0A= =A0#ifdef __cplusplus=0A= =A0}=0A= =A0#endif=0A= diff --git a/drivers/baseband/acc100/rte_acc100_pmd.c b/drivers/baseband/ac= c100/rte_acc100_pmd.c=0A= index dc14079..43f664b 100644=0A= --- a/drivers/baseband/acc100/rte_acc100_pmd.c=0A= +++ b/drivers/baseband/acc100/rte_acc100_pmd.c=0A= @@ -85,6 +85,26 @@=0A= =A0=0A= =A0enum {UL_4G =3D 0, UL_5G, DL_4G, DL_5G, NUM_ACC};=0A= =A0=0A= +/* Return the accelerator enum for a Queue Group Index */=0A= +static inline int=0A= +accFromQgid(int qg_idx, const struct acc100_conf *acc100_conf)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 int accQg[ACC100_NUM_QGRPS];=0A= +=A0=A0=A0=A0=A0=A0 int NumQGroupsPerFn[NUM_ACC];=0A= +=A0=A0=A0=A0=A0=A0 int acc, qgIdx, qgIndex =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qgIdx =3D 0; qgIdx < ACC100_NUM_QGRPS; qgIdx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 accQg[qgIdx] =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 NumQGroupsPerFn[UL_4G] =3D acc100_conf->q_ul_4g.num_qgr= oups;=0A= +=A0=A0=A0=A0=A0=A0 NumQGroupsPerFn[UL_5G] =3D acc100_conf->q_ul_5g.num_qgr= oups;=0A= +=A0=A0=A0=A0=A0=A0 NumQGroupsPerFn[DL_4G] =3D acc100_conf->q_dl_4g.num_qgr= oups;=0A= +=A0=A0=A0=A0=A0=A0 NumQGroupsPerFn[DL_5G] =3D acc100_conf->q_dl_5g.num_qgr= oups;=0A= +=A0=A0=A0=A0=A0=A0 for (acc =3D UL_4G;=A0 acc < NUM_ACC; acc++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 for (qgIdx =3D 0; qgIdx < NumQG= roupsPerFn[acc]; qgIdx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 accQg[q= gIndex++] =3D acc;=0A= +=A0=A0=A0=A0=A0=A0 acc =3D accQg[qg_idx];=0A= +=A0=A0=A0=A0=A0=A0 return acc;=0A= +}=0A= +=0A= =A0/* Return the queue topology for a Queue Group Index */=0A= =A0static inline void=0A= =A0qtopFromAcc(struct rte_q_topology_t **qtop, int acc_enum,=0A= @@ -113,6 +133,30 @@=0A= =A0=A0=A0=A0=A0=A0=A0=A0 *qtop =3D p_qtop;=0A= =A0}=0A= =A0=0A= +/* Return the AQ depth for a Queue Group Index */=0A= +static inline int=0A= +aqDepth(int qg_idx, struct acc100_conf *acc100_conf)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct rte_q_topology_t *q_top =3D NULL;=0A= +=A0=A0=A0=A0=A0=A0 int acc_enum =3D accFromQgid(qg_idx, acc100_conf);=0A= +=A0=A0=A0=A0=A0=A0 qtopFromAcc(&q_top, acc_enum, acc100_conf);=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(q_top =3D=3D NULL))=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 q_top->aq_depth_log2;=0A= +}=0A= +=0A= +/* Return the AQ depth for a Queue Group Index */=0A= +static inline int=0A= +aqNum(int qg_idx, struct acc100_conf *acc100_conf)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 struct rte_q_topology_t *q_top =3D NULL;=0A= +=A0=A0=A0=A0=A0=A0 int acc_enum =3D accFromQgid(qg_idx, acc100_conf);=0A= +=A0=A0=A0=A0=A0=A0 qtopFromAcc(&q_top, acc_enum, acc100_conf);=0A= +=A0=A0=A0=A0=A0=A0 if (unlikely(q_top =3D=3D NULL))=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 q_top->num_aqs_per_groups;=0A= +}=0A= +=0A= =A0static void=0A= =A0initQTop(struct acc100_conf *acc100_conf)=0A= =A0{=0A= @@ -4177,3 +4221,464 @@ static int acc100_pci_remove(struct rte_pci_device = *pci_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= +/*=0A= + * Implementation to fix the power on status of some 5GUL engines=0A= + * This requires DMA permission if ported outside DPDK=0A= + */=0A= +static void=0A= +poweron_cleanup(struct rte_bbdev *bbdev, struct acc100_device *d,=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 struct acc100_conf *conf)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 int i, template_idx, qg_idx;=0A= +=A0=A0=A0=A0=A0=A0 uint32_t address, status, payload;=0A= +=A0=A0=A0=A0=A0=A0 printf("Need to clear power-on 5GUL status in internal = memory\n");=0A= +=A0=A0=A0=A0=A0=A0 /* Reset LDPC Cores */=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < ACC100_ENGINES_MAX; i++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfFecUl5g= CntrlReg +=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_ENGINE_OFFSET * i, ACC100_RESET_HI);=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < ACC100_ENGINES_MAX; i++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfFecUl5g= CntrlReg +=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_ENGINE_OFFSET * i, ACC100_RESET_LO);=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +=A0=A0=A0=A0=A0=A0 /* Prepare dummy workload */=0A= +=A0=A0=A0=A0=A0=A0 alloc_2x64mb_sw_rings_mem(bbdev, d, 0);=0A= +=A0=A0=A0=A0=A0=A0 /* Set base addresses */=0A= +=A0=A0=A0=A0=A0=A0 uint32_t phys_high =3D (uint32_t)(d->sw_rings_phys >> 3= 2);=0A= +=A0=A0=A0=A0=A0=A0 uint32_t phys_low=A0 =3D (uint32_t)(d->sw_rings_phys &= =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_SIZE_64MBYTE-1));=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfDmaFec5GulDescBaseHiRegVf, phys= _high);=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfDmaFec5GulDescBaseLoRegVf, phys= _low);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Descriptor for a dummy 5GUL code block processing*/= =0A= +=A0=A0=A0=A0=A0=A0 union acc100_dma_desc *desc =3D NULL;=0A= +=A0=A0=A0=A0=A0=A0 desc =3D d->sw_rings;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].address =3D d->sw_rings_phys += =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ACC100_= DESC_FCW_OFFSET;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].blen =3D ACC100_FCW_LD_BLEN;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].blkid =3D ACC100_DMA_BLKID_FCW;= =0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].last =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[0].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[1].address =3D d->sw_rings_phys + 5= 12;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[1].blkid =3D ACC100_DMA_BLKID_IN;= =0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[1].last =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[1].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[1].blen =3D 44;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[2].address =3D d->sw_rings_phys + 1= 024;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[2].blkid =3D ACC100_DMA_BLKID_OUT_E= NC;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[2].last =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[2].dma_ext =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.data_ptrs[2].blen =3D 5;=0A= +=A0=A0=A0=A0=A0=A0 /* Dummy FCW */=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.FCWversion =3D ACC100_FCW_VER;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.qm =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.nfiller =3D 30;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.BG =3D 2 - 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.Zc =3D 7;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.ncb =3D 350;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.rm_e =3D 4;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.itmax =3D 10;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.gain_i =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 desc->req.fcw_ld.gain_h =3D 1;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 int engines_to_restart[SIG_UL_5G_LAST + 1] =3D {0};=0A= +=A0=A0=A0=A0=A0=A0 int num_failed_engine =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 /* Detect engines in undefined state */=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_UL_5G; template_idx <=3D SIG_= UL_5G_LAST;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Check engine power-on status= */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HwPfFecUl5gIbDebugR= eg +=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_ENGINE_OFFSET * template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 status =3D (acc100_reg_read(d, = address) >> 4) & 0xF;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (status =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 engines= _to_restart[num_failed_engine] =3D template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 num_fai= led_engine++;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 int numQqsAcc =3D conf->q_ul_5g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 int numQgs =3D conf->q_ul_5g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D numQqsAcc; qg_idx < (numQgs + numQqsAcc= ); qg_idx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload |=3D (1 << qg_idx);=0A= +=A0=A0=A0=A0=A0=A0 /* Force each engine which is in unspecified state */= =0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < num_failed_engine; i++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 int failed_engine =3D engines_t= o_restart[i];=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf("Force engine %d\n", fai= led_engine);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_UL_5G= ; template_idx <=3D SIG_UL_5G_LAST;=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 template_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address= =3D HWPfQmgrGrpTmplateReg4Indx=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 + BYTES_IN_WORD * template_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 (tem= plate_idx =3D=3D failed_engine)=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_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=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=A0=A0= =A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, 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 /* Reset descriptor header */= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.word0 =3D ACC100_DMA_= DESC_TYPE;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.word1 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.word2 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.word3 =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.numCBs =3D 1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.m2dlen =3D 2;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 desc->req.d2mlen =3D 1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Enqueue the code block for p= rocessing */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 union acc100_enqueue_reg_fmt en= q_req;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_req.val =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_req.addr_offset =3D ACC100_= DESC_OFFSET;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_req.num_elem =3D 1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 enq_req.req_elem_addr =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_wmb();=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfQmgrIng= ressAq + 0x100, enq_req.val);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT * 100);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (desc->req.word0 !=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 printf(= "DMA Response %#"PRIx32"\n", desc->req.word0);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Reset LDPC Cores */=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < ACC100_ENGINES_MAX; i++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfFecUl5g= CntrlReg +=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_ENGINE_OFFSET * i, ACC100_RESET_HI);=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < ACC100_ENGINES_MAX; i++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfFecUl5g= CntrlReg +=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_ENGINE_OFFSET * i, ACC100_RESET_LO);=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfHi5GHardResetReg, ACC100_RESET_= HARD);=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +=A0=A0=A0=A0=A0=A0 int numEngines =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 /* Check engine power-on status again */=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_UL_5G; template_idx <=3D SIG_= UL_5G_LAST;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HwPfFecUl5gIbDebugR= eg +=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_ENGINE_OFFSET * template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 status =3D (acc100_reg_read(d, = address) >> 4) & 0xF;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg4Indx=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 + BYTES_IN_WORD * template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (status =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 acc100_= reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 numEngi= nes++;=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 acc100_= reg_write(d, address, 0);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 printf("Number of 5GUL engines %d\n", numEngines);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (d->sw_rings_base !=3D NULL)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_free(d->sw_rings_base);=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +}=0A= +=0A= +/* Initial configuration of a ACC100 device prior to running configure() *= /=0A= +int=0A= +acc100_configure(const char *dev_name, struct acc100_conf *conf)=0A= +{=0A= +=A0=A0=A0=A0=A0=A0 rte_bbdev_log(INFO, "acc100_configure");=0A= +=A0=A0=A0=A0=A0=A0 uint32_t payload, address, status;=0A= +=A0=A0=A0=A0=A0=A0 int qg_idx, template_idx, vf_idx, acc, i;=0A= +=A0=A0=A0=A0=A0=A0 struct rte_bbdev *bbdev =3D rte_bbdev_get_named_dev(dev= _name);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Compile time checks */=0A= +=A0=A0=A0=A0=A0=A0 RTE_BUILD_BUG_ON(sizeof(struct acc100_dma_req_desc) != =3D 256);=0A= +=A0=A0=A0=A0=A0=A0 RTE_BUILD_BUG_ON(sizeof(union acc100_dma_desc) !=3D 256= );=0A= +=A0=A0=A0=A0=A0=A0 RTE_BUILD_BUG_ON(sizeof(struct acc100_fcw_td) !=3D 24);= =0A= +=A0=A0=A0=A0=A0=A0 RTE_BUILD_BUG_ON(sizeof(struct acc100_fcw_te) !=3D 32);= =0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (bbdev =3D=3D NULL) {=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 "Invalid dev_name (%s), or devi= ce is not yet initialised",=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dev_name);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return -ENODEV;=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 struct acc100_device *d =3D bbdev->data->dev_private;= =0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Store configuration */=0A= +=A0=A0=A0=A0=A0=A0 rte_memcpy(&d->acc100_conf, conf, sizeof(d->acc100_conf= ));=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* PCIe Bridge configuration */=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HwPfPcieGpexBridgeControl, ACC100_C= FG_PCI_BRIDGE);=0A= +=A0=A0=A0=A0=A0=A0 for (i =3D 1; i < 17; i++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d,=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 HwPfPcieGpexAxiAddrMappingWindowPexBaseHigh=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 + i * 16, 0);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* PCIe Link Trainiing and Status State Machine */=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HwPfPcieGpexLtssmStateCntrl, 0xDFC0= 0000);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Prevent blocking AXI read on BRESP for AXI Write */= =0A= +=A0=A0=A0=A0=A0=A0 address =3D HwPfPcieGpexAxiPioControl;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D ACC100_CFG_PCI_AXI;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* 5GDL PLL phase shift */=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, HWPfChaDl5gPllPhshft0, 0x1);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Explicitly releasing AXI as this may be stopped afte= r PF FLR/BME */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaAxiControl;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* DDR Configuration */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDdrBcTim6;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D acc100_reg_read(d, address);=0A= +=A0=A0=A0=A0=A0=A0 payload &=3D 0xFFFFFFFB; /* Bit 2 */=0A= +#ifdef ACC100_DDR_ECC_ENABLE=0A= +=A0=A0=A0=A0=A0=A0 payload |=3D 0x4;=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDdrPhyDqsCountNum;=0A= +#ifdef ACC100_DDR_ECC_ENABLE=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 9;=0A= +#else=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 8;=0A= +#endif=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Set default descriptor signature */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaDescriptorSignatuture;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Enable the Error Detection in DMA */=0A= +=A0=A0=A0=A0=A0=A0 payload =3D ACC100_CFG_DMA_ERROR;=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaErrorDetectionEn;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* AXI Cache configuration */=0A= +=A0=A0=A0=A0=A0=A0 payload =3D ACC100_CFG_AXI_CACHE;=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaAxcacheReg;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Default DMA Configuration (Qmgr Enabled) */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaConfig0Reg;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaQmanen;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Default RLIM/ALEN configuration */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaConfig1Reg;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D (1 << 31) + (23 << 8) + (1 << 6) + 7;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Configure DMA Qmanager addresses */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaQmgrAddrReg;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D HWPfQmgrEgressQueuesTemplate;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* =3D=3D=3D=3D=3D Qmgr Configuration =3D=3D=3D=3D=3D *= /=0A= +=A0=A0=A0=A0=A0=A0 /* Configuration of the AQueue Depth QMGR_GRP_0_DEPTH_L= OG2 for UL */=0A= +=A0=A0=A0=A0=A0=A0 int totalQgs =3D conf->q_ul_4g.num_qgroups +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf->q= _ul_5g.num_qgroups +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf->q= _dl_4g.num_qgroups +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 conf->q= _dl_5g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D 0; qg_idx < totalQgs; qg_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrDepthLog2Gr= p +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * qg_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D aqDepth(qg_idx, con= f);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrTholdGrp += =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * qg_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D (1 << 16) + (1 << (= aqDepth(qg_idx, conf) - 1));=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Template Priority in incremental order */=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D 0; template_idx < ACC100_NUM_TMPL= ;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg0Indx +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * (template_idx %= 8);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D TMPL_PRI_0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg1Indx +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * (template_idx %= 8);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D TMPL_PRI_1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg2indx +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * (template_idx %= 8);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D TMPL_PRI_2;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg3Indx +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * (template_idx %= 8);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D TMPL_PRI_3;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpPriority;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D ACC100_CFG_QMGR_HI_P;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Template Configuration */=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D 0; template_idx < ACC100_NUM_TMPL= ; template_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg4Indx=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 + BYTES_IN_WORD * template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 /* 4GUL */=0A= +=A0=A0=A0=A0=A0=A0 int numQgs =3D conf->q_ul_4g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 int numQqsAcc =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D numQqsAcc; qg_idx < (numQgs + numQqsAcc= ); qg_idx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload |=3D (1 << qg_idx);=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_UL_4G; template_idx <=3D SIG_= UL_4G_LAST;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg4Indx=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 + BYTES_IN_WORD*template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 /* 5GUL */=0A= +=A0=A0=A0=A0=A0=A0 numQqsAcc +=3D numQgs;=0A= +=A0=A0=A0=A0=A0=A0 numQgs=A0 =3D conf->q_ul_5g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 int numEngines =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D numQqsAcc; qg_idx < (numQgs + numQqsAcc= ); qg_idx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload |=3D (1 << qg_idx);=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_UL_5G; template_idx <=3D SIG_= UL_5G_LAST;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Check engine power-on status= */=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HwPfFecUl5gIbDebugR= eg +=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_ENGINE_OFFSET * template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 status =3D (acc100_reg_read(d, = address) >> 4) & 0xF;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg4Indx=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 + BYTES_IN_WORD * template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (status =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 acc100_= reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 numEngi= nes++;=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 acc100_= reg_write(d, address, 0);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 #if RTE_ACC100_SINGLE_FEC =3D= =3D 1=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 #endif=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 printf("Number of 5GUL engines %d\n", numEngines);=0A= +=A0=A0=A0=A0=A0=A0 /* 4GDL */=0A= +=A0=A0=A0=A0=A0=A0 numQqsAcc +=3D numQgs;=0A= +=A0=A0=A0=A0=A0=A0 numQgs=A0 =3D conf->q_dl_4g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D numQqsAcc; qg_idx < (numQgs + numQqsAcc= ); qg_idx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload |=3D (1 << qg_idx);=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_DL_4G; template_idx <=3D SIG_= DL_4G_LAST;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg4Indx=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 + BYTES_IN_WORD*template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 #if RTE_ACC100_SINGLE_FEC =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 payload= =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 #endif=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 /* 5GDL */=0A= +=A0=A0=A0=A0=A0=A0 numQqsAcc +=3D numQgs;=0A= +=A0=A0=A0=A0=A0=A0 numQgs=A0 =3D conf->q_dl_5g.num_qgroups;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D numQqsAcc; qg_idx < (numQgs + numQqsAcc= ); qg_idx++)=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload |=3D (1 << qg_idx);=0A= +=A0=A0=A0=A0=A0=A0 for (template_idx =3D SIG_DL_5G; template_idx <=3D SIG_= DL_5G_LAST;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 templat= e_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpTmplateR= eg4Indx=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 + BYTES_IN_WORD*template_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 #if RTE_ACC100_SINGLE_FEC =3D= =3D 1=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 #endif=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Queue Group Function mapping */=0A= +=A0=A0=A0=A0=A0=A0 int qman_func_id[5] =3D {0, 2, 1, 3, 4};=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrGrpFunction0;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D 0; qg_idx < 8; qg_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc =3D accFromQgid(qg_idx, con= f);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload |=3D qman_func_id[acc]<= <(qg_idx * 4);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Configuration of the Arbitration QGroup depth to 1 *= /=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D 0; qg_idx < totalQgs; qg_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfQmgrArbQDepthGr= p +=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 BYTES_IN_WORD * qg_idx;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Enabling AQueues through the Queue hierarchy*/=0A= +=A0=A0=A0=A0=A0=A0 for (vf_idx =3D 0; vf_idx < ACC100_NUM_VFS; vf_idx++) {= =0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 for (qg_idx =3D 0; qg_idx < ACC= 100_NUM_QGRPS; qg_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload= =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 if (vf_= idx < conf->num_vf_bundles &&=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 qg_idx < totalQgs)=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 payload =3D (1 << aqNum(qg_idx, conf)) - 1;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address= =3D HWPfQmgrAqEnableVf=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 + vf_idx * BYTES_IN_WORD;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload= +=3D (qg_idx << 16);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_= reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* This pointer to ARAM (256kB) is shifted by 2 (4B per= register) */=0A= +=A0=A0=A0=A0=A0=A0 uint32_t aram_address =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 for (qg_idx =3D 0; qg_idx < totalQgs; qg_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 for (vf_idx =3D 0; vf_idx < con= f->num_vf_bundles; vf_idx++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address= =3D HWPfQmgrVfBaseAddr + vf_idx=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 * BYTES_IN_WORD + qg_idx=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 * BYTES_IN_WORD * 64;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload= =3D aram_address;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_= reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* Offs= et ARAM Address for next memory bank=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 * - = increment of 4B=0A= +=A0=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=A0=A0=A0=A0=A0=A0=A0=A0 aram_ad= dress +=3D aqNum(qg_idx, conf) *=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 (1 << aqDepth(qg_idx, conf));=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (aram_address > WORDS_IN_ARAM_SIZE) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 rte_bbdev_log(ERR, "ARAM Config= uration not fitting %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=A0=A0= =A0=A0=A0=A0=A0=A0 aram_address, WORDS_IN_ARAM_SIZE);=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= +=0A= +=A0=A0=A0=A0=A0=A0 /* =3D=3D=3D=3D HI Configuration =3D=3D=3D=3D */=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* Prevent Block on Transmit Error */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfHiBlockTransmitOnErrorEn;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0 /* Prevents to drop MSI */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfHiMsiDropEnableReg;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0 /* Set the PF Mode register */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfHiPfMode;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D (conf->pf_mode_en) ? 2 : 0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0 /* Enable Error Detection in HW */=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaErrorDetectionEn;=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 0x3D7;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* QoS overflow init */=0A= +=A0=A0=A0=A0=A0=A0 payload =3D 1;=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfQosmonAEvalOverflow0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=A0=A0=A0=A0=A0=A0 address =3D HWPfQosmonBEvalOverflow0;=0A= +=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, payload);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 /* HARQ DDR Configuration */=0A= +=A0=A0=A0=A0=A0=A0 unsigned int ddrSizeInMb =3D 512; /* Fixed to 512 MB pe= r VF for now */=0A= +=A0=A0=A0=A0=A0=A0 for (vf_idx =3D 0; vf_idx < conf->num_vf_bundles; vf_id= x++) {=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 address =3D HWPfDmaVfDdrBaseRw = + vf_idx=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 * 0x10;=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 payload =3D ((vf_idx * (ddrSize= InMb / 64)) << 16) +=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 (ddrSizeInMb - 1);=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acc100_reg_write(d, address, pa= yload);=0A= +=A0=A0=A0=A0=A0=A0 }=0A= +=A0=A0=A0=A0=A0=A0 usleep(LONG_WAIT);=0A= +=0A= +=A0=A0=A0=A0=A0=A0 if (numEngines < (SIG_UL_5G_LAST + 1))=0A= +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 poweron_cleanup(bbdev, d, conf)= ;=0A= +=0A= +=A0=A0=A0=A0=A0=A0 rte_bbdev_log_debug("PF Tip configuration complete for = %s", dev_name);=0A= +=A0=A0=A0=A0=A0=A0 return 0;=0A= +}=0A= diff --git a/drivers/baseband/acc100/rte_pmd_bbdev_acc100_version.map b/dri= vers/baseband/acc100/rte_pmd_bbdev_acc100_version.map=0A= index 4a76d1d..91c234d 100644=0A= --- a/drivers/baseband/acc100/rte_pmd_bbdev_acc100_version.map=0A= +++ b/drivers/baseband/acc100/rte_pmd_bbdev_acc100_version.map=0A= @@ -1,3 +1,10 @@=0A= =A0DPDK_21 {=0A= =A0=A0=A0=A0=A0=A0=A0=A0 local: *;=0A= =A0};=0A= +=0A= +EXPERIMENTAL {=0A= +=A0=A0=A0=A0=A0=A0 global:=0A= +=0A= +=A0=A0=A0=A0=A0=A0 acc100_configure;=0A= +=0A= +};=0A= -- =0A= 1.8.3.1=0A=