From patchwork Wed Jul 25 17:04:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ashish Gupta X-Patchwork-Id: 43360 X-Patchwork-Delegate: pablo.de.lara.guarch@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8E9BE34EF; Wed, 25 Jul 2018 18:43:06 +0200 (CEST) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0045.outbound.protection.outlook.com [104.47.33.45]) by dpdk.org (Postfix) with ESMTP id 4E4C2F72 for ; Wed, 25 Jul 2018 18:43:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KY6dYFSsjpaT3llV95gDFLpEXmNzYgvujQi2CV3Fu/o=; b=ThxN4+xIOaL3JWuIPYEQo5ykR+2fcZlx44zI3esnqwysUMD9WKLxszMzJnxRi5N7ear17hFvfU22EyGjq/B8vGRatp729WsfG0EiANg1IZkLPsKs/oNdbAKDS0KXMWegTRPvBIb9G2hVGicBaLqthqCyQthxHw3PbOejmqNRSyE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Ashish.Gupta@cavium.com; Received: from hyd1agupta-dt.caveonetworks.com (115.113.156.2) by CY4PR07MB3062.namprd07.prod.outlook.com (2603:10b6:903:d1::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.973.21; Wed, 25 Jul 2018 16:42:59 +0000 From: Ashish Gupta To: pablo.de.lara.guarch@intel.com Cc: dev@dpdk.org, narayanaprasad.athreya@cavium.com, mahipal.challa@cavium.com, fiona.trahe@intel.com, Ashish Gupta , Shally Verma , Sunila Sahu Date: Wed, 25 Jul 2018 22:34:52 +0530 Message-Id: <20180725170456.3319-3-Ashish.Gupta@caviumnetworks.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180725170456.3319-1-Ashish.Gupta@caviumnetworks.com> References: <20180725170456.3319-1-Ashish.Gupta@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [115.113.156.2] X-ClientProxiedBy: MA1PR01CA0106.INDPRD01.PROD.OUTLOOK.COM (2603:1096:a00:1::22) To CY4PR07MB3062.namprd07.prod.outlook.com (2603:10b6:903:d1::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e298c970-0c86-4ff1-1993-08d5f24db036 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989117)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(8990107)(5600073)(711020)(2017052603328)(7153060)(7193020); SRVR:CY4PR07MB3062; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3062; 3:dffjdJ4Y5ii7TUz1XcdbMfV3yzVASK94wWX+YWFlIfKq73aym2o+qOfWHTlCD311B91MBoW9Cy1zWfgrJwf21jUvNiQH2q+D3bWHgRT/+yW5ru9H7AIroKAa/RpVWiZZPfqH8Ey85vHH36S2Nn+L8ifNGT5EqvjfTpd99pPLfcc6/pikWLWZ0agDhQO3SISKwoN+N9iVTgjaee/tEQIjfj/mNr+XIt9FoMLD+I3dG8Imn2x3Q/GIsnuN2uqWOhFC; 25:mMYJwQoHJwfxncj35gXPUhzGpZmsf29Rdi1GIXB7JWJgqmp5j/sOOAMxnRB3OpOhFHVvuvwUo8XPqWHbakSWDXWMAH/Yg/tVMpnAVoy97uYmcxXTl5MGk4i7iD7DbBvzj1nnyYZB2aJrfkUbMeq/mc4QGJ6roQDgY/i+hV3p34YlJ3H+rV8+qH2l3vqdn5iA1S4WDudn/8qsXJt3p7waw7b/aIB8RKZBtJqrrPhmkXC8q6LhLZWGkSgRZM8C+1NJT7KbNOHKmgRii12vCwGXkBlUz5wq8stHHYBq8TkdgaY9IygoJ66BBDaEGuFxnjjAfEm/Qr8RxmYsJzans9WGbA==; 31:STamSYOV52djxgKuv2Ll210WeoN7DaEt0IEkpQYftIkBIDZIEiaAJCtmPZ4PfyowfpeJBbttAIlcZGCPndVKXgobDpLNsZ0srSk13ipkFgoKJLZomoNIxekHFRzztFgoPBYgJCGddT1JSXV0S179Mh9n8c09ymg9cD1vV/D8/BCOEhpYcZ/3ZL44Ja2Kp4rBx/rjEnRysAN3myEPE8T7cnwFGFMYWHkt4gkEe1G3W0w= X-MS-TrafficTypeDiagnostic: CY4PR07MB3062: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3062; 20:MPRWlmhdH4/gQKrf5K2s5oCkWz0jqAivFFQ8CAkNfUAOwk0sbdVkWAKL25nRngJWIQkdL+Lxi8PQ4l/orOGtloJpn9e34GebQsr1p5LKUXX9BDKm8jMIcyC/JQ3oJ74nt9CLabw8E3RvlcKJoMDvHZ8k1ENn2Cb3GmiSCERUDhMn+Uym3E7mP6wO95NvxFuRvP9gxUTbcVxwcfkd7QuDM1H+vTyB+I9IJSCyJa9vJ3bRYisLwroG8MhM1PKYtf8dtR9ccyluxsg4Oh60AqthBnMkRx+rfMowJwi7B/CPV+WQTjWR8ekPUcUaCWarNc0ritdN14wTGarUHhezH5jEk9wgH4WdJhyXuUjVLznUfzPa6nRMuLEkSS3yPV38I+CUoABERAXmRTKviLzf2P7aw1V5gafwMN55CgseWCgmK1ceOWyVkcJi/iTkKXY0lcjZ6OcX15G5o+uRIoapHynciq6KWX8kB9axsTO1Y/hqlPJCeaAFDYTESdv1sqZHpPImtwVPn6x8VT/CWpZnnwM6c/vSQavQijOupi+JpPj3coU73ASHVt25hacOyZHCuN6cxtcdrcVzx5O2xsa01XgqYRgD48tx1nVO0lw7CTH+jyY=; 4:e2b+riG6jj1+g68a2Q6knWTknlCLni5h9psForjOSZK9fP0BlOXhuPy5R47tMsUaw0NnpN86iRiM8PfH0q5pGuUhFz/YBiUXTWLSFSgJCGDJHOaGAVRzoLXN/xlYNC9oZPwFysiU2EYGPmxLCSQKTlcMtgbjtopAEOOs+lbC3Z77T+dPEFLhZMVAoY7fAAGaU8R5Y6vwaPWUd/7q+6RpA1P9kvhAUOnbHtLi0GXtCVPX2qVHTro4b8C3iXPqzC+vWXqBjq2tkVs2eQHfehOMQQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(3231311)(944501410)(52105095)(149027)(150027)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011)(7699016); SRVR:CY4PR07MB3062; BCL:0; PCL:0; RULEID:; SRVR:CY4PR07MB3062; X-Forefront-PRVS: 0744CFB5E8 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(376002)(346002)(136003)(366004)(39860400002)(189003)(199004)(2616005)(956004)(446003)(25786009)(69596002)(6486002)(2351001)(53416004)(81156014)(8676002)(11346002)(47776003)(105586002)(4326008)(66066001)(81166006)(486006)(8936002)(476003)(2361001)(26005)(186003)(16526019)(42882007)(7736002)(106356001)(68736007)(386003)(305945005)(6506007)(50226002)(107886003)(6512007)(51416003)(48376002)(52116002)(54906003)(72206003)(14444005)(50466002)(6666003)(97736004)(6916009)(5660300001)(478600001)(76176011)(16586007)(53936002)(3846002)(36756003)(2906002)(6116002)(55236004)(1076002)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3062; H:hyd1agupta-dt.caveonetworks.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR07MB3062; 23:4O43mD77iqObezHre9TlUnj8IhWK47n8cB/F9KfpJ?= ChOvXIN+BrX9JZKvutF11poZ2fCmgMgMOWQg1v9PvvF5MV7/1hZJk/Oo4WPWByfYoSR/gAk2OCfFBlKedBIlmREASI4TtWEELiKFnA2v/U7zCEHRUebabASzOIHwmwq6ne1K79p8MQtsAqdMOffbJK1GRHKwK1robycxIQ32PL5J0XPXv5ABpdZCx41limJgsrWGgDugNzYXhnIxATElxfkRFyCHzHJ8RRk2ekBFVJ7qJrx6mDGh/fg2ekNwRHjcYWLUFo+UFimuq/0cq3s+2gnfsDXkqtlTwVGfQIU4ykh22X0S4yaS7xKdLfktgZfopeuuKuDxkmvdksPj6xLmcwtR9+j6FxKvbr3kE2brH4zK1dXtj6hjkgTUDjRu6eb4kXv4HMBfGTE/ZX6e7f/FwHg7LEZheN12OI3ynsSucdbiEL9EUZF18ZzD+FMTD8v/5YIdSaRi8gmNebJbvuLYRUNXM7xpoUbgAzKrmEGQIBFC/Ka7wvjiwsE1FBXl/s62snJKPf63Zf9cQftfapxuRSd3HJXteXzpgQIgSAewLe5cOe8x2UpmYBxywobhjoxydWVLlTg3+D4e/XCgJtbsrrcl2vtgSEeUGiLLCIjenLFNXVYXLP0pc+Q/RzoJRT9bXNsGdxv3Z0VhADpjaH8U02wURvYrKz2/3WvnKtYq+z03d7r1bhWbN2kE/fvKDjwHzG78y5WefFAi6ZaeW0TObYFqeuqNd05v1W/qnReiFjyfFOPUQzRTVFfjrAmYfs0nlBeV4FUUivjEbkhxCdRBPHzOrQMe2ytDD6BzhPwLfEEZRR/dcI5LeDH47QrekgOHouRimLMRJVlRtjFSypYOezETCikPVjDcBpR22xIYbWeVdLRa6O/x1pYoUNzI7ChSVhNE5QWruXKNYFbUToX79EFJM6YysyU/vzke3QF2bmQE2zRSN7J5w1oHYHYWRNHN2rzPHvTdVyMjeXGmZ1jIWwgT2ebvyXD4bQH3MUDcBNXAFQQ62npHKnWEhkewrOVs+/2xPcFfoGdkwk9kiodAlUqdbFvDufk23stlyyP7AlypxArtHCRmTIu3TOViTWrZHIPfgsboumH2vP1kjtO0bBvk6vNPBfvWMaO6AzLX3F2BHUw9g2UJ1WlBSo1jN/bZfsIECDTwMr0Z7ErGgKfVbQxCrlNDB/bDGy9YXb3N+MxjIHy7/OhE32UyWzAqxVcH7h6bXTPmxu33QkW51eM+qswPQrI9QhgPl9aZZjoskrZVhiEBVABkPApo/yhybKMChe5Akwpbb1jXC1ntzyr+A7TwFX2BWjU2A4JhnYHWWI51tEE8z/gEX7ISKZDdGQZr/I= X-Microsoft-Antispam-Message-Info: iJvS17CwqlHLf+ws6PK8MKQy2w1mrUuaZ2ymU+tWRk3ggwWjFDL3H1VpoGb14lkrN91Z7MF4NJBPP3upMrcANsYVCrGgLeLUvDcQe5xmR5vaYhR+lpvir6K83a0wOo5PAgr2G/yLbpd0ATIrndvnrYQGceP2gQNyeV0ywTH0+BiIkxaGbFvzqn7Jas9JBOb6vU69BNiSxTPdYv8zVloqvYFiCDzQ6U/RyUuFtVQW38SwMGEXGIG0v0HjsAuJfn17SUroa9hsuGZy6lF/m9H+4WFWUZPW2SW3Fmq7itaxxWmxmXz5rbbhf2yDmbwc4b+EqrEXdOc+gzqOmjD11p1GTfTAEXNN7k8dp/BrvCmEA/c= X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3062; 6:mOQnubDq+spOPUM7qF7O2QJi+ldsKL1DHL/iUFyL1y2Q6bO5EV2sQKr49zQfF3y1NCX2l2kL38UJl0xrMbNptp2C7DXBwB6DYtDtjD9/QTd2XtclEHXKJKasZP3ZQPQcJubzkStKQnAXbkUavAaBtgrpShOEYP1eXxmIYGgZ8NbhK7DLFjC4cWpjuyaGVajUiHJf1b8wJQEmxQYyXfB7KnO+svQOAjBS5P+nieu4MnmKiCoN55iU74m2fAxsnhVPXrHA1eNtj3rIHcgsNrbsf1dcBZpt7skBxqgn/OHnypDpWZ6cVnoBJs/Kq3zctb70OhSqZEi7dWbVXY9MwfvH5QkDBTh1NV95AGhRwElQXQZ2p4YnwPUIwBhU3v9h3uLmPx2CSZOKuwAHnl6xOaB+HX+Yk0T95SsLFC0yQHhFKm4hCJuEkordJ5ssN88iUr9YkUgr49WJVYe1zY3W1hiLFA==; 5:f+sq/ix9mSI46nj7uQ8faVsSHVhm+uXsX9tEImddyeRLCxCXkNUbr+2D2bYW1RqjZfS0lnmKh2ylcyOTn0MG2V7Gl/Qj/a+vVM7TpYm6AsaKSvasULXqhrRfFfvmLuuPB6NJ0NfEIfZLsGF8eM5M4YnfQ23uJAS3ZhtN8RmidvU=; 7:yk5Ah49TX8mVsTbrr+V3KGwI+ch8G646NAFXXiE2c5Vdsuxc5/MtTuY5M4XQalejDYPjOXRvY1cnqTKgqRhUzIfdUoCBeNX1nMeKgsETugYUGoB36qGBjs1z+233zhUl28BVlbIT30mQZaHHTz1M0ligTLjGMpvhm/pb//ELjy3rIB5Lcs9T4YCEqgPrG9z9fZbAl1thGTazYqMzHdOVPGmUaocDk6FYSbg6dUkDSAT/BBQzLg5rPGdCQHF0lsUp SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jul 2018 16:42:59.9920 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e298c970-0c86-4ff1-1993-08d5f24db036 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3062 Subject: [dpdk-dev] [PATCH v4 2/6] compress/octeontx: add device setup PMD ops 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" Add compression PMD device and queue pair setup ops. Signed-off-by: Ashish Gupta Signed-off-by: Shally Verma Signed-off-by: Sunila Sahu --- drivers/compress/octeontx/otx_zip.c | 71 +++++++++ drivers/compress/octeontx/otx_zip.h | 57 ++++++- drivers/compress/octeontx/otx_zip_pmd.c | 253 ++++++++++++++++++++++++++++++++ 3 files changed, 379 insertions(+), 2 deletions(-) diff --git a/drivers/compress/octeontx/otx_zip.c b/drivers/compress/octeontx/otx_zip.c index 7a1dd58..7c81db1 100644 --- a/drivers/compress/octeontx/otx_zip.c +++ b/drivers/compress/octeontx/otx_zip.c @@ -18,6 +18,77 @@ zip_reg_write64(uint8_t *hw_addr, uint64_t offset, uint64_t val) *(uint64_t *)(base + offset) = val; } +static void +zip_q_enable(struct zipvf_qp *qp) +{ + zip_vqx_ena_t que_ena; + + /*ZIP VFx command queue init*/ + que_ena.u = 0ull; + que_ena.s.ena = 1; + + zip_reg_write64(qp->vf->vbar0, ZIP_VQ_ENA, que_ena.u); + rte_wmb(); +} + +/* initialize given qp on zip device */ +int +zipvf_q_init(struct zipvf_qp *qp) +{ + zip_vqx_sbuf_addr_t que_sbuf_addr; + + uint64_t size; + void *cmdq_addr; + uint64_t iova; + struct zipvf_cmdq *cmdq = &qp->cmdq; + struct zip_vf *vf = qp->vf; + + /* allocate and setup instruction queue */ + size = ZIP_MAX_CMDQ_SIZE; + size = ZIP_ALIGN_ROUNDUP(size, ZIP_CMDQ_ALIGN); + + cmdq_addr = rte_zmalloc(qp->name, size, ZIP_CMDQ_ALIGN); + if (cmdq_addr == NULL) + return -1; + + cmdq->sw_head = (uint64_t *)cmdq_addr; + cmdq->va = (uint8_t *)cmdq_addr; + iova = rte_mem_virt2iova(cmdq_addr); + + cmdq->iova = iova; + + que_sbuf_addr.u = 0ull; + que_sbuf_addr.s.ptr = (cmdq->iova >> 7); + zip_reg_write64(vf->vbar0, ZIP_VQ_SBUF_ADDR, que_sbuf_addr.u); + + zip_q_enable(qp); + + memset(cmdq->va, 0, ZIP_MAX_CMDQ_SIZE); + rte_spinlock_init(&cmdq->qlock); + + return 0; +} + +int +zipvf_q_term(struct zipvf_qp *qp) +{ + struct zipvf_cmdq *cmdq = &qp->cmdq; + zip_vqx_ena_t que_ena; + struct zip_vf *vf = qp->vf; + + if (cmdq->va != NULL) { + memset(cmdq->va, 0, ZIP_MAX_CMDQ_SIZE); + rte_free(cmdq->va); + } + + /*Disabling the ZIP queue*/ + que_ena.u = 0ull; + zip_reg_write64(vf->vbar0, ZIP_VQ_ENA, que_ena.u); + + return 0; +} + + int zipvf_create(struct rte_compressdev *compressdev) { diff --git a/drivers/compress/octeontx/otx_zip.h b/drivers/compress/octeontx/otx_zip.h index 8a58f31..1289919 100644 --- a/drivers/compress/octeontx/otx_zip.h +++ b/drivers/compress/octeontx/otx_zip.h @@ -77,8 +77,54 @@ int octtx_zip_logtype_driver; ZIP_PMD_LOG(INFO, fmt, ## args) #define ZIP_PMD_ERR(fmt, args...) \ ZIP_PMD_LOG(ERR, fmt, ## args) -#define ZIP_PMD_WARN(fmt, args...) \ - ZIP_PMD_LOG(WARNING, fmt, ## args) + +/* resources required to process stream */ +enum { + RES_BUF = 0, + CMD_BUF, + HASH_CTX_BUF, + DECOMP_CTX_BUF, + IN_DATA_BUF, + OUT_DATA_BUF, + HISTORY_DATA_BUF, + MAX_BUFS_PER_STREAM +} NUM_BUFS_PER_STREAM; + + +struct zipvf_qp; + + +/** + * ZIP instruction Queue + */ +struct zipvf_cmdq { + rte_spinlock_t qlock; + /* queue lock */ + uint64_t *sw_head; + /* pointer to start of 8-byte word length queue-head */ + uint8_t *va; + /* pointer to instruction queue virtual address */ + rte_iova_t iova; + /* iova addr of cmdq head*/ +}; + +/** + * ZIP device queue structure + */ +struct zipvf_qp { + struct zipvf_cmdq cmdq; + /* Hardware instruction queue structure */ + struct rte_ring *processed_pkts; + /* Ring for placing processed packets */ + struct rte_compressdev_stats qp_stats; + /* Queue pair statistics */ + uint16_t id; + /* Queue Pair Identifier */ + const char *name; + /* Unique Queue Pair Name */ + struct zip_vf *vf; + /* pointer to device, queue belongs to */ +} __rte_cache_aligned; /** * ZIP VF device structure. @@ -104,6 +150,13 @@ zipvf_create(struct rte_compressdev *compressdev); int zipvf_destroy(struct rte_compressdev *compressdev); +int +zipvf_q_init(struct zipvf_qp *qp); + +int +zipvf_q_term(struct zipvf_qp *qp); + + uint64_t zip_reg_read64(uint8_t *hw_addr, uint64_t offset); diff --git a/drivers/compress/octeontx/otx_zip_pmd.c b/drivers/compress/octeontx/otx_zip_pmd.c index 4d92c9d..b670f87 100644 --- a/drivers/compress/octeontx/otx_zip_pmd.c +++ b/drivers/compress/octeontx/otx_zip_pmd.c @@ -11,8 +11,261 @@ #include "otx_zip.h" +static const struct rte_compressdev_capabilities + octtx_zip_pmd_capabilities[] = { + { .algo = RTE_COMP_ALGO_DEFLATE, + /* Deflate */ + .comp_feature_flags = RTE_COMP_FF_HUFFMAN_FIXED | + RTE_COMP_FF_HUFFMAN_DYNAMIC, + /* Non sharable Priv XFORM and Stateless */ + .window_size = { + .min = 1, + .max = 14, + .increment = 1 + /* size supported 2^1 to 2^14 */ + }, + }, + RTE_COMP_END_OF_CAPABILITIES_LIST() +}; + +/** Configure device */ +static int +zip_pmd_config(struct rte_compressdev *dev, + struct rte_compressdev_config *config) +{ + int nb_streams; + char res_pool[RTE_MEMZONE_NAMESIZE]; + struct zip_vf *vf; + struct rte_mempool *zip_buf_mp; + + if (!config || !dev) + return -EIO; + + vf = (struct zip_vf *)(dev->data->dev_private); + + /* create pool with maximum numbers of resources + * required by streams + */ + + /* use common pool for non-shareable priv_xform and stream */ + nb_streams = config->max_nb_priv_xforms + config->max_nb_streams; + + snprintf(res_pool, RTE_MEMZONE_NAMESIZE, "octtx_zip_res_pool%u", + dev->data->dev_id); + + /** TBD Should we use the per core object cache for stream resources */ + zip_buf_mp = rte_mempool_create( + res_pool, + nb_streams * MAX_BUFS_PER_STREAM, + ZIP_BUF_SIZE, + 0, + 0, + NULL, + NULL, + NULL, + NULL, + SOCKET_ID_ANY, + 0); + + if (zip_buf_mp == NULL) { + ZIP_PMD_ERR( + "Failed to create buf mempool octtx_zip_res_pool%u", + dev->data->dev_id); + return -1; + } + + vf->zip_mp = zip_buf_mp; + + return 0; +} + +/** Start device */ +static int +zip_pmd_start(__rte_unused struct rte_compressdev *dev) +{ + return 0; +} + +/** Stop device */ +static void +zip_pmd_stop(__rte_unused struct rte_compressdev *dev) +{ + +} + +/** Close device */ +static int +zip_pmd_close(struct rte_compressdev *dev) +{ + if (dev == NULL) + return -1; + + struct zip_vf *vf = (struct zip_vf *)dev->data->dev_private; + rte_mempool_free(vf->zip_mp); + + return 0; +} + +/** Get device statistics */ +static void +zip_pmd_stats_get(struct rte_compressdev *dev, + struct rte_compressdev_stats *stats) +{ + int qp_id; + + for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { + struct zipvf_qp *qp = dev->data->queue_pairs[qp_id]; + + stats->enqueued_count += qp->qp_stats.enqueued_count; + stats->dequeued_count += qp->qp_stats.dequeued_count; + + stats->enqueue_err_count += qp->qp_stats.enqueue_err_count; + stats->dequeue_err_count += qp->qp_stats.dequeue_err_count; + } +} + +/** Reset device statistics */ +static void +zip_pmd_stats_reset(struct rte_compressdev *dev) +{ + int qp_id; + + for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { + struct zipvf_qp *qp = dev->data->queue_pairs[qp_id]; + memset(&qp->qp_stats, 0, sizeof(qp->qp_stats)); + } +} + +/** Get device info */ +static void +zip_pmd_info_get(struct rte_compressdev *dev, + struct rte_compressdev_info *dev_info) +{ + struct zip_vf *vf = (struct zip_vf *)dev->data->dev_private; + + if (dev_info != NULL) { + dev_info->driver_name = dev->device->driver->name; + dev_info->feature_flags = dev->feature_flags; + dev_info->capabilities = octtx_zip_pmd_capabilities; + dev_info->max_nb_queue_pairs = vf->max_nb_queue_pairs; + } +} + +/** Release queue pair */ +static int +zip_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id) +{ + struct zipvf_qp *qp = dev->data->queue_pairs[qp_id]; + + if (qp != NULL) { + zipvf_q_term(qp); + + if (qp->processed_pkts) + rte_ring_free(qp->processed_pkts); + + rte_free(qp); + dev->data->queue_pairs[qp_id] = NULL; + } + return 0; +} + +/** Create a ring to place process packets on */ +static struct rte_ring * +zip_pmd_qp_create_processed_pkts_ring(struct zipvf_qp *qp, + unsigned int ring_size, int socket_id) +{ + struct rte_ring *r; + + r = rte_ring_lookup(qp->name); + if (r) { + if (rte_ring_get_size(r) >= ring_size) { + ZIP_PMD_INFO("Reusing existing ring %s for processed" + " packets", qp->name); + return r; + } + + ZIP_PMD_ERR("Unable to reuse existing ring %s for processed" + " packets", qp->name); + return NULL; + } + + return rte_ring_create(qp->name, ring_size, socket_id, + RING_F_EXACT_SZ); +} + +/** Setup a queue pair */ +static int +zip_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id, + uint32_t max_inflight_ops, int socket_id) +{ + struct zipvf_qp *qp = NULL; + struct zip_vf *vf; + char *name; + int ret; + + if (!dev) + return -1; + + vf = (struct zip_vf *) (dev->data->dev_private); + + /* Free memory prior to re-allocation if needed. */ + if (dev->data->queue_pairs[qp_id] != NULL) { + ZIP_PMD_INFO("Using existing queue pair %d ", qp_id); + return 0; + } + + name = rte_malloc(NULL, RTE_COMPRESSDEV_NAME_MAX_LEN, 0); + snprintf(name, RTE_COMPRESSDEV_NAME_MAX_LEN, + "zip_pmd_%u_qp_%u", + dev->data->dev_id, qp_id); + + /* Allocate the queue pair data structure. */ + qp = rte_zmalloc_socket(name, sizeof(*qp), + RTE_CACHE_LINE_SIZE, socket_id); + if (qp == NULL) + return (-ENOMEM); + + qp->name = name; + + /* Create completion queue upto max_inflight_ops */ + qp->processed_pkts = zip_pmd_qp_create_processed_pkts_ring(qp, + max_inflight_ops, socket_id); + if (qp->processed_pkts == NULL) + goto qp_setup_cleanup; + + qp->id = qp_id; + qp->vf = vf; + + ret = zipvf_q_init(qp); + if (ret < 0) + goto qp_setup_cleanup; + + dev->data->queue_pairs[qp_id] = qp; + + memset(&qp->qp_stats, 0, sizeof(qp->qp_stats)); + return 0; + +qp_setup_cleanup: + if (qp->processed_pkts) + rte_ring_free(qp->processed_pkts); + if (qp) + rte_free(qp); + return -1; +} + struct rte_compressdev_ops octtx_zip_pmd_ops = { + .dev_configure = zip_pmd_config, + .dev_start = zip_pmd_start, + .dev_stop = zip_pmd_stop, + .dev_close = zip_pmd_close, + + .stats_get = zip_pmd_stats_get, + .stats_reset = zip_pmd_stats_reset, + + .dev_infos_get = zip_pmd_info_get, + .queue_pair_setup = zip_pmd_qp_setup, + .queue_pair_release = zip_pmd_qp_release, }; static int