From patchwork Mon Oct 27 13:22:07 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yijing Wang X-Patchwork-Id: 5160411 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 008709F318 for ; Mon, 27 Oct 2014 12:46:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2E62120108 for ; Mon, 27 Oct 2014 12:46:39 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0E4D420109 for ; Mon, 27 Oct 2014 12:46:38 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xijeu-0005Cy-4R; Mon, 27 Oct 2014 12:44:28 +0000 Received: from szxga02-in.huawei.com ([119.145.14.65]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XijeH-0004rO-Lt for linux-arm-kernel@lists.infradead.org; Mon, 27 Oct 2014 12:43:51 +0000 Received: from 172.24.2.119 (EHLO szxeml404-hub.china.huawei.com) ([172.24.2.119]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CBJ49231; Mon, 27 Oct 2014 20:41:29 +0800 (CST) Received: from localhost.localdomain (10.175.100.166) by szxeml404-hub.china.huawei.com (10.82.67.59) with Microsoft SMTP Server id 14.3.158.1; Mon, 27 Oct 2014 20:41:15 +0800 From: Yijing Wang To: Bjorn Helgaas Subject: [PATCH 01/16] PCI/MSI: Refactor MSI controller to make it become more common Date: Mon, 27 Oct 2014 21:22:07 +0800 Message-ID: <1414416142-31239-2-git-send-email-wangyijing@huawei.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1414416142-31239-1-git-send-email-wangyijing@huawei.com> References: <1414416142-31239-1-git-send-email-wangyijing@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.100.166] X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141027_054350_143922_D446AF23 X-CRM114-Status: GOOD ( 14.00 ) X-Spam-Score: -1.3 (-) Cc: linux-mips@linux-mips.org, linux-ia64@vger.kernel.org, linux-pci@vger.kernel.org, Xinwei Hu , Yijing Wang , Thierry Reding , sparclinux@vger.kernel.org, linux-s390@vger.kernel.org, Russell King , Michael Ellerman , Joerg Roedel , x86@kernel.org, Sebastian Ott , Benjamin Herrenschmidt , xen-devel@lists.xenproject.org, Konrad Rzeszutek Wilk , Chris Metcalf , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , Tony Luck , Sergei Shtylyov , linux-kernel@vger.kernel.org, Ralf Baechle , iommu@lists.linux-foundation.org, David Vrabel , Wuyun , linuxppc-dev@lists.ozlabs.org, "David S. Miller" , Lucas Stach X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Now there are a lot of weak arch MSI functions in MSI code. These functions make MSI driver complex. Because people need to know much which arch MSI function should be overrode and which is not. Thierry introduced MSI chip framework to configure MSI/MSI-X irq in arm. MSI chip framework is better than raw arch MSI functions, people can clearly know they should implement which MSI ops in specific platform. Use MSI chip framework to refactor all other platform MSI code to eliminate weak arch MSI functions. This patch add .restore_irqs(), .teardown_irqs() and .setup_irqs() to make it become more common. Signed-off-by: Yijing Wang Reviewed-by: Lucas Stach --- drivers/pci/msi.c | 15 +++++++++++++++ include/linux/msi.h | 8 ++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 27b6a54..0e1da3e 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -70,6 +70,11 @@ int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) { struct msi_desc *entry; int ret; + struct msi_controller *ctrl; + + ctrl = pci_msi_controller(dev->bus); + if (ctrl && ctrl->setup_irqs) + return ctrl->setup_irqs(ctrl, dev, nvec, type); /* * If an architecture wants to support multiple MSI, it needs to @@ -112,6 +117,11 @@ void default_teardown_msi_irqs(struct pci_dev *dev) void __weak arch_teardown_msi_irqs(struct pci_dev *dev) { + struct msi_controller *ctrl = pci_msi_controller(dev->bus); + + if (ctrl && ctrl->teardown_irqs) + return ctrl->teardown_irqs(ctrl, dev); + return default_teardown_msi_irqs(dev); } @@ -135,6 +145,11 @@ static void default_restore_msi_irq(struct pci_dev *dev, int irq) void __weak arch_restore_msi_irqs(struct pci_dev *dev) { + struct msi_controller *ctrl = pci_msi_controller(dev->bus); + + if (ctrl && ctrl->restore_irqs) + return ctrl->restore_irqs(ctrl, dev); + return default_restore_msi_irqs(dev); } diff --git a/include/linux/msi.h b/include/linux/msi.h index 6704991..4426cb4 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -71,9 +71,13 @@ struct msi_controller { struct device_node *of_node; struct list_head list; - int (*setup_irq)(struct msi_controller *chip, struct pci_dev *dev, + int (*setup_irq)(struct msi_controller *ctrl, struct pci_dev *dev, struct msi_desc *desc); - void (*teardown_irq)(struct msi_controller *chip, unsigned int irq); + int (*setup_irqs)(struct msi_controller *ctrl, struct pci_dev *dev, + int nvec, int type); + void (*teardown_irq)(struct msi_controller *ctrl, unsigned int irq); + void (*teardown_irqs)(struct msi_controller *ctrl, struct pci_dev *dev); + void (*restore_irqs)(struct msi_controller *ctrl, struct pci_dev *dev); }; #endif /* LINUX_MSI_H */