From patchwork Wed Dec 16 15:16:29 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomasz Nowicki X-Patchwork-Id: 7863051 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.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C496A9F387 for ; Wed, 16 Dec 2015 15:29:20 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D9E6C20382 for ; Wed, 16 Dec 2015 15:29:19 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 154CA2037F for ; Wed, 16 Dec 2015 15:29:19 +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 1a9DzB-0001mz-Mq; Wed, 16 Dec 2015 15:27:25 +0000 Received: from mail-wm0-x22e.google.com ([2a00:1450:400c:c09::22e]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1a9Dqc-0000nL-Mv for linux-arm-kernel@lists.infradead.org; Wed, 16 Dec 2015 15:18:37 +0000 Received: by mail-wm0-x22e.google.com with SMTP id l126so44185002wml.1 for ; Wed, 16 Dec 2015 07:18:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Qa/kQCZjH1BxAQ8EmF98Fbe5AX4p1nBi/i8pjKBjs7A=; b=1TEioWtWm4QsG0Wu8Nk9f/n+wd94LIEU95qKX50nvzI8q3hZFFEbEcASzzQGf5+KAZ aT7Tj2kP8K39aaQYsU6+tBR0hyNJoLWVr31B5JMjaNaiS//sg4QLpix17+joiK/8zeZm rA9GioEDYT28VmhYilDbT3CF50FMJBHY/tiSrkTr4RiWe+nCDOXYKcubclrTrjVg2PyI aOEA/pMS+kjgGJyTVZ+SNb/qnyKWtZFE9F+N3FQK7tIzrnB+6SEdD/3YfYV2S7xEKPGH jpiQa22PfyR4QO+YGdACfR3HC29IazBVFpLd/R3Xoyp6An0Y4HqHj2lV3/be8GUQnPXq WsBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Qa/kQCZjH1BxAQ8EmF98Fbe5AX4p1nBi/i8pjKBjs7A=; b=KfhDdaG6DB0s2VSaITYRj92FNEAcbUTrT+hXRmbbCDcJ/3jh7cc9TMH2qAv6HR61bv SSa+wSRTyD7gTGEvPMUuvEubnPbPinUBb9pBTflnkI9I5GaBhMr9dHOi8wthFrd3VEsR U9pMRcoR6FsXby4S447+SKOuizFZXl7V78netoESdsfb2vvjIMQ/xS8trRzNAE25pM7k ZOawLRQMYWsHa1cooaXuCgI/5grksSsXmonCJM2YpdAXqI1spJufK/UKyr1YREpv185H 0AmsRK3xWNtAgWYSNiQlYWgUipqocf2AubFgZqMtJCIE3VS5a7qs094YqUrRWTPSO7JA vbjg== X-Gm-Message-State: ALoCoQmc4nTzYiTNOhyJavusDwdsRZLZm1anJ6czTn45PupIoMVfvtZHNRDdLFC81XGh7se2HLASZCn8tMHi2EjjKfjZDwbfdw== X-Received: by 10.28.138.6 with SMTP id m6mr12470435wmd.82.1450279093677; Wed, 16 Dec 2015 07:18:13 -0800 (PST) Received: from tn-HP-4.semihalf.local ([80.82.22.190]) by smtp.gmail.com with ESMTPSA id z17sm6438761wjq.1.2015.12.16.07.18.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Dec 2015 07:18:13 -0800 (PST) From: Tomasz Nowicki To: bhelgaas@google.com, arnd@arndb.de, will.deacon@arm.com, catalin.marinas@arm.com, rjw@rjwysocki.net, hanjun.guo@linaro.org, Lorenzo.Pieralisi@arm.com, okaya@codeaurora.org, jiang.liu@linux.intel.com, Stefano.Stabellini@eu.citrix.com Subject: [PATCH V2 19/23] acpi, mcfg: Add default PCI config accessors implementation and initial support for related quirks. Date: Wed, 16 Dec 2015 16:16:29 +0100 Message-Id: <1450278993-12664-20-git-send-email-tn@semihalf.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450278993-12664-1-git-send-email-tn@semihalf.com> References: <1450278993-12664-1-git-send-email-tn@semihalf.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20151216_071835_221485_1855E90A X-CRM114-Status: GOOD ( 13.10 ) X-Spam-Score: -2.6 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jchandra@broadcom.com, jcm@redhat.com, linaro-acpi@lists.linaro.org, linux-pci@vger.kernel.org, Liviu.Dudau@arm.com, ddaney@caviumnetworks.com, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, robert.richter@caviumnetworks.com, Suravee.Suthikulpanit@amd.com, msalter@redhat.com, wangyijing@huawei.com, Tomasz Nowicki , tglx@linutronix.de, mw@semihalf.com, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_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 We use generic accessors from access.c by default. However, we already know platforms that need special handling while accessing to PCI config space. These platforms will need different accessors set matched against platform ID, domain, bus touple. Therefore we are going to add (in future) DECLARE_ACPI_MCFG_FIXUP which will register platform specific custom accessors. For now we let pci_mcfg_get_ops takes domain and bus arguments and left some space for matching algorithm. Signed-off-by: Tomasz Nowicki --- drivers/acpi/mcfg.c | 30 ++++++++++++++++++++++++++++++ include/linux/pci-acpi.h | 8 ++++++++ 2 files changed, 38 insertions(+) diff --git a/drivers/acpi/mcfg.c b/drivers/acpi/mcfg.c index dca4c4e..a9b2231 100644 --- a/drivers/acpi/mcfg.c +++ b/drivers/acpi/mcfg.c @@ -34,6 +34,36 @@ int __weak raw_pci_write(unsigned int domain, unsigned int bus, return PCIBIOS_DEVICE_NOT_FOUND; } +void __iomem * +pci_mcfg_dev_base(struct pci_bus *bus, unsigned int devfn, int offset) +{ + struct pci_mmcfg_region *cfg; + + cfg = pci_mmconfig_lookup(pci_domain_nr(bus), bus->number); + if (cfg && cfg->virt) + return cfg->virt + + (PCI_MMCFG_BUS_OFFSET(bus->number) | (devfn << 12)) + + offset; + return NULL; +} + +/* Default generic PCI config accessors */ +static struct pci_ops default_pci_mcfg_ops = { + .map_bus = pci_mcfg_dev_base, + .read = pci_generic_config_read, + .write = pci_generic_config_write, +}; + +struct pci_ops *pci_mcfg_get_ops(int domain, int bus) +{ + /* + * TODO: Match against platform specific quirks and return + * corresponding PCI config space accessor set. + */ + + return &default_pci_mcfg_ops; +} + int __init acpi_parse_mcfg(struct acpi_table_header *header) { struct acpi_table_mcfg *mcfg; diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index c277415..3790197 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h @@ -82,10 +82,18 @@ void acpi_pci_remove_bus(struct pci_bus *bus); #ifdef CONFIG_PCI_MMCONFIG int pci_mmcfg_setup_map(struct acpi_pci_root_info *ci); void pci_mmcfg_teardown_map(struct acpi_pci_root_info *ci); +struct pci_ops *pci_mcfg_get_ops(int domain, int bus); +void __iomem * +pci_mcfg_dev_base(struct pci_bus *bus, unsigned int devfn, int offset); #else static inline int pci_mmcfg_setup_map(struct acpi_pci_root_info *ci) { return 0; } static inline void pci_mmcfg_teardown_map(struct acpi_pci_root_info *ci) { } +static inline struct pci_ops *pci_mcfg_get_ops(int domain, int bus) +{ return NULL; } +void __iomem * +pci_mcfg_dev_base(struct pci_bus *bus, unsigned int devfn, int offset) +{ return NULL; } #endif #ifdef CONFIG_ACPI_PCI_SLOT