Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp2165784pxk; Sat, 26 Sep 2020 20:31:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxax+H5PQQFzppemkM9bmZXmPa53bfniHH23aI21yOopMgvN7qD5ubBxbAYZG6R2Yg4K1d1 X-Received: by 2002:a05:6402:228c:: with SMTP id cw12mr9543881edb.174.1601177481719; Sat, 26 Sep 2020 20:31:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601177481; cv=none; d=google.com; s=arc-20160816; b=HqgLab+UTwQLfjmY/pKvo5wt3vKJWeXIungj+JqJ22H/3HvBsEu7Qvx4/3nlcHCrOc 9ngnId3pw02qMvWlCMQ87krh2Kdu/T/Ofp5a6uP6wpXU1StbSji8uphkSxsNpt4Y8QlN cObzUgRgCsKio1whekK3mGlHtud8j9YZVdAoOPKsBvUJpuT/6RqkZrhPyG3FOOVHQtbC 9rj83wGl4uYK6aJ69AW5fOrqCh87TDC5jURqACuMD5d1D/PkKh0EizLAHWRJ7ixGGbCb 737Z19aM/Ffr2JqrKJkmWz3o8tiKSB9cx0NVR+D23mNb2t9jGQDbARpzCM9kUEWalsZg 4Khg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=EndSHMIvhwCMNJ8z0c1qsWOqbA7RX3EUXxuLgnMyRTA=; b=roFjDEf3j4U0n9J5diF6BeA9163L5rh6JNDJSYaPDn9K7Q1z2F3ev9380AcE5Tjt/q TQEVcx3leY8s35KeUbjOoB+pL8ZVgPQtsM2NI8oCihLz7HpxUqq67Y0wSJPRjX3ic9al t8Kgh4BoARUEp3ly/EnJn4hksbOb5NL4rMVYU5rfwBWM8mbyWw/Y32vpjMnj4yKKFQg+ r8yDo++9k4W+RjGaLfI9woh2sWKGnyel8pj/Fg9R3DnLmBOVbzIW7a6cfh5qTIdugFVq /MOhUD4SC0+DNBNXx6+xU/W0tdkmqLmRPkIiykX1VeO2IcqStV794sFcrRxBCFj6HpU9 U2/A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c5si5134293edv.513.2020.09.26.20.30.57; Sat, 26 Sep 2020 20:31:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730242AbgI0DaE (ORCPT + 99 others); Sat, 26 Sep 2020 23:30:04 -0400 Received: from mga12.intel.com ([192.55.52.136]:65381 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726478AbgI0DaD (ORCPT ); Sat, 26 Sep 2020 23:30:03 -0400 IronPort-SDR: otU/DOko7/UUM1bF24BLFiBdDSrvH0sjVWhbaFUUv5Hez4vIl/cLSfriPKut72UYDAwJCX/McF cA1vcIvysgYQ== X-IronPort-AV: E=McAfee;i="6000,8403,9756"; a="141242659" X-IronPort-AV: E=Sophos;i="5.77,308,1596524400"; d="scan'208";a="141242659" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Sep 2020 20:30:03 -0700 IronPort-SDR: ESeO+6bAJMd0p7YOx10yvqkJqq8JQmTsah36nE2wb8DBROGCUbPwkI3/Hz5UrqveafuUCktXL5 YsXqC+D94XsQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,308,1596524400"; d="scan'208";a="337697494" Received: from shskylake.sh.intel.com ([10.239.48.137]) by fmsmga004.fm.intel.com with ESMTP; 26 Sep 2020 20:30:00 -0700 From: Ethan Zhao To: bhelgaas@google.com, oohall@gmail.com, ruscur@russell.cc, lukas@wunner.de, andriy.shevchenko@linux.intel.com, stuart.w.hayes@gmail.com, mr.nuke.me@gmail.com, mika.westerberg@linux.intel.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, pei.p.jia@intel.com, ashok.raj@linux.intel.com, sathyanarayanan.kuppuswamy@intel.com, Ethan Zhao Subject: [PATCH 1/5 V2] PCI: define a function to check and wait till port finish DPC handling Date: Sat, 26 Sep 2020 23:28:25 -0400 Message-Id: <20200927032829.11321-2-haifeng.zhao@intel.com> X-Mailer: git-send-email 2.18.4 In-Reply-To: <20200927032829.11321-1-haifeng.zhao@intel.com> References: <20200927032829.11321-1-haifeng.zhao@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Once root port DPC capability is enabled and triggered, at the beginning of DPC is triggered, the DPC status bits are set by hardware and then sends DPC/DLLSC/PDC interrupts to OS DPC and pciehp drivers, it will take the port and software DPC interrupt handler 10ms to 50ms (test data on ICS(Ice Lake SP platform, see https://en.wikichip.org/wiki/intel/microarchitectures/ice_lake_(server) & stable 5.9-rc6) to complete the DPC containment procedure till the DPC status is cleared at the end of the DPC interrupt handler. We use this function to check if the root port is in DPC handling status and wait till the hardware and software completed the procedure. Signed-off-by: Ethan Zhao Tested-by: Wen Jin Tested-by: Shanshan Zhang Reviewed-by: Andy Shevchenko --- changes: V2:align ICS code name to public doc. include/linux/pci.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/include/linux/pci.h b/include/linux/pci.h index 835530605c0d..5beb76c6ae26 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -2427,4 +2428,34 @@ void pci_uevent_ers(struct pci_dev *pdev, enum pci_ers_result err_type); WARN_ONCE(condition, "%s %s: " fmt, \ dev_driver_string(&(pdev)->dev), pci_name(pdev), ##arg) +#ifdef CONFIG_PCIE_DPC +static inline bool pci_wait_port_outdpc(struct pci_dev *pdev) +{ + u16 cap = pdev->dpc_cap, status; + u16 loop = 0; + + if (!cap) { + pci_WARN_ONCE(pdev, !cap, "No DPC capability initiated\n"); + return false; + } + pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &status); + pci_dbg(pdev, "DPC status %x, cap %x\n", status, cap); + while (status & PCI_EXP_DPC_STATUS_TRIGGER && loop < 100) { + msleep(10); + loop++; + pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &status); + } + if (!(status & PCI_EXP_DPC_STATUS_TRIGGER)) { + pci_dbg(pdev, "Out of DPC %x, cost %d ms\n", status, loop*10); + return true; + } + pci_dbg(pdev, "Timeout to wait port out of DPC status\n"); + return false; +} +#else +static inline bool pci_wait_port_outdpc(struct pci_dev *pdev) +{ + return true; +} +#endif #endif /* LINUX_PCI_H */ -- 2.18.4