From patchwork Fri Apr 12 22:44:38 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinghai Lu X-Patchwork-Id: 236274 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id D6E6F2C00B2 for ; Sat, 13 Apr 2013 08:51:55 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932337Ab3DLWvi (ORCPT ); Fri, 12 Apr 2013 18:51:38 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:48827 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758592Ab3DLWvg (ORCPT ); Fri, 12 Apr 2013 18:51:36 -0400 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r3CMixOD000336 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 12 Apr 2013 22:44:59 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3CMiwri010680 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 12 Apr 2013 22:44:59 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r3CMiwTh010672; Fri, 12 Apr 2013 22:44:58 GMT Received: from linux-siqj.site (/10.132.126.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 12 Apr 2013 15:44:57 -0700 From: Yinghai Lu To: Bjorn Helgaas , Ram Pai Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Yinghai Lu Subject: [PATCH v4 24/29] PCI: Add helpers to add addon_resource Date: Fri, 12 Apr 2013 15:44:38 -0700 Message-Id: <1365806683-26717-25-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1365806683-26717-1-git-send-email-yinghai@kernel.org> References: <1365806683-26717-1-git-send-email-yinghai@kernel.org> X-Source-IP: ucsinet22.oracle.com [156.151.31.94] Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Add helper to put add_on resources into pci devices resource list. -v2: change one function to static according to Fengguang. Signed-off-by: Yinghai Lu --- drivers/pci/probe.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/pci.h | 5 ++++ 2 files changed, 73 insertions(+) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 9e659c7..f3038c2 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -144,6 +144,74 @@ int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res) return -1; } +static struct pci_dev_addon_resource *pci_alloc_dev_addon_resource( + struct pci_dev *dev, int addr, char *name) +{ + struct pci_dev_addon_resource *addon_res; + + addon_res = kzalloc(sizeof(*addon_res), GFP_KERNEL); + + if (!addon_res) + return NULL; + + addon_res->reg_addr = addr; + + if (name) + addon_res->res.name = name; + else + addon_res->res.name = pci_name(dev); + + list_add_tail(&addon_res->list, &dev->addon_resources); + + return addon_res; +} + +struct pci_dev_addon_resource *pci_add_dev_addon_fixed_resource( + struct pci_dev *dev, int start, int size, int flags, + int addr, char *name) +{ + struct pci_dev_addon_resource *addon_res; + struct resource *res; + + addon_res = pci_alloc_dev_addon_resource(dev, addr, name); + if (addon_res) + return NULL; + + res = &addon_res->res; + res->start = start; + res->end = start + size - 1; + res->flags = flags | IORESOURCE_PCI_FIXED; + + dev_printk(KERN_DEBUG, &dev->dev, + "addon fixed resource %s %pR added\n", res->name, res); + + return addon_res; +} + +struct pci_dev_addon_resource *pci_add_dev_addon_resource(struct pci_dev *dev, + int addr, int size, struct resource_ops *ops, char *name) +{ + struct pci_dev_addon_resource *addon_res; + struct resource *res; + + addon_res = pci_alloc_dev_addon_resource(dev, addr, name); + if (!addon_res) + return NULL; + + res = &addon_res->res; + if (ops) { + addon_res->ops = ops; + addon_res->size = size; + ops->read(dev, res, addr); + } else + __pci_read_base(dev, pci_bar_unknown, res, addr); + + dev_printk(KERN_DEBUG, &dev->dev, + "addon resource %s %pR added\n", res->name, res); + + return addon_res; +} + static void pci_release_dev_addon_resource(struct pci_dev *dev) { struct pci_dev_addon_resource *addon_res, *tmp; diff --git a/include/linux/pci.h b/include/linux/pci.h index c337c51..243226c 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -394,6 +394,11 @@ struct pci_dev_addon_resource { struct resource *pci_dev_resource_n(struct pci_dev *dev, int n); int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res); +struct pci_dev_addon_resource *pci_add_dev_addon_fixed_resource( + struct pci_dev *dev, int start, int size, int flags, + int addr, char *name); +struct pci_dev_addon_resource *pci_add_dev_addon_resource(struct pci_dev *dev, + int addr, int size, struct resource_ops *ops, char *name); #define PCI_STD_RES (1<<0) #define PCI_ROM_RES (1<<1)