From patchwork Thu Nov 9 20:46:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oza Pawandeep X-Patchwork-Id: 836501 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="Gw7OiwQk"; dkim=pass (1024-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="CzVWXfFE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yXwG368Blz9sRW for ; Fri, 10 Nov 2017 07:47:23 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752695AbdKIUrW (ORCPT ); Thu, 9 Nov 2017 15:47:22 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:60926 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751133AbdKIUrV (ORCPT ); Thu, 9 Nov 2017 15:47:21 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 35B6160856; Thu, 9 Nov 2017 20:47:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1510260441; bh=QzrUtx9zoyULnc6HlTsmLldZWIVGHbjwoHx775xAfCs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gw7OiwQkksL5SXfA7Pdq3e29zPy7z++5uIoS6HK3HOe8mRfNxzdvHJ50Z3D8LKglu /gKUET5+2wLZ5g2kCqo9vk/2KyiQNiU9xYnAKyBDTdwlcCKtB3lDiVe388Jr8AHnWY ranD7yD2sLaJ5REimHI8u0uAXVJi17fxzwNsMVqY= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from blr-ubuntu-poza.qualcomm.com (blr-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.18.19]) (using TLSv1.1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: poza@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id B33CD60847; Thu, 9 Nov 2017 20:47:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1510260439; bh=QzrUtx9zoyULnc6HlTsmLldZWIVGHbjwoHx775xAfCs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CzVWXfFEWtw7AvGPp3axmKSIEUpMiThagGnSpTHCBpk6OqRSUNi2NUN5h3EwcX1mq nt60l7B9TGoPppwu9+SKfMeYQn04kSHRsqqkJFvBS3yO3VX2E9SsdXOPpTnAuw5v08 /dnPNq7SORShBBp2KBc6G4c2AOVnZtFyTwy4eHZY= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org B33CD60847 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=poza@codeaurora.org From: Pawandeep Oza To: linux-pci@vger.kernel.org, timur@codeaurora.org Cc: Bjorn Helgaas , Dongdong Liu , Gabriele Paoloni , Thomas Gleixner , Greg Kroah-Hartman , linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Oza Pawandeep Subject: [PATCH 3/4] PCI/portdrv: Implement interface to query the registered service Date: Fri, 10 Nov 2017 02:16:38 +0530 Message-Id: <1510260399-14886-4-git-send-email-poza@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1510260399-14886-1-git-send-email-poza@codeaurora.org> References: <1510260399-14886-1-git-send-email-poza@codeaurora.org> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Oza Pawandeep This patch implements query service interface. So that, any port service driver can query to know, if the service is active or not. When multiple service drivers try to take actions, these service drivers could race or could have conflict of interest. For e.g. when DPC is enabled, AER should not attempt recovery. The interface walks up the parent till root bridge, and if any of the downstream port has DPC service active, it stops there, since DPC will be removing all the devices beneath. Signed-off-by: Oza Pawandeep diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index 6bfe986..63fa57a 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -490,6 +490,30 @@ static int pcie_port_remove_service(struct device *dev) } /** + * pcie_port_service_query - query if particula port service is enabled. + * dev: pcie device + * @port service: PCI express port service + */ +int pcie_port_query_service(struct pci_dev *dev, u32 port_service) +{ + struct pcie_device *pdev; + struct pci_dev *parent, *this = dev; + + do { + list_for_each_entry(pdev, &this->service_list, slist) { + if (pdev->service == port_service) + return 1; + } + parent = pci_upstream_bridge(this); + this = parent; + } while (parent && pci_is_pcie(parent)); + + return 0; +} +EXPORT_SYMBOL(pcie_port_query_service); + + +/** * pcie_port_shutdown_service - shut down given PCI Express port service * @dev: PCI Express port service device to handle * diff --git a/include/linux/pcieport_if.h b/include/linux/pcieport_if.h index 9d05621..bb8febb 100644 --- a/include/linux/pcieport_if.h +++ b/include/linux/pcieport_if.h @@ -68,5 +68,5 @@ struct pcie_port_service_driver { int pcie_port_service_register(struct pcie_port_service_driver *new); void pcie_port_service_unregister(struct pcie_port_service_driver *new); - +int pcie_port_query_service(struct pci_dev *dev, u32 port_service); #endif /* _PCIEPORT_IF_H_ */