From patchwork Sat May 27 10:25:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shreyansh Jain X-Patchwork-Id: 24765 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 582BF7CE5; Sat, 27 May 2017 12:18:35 +0200 (CEST) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0054.outbound.protection.outlook.com [104.47.37.54]) by dpdk.org (Postfix) with ESMTP id 4234E7CBA for ; Sat, 27 May 2017 12:18:25 +0200 (CEST) Received: from BN6PR03CA0092.namprd03.prod.outlook.com (10.164.122.158) by MWHPR03MB2800.namprd03.prod.outlook.com (10.168.208.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9; Sat, 27 May 2017 10:18:23 +0000 Received: from BL2FFO11FD019.protection.gbl (2a01:111:f400:7c09::103) by BN6PR03CA0092.outlook.office365.com (2603:10b6:405:6f::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9 via Frontend Transport; Sat, 27 May 2017 10:18:22 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11FD019.mail.protection.outlook.com (10.173.161.37) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1075.5 via Frontend Transport; Sat, 27 May 2017 10:18:22 +0000 Received: from Tophie.ap.freescale.net ([10.232.14.39]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id v4RAHYu1029968; Sat, 27 May 2017 03:18:20 -0700 From: Shreyansh Jain To: CC: , Date: Sat, 27 May 2017 15:55:11 +0530 Message-ID: <1495880735-1651-16-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495880735-1651-1-git-send-email-shreyansh.jain@nxp.com> References: <1495880735-1651-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131403539024061222; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39450400003)(39840400002)(39410400002)(39400400002)(39850400002)(39380400002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(9170700003)(47776003)(33646002)(50466002)(2351001)(5003940100001)(2950100002)(86362001)(4326008)(53936002)(48376002)(305945005)(189998001)(85426001)(5660300001)(6666003)(104016004)(498600001)(6916009)(2906002)(50986999)(36756003)(54906002)(76176999)(8936002)(77096006)(8656002)(81166006)(50226002)(38730400002)(68736007)(356003)(105606002)(106466001)(110136004)(8676002); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR03MB2800; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD019; 1:OJQJia8ffo1lniTEkextu4DIMgk5ZbkcPAth6OH1sycVpUdIVpqjDRL2ZaFKu3kBzyLO6BMOKMvAJsY8tLt7usmcgog/Bh0jIV0p8WUF1mmqf1IrziEto1hRF9O8J3rIdBPbzioHzDuNky08tuVUlQtEl7CZl2hHUGzb22haGbe2XVbzlHm4Z2CHks+67e/zc/gJSd49z2wzZ9V9xJcXVD7b+OgJH7NYjpc1Xh7VsgyYlABgzpPa0Vt+8OXE155whxo8/4ZKebJvoNwkRybUo8+ixl9UoXwXwlGgo0+z8msFF3wnBpd2q9zo/i9VUzldQQzGDLc1honu8NCcAwwJdOguDzAW20+pfECccLNh4gthaDGmF2fQ8m8CqSsXx1VWuBA6h9N3wv3MsZKCGP019KcVPHHSDYiuEVsz7WJlAcjzzNKymK2SpPsvNwMlkMuBh+Pt+ppPVp8RflKMnR/V2qpDmGhXxdjvPoxF2Bc9I2z9BoIPhn68qDwY/LEhMrql10YtX53LvIaajVmXEF7S1Ihud9r56MW01hrBwGEuyoWKBOWylT6dKPMhvSIdi+p4EbMreUwtIB1aFxCxAnjLh8MySgLYlUIslI2RlWhZnHjWsAKjZd1hZ3oWsVDPs0u4gDswM54YiAodCKhtyh01XX28A4KKdGYu2wigddR6dMVKOw6/mOss1J6WZJ37FUYs18HAYBChBae39MyZzfAV6A== MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR03MB2800: X-MS-Office365-Filtering-Correlation-Id: 46c5499a-837b-4cf8-c1c6-08d4a4e9b436 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131430075)(201703131517081); SRVR:MWHPR03MB2800; X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2800; 3:+eW7KwW9IbkHxc2EdGg01wd7dM888aLg4c5dMCwkqh8U/+RHzDeWRnRfQgJMXqxAzSgENaxFp1ntUNYxNRj1fls8+HE9aHcUSK8FGEvEcNEndY64GHrHlDLX2UkzeDTdZxf/GBNQQ9F/heFim4wIdwQ/NImZ8HZoYI+S54TUPkcrLcfrSmdUx4SyrFTW+WkOUlVeoXajzFDcx/m98iPuWQzyqeBtV318PKYmOE4kkhC/GYj+o/ONgUnXfMx8UFBxFxm9bOUf0VFMz6MBA3QgT/SnlX874Hwb3H7NUD39+iccZX1H0AcYPE3RvZozluD8ahFTnOIO/xMq23Z92QBQH5o4S9O7Nh19bdJZMoPM7TmtYQlM47cLBJIbuGIBqcd2Qgu2k9ITjWQsFcN4OrBN1OZ7u1r4xf1K+5Ap4DZmwLsnRq9LgZMNzKNkZI9ijxOP; 25:rw9LosoD3o3sb5CsBHXrqRUsa0ag1LApJToaOda7WpThM3SVd5fojek62IpFxdlkRvLaaotjktqkusShZQeFj4gtNeqwajzli0c9bnK8Rn/78ZpoxfdgMiZ1YlwLrnxe451yFGl2CdBMLVE7TEx0dn50qDwVURruqBxSC66nYtqxP9XORegCYYKXgdO5Aow295A2oap6vN2ItdBOIYnE+//LZkCflDKv1TKUgTPUhzWRqufn+Sy0XO7TefMd+U0ClP+TbYssjnA49BbJGDgHdMZDRDh2W9XH2z4DlxI4zqR5FnmnnIJnml30uPNrTYVZBzDh5dBGzuCRxFK0iPdwSDCbEa2G5gIJj5r1xhXW9CjGC7nLzudHPESxheT7OBWZGjq2WrpWiS7jNRCu8POxizmXRHp0Cotd/p7VPCxIrCvUFNEuHhgmaHsrXb5YYpJLmAqhVhDGrHmxink1ebY8/Z3KpOfOztjnLJ1hsybKoHA= X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2800; 31:J7AvTdp5gNlSTT+HgDzqsCyKta7wZ9qC37e9T+jh6PW+Jf62yjVfKyA7k8V5BB4X6freD6lK5SyRioAx6e/c6QO6KitiCxLw5gL333B5D28AfGuGLuHNDhfDdvJNEUEKTbzLCfX6/O6jHeN2Kuy+HjWSR9nmgcVcJmqnwuV4vP+Pq1T8Es14urO4I8OtmNxm0GLUgGGv316YoHKeBHgijxihChDjxP7bnoDsv/tPKKkrMs6BH1qT7m8dn6+bW/8Dd1VrbBmkbbZNQFKK+scohg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(101931422205132)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(601004)(2401047)(8121501046)(5005006)(13018025)(13016025)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(20161123556025)(20161123561025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123565025)(20161123563025)(20161123559100); SRVR:MWHPR03MB2800; BCL:0; PCL:0; RULEID:(400006); SRVR:MWHPR03MB2800; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR03MB2800; 4:Oa91GcRlLA3NN4/+QhTvWW5EzxWv5t9F+ekxFis2u2?= iN3kqSgJ5QJZoqIzzNhr6MbsBgaEAeYMh2R7TXiKx9jqc2jnCR+6iwLY30UkIQWUl6ASbfDa1ttYVUEbW3/OVD4YuXPPVdHUJHUVkAHiuwDAwQKyFBjpYET7yJsZ/vYTgvtPNwfwjUEVnJH2g3IJ1RvsXicYCgEu/95f5xiSMniXKp8K48G4sb5Bwp+VCJZ5yz6BTPHZ01Bd346TKHqMHCgjAv4bsogGFr0Q6B60DTbz34a+JZouLJL0F+duSX5LwPDsf9RbHfQ7fP9Y6V+ygzHdNoMw8rbvJ0ML+oTGNiBd6R1Cwyk4KOEHwhNds2G04cxwGHE2YkdqEgo+3xr/L+Te8Drzev/ez7rC6rDDW7f10deHGXxtT9nNA4v3tjBOC7xa1qHjzg++YDjK64Q9n/YDYIhk9Op/qCQ0EPtrW9/kzCC4SWJiswL18FkjNs88F3L6eQVYG7mk/0z1lmmysP7onRROnDov2N20RBq1n3Qei5d2x/eeFm4qRlQn37EE+HUpwqky/p42NtDkHnasbYYmX+BEGR8hMMSu8bCoCj+sIpLO/nTAIAQhbK8PAj4Rhi/z/hiGqe+60naMyc648tht8sGni1PBXEjTXiy8h2stwqf+4RLTXcLlz6NJaHjBPqggr2Eb7WP8ujBj+FwulfULFXAP49YPlAZ97pEWO7d0TSxeN0Lv2E2CUvDFCtv9hsJoM4+M0qWvwEq/fHsldH/u7Rmix10YYbvVKZQn+UgPzEFOiQliH7IWHMdJ03IdsiAlKINfiUCSvM4MW0RcGiHnBtm7nDMFanvun28mZgIBPIA2ry4UQGrq6kTkUv1n989b/jNuIdRLYraRZMGlavjJLAOntq9LbC08RDC3t4yFZLwe9xa2BAGOXpFLigtptDssRTt0TwGZejkB+dvnivxzy30Ao7LGHleVafpdAzqA== X-Forefront-PRVS: 0320B28BE1 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR03MB2800; 23:rGCxkwXAVadXx2MzVHlyec/FOVTI8W1ucjcRFJOoS?= r7ZQfLK23t+KoBVblZflnEpqTlmuoFqP6ftt3ayOzTRHSXjVzzqjyTZKB9bxiqz0ItWr2Vm1uN7LChuCxh37pkeGbLql72/JsjksG4P5SKdHPdDT1jjDtokbwEjPFuGaU+hOz5MI0AfgIYMSl1kOl7Ld49HZXWQmcAX62e64LXlaEui7yNEEk8S5SqTyiHTOeCa0IBqyathQ8WbXXMWH1ztCiDGD5uTRgc+6BTdiqLclsoBrvJXpRKmEtJTtqqtX5RueobqZg+r/i9m/d4HE/n4eQj8k0R5OAndH/ZyjhHaT2eX9YZrq54FyQCY1hJFnhnZdaWbLpwztaAzpHm/nvTHPLximREnIoH1xT1Jy0tGexRCeBUCCgdhmBFLM0tbk0zpM1pVxAQO2rD8PoFfcMFA86m6dOFoOwTH3hw8WL2HpD1knDm9zh/lYkr7+d7CqfIZWG8d6fxMvd5UiVQ300xmMzNPcNFooK/o5qunhNUmQ0mHuGkMUasHMdR66vb04PFNAUefHwPMC+cjfO+HzFd/y4K4Vu11mH32SWUWbo9jvjblkETlBNtXhSOKTZ2VjkHZvq28TguIRA39V8mjKXqu3lD85S10S+fMYSfgMDR8fMvFJV/mLKVMtFGH2wqIFzW36JoVEsOE7mMPQH/kDXCSGB7N03ggPzijC6JyUU2fHzDUW+n7oi9AwdqPAZEq+GHCzIdG+Y2MYdrvvKykhP3vZrfR+8G3IooCrtZHOyRkcdgNz8IVRGvRYjid6Wjk9vc9x9iGcr3xQ7YtVVRY76B2swIyUXr/n1Pak6NCN6GY2Y3dYTaXx3rySJIehb0n+9SCH+lbaORoR+F0yW30hWItX/FrQ3laTKmmWcG49bb6HqVpKtCxV1QCkcUj3l7IT39lREJMSC/xrJBFA099rSCYPB90Tdzgyw9aE/QcvH0z0GNxdvQT1rth7lDms1qnFuKwEIwIMpQUCF7dYH7sRBfkIiZ2EvAPXBwfFwGHZaiq9b1nrucmPLbDjfebbY7gyHKnfyuAzNCMzguw6Ox+1E0po08x8+aTdEtFPvKJKshaLn0IDSGqvsroUWxsX5rO9EMe3G8W9zW0LURenF6TI/uO/tnf32E7jIm+vgArAFrFW2FobAso461hOzBV3qVz13HuSaRP2bilY30c1s5c1MLx5ao2WWX1eEkNgfrFCeyhj5Id9B0kJORhb7Ep2AYNw09wCJe5ToeOo69wsIMRm8q5 X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2800; 6:1S3RltclweHBi911EaUTtrb/qgTE0uvUq9cI4B8mzaME7sbjW4Gjsbq5JFd6TJLugQZXirdS8DRtXroOU9jJSOFoN/WdSEagMbKzZHQYTKkZA7JEyOfEvuekOaNmB9Q0mF1oG5+8gvubOvkfx420nAuZE4seavuhsT/trUVjEXl3offwhCzMyxc/cIypJcHeVnKynGaY5bQhAe3guvEN+KOmcD++O87Jh1ihEEBCbF90tcm7TBM4puDFAKos2bmY1SZNb49mGmIrkPYvFtaUA/I/F9+A15Y+lwAczHtkemedzd3VgxzYm04iyiLsOc6CM5hWYHuLrTr4IgcjasoyKoKToBUjsa39eRMcm/XRxTUaLE/4IvvMQuuQN7TnrJTkd/aEhAZMJIa5o9UX46QzgseyuP4Wq0tildRINUdec0XWXx1PQQqzsLS0o+OiRGFv03rZ9HYGnIG+8+Ew/s2StdhT4E8Q28iJIhpV3Ek9v/hOplrO5trEpTrsHLHnQwHIdy0X+sa3PSYr+pxpiuBTWg==; 5:7MzgUM0YEAg/PFzRAWsDxK7KGJ7jV7jrgszGzWiPk7dHju5939hxTmya1rC0o5QqDV8hLuuTf681kGzFJpBZcq3uFEkq7F5oeeU3IcHmjedVvKoBcggnw1ccHx77qRytV5xaaj78BO5HFrdSYVXnIF/eo6BqXyVbKVnAAB2Sc0IxgFOkPI8XGlIdB2aTCqRu; 24:MJ/Lk5T0NiOEQCTBjIiOVv0VEwqeHtLdtxbkw0yKg63R9QcIeo3RAMrplDCOqbPdeo8Cl3438ecqQRr+ZdGQUb+BXyNNLcpQG9eBBBZgsT0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2800; 7:JgdFXSE4KLWA9FgDfDTyEX1ZvWRkYkfbIPR7bILxOPiC5Lq/7uLf9O+Q1C1BfnJFBCR1rJhYmSEDaHo/m1J7Vl8XaiMg/o4rlMVbwvWsLRxwEyALOVpThELR3tfgzlqmdDatiOFDusBEp+dql0XsspE06tPKFSm9tX9opQYvGpDNbvqTvxV+zbAaDHr238CP2B83p2Mstvsq5aMlO8EYHrDah7eQ8QsfOicgMxoplm2lHeF9TiYYgMpHQ7BFQZvWGSYmdsFRPVjFIUyOvDtvZSIKG2dMvpSeT9dZPMamQQByHAYy7HcoYw3/oiig6hZ1Ike9AeCplujAj7vcXnoq+A== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2017 10:18:22.1565 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB2800 Subject: [dpdk-dev] [RFC Patch 15/39] bus/dpaa: add support for FMAN frame queue lookup 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" Signed-off-by: Geoff Thorpe Signed-off-by: Roy Pledge Signed-off-by: Hemant Agrawal Signed-off-by: Shreyansh Jain --- drivers/bus/dpaa/base/qbman/qman.c | 99 ++++++++++++++++++++++++++++++- drivers/bus/dpaa/base/qbman/qman_driver.c | 7 ++- drivers/bus/dpaa/base/qbman/qman_priv.h | 11 ++++ drivers/bus/dpaa/include/fsl_qman.h | 12 ++++ 4 files changed, 126 insertions(+), 3 deletions(-) diff --git a/drivers/bus/dpaa/base/qbman/qman.c b/drivers/bus/dpaa/base/qbman/qman.c index 8da7acb..2a1882a 100644 --- a/drivers/bus/dpaa/base/qbman/qman.c +++ b/drivers/bus/dpaa/base/qbman/qman.c @@ -176,6 +176,65 @@ static inline struct qman_fq *table_find_fq(struct qman_portal *p, u32 fqid) return fqtree_find(&p->retire_table, fqid); } +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP +static void **qman_fq_lookup_table; +static size_t qman_fq_lookup_table_size; + +int qman_setup_fq_lookup_table(size_t num_entries) +{ + num_entries++; + /* Allocate 1 more entry since the first entry is not used */ + qman_fq_lookup_table = vmalloc((num_entries * sizeof(void *))); + if (!qman_fq_lookup_table) { + pr_err("QMan: Could not allocate fq lookup table\n"); + return -ENOMEM; + } + memset(qman_fq_lookup_table, 0, num_entries * sizeof(void *)); + qman_fq_lookup_table_size = num_entries; + pr_info("QMan: Allocated lookup table at %p, entry count %lu\n", + qman_fq_lookup_table, + (unsigned long)qman_fq_lookup_table_size); + return 0; +} + +/* global structure that maintains fq object mapping */ +static DEFINE_SPINLOCK(fq_hash_table_lock); + +static int find_empty_fq_table_entry(u32 *entry, struct qman_fq *fq) +{ + u32 i; + + spin_lock(&fq_hash_table_lock); + /* Can't use index zero because this has special meaning + * in context_b field. + */ + for (i = 1; i < qman_fq_lookup_table_size; i++) { + if (qman_fq_lookup_table[i] == NULL) { + *entry = i; + qman_fq_lookup_table[i] = fq; + spin_unlock(&fq_hash_table_lock); + return 0; + } + } + spin_unlock(&fq_hash_table_lock); + return -ENOMEM; +} + +static void clear_fq_table_entry(u32 entry) +{ + spin_lock(&fq_hash_table_lock); + BUG_ON(entry >= qman_fq_lookup_table_size); + qman_fq_lookup_table[entry] = NULL; + spin_unlock(&fq_hash_table_lock); +} + +static inline struct qman_fq *get_fq_table_entry(u32 entry) +{ + BUG_ON(entry >= qman_fq_lookup_table_size); + return qman_fq_lookup_table[entry]; +} +#endif + static inline void cpu_to_hw_fqd(struct qm_fqd *fqd) { /* Byteswap the FQD to HW format */ @@ -766,8 +825,13 @@ static u32 __poll_portal_slow(struct qman_portal *p, u32 is) break; case QM_MR_VERB_FQPN: /* Parked */ +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + fq = get_fq_table_entry( + be32_to_cpu(msg->fq.contextB)); +#else fq = (void *)(uintptr_t) be32_to_cpu(msg->fq.contextB); +#endif fq_state_change(p, fq, msg, verb); if (fq->cb.fqs) fq->cb.fqs(p, fq, &swapped_msg); @@ -792,7 +856,11 @@ static u32 __poll_portal_slow(struct qman_portal *p, u32 is) } } else { /* Its a software ERN */ +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + fq = get_fq_table_entry(be32_to_cpu(msg->ern.tag)); +#else fq = (void *)(uintptr_t)be32_to_cpu(msg->ern.tag); +#endif fq->cb.ern(p, fq, &swapped_msg); } num++; @@ -907,7 +975,11 @@ static inline unsigned int __poll_portal_fast(struct qman_portal *p, clear_vdqcr(p, fq); } else { /* SDQCR: context_b points to the FQ */ +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + fq = get_fq_table_entry(dq->contextB); +#else fq = (void *)(uintptr_t)dq->contextB; +#endif /* Now let the callback do its stuff */ res = fq->cb.dqrr(p, fq, dq); /* @@ -1119,7 +1191,12 @@ int qman_create_fq(u32 fqid, u32 flags, struct qman_fq *fq) fq->flags = flags; fq->state = qman_fq_state_oos; fq->cgr_groupid = 0; - +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + if (unlikely(find_empty_fq_table_entry(&fq->key, fq))) { + pr_info("Find empty table entry failed\n"); + return -ENOMEM; + } +#endif if (!(flags & QMAN_FQ_FLAG_AS_IS) || (flags & QMAN_FQ_FLAG_NO_MODIFY)) return 0; /* Everything else is AS_IS support */ @@ -1193,7 +1270,9 @@ void qman_destroy_fq(struct qman_fq *fq, u32 flags __maybe_unused) case qman_fq_state_oos: if (fq_isset(fq, QMAN_FQ_FLAG_DYNAMIC_FQID)) qman_release_fqid(fq->fqid); - +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + clear_fq_table_entry(fq->key); +#endif return; default: break; @@ -1258,7 +1337,11 @@ int qman_init_fq(struct qman_fq *fq, u32 flags, struct qm_mcc_initfq *opts) dma_addr_t phys_fq; mcc->initfq.we_mask |= QM_INITFQ_WE_CONTEXTB; +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + mcc->initfq.fqd.context_b = fq->key; +#else mcc->initfq.fqd.context_b = (u32)(uintptr_t)fq; +#endif /* * and the physical address - NB, if the user wasn't trying to * set CONTEXTA, clear the stashing settings. @@ -1419,7 +1502,11 @@ int qman_retire_fq(struct qman_fq *fq, u32 *flags) msg.verb = QM_MR_VERB_FQRNI; msg.fq.fqs = mcr->alterfq.fqs; msg.fq.fqid = fq->fqid; +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + msg.fq.contextB = fq->key; +#else msg.fq.contextB = (u32)(uintptr_t)fq; +#endif fq->cb.fqs(p, fq, &msg); } } else if (res == QM_MCR_RESULT_PENDING) { @@ -1861,7 +1948,11 @@ static inline struct qm_eqcr_entry *try_p_eq_start(struct qman_portal *p, QM_EQCR_DCA_PARK : 0) | ((flags >> 8) & QM_EQCR_DCA_IDXMASK); eq->fqid = cpu_to_be32(fq->fqid); +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + eq->tag = cpu_to_be32(fq->key); +#else eq->tag = cpu_to_be32((u32)(uintptr_t)fq); +#endif eq->fd = *fd; cpu_to_hw_fd(&eq->fd); return eq; @@ -1907,7 +1998,11 @@ int qman_enqueue_multi(struct qman_fq *fq, /* try to send as many frames as possible */ while (eqcr->available && frames_to_send--) { eq->fqid = cpu_to_be32(fq->fqid); +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + eq->tag = cpu_to_be32(fq->key); +#else eq->tag = cpu_to_be32((u32)(uintptr_t)fq); +#endif eq->fd.opaque_addr = fd->opaque_addr; eq->fd.addr = cpu_to_be40(fd->addr); eq->fd.status = cpu_to_be32(fd->status); diff --git a/drivers/bus/dpaa/base/qbman/qman_driver.c b/drivers/bus/dpaa/base/qbman/qman_driver.c index a7faf17..5c535dd 100644 --- a/drivers/bus/dpaa/base/qbman/qman_driver.c +++ b/drivers/bus/dpaa/base/qbman/qman_driver.c @@ -279,5 +279,10 @@ int qman_global_init(void) else qman_clk = be32_to_cpu(*clk); - return ret; +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + ret = qman_setup_fq_lookup_table(CONFIG_FSL_QMAN_FQ_LOOKUP_MAX); + if (ret) + return ret; +#endif + return 0; } diff --git a/drivers/bus/dpaa/base/qbman/qman_priv.h b/drivers/bus/dpaa/base/qbman/qman_priv.h index 4ae2ea5..e9826c2 100644 --- a/drivers/bus/dpaa/base/qbman/qman_priv.h +++ b/drivers/bus/dpaa/base/qbman/qman_priv.h @@ -44,6 +44,10 @@ #include "dpaa_sys.h" #include +#if !defined(CONFIG_FSL_QMAN_FQ_LOOKUP) && defined(RTE_ARCH_ARM64) +#error "_ARM64 requires _FSL_QMAN_FQ_LOOKUP" +#endif + /* Congestion Groups */ /* * This wrapper represents a bit-array for the state of the 256 QMan congestion @@ -197,6 +201,13 @@ void qm_set_liodns(struct qm_portal_config *pcfg); int qman_testwrite_cgr(struct qman_cgr *cgr, u64 i_bcnt, struct qm_mcr_cgrtestwrite *result); +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP +/* If the fq object pointer is greater than the size of context_b field, + * than a lookup table is required. + */ +int qman_setup_fq_lookup_table(size_t num_entries); +#endif + /* QMan s/w corenet portal, low-level i/face */ /* diff --git a/drivers/bus/dpaa/include/fsl_qman.h b/drivers/bus/dpaa/include/fsl_qman.h index 7d9ad00..1867a66 100644 --- a/drivers/bus/dpaa/include/fsl_qman.h +++ b/drivers/bus/dpaa/include/fsl_qman.h @@ -46,6 +46,15 @@ extern "C" { #include +/* FQ lookups (turn this on for 64bit user-space) */ +#if (__WORDSIZE == 64) +#define CONFIG_FSL_QMAN_FQ_LOOKUP +/* if FQ lookups are supported, this controls the number of initialised, + * s/w-consumed FQs that can be supported at any one time. + */ +#define CONFIG_FSL_QMAN_FQ_LOOKUP_MAX (32 * 1024) +#endif + /* Last updated for v00.800 of the BG */ /* Hardware constants */ @@ -1245,6 +1254,9 @@ struct qman_fq { enum qman_fq_state state; int cgr_groupid; struct rb_node node; +#ifdef CONFIG_FSL_QMAN_FQ_LOOKUP + u32 key; +#endif }; /*