From patchwork Sun Mar 29 16:16:33 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vlad Zolotarov X-Patchwork-Id: 455818 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from whitealder.osuosl.org (whitealder.osuosl.org [140.211.166.138]) by ozlabs.org (Postfix) with ESMTP id 748A31400A0 for ; Mon, 30 Mar 2015 03:16:55 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id C47DA9160A for ; Sun, 29 Mar 2015 16:16:54 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ti-YHApdoEnF for ; Sun, 29 Mar 2015 16:16:52 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id D413C915D2 for ; Sun, 29 Mar 2015 16:16:52 +0000 (UTC) X-Original-To: intel-wired-lan@lists.osuosl.org Delivered-To: intel-wired-lan@lists.osuosl.org Received: from silver.osuosl.org (silver.osuosl.org [140.211.166.136]) by ash.osuosl.org (Postfix) with ESMTP id 6FBB91C2982 for ; Sun, 29 Mar 2015 16:16:51 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 1292E3210C for ; Sun, 29 Mar 2015 16:16:51 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nqS8Zhrv3cBc for ; Sun, 29 Mar 2015 16:16:48 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by silver.osuosl.org (Postfix) with ESMTPS id 068FB2013C for ; Sun, 29 Mar 2015 16:16:47 +0000 (UTC) Received: by wiaa2 with SMTP id a2so94330337wia.0 for ; Sun, 29 Mar 2015 09:16:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=c3iN62/RAE3Arb9mGJkiG4ZPulZ9n+bZZPX8Ompd9LQ=; b=XUUED8EpFcS4qYdWrkulpH2JTpHN/HkrLLWMWhBBX3ATy33qlLPyQCiPFeIwNoTbeg qJmlW3lrFIRA20gcyOx211dXVdlKfVfLjvcj8RqFm9DJqSVe4rPkR7fwwjA+q9bR8Vbd Ox61iDGehWYMHI4UQa+fhETeol0ec92+8Xd7BpbnBxFEDD3rCvC9R26pHD4qnoxDMaFU /KgulKsxVGfZEXDtYbxOXPKGyGMQbGSZAr9bg+VnWhRoaFvDFCfNyf4UH7J2WdZdO3DP ktnUtsxe7RbNdLqGUAOSc/d3RsGHc0bfHDiyN0MtXyrd0gGd5XAAs+vidgf/ksFoYj+b p/CQ== X-Gm-Message-State: ALoCoQmLxdqDB6424CYadwcak8u3O4pqBfcYBc5ElWY9W2xob8FbcUSneLfVKCh4G9WJjFkYtMzy X-Received: by 10.194.89.195 with SMTP id bq3mr55679114wjb.123.1427645806448; Sun, 29 Mar 2015 09:16:46 -0700 (PDT) Received: from vladz-laptop.cloudius-systems.com. ([212.143.139.214]) by mx.google.com with ESMTPSA id gy9sm2471285wib.12.2015.03.29.09.16.44 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 29 Mar 2015 09:16:45 -0700 (PDT) From: Vlad Zolotarov To: intel-wired-lan@lists.osuosl.org Date: Sun, 29 Mar 2015 19:16:33 +0300 Message-Id: <1427645797-10832-4-git-send-email-vladz@cloudius-systems.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1427645797-10832-1-git-send-email-vladz@cloudius-systems.com> References: <1427645797-10832-1-git-send-email-vladz@cloudius-systems.com> Subject: [Intel-wired-lan] [PATCH net-next v9 3/7] ixgbe: Add a RETA query command to VF-PF channel API X-BeenThere: intel-wired-lan@lists.osuosl.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Intel Wired Ethernet Linux Kernel Driver Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-wired-lan-bounces@lists.osuosl.org Sender: "Intel-wired-lan" Add this new command for 82599 and x540 devices only. Support for other devices will be added later. 82599 and x540 VFs and PF share the same RSS redirection table (RETA). Therefore we just return it for all VFs. For 82599 and x540 RETA table is an array of 32 registers (128 bytes) and the maximum number of registers that may be delivered in a single VF-PF channel command is 15. Therefore we will deliver the whole table in 3 steps: 12, 12 and 8 registers in each step correspondingly. Thus this patch does the following: - Adds a new API version (to specify a new commands set). - Adds the IXGBE_VF_GET_RETA command to the VF-PF commands set. Signed-off-by: Vlad Zolotarov --- New in v9: - Reduce the support to 82599 and x540 devices only. - Improvements in query RETA VF-PF command implementation: - Use the cached RETA contents. - Compress the mailbox message. New in v5: - Use the newly added netdev op to allow/prevent the RETA query on a per-VF basis. New in v4: - Deleted an empty line in ixgbe_get_vf_reta() switch-case. New in v3: - Pass the number of dwords and offset in RETA in the IXGBE_VF_GET_RETA request message. This allows to reduce the added command set to a single command. - Added a support for all devices supported by the ixgbe driver that have SR-IOV functions support: 82599, x540 and x550. The original code supported only 82599 and x540. - Added the masking of the RETA entries according to the PSRTYPE[n].RQPL value. New in v1 (compared to RFC): - Use "if-else" statement instead of a "switch-case" for a single option case (in ixgbe_get_vf_reta()). --- drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 4 +++ drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 49 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h index a5cb755..3522f53 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h @@ -73,6 +73,7 @@ enum ixgbe_pfvf_api_rev { ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */ ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */ ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */ + ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */ /* This value should always be last */ ixgbe_mbox_api_unknown, /* indicates that API version is not known */ }; @@ -97,6 +98,9 @@ enum ixgbe_pfvf_api_rev { #define IXGBE_VF_TRANS_VLAN 3 /* Indication of port vlan */ #define IXGBE_VF_DEF_QUEUE 4 /* Default queue offset */ +/* mailbox API, version 1.2 VF requests */ +#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */ + /* length of permanent address message returned from PF */ #define IXGBE_VF_PERMADDR_MSG_LEN 4 /* word in permanent address message with the current multicast type */ diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index f08672a..8424e7f 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -433,6 +433,7 @@ static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) #endif /* CONFIG_FCOE */ switch (adapter->vfinfo[vf].vf_api) { case ixgbe_mbox_api_11: + case ixgbe_mbox_api_12: /* * Version 1.1 supports jumbo frames on VFs if PF has * jumbo frames enabled which means legacy VFs are @@ -900,6 +901,7 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter, switch (api) { case ixgbe_mbox_api_10: case ixgbe_mbox_api_11: + case ixgbe_mbox_api_12: adapter->vfinfo[vf].vf_api = api; return 0; default: @@ -923,6 +925,7 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter, switch (adapter->vfinfo[vf].vf_api) { case ixgbe_mbox_api_20: case ixgbe_mbox_api_11: + case ixgbe_mbox_api_12: break; default: return -1; @@ -950,6 +953,49 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter, return 0; } +static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) +{ + struct ixgbe_hw *hw = &adapter->hw; + u32 i, j; + u32 *out_buf = &msgbuf[1]; + const u8 *reta = adapter->rss_indir_tbl; + u8 mask = 0; + u32 psrtype; + u32 reta_size = ixgbe_rss_indir_tbl_entries(adapter); + + /* verify the PF is supporting the correct API */ + if (!adapter->vfinfo[vf].rss_query_enabled || + (adapter->vfinfo[vf].vf_api != ixgbe_mbox_api_12)) + return -EPERM; + + psrtype = IXGBE_READ_REG(hw, IXGBE_PSRTYPE(vf)); + + /* The redirection table is composed as follows: + * 82598: 128 (8 bit wide) entries containing pair of 4 bit RSS indices + * 82599/X540: 128 (8 bit wide) entries containing 4 bit RSS index + * + * PSRTYPE[n].RQPL defines if 0, 1 or 2 bits from the redirection table + * value should be used. + */ + + if ((psrtype & (1 << 29)) == (1 << 29)) + mask = 0x01; + else if ((psrtype & (2 << 29)) == (2 << 29)) + mask = 0x03; + + /* Compress the RETA by saving only 2 bits from each entry. This way + * we will be able to transfer the whole RETA in a single mailbox + * operation. + */ + for (i = 0; i < reta_size / 16; i++) { + out_buf[i] = 0; + for (j = 0; j < 16; j++) + out_buf[i] |= (u32)(reta[16 * i + j] & mask) << (2 * j); + } + + return 0; +} + static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf) { u32 mbx_size = IXGBE_VFMAILBOX_SIZE; @@ -1006,6 +1052,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf) case IXGBE_VF_GET_QUEUES: retval = ixgbe_get_vf_queues(adapter, msgbuf, vf); break; + case IXGBE_VF_GET_RETA: + retval = ixgbe_get_vf_reta(adapter, msgbuf, vf); + break; default: e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]); retval = IXGBE_ERR_MBX;