Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp3420241pxu; Mon, 19 Oct 2020 11:34:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxb9khDWCwNt3SMs95RaJk26v0PmhniufxdrVhPBRYmpi81fDDdtqnBUNM8FSHuxq1ahZgR X-Received: by 2002:a17:906:2c41:: with SMTP id f1mr1207839ejh.524.1603132480479; Mon, 19 Oct 2020 11:34:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603132480; cv=none; d=google.com; s=arc-20160816; b=Vp3aoUhYf87dYQZrxqiKPH9zdAAfPS2qZl5Bd7+m9sdfKjSMZ6Sr+QQGgY6eRhVg1J gtzdxllgM+GSBVfVeflP1BMP1xd1NuSymgmTe6iJkNxf5esL8A0b2mvDhuiL8jVkMAHI xaFjNCxB52mB1UDi9eqhKdVKP8gGCFtPoZLIk1utRzqjaHULC8pTA8JpM7sgxJPCNOt6 fjC8UJ3TiUY9NabKS5SnxBGi+Ta6LM9lI2cM1mRg0pPOd2d9AXl3kxj2n7/OWxxY6wWb n1fViRc8JpDYEbek/X+K6ah3HFtQEvFSw0Dwdzsi7I9Q9j0hKkeVaA1N9dm1gvNTUi5M Ul2Q== 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 :dkim-signature; bh=/nN/y6WrCYAjhicfS1AOY7YPS8cKcq8Aw03kn4aPB58=; b=mPTE3hKtydyxrJTZ71SV0d7BsQgHCXfl62clMwt7qHaL0OdeuakbyIKn4ClAq8gZNU nysvzM6J8L6t1PneMw09jS+zbolqcaY7w0vuyks89dKQ7zIabf3TkeF/fyAbztLko4Fc rRb7e1x5zr0jw8gJBnPOAoXkd2K59aA4RjB1/HAuTubxCMD3v/zv57N3WeJhemaIL5Mi pKbD8kLJbBWQnm30htTFkNDRIIOUzuSEyYxIZMl6B0x8P5Mhu57TEtBHhkexfZAmT1T9 3/LAnB9JZMi9fF0+KVCNzMnBO9YF2X+6O5ifvJkBgwC6vArMLMxKunr6Pr//8tptvln8 PFpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel-com.20150623.gappssmtp.com header.s=20150623 header.b=0NFCd1HP; 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 bt15si582444ejb.170.2020.10.19.11.34.17; Mon, 19 Oct 2020 11:34:40 -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; dkim=pass header.i=@intel-com.20150623.gappssmtp.com header.s=20150623 header.b=0NFCd1HP; 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 S1730738AbgJSSbS (ORCPT + 99 others); Mon, 19 Oct 2020 14:31:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51532 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730464AbgJSSbS (ORCPT ); Mon, 19 Oct 2020 14:31:18 -0400 Received: from mail-pj1-x1043.google.com (mail-pj1-x1043.google.com [IPv6:2607:f8b0:4864:20::1043]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 76C9DC0613D0 for ; Mon, 19 Oct 2020 11:31:18 -0700 (PDT) Received: by mail-pj1-x1043.google.com with SMTP id ds1so230175pjb.5 for ; Mon, 19 Oct 2020 11:31:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/nN/y6WrCYAjhicfS1AOY7YPS8cKcq8Aw03kn4aPB58=; b=0NFCd1HPRyMs+EpHC33zKfqWmQ/rgzJB5lBxVDX7Er7MHKZOHk9gVhTxmR9HBCSZvc isstnw2lQlvuQpgCi9odOUvU+8Dy5LD+HzZIqmvSJcF7TIuDkjxUwD+XKFehk/5g57D6 +bXzk7Ywp836IcrOe9MACEwMDwBnC+8jS5wff6jCff/Vu5ZUlwVi0hW5MDmcPjBxSeRJ 4AVn8aIEbInIhCqo9E4tCkjTJvRap0Uhrd6LMPpIw/BfEDGZCChgXn4wqLk0MB/5SmlH nmU6WOCxx6hKblr1F8o79UGjPD8quW3Q9RL+8WtUqkX53yDV4dIK7oGexRuE6my83oqq mfqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/nN/y6WrCYAjhicfS1AOY7YPS8cKcq8Aw03kn4aPB58=; b=JG2hmG2yYqIz2mjGAT3hVMtH4rwpscuttXBOlBxEqlMDkR/CIEp+siR6Oq4P/gIMMM 4k47orxjfpBTCjBa/4oCRa1Bfm2BU+/y/x7DJd+nu6BaGfpQzqqIUy3aVWCVPrCH6ZYm sTofo7MPPyPOqytOAE0EGbcEyIbxATqq9qpGAi2ZSvQH7GAvDbc1HhUSDg8wMNk4iMmF tsNYeUyP6frsBGTyiH/lxS00zcVTTHapd21N9TaUpi2SJhrXtWJmLxCLsu9SYWcQOq7g c3fQXfirDyjmSfKKdUaw3+g1FGNF/Kz0SAySEdOouH0kaiguS6K5Lx8Yh9cZF0RItdRw V7lg== X-Gm-Message-State: AOAM530txlaUfwZOEoex9iB+j6/XW3h/f2FeJjnMlr378tccW9jPFBqt rqnhL+fEKtGYPDcHwb2j08DtrfeVIt3mmA== X-Received: by 2002:a17:902:eed4:b029:d5:ebe3:fc29 with SMTP id h20-20020a170902eed4b02900d5ebe3fc29mr1034105plb.20.1603132277783; Mon, 19 Oct 2020 11:31:17 -0700 (PDT) Received: from [10.209.12.57] ([134.134.137.79]) by smtp.gmail.com with ESMTPSA id n15sm316037pgt.75.2020.10.19.11.31.15 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Oct 2020 11:31:16 -0700 (PDT) From: "Sean V Kelley" To: "Ethan Zhao" Cc: "Bjorn Helgaas" , "Sean V Kelley" , Jonathan.Cameron@huawei.com, "Bjorn Helgaas" , rafael.j.wysocki@intel.com, "Ashok Raj" , tony.luck@intel.com, "Sathyanarayanan Kuppuswamy" , qiuxu.zhuo@intel.com, linux-pci , "Linux Kernel Mailing List" , "Christoph Hellwig" , "Sinan Kaya" , "Keith Busch" Subject: Re: [PATCH v9 12/15] PCI/RCEC: Add RCiEP's linked RCEC to AER/ERR Date: Mon, 19 Oct 2020 11:31:14 -0700 X-Mailer: MailMate (1.13.2r5673) Message-ID: <4F54EEC0-3933-4A2E-87BC-23FABECB0C0A@intel.com> In-Reply-To: References: <20201016203037.GA90074@bjorn-Precision-5520> <20201016222902.GA112659@bjorn-Precision-5520> MIME-Version: 1.0 Content-Type: text/plain; format=flowed Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 19 Oct 2020, at 3:49, Ethan Zhao wrote: > On Sat, Oct 17, 2020 at 6:29 AM Bjorn Helgaas = > wrote: >> >> [+cc Christoph, Ethan, Sinan, Keith; sorry should have cc'd you to >> begin with since you're looking at this code too. Particularly >> interested in your thoughts about whether we should be touching >> PCI_ERR_ROOT_COMMAND and PCI_ERR_ROOT_STATUS when we don't own AER.] > > aer_root_reset() function has a prefix 'aer_', looks like it's a > function of aer driver, will > only be called by aer driver at runtime. if so it's up to the > owner/aer to know if OSPM is > granted to init. while actually some of the functions and runtime = > service of > aer driver is also shared by GHES driver (running time) and DPC driver > (compiling time ?) > etc. then it is confused now. > > Shall we move some of the shared functions and running time service to > pci/err.c ? > if so , just like pcie_do_recovery(), it's share by firmware_first = > mode GHES > ghes_probe() > ->ghes_irq_func > ->ghes_proc > ->ghes_do_proc() > ->ghes_handle_aer() > ->aer_recover_work_func() > ->pcie_do_recovery() > ->aer_root_reset() > > and aer driver etc. if aer wants to do some access might conflict > with firmware(or > firmware in embedded controller) should check _OSC_ etc first. = > blindly issue > PCI_ERR_ROOT_COMMAND or clear PCI_ERR_ROOT_STATUS *likely* > cause errors by error handling itself. If _OSC negotiation ends up with FW being in control of AER, that means = OS is not in charge and should not be messing with AER I guess. That = seems appropriate to me then. Thanks, Sean > > Thanks, > Ethan > >> >> On Fri, Oct 16, 2020 at 03:30:37PM -0500, Bjorn Helgaas wrote: >>> [+to Jonathan] >>> >>> On Thu, Oct 15, 2020 at 05:11:10PM -0700, Sean V Kelley wrote: >>>> From: Qiuxu Zhuo >>>> >>>> When attempting error recovery for an RCiEP associated with an RCEC = >>>> device, >>>> there needs to be a way to update the Root Error Status, the = >>>> Uncorrectable >>>> Error Status and the Uncorrectable Error Severity of the parent = >>>> RCEC. In >>>> some non-native cases in which there is no OS-visible device = >>>> associated >>>> with the RCiEP, there is nothing to act upon as the firmware is = >>>> acting >>>> before the OS. >>>> >>>> Add handling for the linked RCEC in AER/ERR while taking into = >>>> account >>>> non-native cases. >>>> >>>> Co-developed-by: Sean V Kelley >>>> Link: = >>>> https://lore.kernel.org/r/20201002184735.1229220-12-seanvk.dev@orego= ntracks.org >>>> Signed-off-by: Sean V Kelley >>>> Signed-off-by: Qiuxu Zhuo >>>> Signed-off-by: Bjorn Helgaas >>>> Reviewed-by: Jonathan Cameron >>>> --- >>>> drivers/pci/pcie/aer.c | 53 = >>>> ++++++++++++++++++++++++++++++------------ >>>> drivers/pci/pcie/err.c | 20 ++++++++-------- >>>> 2 files changed, 48 insertions(+), 25 deletions(-) >>>> >>>> diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c >>>> index 65dff5f3457a..083f69b67bfd 100644 >>>> --- a/drivers/pci/pcie/aer.c >>>> +++ b/drivers/pci/pcie/aer.c >>>> @@ -1357,27 +1357,50 @@ static int aer_probe(struct pcie_device = >>>> *dev) >>>> */ >>>> static pci_ers_result_t aer_root_reset(struct pci_dev *dev) >>>> { >>>> - int aer =3D dev->aer_cap; >>>> + int type =3D pci_pcie_type(dev); >>>> + struct pci_dev *root; >>>> + int aer =3D 0; >>>> + int rc =3D 0; >>>> u32 reg32; >>>> - int rc; >>>> >>>> + if (pci_pcie_type(dev) =3D=3D PCI_EXP_TYPE_RC_END) >>> >>> "type =3D=3D PCI_EXP_TYPE_RC_END" >>> >>>> + /* >>>> + * The reset should only clear the Root Error Status >>>> + * of the RCEC. Only perform this for the >>>> + * native case, i.e., an RCEC is present. >>>> + */ >>>> + root =3D dev->rcec; >>>> + else >>>> + root =3D dev; >>>> >>>> - /* Disable Root's interrupt in response to error messages */ >>>> - pci_read_config_dword(dev, aer + PCI_ERR_ROOT_COMMAND, ®32); >>>> - reg32 &=3D ~ROOT_PORT_INTR_ON_MESG_MASK; >>>> - pci_write_config_dword(dev, aer + PCI_ERR_ROOT_COMMAND, reg32); >>>> + if (root) >>>> + aer =3D dev->aer_cap; >>>> >>>> - rc =3D pci_bus_error_reset(dev); >>>> - pci_info(dev, "Root Port link has been reset\n"); >>>> + if (aer) { >>>> + /* Disable Root's interrupt in response to error = >>>> messages */ >>>> + pci_read_config_dword(root, aer + PCI_ERR_ROOT_COMMAND, = >>>> ®32); >>>> + reg32 &=3D ~ROOT_PORT_INTR_ON_MESG_MASK; >>>> + pci_write_config_dword(root, aer + = >>>> PCI_ERR_ROOT_COMMAND, reg32); >>> >>> Not directly related to *this* patch, but my assumption was that in >>> the APEI case, the firmware should retain ownership of the AER >>> Capability, so the OS should not touch PCI_ERR_ROOT_COMMAND and >>> PCI_ERR_ROOT_STATUS. >>> >>> But this code appears to ignore that ownership. Jonathan, you must >>> have looked at this recently for 068c29a248b6 ("PCI/ERR: Clear PCIe >>> Device Status errors only if OS owns AER"). Do you have any insight >>> about this? >>> >>>> - /* Clear Root Error Status */ >>>> - pci_read_config_dword(dev, aer + PCI_ERR_ROOT_STATUS, ®32); >>>> - pci_write_config_dword(dev, aer + PCI_ERR_ROOT_STATUS, reg32); >>>> + /* Clear Root Error Status */ >>>> + pci_read_config_dword(root, aer + PCI_ERR_ROOT_STATUS, = >>>> ®32); >>>> + pci_write_config_dword(root, aer + PCI_ERR_ROOT_STATUS, = >>>> reg32); >>>> >>>> - /* Enable Root Port's interrupt in response to error messages = >>>> */ >>>> - pci_read_config_dword(dev, aer + PCI_ERR_ROOT_COMMAND, ®32); >>>> - reg32 |=3D ROOT_PORT_INTR_ON_MESG_MASK; >>>> - pci_write_config_dword(dev, aer + PCI_ERR_ROOT_COMMAND, reg32); >>>> + /* Enable Root Port's interrupt in response to error = >>>> messages */ >>>> + pci_read_config_dword(root, aer + PCI_ERR_ROOT_COMMAND, = >>>> ®32); >>>> + reg32 |=3D ROOT_PORT_INTR_ON_MESG_MASK; >>>> + pci_write_config_dword(root, aer + = >>>> PCI_ERR_ROOT_COMMAND, reg32); >>>> + } >>>> + >>>> + if ((type =3D=3D PCI_EXP_TYPE_RC_EC) || (type =3D=3D = >>>> PCI_EXP_TYPE_RC_END)) { >>>> + if (pcie_has_flr(root)) { >>>> + rc =3D pcie_flr(root); >>>> + pci_info(dev, "has been reset (%d)\n", rc); >>>> + } >>>> + } else { >>>> + rc =3D pci_bus_error_reset(root); >>> >>> Don't we want "dev" for both the FLR and pci_bus_error_reset()? I >>> think "root =3D=3D dev" except when dev is an RCiEP. When dev is an >>> RCiEP, "root" is the RCEC (if present), and we want to reset the >>> RCiEP, not the RCEC. >>> >>>> + pci_info(dev, "Root Port link has been reset (%d)\n", = >>>> rc); >>>> + } >>> >>> There are a couple changes here that I think should be split out. >>> >>> Based on my theory that when firmware retains control of AER, the OS >>> should not touch PCI_ERR_ROOT_COMMAND and PCI_ERR_ROOT_STATUS, and = >>> any >>> updates to them would have to be done by firmware before we get = >>> here, >>> I suggested reordering this: >>> >>> - clear PCI_ERR_ROOT_COMMAND ROOT_PORT_INTR_ON_MESG_MASK >>> - do reset >>> - clear PCI_ERR_ROOT_STATUS (for APEI, presumably done by = >>> firmware?) >>> - enable PCI_ERR_ROOT_COMMAND ROOT_PORT_INTR_ON_MESG_MASK >>> >>> to this: >>> >>> - clear PCI_ERR_ROOT_COMMAND ROOT_PORT_INTR_ON_MESG_MASK >>> - clear PCI_ERR_ROOT_STATUS >>> - enable PCI_ERR_ROOT_COMMAND ROOT_PORT_INTR_ON_MESG_MASK >>> - do reset >>> >>> If my theory is correct, I think we should still reorder this, but: >>> >>> - It's a significant behavior change that deserves its own patch = >>> so >>> we can document/bisect/revert. >>> >>> - I'm not sure why we clear the PCI_ERR_ROOT_COMMAND error = >>> reporting >>> bits. In the new "clear COMMAND, clear STATUS, enable COMMAND" >>> order, it looks superfluous. There's no reason to disable error >>> reporting while clearing the status bits. >>> >>> The current "clear, reset, enable" order suggests that the reset >>> might cause errors that we should ignore. I don't know whether >>> that's the case or not. It dates from 6c2b374d7485 = >>> ("PCI-Express >>> AER implemetation: AER core and aerdriver"), which doesn't >>> elaborate. >>> >>> - Should we also test for OS ownership of AER before touching >>> PCI_ERR_ROOT_STATUS? >>> >>> - If we remove the PCI_ERR_ROOT_COMMAND fiddling (and I = >>> tentatively >>> think we *should* unless we can justify it), that would also >>> deserve its own patch. Possibly (1) remove PCI_ERR_ROOT_COMMAND >>> fiddling, (2) reorder PCI_ERR_ROOT_STATUS clearing and reset, = >>> (3) >>> test for OS ownership of AER (?), (4) the rest of this patch. >>> >>>> return rc ? PCI_ERS_RESULT_DISCONNECT : = >>>> PCI_ERS_RESULT_RECOVERED; >>>> } >>>> diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c >>>> index 7883c9791562..cbc5abfe767b 100644 >>>> --- a/drivers/pci/pcie/err.c >>>> +++ b/drivers/pci/pcie/err.c >>>> @@ -148,10 +148,10 @@ static int report_resume(struct pci_dev *dev, = >>>> void *data) >>>> >>>> /** >>>> * pci_walk_bridge - walk bridges potentially AER affected >>>> - * @bridge: bridge which may be a Port, an RCEC with = >>>> associated RCiEPs, >>>> - * or an RCiEP associated with an RCEC >>>> - * @cb: callback to be called for each device found >>>> - * @userdata: arbitrary pointer to be passed to callback >>>> + * @bridge bridge which may be an RCEC with associated RCiEPs, >>>> + * or a Port. >>>> + * @cb callback to be called for each device found >>>> + * @userdata arbitrary pointer to be passed to callback. >>>> * >>>> * If the device provided is a bridge, walk the subordinate bus, = >>>> including >>>> * any bridged devices on buses under this bus. Call the provided = >>>> callback >>>> @@ -164,8 +164,14 @@ static void pci_walk_bridge(struct pci_dev = >>>> *bridge, >>>> int (*cb)(struct pci_dev *, void *), >>>> void *userdata) >>>> { >>>> + /* >>>> + * In a non-native case where there is no OS-visible reporting >>>> + * device the bridge will be NULL, i.e., no RCEC, no Downstream = >>>> Port. >>>> + */ >>>> if (bridge->subordinate) >>>> pci_walk_bus(bridge->subordinate, cb, userdata); >>>> + else if (bridge->rcec) >>>> + cb(bridge->rcec, userdata); >>>> else >>>> cb(bridge, userdata); >>>> } >>>> @@ -194,12 +200,6 @@ pci_ers_result_t pcie_do_recovery(struct = >>>> pci_dev *dev, >>>> pci_dbg(bridge, "broadcast error_detected message\n"); >>>> if (state =3D=3D pci_channel_io_frozen) { >>>> pci_walk_bridge(bridge, report_frozen_detected, = >>>> &status); >>>> - if (type =3D=3D PCI_EXP_TYPE_RC_END) { >>>> - pci_warn(dev, "subordinate device reset not = >>>> possible for RCiEP\n"); >>>> - status =3D PCI_ERS_RESULT_NONE; >>>> - goto failed; >>>> - } >>>> - >>>> status =3D reset_subordinates(bridge); >>>> if (status !=3D PCI_ERS_RESULT_RECOVERED) { >>>> pci_warn(bridge, "subordinate device reset = >>>> failed\n"); >>>> -- >>>> 2.28.0 >>>>