Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp5909pxk; Wed, 30 Sep 2020 16:04:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzwhzIms5+Y3rmo2wi+nyYlBQHKBVTe3s0Li7uxaEQ8PEA6AUdQjD1i/2w78UnOkGfLvzKY X-Received: by 2002:aa7:d68c:: with SMTP id d12mr5400125edr.274.1601507080084; Wed, 30 Sep 2020 16:04:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601507080; cv=none; d=google.com; s=arc-20160816; b=biEhc+jL+2fD3E8nKpWXE22TmiGhVO51wqtsVD8c4F0toPdVkuawPIA6qDwzZjUpv7 t0/qx4iPNvCLqnU2c8vP8sPdBRCxUV4NYFxpxOy8ROqzJ8GH8CEeRGfA/SXlvgwn7YHY qGu7DMIMML8careOsbo6RbY+IvvJHOnC+bncxVfSDAPrW0gBoan3J6vIvcyZzXEyBM1B vtvuiKSi/RiytF5BoCPWsaC5EYVoRmicFTf/iYYJs+oSmiG4RdIKnw/dM6kVqY2fkAQE aRC5clESZjsRZJvfBDTeATgvZcqqys2Ccx4EHuuJKtYJerAVz+jBROkf2mc80VO/Me1h 6/Lg== 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:dkim-signature; bh=3XMUwzDQAEBZXn+9J8mGrGgpAFJVHQZk4InGjJxlJEU=; b=VbtAR4MDf0IwrtDYFKLFbnNDuTRsqI2fVEUqTfiSZEIlAVYHnIXew+/IVu9on6yHQ+ u5AXNTb+KUZPZMHP9+zdX4xKyf/sGdwX1HeUmZAo3IctdoxWUxyNEZyQGi/odeksZFiD 0pXL4ElQetO/kQkjVgARQQFGEoQC1NQSXvYdkUHUGzdiCo7sJ0rHzS79rKrb1ImJMQGs oZZyswHHij7hB3S89ylR9cFGX/8Kbehe8GiQv2/dX0AOq2P8bmurxEFq538hl3eDKTYb IEXMzQVykivUDy8op4nFb6OtPCHyNSCFVJLAWtXGlowlGgQqyY7BY9ySIacQOKj0l9qN kltg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oregontracks.org header.s=fm1 header.b=Quw5Nszp; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=MHpQyMSd; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b11si1846180eju.453.2020.09.30.16.04.17; Wed, 30 Sep 2020 16:04: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=@oregontracks.org header.s=fm1 header.b=Quw5Nszp; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=MHpQyMSd; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731430AbgI3V67 (ORCPT + 99 others); Wed, 30 Sep 2020 17:58:59 -0400 Received: from wout1-smtp.messagingengine.com ([64.147.123.24]:38509 "EHLO wout1-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731388AbgI3V6s (ORCPT ); Wed, 30 Sep 2020 17:58:48 -0400 Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailout.west.internal (Postfix) with ESMTP id 1A356FA3; Wed, 30 Sep 2020 17:58:47 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute7.internal (MEProxy); Wed, 30 Sep 2020 17:58:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= oregontracks.org; h=from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; s=fm1; bh=3XMUwzDQAEBZXn+9J8mGrGgpAFJVHQZk4InGjJxlJEU=; b=Quw5N szpdpCdzG8+Dfyn0FjORynddTGsIKmGYsG3QJtYr29LFyp9fw/xGueFaPfMwcOmR ahcp7ccPbFP8R8v9Q2mGUOAsBncTgRa6Z9aVTgKu8JYe0IfE2K4kWHJXVI6o486y v5lomcpmP4fXm8Hq2uU1yV7yBzYHNDrvIzepuV5jayiTsNjjjbEFL3CCrS1N/yF2 D7k2sGtu2Y7oEzLKJU7eyYgRwE9F9Gke9TLpRCCD+D0pQQ1QWta44g0/H/6KSA3z jV6HrhHphFYX6zxBGdZjd0Ua+19Ny3kEkiPjRugNhAKOcS4GBhcwDG1BkTX8a07K wWw1LQ0WuMq/t8OUg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=3XMUwzDQAEBZXn+9J8mGrGgpAFJVHQZk4InGjJxlJEU=; b=MHpQyMSd CkLHt4b9pkcT9FvLIAUUd7bBLmj2ykwXSmmcb+NcpW5fcY5tGIYtsUJuxbXzfZtQ AwG8pIor99PK6LnOTywcdrhbkqunWTc48Z1inD/RgPj//gPMGD0N7pd84uSkmqCC V4sknJ+84HfCv+yRptmlYnUCTmT+qYreyHzwvYEEXbgRAiOaMM0rnUotywbHwnQs llxTk58PSueIK4JmOQd3/oSvHVbTKc6XtKNExp2ilgQLVWjAlHVe8sjzH7bM9uyB jjy349a3Rumx0Xkg8Lmm8j1eLsuCeiIJggY5z6TaU/Yz4MY+E7Jm1WJEitUMzvl4 z6bju5c8nAWLIw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrfeefgddthecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhephffvufffkffojghfggfgsedtkeertd ertddtnecuhfhrohhmpefuvggrnhcuggcumfgvlhhlvgihuceoshgvrghnvhhkrdguvghv sehorhgvghhonhhtrhgrtghkshdrohhrgheqnecuggftrfgrthhtvghrnhepheekffetie duieffleekleevffdtlefhiedtieegffelueefvdfggedvfeevtdetnecukfhppedvgedr vddtrddugeekrdegleenucevlhhushhtvghrufhiiigvpedutdenucfrrghrrghmpehmrg hilhhfrhhomhepshgvrghnvhhkrdguvghvsehorhgvghhonhhtrhgrtghkshdrohhrgh X-ME-Proxy: Received: from arch-ashland-svkelley.hsd1.or.comcast.net (c-24-20-148-49.hsd1.or.comcast.net [24.20.148.49]) by mail.messagingengine.com (Postfix) with ESMTPA id E4C92328005E; Wed, 30 Sep 2020 17:58:44 -0400 (EDT) From: Sean V Kelley To: bhelgaas@google.com, Jonathan.Cameron@huawei.com, rafael.j.wysocki@intel.com, ashok.raj@intel.com, tony.luck@intel.com, sathyanarayanan.kuppuswamy@intel.com, qiuxu.zhuo@intel.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Sean V Kelley Subject: [PATCH v7 11/13] PCI/AER: Add pcie_walk_rcec() to RCEC AER handling Date: Wed, 30 Sep 2020 14:58:18 -0700 Message-Id: <20200930215820.1113353-12-seanvk.dev@oregontracks.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200930215820.1113353-1-seanvk.dev@oregontracks.org> References: <20200930215820.1113353-1-seanvk.dev@oregontracks.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean V Kelley Root Complex Event Collectors (RCEC) appear as peers to Root Ports and also have the AER capability. In addition, actions need to be taken for associated RCiEPs. In such cases the RCECs will need to be walked in order to find and act upon their respective RCiEPs. Extend the existing ability to link the RCECs with a walking function pcie_walk_rcec(). Add RCEC support to the current AER service driver and attach the AER service driver to the RCEC device. Co-developed-by: Qiuxu Zhuo Signed-off-by: Qiuxu Zhuo Signed-off-by: Sean V Kelley Reviewed-by: Jonathan Cameron --- drivers/pci/pci.h | 4 ++++ drivers/pci/pcie/aer.c | 27 ++++++++++++++++++++------- drivers/pci/pcie/rcec.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index ef60a78a1861..b20cc3544267 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -474,10 +474,14 @@ static inline void pci_dpc_init(struct pci_dev *pdev) {} int pci_rcec_init(struct pci_dev *dev); void pci_rcec_exit(struct pci_dev *dev); void pcie_link_rcec(struct pci_dev *rcec); +void pcie_walk_rcec(struct pci_dev *rcec, int (*cb)(struct pci_dev *, void *), + void *userdata); #else static inline int pci_rcec_init(struct pci_dev *dev) {return 0;} static inline void pci_rcec_exit(struct pci_dev *dev) {} static inline void pcie_link_rcec(struct pci_dev *rcec) {} +static inline void pcie_walk_rcec(struct pci_dev *rcec, int (*cb)(struct pci_dev *, void *), + void *userdata) {} #endif #ifdef CONFIG_PCI_ATS diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index dccdba60b5d9..3cde646f71c0 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c @@ -300,7 +300,7 @@ int pci_aer_raw_clear_status(struct pci_dev *dev) return -EIO; port_type = pci_pcie_type(dev); - if (port_type == PCI_EXP_TYPE_ROOT_PORT) { + if (port_type == PCI_EXP_TYPE_ROOT_PORT || port_type == PCI_EXP_TYPE_RC_EC) { pci_read_config_dword(dev, aer + PCI_ERR_ROOT_STATUS, &status); pci_write_config_dword(dev, aer + PCI_ERR_ROOT_STATUS, status); } @@ -595,7 +595,8 @@ static umode_t aer_stats_attrs_are_visible(struct kobject *kobj, if ((a == &dev_attr_aer_rootport_total_err_cor.attr || a == &dev_attr_aer_rootport_total_err_fatal.attr || a == &dev_attr_aer_rootport_total_err_nonfatal.attr) && - pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) + ((pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) && + (pci_pcie_type(pdev) != PCI_EXP_TYPE_RC_EC))) return 0; return a->mode; @@ -916,7 +917,10 @@ static bool find_source_device(struct pci_dev *parent, if (result) return true; - pci_walk_bus(parent->subordinate, find_device_iter, e_info); + if (pci_pcie_type(parent) == PCI_EXP_TYPE_RC_EC) + pcie_walk_rcec(parent, find_device_iter, e_info); + else + pci_walk_bus(parent->subordinate, find_device_iter, e_info); if (!e_info->error_dev_num) { pci_info(parent, "can't find device of ID%04x\n", e_info->id); @@ -1053,6 +1057,7 @@ int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info) if (!(info->status & ~info->mask)) return 0; } else if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || + pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC || pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM || info->severity == AER_NONFATAL) { @@ -1205,6 +1210,7 @@ static int set_device_error_reporting(struct pci_dev *dev, void *data) int type = pci_pcie_type(dev); if ((type == PCI_EXP_TYPE_ROOT_PORT) || + (type == PCI_EXP_TYPE_RC_EC) || (type == PCI_EXP_TYPE_UPSTREAM) || (type == PCI_EXP_TYPE_DOWNSTREAM)) { if (enable) @@ -1229,9 +1235,11 @@ static void set_downstream_devices_error_reporting(struct pci_dev *dev, { set_device_error_reporting(dev, &enable); - if (!dev->subordinate) - return; - pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable); + if (pci_pcie_type(dev) == PCI_EXP_TYPE_RC_EC) + pcie_walk_rcec(dev, set_device_error_reporting, &enable); + else if (dev->subordinate) + pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable); + } /** @@ -1329,6 +1337,11 @@ static int aer_probe(struct pcie_device *dev) struct device *device = &dev->device; struct pci_dev *port = dev->port; + /* Limit to Root Ports or Root Complex Event Collectors */ + if ((pci_pcie_type(port) != PCI_EXP_TYPE_RC_EC) && + (pci_pcie_type(port) != PCI_EXP_TYPE_ROOT_PORT)) + return -ENODEV; + rpc = devm_kzalloc(device, sizeof(struct aer_rpc), GFP_KERNEL); if (!rpc) return -ENOMEM; @@ -1385,7 +1398,7 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) static struct pcie_port_service_driver aerdriver = { .name = "aer", - .port_type = PCI_EXP_TYPE_ROOT_PORT, + .port_type = PCIE_ANY_PORT, .service = PCIE_PORT_SERVICE_AER, .probe = aer_probe, diff --git a/drivers/pci/pcie/rcec.c b/drivers/pci/pcie/rcec.c index 9ba74d8064e9..a3ca3bbfac93 100644 --- a/drivers/pci/pcie/rcec.c +++ b/drivers/pci/pcie/rcec.c @@ -51,6 +51,17 @@ static int link_rcec_helper(struct pci_dev *dev, void *data) return 0; } +static int walk_rcec_helper(struct pci_dev *dev, void *data) +{ + struct walk_rcec_data *rcec_data = data; + struct pci_dev *rcec = rcec_data->rcec; + + if ((pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END) && rcec_assoc_rciep(rcec, dev)) + rcec_data->user_callback(dev, rcec_data->user_data); + + return 0; +} + static void walk_rcec(int (*cb)(struct pci_dev *dev, void *data), void *userdata) { struct walk_rcec_data *rcec_data = userdata; @@ -106,6 +117,32 @@ void pcie_link_rcec(struct pci_dev *rcec) walk_rcec(link_rcec_helper, &rcec_data); } +/** + * pcie_walk_rcec - Walk RCiEP devices associating with RCEC and call callback. + * @rcec RCEC whose RCiEP devices should be walked. + * @cb Callback to be called for each RCiEP device found. + * @userdata Arbitrary pointer to be passed to callback. + * + * Walk the given RCEC. Call the provided callback on each RCiEP device found. + * + * We check the return of @cb each time. If it returns anything + * other than 0, we break out. + */ +void pcie_walk_rcec(struct pci_dev *rcec, int (*cb)(struct pci_dev *, void *), + void *userdata) +{ + struct walk_rcec_data rcec_data; + + if (!rcec->rcec_ea) + return; + + rcec_data.rcec = rcec; + rcec_data.user_callback = cb; + rcec_data.user_data = userdata; + + walk_rcec(walk_rcec_helper, &rcec_data); +} + int pci_rcec_init(struct pci_dev *dev) { struct rcec_ea *rcec_ea; -- 2.28.0