From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f178.google.com (mail-wi0-f178.google.com [209.85.212.178]) by dpdk.org (Postfix) with ESMTP id 05DDFA6A for ; Mon, 23 Mar 2015 12:53:14 +0100 (CET) Received: by wibgn9 with SMTP id gn9so59892626wib.1 for ; Mon, 23 Mar 2015 04:53:12 -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:organization :user-agent:in-reply-to:references:mime-version :content-transfer-encoding:content-type; bh=qoQGt2C693EUEeXCOk0RiqvE/HE63UhdqByETrR5row=; b=CBR6PHREQsKKdkuTS90o6XptxJ5yHQsK1QuY0ZTmFFVSPxPlJN4kVF6/z2we4zKNCq dawmqUEolalIui/ujSWUJZyTQn/qyg5LTjURjWVx7i5CJTp9cmjZzbcel28SCyNAIUbV THmEa2JP6pyapbPBn+IOVFIkdh2PLMEKvH7Q7RMcN8EPOrQ5wkNerc3imo5sUKY4ZIYP 7DEBDT0AuZtkh//EUTHVrGF6XRblV3PXGsXGH6V3EqwWwNpBkK+2QJ9sdWw4fjvzINYl U0RmZSTUHPxI8AaXEI+Qg/+z5TbQxM9xInOsvM/3DBdnLTWwWN2+FKefyZOP6Z89jXyr Qrhg== X-Gm-Message-State: ALoCoQkaYIgkHmE66+hrDMzwmz6LTBzG8ZvrFbv9i6alC7qOcYgVgbPVQMzZJxeBgimNVC+pLQAG X-Received: by 10.180.106.70 with SMTP id gs6mr18217928wib.48.1427111592905; Mon, 23 Mar 2015 04:53:12 -0700 (PDT) Received: from xps13.localnet (136-92-190-109.dsl.ovh.fr. [109.190.92.136]) by mx.google.com with ESMTPSA id k1sm1062200wjn.9.2015.03.23.04.53.11 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 23 Mar 2015 04:53:12 -0700 (PDT) From: Thomas Monjalon To: zhida zang Date: Mon, 23 Mar 2015 12:52:31 +0100 Message-ID: <3200414.B2YSnFKgSE@xps13> Organization: 6WIND User-Agent: KMail/4.14.4 (Linux/3.18.4-1-ARCH; KDE/4.14.4; x86_64; ; ) In-Reply-To: <1422593822-15531-1-git-send-email-zhida.zang@intel.com> References: <1422593822-15531-1-git-send-email-zhida.zang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Cc: dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH] scripts: enable extended tag of PCIe X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Mar 2015 11:53:14 -0000 Hi, This patch needs review and documentation. It's going to be dropped if nobody cares. There were some previous discussions about it: http://dpdk.org/ml/archives/dev/2015-February/012708.html 2015-01-30 12:57, zhida zang: > As 'extended tag' of PCIe needs to be enabled for i40e high performance, > Linux command of 'setpci' can be used to check and set the corresponding > bit of 'extended tag' of PCIe configuration space. The script is to check > and set the right bit in PCIe configuration space to enable 'extended tag'. > > Signed-off-by: Zhida Zang > --- > tools/set_pci.py | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 124 insertions(+) > create mode 100755 tools/set_pci.py > > diff --git a/tools/set_pci.py b/tools/set_pci.py > new file mode 100755 > index 0000000..e242efb > --- /dev/null > +++ b/tools/set_pci.py > @@ -0,0 +1,124 @@ > +#! /usr/bin/python > +import sys > +import os > +import subprocess > +import getopt > +from os.path import basename > + > +# The register to check if extended tag is supported or not. > +PCI_DEV_CAP_REG = 0xA4 > +# The control register which contains the bit to enable/disable 'extended tag'. > +PCI_DEV_CTRL_REG = 0xA8 > +# The mask of 'extended tag' in capability register. > +PCI_DEV_CAP_EXT_TAG_MASK = 0x20 > +# The mask of 'extended tag' in control register. > +PCI_DEV_CTRL_EXT_TAG_MASK = 0x100 > + > +dev_ids = {} > +flag = "Set" > + > + > +def usage(): > + '''Print usage information for the program''' > + argv0 = basename(sys.argv[0]) > + print """ > +Usage: > +------ > + > + %(argv0)s [options] DEVICE1 DEVICE2 .... > + > +where DEVICE1, DEVICE2 etc, are specified via PCI "domain:bus:slot.func" syntax > +or "bus:slot.func" syntax. For devices bound to Linux kernel drivers, they may > +also be referred to by Linux interface name e.g. eth0, eth1, em0, em1, etc. > + > +Options: > + --help, --usage: > + Display usage information and quit > + > + -s --set: > + Set the following pci device > + > + -u --Unset: > + Unset the following pci device > + > +Examples: > +--------- > +To set pci 0a:00.0 > + %(argv0)s -s 0a:00.0 > + %(argv0)s --set 0a:00.0 > + > +To unset 0000:01:00.0 > + %(argv0)s -u 0000:01:00.0 > + %(argv0)s --unset 0000:01:00.0 > + > +To set 0000:02:00.0 and 0000:02:00.1 > + %(argv0)s -s 02:00.0 02:00.1 > + > + """ % locals() # replace items from local variables > + > + > +def parse_args(): > + global flag > + global dev_ids > + if len(sys.argv) <= 1: > + usage() > + sys.exit(0) > + try: > + opts, dev_ids = getopt.getopt( > + sys.argv[1:], > + "su", > + ["help", "usage", "set", "unset"] > + ) > + except getopt.GetoptError, error: > + print str(error) > + print "Run '%s --usage' for further information" % sys.argv[0] > + sys.exit(1) > + > + for opt, arg in opts: > + if opt == "--help" or opt == "--usage": > + usage() > + sys.exit(0) > + if opt == "-s" or opt == "--set": > + flag = "Set" > + if opt == "-u" or opt == "--unset": > + flag = "Unset" > + > + > +def check_output(args, stderr=None): > + '''Run a command and capture its output''' > + return subprocess.Popen( > + args, > + stdout=subprocess.PIPE, > + stderr=stderr > + ).communicate()[0] > + > + > +def set_pci(): > + if len(dev_ids) == 0: > + print "Error: No devices specified." > + print "Run '%s --usage' for further information" % sys.argv[0] > + sys.exit(1) > + param_cap = "%x.W" % PCI_DEV_CAP_REG > + for k in range(len(dev_ids)): > + val = check_output(["setpci", "-s", dev_ids[k], param_cap]) > + if (not (int(val, 16) & PCI_DEV_CAP_EXT_TAG_MASK)): > + print dev_ids[k], "Not supported" > + continue > + if (int(val, 16) & PCI_DEV_CTRL_EXT_TAG_MASK): > + continue > + param_ctrl = "%x.W" % PCI_DEV_CTRL_REG > + val = check_output(["setpci", "-s", dev_ids[k], param_ctrl]) > + if flag == "Set": > + val = int(val, 16) | PCI_DEV_CTRL_EXT_TAG_MASK > + else: > + val = int(val, 16) & ~PCI_DEV_CTRL_EXT_TAG_MASK > + param_ctrl = "%x.W=%x" % (PCI_DEV_CTRL_REG, val) > + check_output(["setpci", "-s", dev_ids[k], param_ctrl]) > + > + > +def main(): > + parse_args() > + set_pci() > + > +if __name__ == "__main__": > + main() >