From patchwork Sun Oct 8 12:44:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Santosh Shukla X-Patchwork-Id: 29902 X-Patchwork-Delegate: ferruh.yigit@amd.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 0D77F1B205; Sun, 8 Oct 2017 14:45:47 +0200 (CEST) Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0062.outbound.protection.outlook.com [104.47.36.62]) by dpdk.org (Postfix) with ESMTP id 112451B205 for ; Sun, 8 Oct 2017 14:45:45 +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; bh=I2Tu0SRogARfY0nw0NYYZLnKgGBu+MONOueZWpbX5BM=; b=Se1yVC/EspySsKFbkwqrBy5oIrmYvCA9/JpQlTdOx79IzYcg2T0l5RGW7GYfzJwiGaIq5MsK+BFJcBx+ReaQ/wLH8jO766jaC6HkVNW57gyfQQV3INaOAwyqoBbsNqETbjERPrRNAhPPw5BB/tQakCJ96QCsuO9YEdi2wGy7U2s= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Santosh.Shukla@cavium.com; Received: from localhost.localdomain (14.140.2.178) by BN6PR07MB3089.namprd07.prod.outlook.com (10.172.105.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Sun, 8 Oct 2017 12:45:41 +0000 From: Santosh Shukla To: dev@dpdk.org Cc: ferruh.yigit@intel.com, jerin.jacob@caviumnetworks.com, Santosh Shukla Date: Sun, 8 Oct 2017 18:14:13 +0530 Message-Id: <20171008124430.1866-10-santosh.shukla@caviumnetworks.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171008124430.1866-1-santosh.shukla@caviumnetworks.com> References: <20170831145436.5397-1-jerin.jacob@caviumnetworks.com> <20171008124430.1866-1-santosh.shukla@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: MA1PR01CA0113.INDPRD01.PROD.OUTLOOK.COM (10.174.56.157) To BN6PR07MB3089.namprd07.prod.outlook.com (10.172.105.7) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a1e08b65-e60b-4d23-cb84-08d50e4a7d50 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:BN6PR07MB3089; X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3089; 3:ZjBqcP5jKMxf8K+uPBhqOYgV3MmfYVHSWHA+QFWEb8bQWlRmRQh4+VeVTxE38EBDacKRwUvkF9ZuKzSlQMuhvN0TogqM3xq+X+ZzlSgfEIaVYlnSZY6Q9Da/zu3Tzr+fFwIwRWrU5UWTknHh9NobyqCQXbEOLF9zX276hgC+XbXiXFBWRQ2/0yVaQKnh2ZY/p1/iGld7oEj7Ierwqw2btJeUlUyrhl+yD4hinJI6C75SjQzZRlWNuhS4J/hDjWUf; 25:HQPXu8uDNSEP1e9OC3dvOlqoqBlI/BlVMJJ+Ul668fl+yVbbE0PO3yU/qcFQMS8GOTtNmW6cKIBiQDv3acOwBhHtz2sPYOirA+Q5VX8oeDgpg/HKykwOYtOTWinX/rtSpfnatQSMRJgN5swtpOy4jdX4t8bGQQzeXddFPPPSg/HcLfZqbtViGiq3oLfZKV0JPPWvWPpi+vyAA0Ih6jxf0fNKgz7qPNOVbu6wy5TRIY5PdWy4zRzIIy0bJS+r8daBkuGm/gVYlAx4XzBVc/ggsJypGvv1t6ixovtxsN1bE/cgvlZUJEGHpT8HfUBRbkOS894/xkvT0lw0g+InEA1OUA==; 31:FOzbmCmTQP/5l3Tfg4HwoJzX3Y/lI6WYJrKFc+lDUnkFCsEg2XnhR1JND4LC5o8tV/p3H3aztdNP9axsbf/tuguzn6+Y16N+pwZqBCrYL3V26UZppvDm2QvqzTcgW0lZdsEz1v3foOaAN45KelKgJ5SkOtJ0YolQ3w0e3wbwt0civSicH03uyRfQdEeFYZyjMRjLgl3iouXWOhYiNNwQVg9lIeRK2velVuvINdHR1Qo= X-MS-TrafficTypeDiagnostic: BN6PR07MB3089: X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3089; 20:d3bIDr8yWaPRj4ZR8yFs+1HmQiEFtd7Q5794F+cKjviGdog67kZwoGjPx97AeRrS/5WyXNAguaha4XtHPwhqR8huQnuB8ZBg1EK5N5Mk906mvNJ0Py1vyqllGmn/x3B+sexn6gENWhVcWMCdSkDAhnDpkEieV67JomlJ2uGHoBVXnckok4b3ylnIrCpXtFWgIvjCmh5utVlQ4bZYScwB8pYYy2UyIb1++NZSlmPNV2EYCNxnyotYC0lZZAanLeABAGCmf6rfy7N9CiM78Kaj/mreiZNDRv4/pIrPtxk9QqfTNM8txodabFXWq67Xl9rYA184kcXwHbq9stPD46tlWs/AU6q7cB7UL7s0kjAn2JZcfcGlPbYZU2DTShWUi3paG594zRHcBpnUadM3qfFz/7ut0I/hK+xXmhWnPJe/hQjcDeM38Yk94uya+PjYy0iYdYyBJnEeiaUGjGzV3oBnv5jRqAqwh1MwOE/pbFT8c+ruV1foSqjsDfsJjYwyhzmCmO2gfH+xPokyoU27mvKbijLIgT6ofDbPXhrzi6j6tvQsFM3kniBVvkXHOWAD0gMXsQ0tWnbVS98gj+gVwuVeV8xC/WUqJ1nxb3W7fTkgrfk=; 4:cx0uCsRBpM73QIuWEqKv99nuOW1Me88XN+yAV17MQKeF8qrDM9H9GZALT0bvbOJ6N3KTsK4aezn63ur/rP8blX4reePxLvDS9kueNJdPQZlvvMsdf0M3IE5e5X0SqOzYGBdz8B9R7M3ADfMZab1fotumm3iHaLPW6SGHVd53Bel3Nv+sFvz2FsR8p/J0ShBkmZDWkf/t9PbA5v0s64ViyomqqkAm3J5m8sUalTKgyzXdAijpynIbDmV9+QNfwS7RY8BYiLFGul5X7Cx2Ke0bcGuf5isscM7Hi5E1zR76UCg= X-Exchange-Antispam-Report-Test: UriScan:(158342451672863); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(100000703101)(100105400095)(6041248)(20161123562025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BN6PR07MB3089; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BN6PR07MB3089; X-Forefront-PRVS: 0454444834 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(6009001)(376002)(346002)(199003)(189002)(6916009)(42882006)(81166006)(575784001)(2950100002)(81156014)(8936002)(50226002)(6486002)(16526018)(6666003)(189998001)(16586007)(316002)(6116002)(1076002)(6506006)(3846002)(7736002)(305945005)(8676002)(106356001)(105586002)(5009440100003)(53936002)(4326008)(66066001)(107886003)(47776003)(2906002)(5660300001)(6512007)(76176999)(5003940100001)(50986999)(97736004)(25786009)(101416001)(68736007)(48376002)(50466002)(478600001)(72206003)(2351001)(2361001)(33646002)(36756003)(110426004); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR07MB3089; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR07MB3089; 23:lYAFu9H6Ocz0v045HMO3YXtsUHk5BMjDZ9RsXEqwf?= 0XuGXwF/YhmPRBkpdyRVeat23efEpjrtWcut1qcImCnKh6qIy2tw/D6HgKvB/OI7vGRZwAlXKjjgOVG/GPOkOuS9OPPIpR9aZnLbIjht4QTM4Y8P99veHvIiv0egkDgncCbJfNbL0m6v6N8+ZOdWMJaTMez7Xo1QIxNK1AahoxnuuHJmMki4qfc03vDjaSdBv78jnng8UIErapGiBI2pmY8buB/dhggh+Kf27Og3PbHPpd6L1bQqS5SQcLOLff4AcNHzRwSnsKi3KRm97+19U96jVv4SAdudAx3/cgfPazytJbuU2RbJDkz5Ty+Eik6+Jr03mQDcmpgFgLyl8BXPc4+9hf4DvHZpmctMj7DOUWLov3mj4HTVgpA65VDZ1QPtFXTfXju6MH3ZoHv89XoV3mxwg36Cqa6uhVt3UOu6mZQPM3Lc6elYUDx4BZjA4rpQpbICmabvq+Uesj6cbM9zipDDllYKXy0Ly1AGYu9cfy7LY8jdM3v676szPa43c/h1HpBnX/epzwoyiQf/D39iWvly75R+UEgp1UdNt0VXIOjV93K/MWo/wtD0qGevemgSdGp/B8AXZowNU3Pd4Fy6QLipFzTtU0oyqtph1wOWWgtm3a6hBtd2RxGKA5V8IrAmsLUINlOQkWzD89hTdCmCxjUSjgPeWVb5D/K+1W+xXko36DBUJu+eLhLG/ZaQeK0u85ukVtlexAVrTle4/gUeMa5ON0LmgKzzJoZiSqI5LxDamYZHULiJh6AngYy3tJgt/jeJXko4FD/0WHqRtU3MVp6vLV3GTKBejHlQy3iOCI8D16zaVIO1iBQKKqN0aDsfSGbnH5SJRJW6NIq9aR//vpfmCos4aJatLTLxzMJmhKW9Qx53mtRfhEauKoFsVX9lbmcj5918p5Xyjkad0deV8HfScEGRIe4LSGJWc7QeRJ/Lv91+VUvJ90J9dtAJoezawsYdwzhJmw5+usWpe5/v1UcdPFyyEC8Gn+wmN6TGqH5A5ZNkJdrVw9GVateWO1k5f8oLXrSi1i4rrgogwtUrj5coi2b7qSluovk/LL0q8tXGhnZk4n838Ie8FXvYjI2RaHJbJdxPv4IpQAJRHo965bEgWv7CEwUpdLttRsKetMAKEI9irRVWm0suWrc/MxM26F4pQrJsAmu1Howp+imSwlxE4gdnfdcWiucbxuwWUTVey0FXcB+02MB/FHjYMh4xRMpeuEZHbJkf5bCCANOuy/6 X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3089; 6:BY82uTDUh5JY6KvGVE34BH32OmpxeE7i5OPqT4TDnHXF9U6cywODWB5/kreGezAzjdV7Mgc55Kt58fFSAN9NviEl/6o5muQCJfH1yPQ4tnI7dZVt4vLTK/Pg2jUe+HsZ5vP8590pxHJyNDDGKwmUxqvz3+JmaQ8nr10ghwIqs9Mwdkab0LhwUJIBHy9nrP6yCEngQizGPELwvssmjOUQYJuevUJOsJK/MIFLaNoU6cqrZhja51pSWKOE9VeB2P+BUOekf8pBT6vvop2H4oNMLVrLX8A2pv8y/f8qbeM2vPMPo+Uubh65V6hJfF4x2AaW6zU522STyJyUim2mUXkvGQ==; 5:6kkFTSvAmZj2BvXe/zqIx32ufC3QlTnopFHDCRKu0ww/62RhWkga3jwb7p8+8KDilBwYr2lTV90egwIcFBRprUw5QsbvblyOB4f6TRz14u5dXAelYvmTdJlHYhVULuZgIWBGDM0PtLWsOwtkqX+YIQ==; 24:GwZ3Wi0DaRt8qOxU/kzwb3kIfosYGcI2nsojxd1xL8RFf7JHHf9MpcJSERp8Xj+zuC+Qas7zVEhzC8BR5Lf1ZSVwVfyxYY/0Btzb+FcscN4=; 7:GePUAM598SXR0UgYPnyNBiNDU4JdJFiEnN2+QHOzK8h0dgoszWOZJh6Ki6HHNnzeTY5tq8YJc5MzWw0F0h7ZP8AQlL/T0UgbQc5cmcxS0g536j99ePfMUh54llpcJ1WJsg/xfHktNjt9g/QWNV76C1kF6TRYr5RmF9v6/m5yHEi1+6mZSBGXffqN4LwW/FjG1QwiRxHM6ITRK9UCi6x6VwNLycwxG6hTVZGHVlZiVAA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Oct 2017 12:45:41.6606 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR07MB3089 Subject: [dpdk-dev] [PATCH v2 09/26] net/octeontx/base: add base PKO operations 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" From: Jerin Jacob PKO is the packet output processing unit, which receives the packet from the core and sends to the BGX interface. This patch adds the basic PKO operation like open, close, start and stop. These operations are implemented through mailbox messages and kernel PF driver being the server to process the message with the logical port identifier. Signed-off-by: Jerin Jacob Co-authored-by: Santosh Shukla Signed-off-by: Santosh Shukla --- drivers/net/octeontx/base/octeontx_pkovf.c | 327 +++++++++++++++++++++++++++++ drivers/net/octeontx/base/octeontx_pkovf.h | 17 ++ 2 files changed, 344 insertions(+) diff --git a/drivers/net/octeontx/base/octeontx_pkovf.c b/drivers/net/octeontx/base/octeontx_pkovf.c index 599edefd0..38693a9bc 100644 --- a/drivers/net/octeontx/base/octeontx_pkovf.c +++ b/drivers/net/octeontx/base/octeontx_pkovf.c @@ -77,6 +77,333 @@ struct octeontx_pko_vf_ctl_s { static struct octeontx_pko_vf_ctl_s pko_vf_ctl; +static void * +octeontx_pko_dq_vf_bar0(uint16_t txq) +{ + int vf_ix; + + vf_ix = txq / PKO_VF_NUM_DQ; + return pko_vf_ctl.pko[vf_ix].bar0; +} + +static int +octeontx_pko_dq_gdq(uint16_t txq) +{ + return txq % PKO_VF_NUM_DQ; +} + +/** + * Open a PKO DQ. + */ +static inline +int octeontx_pko_dq_open(uint16_t txq) +{ + unsigned int reg_off; + uint8_t *vf_bar0; + uint64_t rtn; + int gdq; + + vf_bar0 = octeontx_pko_dq_vf_bar0(txq); + gdq = octeontx_pko_dq_gdq(txq); + + if (unlikely(gdq < 0 || vf_bar0 == NULL)) + return -EINVAL; + *(volatile int64_t*)(pko_vf_ctl.fc_ctl + txq) = + PKO_DQ_FC_DEPTH_PAGES - PKO_DQ_FC_SKID; + + rte_wmb(); + + octeontx_write64(PKO_DQ_FC_DEPTH_PAGES, + vf_bar0 + PKO_VF_DQ_FC_STATUS(gdq)); + + /* Set the register to return descriptor (packet) count as DEPTH */ + /* KIND=1, NCB_QUERY_RSP=0 */ + octeontx_write64(1ull << PKO_DQ_KIND_BIT, + vf_bar0 + PKO_VF_DQ_WM_CTL(gdq)); + reg_off = PKO_VF_DQ_OP_OPEN(gdq); + + rtn = octeontx_reg_ldadd_u64(vf_bar0 + reg_off, 0); + + /* PKO_DQOP_E::OPEN */ + if (((rtn >> PKO_DQ_OP_BIT) & 0x3) != 0x1) + return -EIO; + + switch (rtn >> PKO_DQ_STATUS_BIT) { + case 0xC: /* DQALREADYCREATED */ + case 0x0: /* PASS */ + break; + default: + return -EIO; + } + + /* DRAIN=0, DRAIN_NULL_LINK=0, SW_XOFF=0 */ + octeontx_write64(0, vf_bar0 + PKO_VF_DQ_SW_XOFF(gdq)); + + return rtn & ((1ull << PKO_DQ_OP_BIT) - 1); +} + +/** + * Close a PKO DQ + * Flush all packets pending. + */ +static inline +int octeontx_pko_dq_close(uint16_t txq) +{ + unsigned int reg_off; + uint8_t *vf_bar0; + uint64_t rtn; + int res; + + vf_bar0 = octeontx_pko_dq_vf_bar0(txq); + res = octeontx_pko_dq_gdq(txq); + + if (unlikely(res < 0 || vf_bar0 == NULL)) + return -EINVAL; + + reg_off = PKO_VF_DQ_OP_CLOSE(res); + + rtn = octeontx_reg_ldadd_u64(vf_bar0 + reg_off, 0); + + /* PKO_DQOP_E::CLOSE */ + if (((rtn >> PKO_DQ_OP_BIT) & 0x3) != 0x2) + return -EIO; + + switch (rtn >> PKO_DQ_STATUS_BIT) { + case 0xD: /* DQNOTCREATED */ + case 0x0: /* PASS */ + break; + default: + return -EIO; + } + + res = rtn & ((1ull << PKO_DQ_OP_BIT) - 1); /* DEPTH */ + return res; +} + +/* Flush all packets pending on a DQ */ +static inline +int octeontx_pko_dq_drain(uint16_t txq) +{ + unsigned int gdq; + uint8_t *vf_bar0; + uint64_t reg; + int res, timo = PKO_DQ_DRAIN_TO; + + vf_bar0 = octeontx_pko_dq_vf_bar0(txq); + res = octeontx_pko_dq_gdq(txq); + gdq = res; + + /* DRAIN=1, DRAIN_NULL_LINK=0, SW_XOFF=1 */ + octeontx_write64(0x3, vf_bar0 + PKO_VF_DQ_SW_XOFF(gdq)); + /* Wait until buffers leave DQs */ + reg = octeontx_read64(vf_bar0 + PKO_VF_DQ_WM_CNT(gdq)); + while (reg && timo > 0) { + rte_delay_us(100); + timo--; + reg = octeontx_read64(vf_bar0 + PKO_VF_DQ_WM_CNT(gdq)); + } + /* DRAIN=0, DRAIN_NULL_LINK=0, SW_XOFF=0 */ + octeontx_write64(0, vf_bar0 + PKO_VF_DQ_SW_XOFF(gdq)); + + return reg; +} + +static inline int +octeontx_pko_dq_range_lookup(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid, + unsigned int dq_num, unsigned int dq_from) +{ + unsigned int dq, dq_cnt; + unsigned int dq_base; + + dq_cnt = 0; + dq = dq_from; + while (dq < RTE_DIM(ctl->dq_map)) { + dq_base = dq; + dq_cnt = 0; + while (ctl->dq_map[dq].chanid == ~chanid && + dq < RTE_DIM(ctl->dq_map)) { + dq_cnt++; + if (dq_cnt == dq_num) + return dq_base; + dq++; + } + dq++; + } + return -1; +} + +static inline void +octeontx_pko_dq_range_assign(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid, + unsigned int dq_base, unsigned int dq_num) +{ + unsigned int dq, dq_cnt; + + dq_cnt = 0; + while (dq_cnt < dq_num) { + dq = dq_base + dq_cnt; + + octeontx_log_dbg("DQ# %u assigned to CHAN# %lx", dq, chanid); + + ctl->dq_map[dq].chanid = ~chanid; + dq_cnt++; + } +} + +static inline int +octeontx_pko_dq_claim(struct octeontx_pko_vf_ctl_s *ctl, unsigned int dq_base, + unsigned int dq_num, uint64_t chanid) +{ + const uint64_t null_chanid = ~0ull; + int dq; + + rte_spinlock_lock(&ctl->lock); + + dq = octeontx_pko_dq_range_lookup(ctl, null_chanid, dq_num, dq_base); + if (dq < 0 || (unsigned int)dq != dq_base) { + rte_spinlock_unlock(&ctl->lock); + return -1; + } + octeontx_pko_dq_range_assign(ctl, chanid, dq_base, dq_num); + + rte_spinlock_unlock(&ctl->lock); + + return 0; +} + +static inline int +octeontx_pko_dq_free(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid) +{ + const uint64_t null_chanid = ~0ull; + unsigned int dq = 0, dq_cnt = 0; + + rte_spinlock_lock(&ctl->lock); + while (dq < RTE_DIM(ctl->dq_map)) { + if (ctl->dq_map[dq].chanid == ~chanid) { + ctl->dq_map[dq].chanid = ~null_chanid; + dq_cnt++; + } + dq++; + } + rte_spinlock_unlock(&ctl->lock); + + return dq_cnt > 0 ? 0 : -EINVAL; +} + +int +octeontx_pko_channel_open(int dq_base, int dq_num, int chanid) +{ + struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl; + int res; + + res = octeontx_pko_dq_claim(ctl, dq_base, dq_num, chanid); + if (res < 0) + return -1; + + return 0; +} + +int +octeontx_pko_channel_close(int chanid) +{ + struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl; + int res; + + res = octeontx_pko_dq_free(ctl, chanid); + if (res < 0) + return -1; + + return 0; +} + +static inline int +octeontx_pko_chan_start(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid) +{ + unsigned int dq_vf; + unsigned int dq, dq_cnt; + + dq_cnt = 0; + dq = 0; + while (dq < RTE_DIM(ctl->dq_map)) { + dq_vf = dq / PKO_VF_NUM_DQ; + + if (!ctl->pko[dq_vf].bar0) { + dq += PKO_VF_NUM_DQ; + continue; + } + + if (ctl->dq_map[dq].chanid != ~chanid) { + dq++; + continue; + } + + if (octeontx_pko_dq_open(dq) < 0) + break; + + dq_cnt++; + dq++; + } + + return dq_cnt; +} + +int +octeontx_pko_channel_start(int chanid) +{ + struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl; + int dq_cnt; + + dq_cnt = octeontx_pko_chan_start(ctl, chanid); + if (dq_cnt < 0) + return -1; + + return dq_cnt; +} + +static inline int +octeontx_pko_chan_stop(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid) +{ + unsigned int dq, dq_cnt, dq_vf; + int res; + + dq_cnt = 0; + dq = 0; + while (dq < RTE_DIM(ctl->dq_map)) { + dq_vf = dq / PKO_VF_NUM_DQ; + + if (!ctl->pko[dq_vf].bar0) { + dq += PKO_VF_NUM_DQ; + continue; + } + + if (ctl->dq_map[dq].chanid != ~chanid) { + dq++; + continue; + } + + res = octeontx_pko_dq_drain(dq); + if (res > 0) + octeontx_log_err("draining DQ%d, buffers left: %x", + dq, res); + + res = octeontx_pko_dq_close(dq); + if (res < 0) + octeontx_log_err("closing DQ%d failed\n", dq); + + dq_cnt++; + dq++; + } + return dq_cnt; +} + +int +octeontx_pko_channel_stop(int chanid) +{ + struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl; + + octeontx_pko_chan_stop(ctl, chanid); + return 0; +} + static void octeontx_pkovf_setup(void) { diff --git a/drivers/net/octeontx/base/octeontx_pkovf.h b/drivers/net/octeontx/base/octeontx_pkovf.h index bca4b2836..b33796a29 100644 --- a/drivers/net/octeontx/base/octeontx_pkovf.h +++ b/drivers/net/octeontx/base/octeontx_pkovf.h @@ -60,4 +60,21 @@ #define PKO_VF_DQ_OP_CLOSE(gdq) (0x001200 | (gdq) << 17) #define PKO_VF_DQ_OP_QUERY(gdq) (0x001300 | (gdq) << 17) +/* pko_send_hdr_s + pko_send_link */ +#define PKO_CMD_SZ (2 << 1) +#define PKO_SEND_GATHER_SUBDC (0x0ull << 60) +#define PKO_SEND_GATHER_LDTYPE(x) ((x) << 58) +#define PKO_SEND_GATHER_GAUAR(x) ((x) << 24) + +typedef struct octeontx_dq_s { + void *lmtline_va; + void *ioreg_va; + void *fc_status_va; +} octeontx_dq_t; + +int octeontx_pko_channel_open(int dq_base, int dq_num, int chanid); +int octeontx_pko_channel_close(int chanid); +int octeontx_pko_channel_start(int chanid); +int octeontx_pko_channel_stop(int chanid); + #endif /* __OCTEONTX_PKO_H__ */