Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1886160pxk; Sat, 3 Oct 2020 01:00:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwvFWq1+j5fZY8Iqdu6i6YMbh1a5qrn7BbpVfNf3ByLia/y5DzMKCW5qsU7zaOWU+1YzOcx X-Received: by 2002:a17:906:a002:: with SMTP id p2mr5288456ejy.399.1601712032558; Sat, 03 Oct 2020 01:00:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601712032; cv=none; d=google.com; s=arc-20160816; b=p2jQPyL9teJSC3Gb5TV847BBUxrZRTlWYuRqPw0Wu/0G8pgfqGYX5XohsYzTaxledu 5nRJk5MlIMmcgGU+cfvQy6gUzhkyLRPZbfh5RJCete6Y8resctZRH58bgtL88jOK0V/F O4KZuH7RyWJ/QTIXECrXzv/ly1qnCnSno/Qvxhe/iOICzLAHR0EOrzI2RXTJnyd7knQ9 sGrLGDnXJH7xa1YzHbLf5HCLR9UVCGB/fqlbYOYL1XkhxNQe33e9PrEF09SSoqpZDBKq zz3LoUsHURhlL5NyhNvu20XXR11zd6f8KPwwa7GczSNNj46+LCO1uUFqoC6UdyC63EoX qoLg== 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=7es2ACDJjfWtxDZ0vUe1uN9H1XKKDNuOdh+iea6B3Hg=; b=ChhSjHR9mlL9zUICR7nc98XtjFllC0Aa84XuNBU7K6Oe1m1T/ISQhLEAQnH5+ktQ2h 9bab2V23QQOb9w8OhSFGX+dAKSQfNnZGlI+WGbqjTcILn6ypgJglFO8eNJExZ3c/uf3X 7SY14q7Si7lr6LisI1bKyy4l7u7jRsnt2pinvf8V3wI+zbCPssQ5eP80Q5j8Tem8LOGZ Dmna2G6SHO01K1cwtkBWyXAuKJ7AiwO/Q6GPA9vdR0yoc4SiUEsDj1DVQdLpEz3LKmz7 eC8+1OOePNtYHNdJsLX/Ky0KQTItoo7W3vbEj0W9GTjjw6TIINmLZvuPqz2HcqTzZTDp bC+w== 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 3si2745307ejr.430.2020.10.03.01.00.10; Sat, 03 Oct 2020 01:00:32 -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 S1725831AbgJCH47 (ORCPT + 99 others); Sat, 3 Oct 2020 03:56:59 -0400 Received: from mga07.intel.com ([134.134.136.100]:28593 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725797AbgJCH4r (ORCPT ); Sat, 3 Oct 2020 03:56:47 -0400 IronPort-SDR: GgG7yxUZbHeFkXpOTeB90+rAvhZD+9aTc1P/BU246WpWP0+j1Wu9hhsFkvUlExTdARES/0hQGT l5BL6Q5fdajQ== X-IronPort-AV: E=McAfee;i="6000,8403,9762"; a="227305308" X-IronPort-AV: E=Sophos;i="5.77,330,1596524400"; d="scan'208";a="227305308" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Oct 2020 00:56:47 -0700 IronPort-SDR: jMNyxMaDeX7Xb2246JFAqAeksYjFjQLapWp6beTJIdmUVpZYklX7k6EvcdOBh1HYLNFn+EOSGt J9WlRHp14nkw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,330,1596524400"; d="scan'208";a="513062548" Received: from shskylake.sh.intel.com ([10.239.48.137]) by orsmga005.jf.intel.com with ESMTP; 03 Oct 2020 00:56:43 -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, ashok.raj@linux.intel.com, sathyanarayanan.kuppuswamy@intel.com, xerces.zhao@gmail.com, Ethan Zhao Subject: [PATCH v7 2/5] PCI/DPC: define a function to check and wait till port finish DPC handling Date: Sat, 3 Oct 2020 03:55:11 -0400 Message-Id: <20201003075514.32935-3-haifeng.zhao@intel.com> X-Mailer: git-send-email 2.18.4 In-Reply-To: <20201003075514.32935-1-haifeng.zhao@intel.com> References: <20201003075514.32935-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 --- changes: v2:align ICS code name to public doc. v3: no change. v4: response to Christoph's (Christoph Hellwig ) tip, move pci_wait_port_outdpc() to DPC driver and its declaration to pci.h. v5: fix building issue reported by lkp@intel.com with some config. v6: move from [1/5] to [2/5]. v7: no change. drivers/pci/pci.h | 2 ++ drivers/pci/pcie/dpc.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index fa12f7cbc1a0..455b32187abd 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -455,10 +455,12 @@ void pci_restore_dpc_state(struct pci_dev *dev); void pci_dpc_init(struct pci_dev *pdev); void dpc_process_error(struct pci_dev *pdev); pci_ers_result_t dpc_reset_link(struct pci_dev *pdev); +bool pci_wait_port_outdpc(struct pci_dev *pdev); #else static inline void pci_save_dpc_state(struct pci_dev *dev) {} static inline void pci_restore_dpc_state(struct pci_dev *dev) {} static inline void pci_dpc_init(struct pci_dev *pdev) {} +static inline bool pci_wait_port_outdpc(struct pci_dev *pdev) { return false; } #endif #ifdef CONFIG_PCI_ATS diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c index daa9a4153776..2e0e091ce923 100644 --- a/drivers/pci/pcie/dpc.c +++ b/drivers/pci/pcie/dpc.c @@ -71,6 +71,33 @@ void pci_restore_dpc_state(struct pci_dev *dev) pci_write_config_word(dev, dev->dpc_cap + PCI_EXP_DPC_CTL, *cap); } +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; +} + static int dpc_wait_rp_inactive(struct pci_dev *pdev) { unsigned long timeout = jiffies + HZ; -- 2.18.4