linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: msalter@redhat.com (Mark Salter)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V3 20/21] pci, acpi: Match PCI config space accessors against platfrom specific quirks.
Date: Thu, 14 Jan 2016 10:36:16 -0500	[thread overview]
Message-ID: <1452785776.28109.22.camel@redhat.com> (raw)
In-Reply-To: <1452691267-32240-21-git-send-email-tn@semihalf.com>

On Wed, 2016-01-13 at 14:21 +0100, Tomasz Nowicki wrote:
> Some platforms may not be fully compliant with generic set of PCI config
> accessors. For these cases we implement the way to overwrite accessors
> set prior to PCI buses enumeration. Algorithm traverses available quirk
> list, matches against <platform ID (DMI), domain, bus number> tuple and
> returns corresponding accessors. All quirks can be defined using:
> DECLARE_ACPI_MCFG_FIXUP() and keep self contained. Example,
> 
> static const struct dmi_system_id foo_dmi[] = {
> ????????{
> ????????????????.ident = "<Platform ident string>",
> ????????????????.callback = <handler>,
> ????????????????.matches = {
> ????????????????????????DMI_MATCH(DMI_SYS_VENDOR, "<system vendor>"),
> ????????????????????????DMI_MATCH(DMI_PRODUCT_NAME, "<product name>"),
> ????????????????????????DMI_MATCH(DMI_PRODUCT_VERSION, "product version"),
> ????????????????},
> ????????},
> ????????{ }
> };
> 
> static struct pci_ops foo_ecam_pci_ops = {
> ????????.map_bus = pci_mcfg_dev_base,
> ????????.read = foo_ecam_config_read,
> ????????.write = foo_ecam_config_write,
> };
> DECLARE_ACPI_MCFG_FIXUP(foo_dmi, NULL, &foo_ecam_pci_ops, <domain_nr>, <bus_nr>);
> 
> More custom (non-DMI) matching can be done via an alternative call.
> Note that there is possibility to assign quirk related private data to
> root->sysdata which will be available along read/wriate accessor, example:
> 
> static int boo_match(struct pci_mcfg_fixup *fixup, struct acpi_pci_root *root)
> {
> ????????return [condition] ? 1 : 0;
> }
> 
> int boo_ecam_config_read(struct pci_bus *bus, unsigned int devfn,
> ??????????????????????????int where, int size, u32 *val)
> {
> ????????struct acpi_pci_root *root = bus->sysdata;
> ????????struct boo_priv_data *boo_data = root->sysdata;
> 
> ????????[..]
> }
> 
> static struct pci_ops boo_ecam_pci_ops = {
> 	.map_bus = pci_mcfg_dev_base,
> 	.read = boo_ecam_config_read,
> 	.write = boo_ecam_config_write,
> };
> DECLARE_ACPI_MCFG_FIXUP(NULL, boo_match, &boo_ecam_pci_ops, <domain_nr>, <bus_nr>);
> 
> Signed-off-by: Tomasz Nowicki <tn@semihalf.com>
> ---
> ?drivers/acpi/mcfg.c???????????????| 33 +++++++++++++++++++++++++++++++--
> ?include/acpi/acpi_bus.h???????????|??1 +
> ?include/asm-generic/vmlinux.lds.h |??7 +++++++
> ?include/linux/ecam.h??????????????| 18 ++++++++++++++++++
> ?4 files changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/acpi/mcfg.c b/drivers/acpi/mcfg.c
> index dfc2d14..ec5fe7b 100644
> --- a/drivers/acpi/mcfg.c
> +++ b/drivers/acpi/mcfg.c
> @@ -8,6 +8,7 @@
> ? */
> ?
> ?#include <linux/acpi.h>
> +#include <linux/dmi.h>
> ?#include <linux/ecam.h>
> ?#include <linux/pci.h>
> ?#include <linux/pci-acpi.h>
> @@ -34,6 +35,29 @@ int __weak raw_pci_write(unsigned int domain, unsigned int bus,
> ?	return PCIBIOS_DEVICE_NOT_FOUND;
> ?}
> ?
> +extern struct pci_mcfg_fixup __start_acpi_mcfg_fixups[];
> +extern struct pci_mcfg_fixup __end_acpi_mcfg_fixups[];
> +
> +static struct pci_ops *pci_mcfg_check_quirks(struct acpi_pci_root *root)
> +{
> +	struct pci_mcfg_fixup *f;
> +	int bus_num = root->secondary.start;
> +	int domain = root->segment;
> +
> +	/*
> +	?* First match against PCI topology <domain:bus> then use DMI or
> +	?* custom match handler.
> +	?*/
> +	for (f = __start_acpi_mcfg_fixups; f < __end_acpi_mcfg_fixups; f++) {
> +		if ((f->domain == domain || f->domain == PCI_MCFG_DOMAIN_ANY) &&
> +		????(f->bus_num == bus_num || f->bus_num == PCI_MCFG_BUS_ANY) &&
> +		????(f->system ? dmi_check_system(f->system) : 0 ||
> +		?????f->match ? f->match(f, root) : 0))
> +			return f->ops;

I think this would be better as:

		????(f->system ? dmi_check_system(f->system) : 1 &&
		?????f->match ? f->match(f, root) : 1))
			return f->ops;

Otherwise, one has to call dmi_check_system() from f->match() if
access to root is needed.
??
> +	}
> +	return NULL;
> +}
> +
> ?void __iomem *
> ?pci_mcfg_dev_base(struct pci_bus *bus, unsigned int devfn, int offset)
> ?{
> @@ -56,10 +80,15 @@ static struct pci_ops default_pci_mcfg_ops = {
> ?
> ?struct pci_ops *pci_mcfg_get_ops(struct acpi_pci_root *root)
> ?{
> +	struct pci_ops *pci_mcfg_ops_quirk;
> +
> ?	/*
> -	?* TODO: Match against platform specific quirks and return
> -	?* corresponding PCI config space accessor set.
> +	?* Match against platform specific quirks and return corresponding
> +	?* PCI config space accessor set.
> ?	?*/
> +	pci_mcfg_ops_quirk = pci_mcfg_check_quirks(root);
> +	if (pci_mcfg_ops_quirk)
> +		return pci_mcfg_ops_quirk;
> ?
> ?	return &default_pci_mcfg_ops;
> ?}
> diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> index ad0a5ff..ea4d2b5 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -554,6 +554,7 @@ struct acpi_pci_root {
> ?	struct pci_bus *bus;
> ?	u16 segment;
> ?	struct resource secondary;	/* downstream bus range */
> +	void *sysdata;
> ?
> ?	u32 osc_support_set;	/* _OSC state of support bits */
> ?	u32 osc_control_set;	/* _OSC state of control bits */
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index c4bd0e2..c93fc97 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -298,6 +298,13 @@
> ?		VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .;	\
> ?	}								\
> ?									\
> +	/* ACPI MCFG quirks */						\
> +	.acpi_fixup????????: AT(ADDR(.acpi_fixup) - LOAD_OFFSET) {	\
> +		VMLINUX_SYMBOL(__start_acpi_mcfg_fixups) = .;		\
> +		*(.acpi_fixup_mcfg)					\
> +		VMLINUX_SYMBOL(__end_acpi_mcfg_fixups) = .;		\
> +	}								\
> +									\
> ?	/* Built-in firmware blobs */					\
> ?	.builtin_fw????????: AT(ADDR(.builtin_fw) - LOAD_OFFSET) {	\
> ?		VMLINUX_SYMBOL(__start_builtin_fw) = .;			\
> diff --git a/include/linux/ecam.h b/include/linux/ecam.h
> index e0f322e..21215be 100644
> --- a/include/linux/ecam.h
> +++ b/include/linux/ecam.h
> @@ -20,6 +20,24 @@ struct pci_mmcfg_region {
> ?	bool hot_added;
> ?};
> ?
> +struct pci_mcfg_fixup {
> +	const struct dmi_system_id *system;
> +	int (*match)(struct pci_mcfg_fixup *, struct acpi_pci_root *);
> +	struct pci_ops *ops;
> +	int domain;
> +	int bus_num;
> +};
> +
> +#define PCI_MCFG_DOMAIN_ANY	-1
> +#define PCI_MCFG_BUS_ANY	-1
> +
> +/* Designate a routine to fix up buggy MCFG */
> +#define DECLARE_ACPI_MCFG_FIXUP(system, match, ops, dom, bus)		\
> +	static const struct pci_mcfg_fixup __mcfg_fixup_##system##dom##bus\
> +	?__used	__attribute__((__section__(".acpi_fixup_mcfg"),		\
> +				aligned((sizeof(void *))))) =		\
> +	{ system, match, ops, dom, bus };
> +
> ?struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus);
> ?struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start,
> ?						???int end, u64 addr);

  reply	other threads:[~2016-01-14 15:36 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-13 13:20 [PATCH V3 00/21] MMCONFIG refactoring and support for ARM64 PCI hostbridge init based on ACPI Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 01/21] x86, pci: Reorder logic of pci_mmconfig_insert() function Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 02/21] x86, pci, acpi: Move arch-agnostic MMCONFIG (aka ECAM) and ACPI code out of arch/x86/ directory Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 03/21] pci, acpi, mcfg: Provide generic implementation of MCFG code initialization Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 04/21] x86, pci: mmconfig_{32, 64}.c code refactoring - remove code duplication Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 05/21] x86, pci, ecam: mmconfig_64.c becomes default implementation for ECAM driver Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 06/21] XEN / PCI: Remove the dependence on arch x86 when PCI_MMCONFIG=y Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 07/21] pci, acpi, mcfg: Provide default RAW ACPI PCI config space accessors Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 08/21] arm64, acpi: Use empty PCI config space accessors from mcfg.c file Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 09/21] pci, acpi, ecam: Add flag to indicate whether ECAM region was hot added or not Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 10/21] x86, pci: Cleanup platform specific MCFG data using previously added ECAM hot_added flag Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 11/21] pci, acpi: Move ACPI host bridge device companion assignment to core code Tomasz Nowicki
2016-01-19 16:02   ` Lorenzo Pieralisi
2016-01-20 11:20     ` Tomasz Nowicki
2016-01-20 12:38       ` Lorenzo Pieralisi
2016-01-20 13:40         ` Tomasz Nowicki
2016-01-20 14:22           ` Lorenzo Pieralisi
2016-01-20 14:41             ` Tomasz Nowicki
2016-01-27 17:42               ` Lorenzo Pieralisi
2016-01-13 13:20 ` [PATCH V3 12/21] x86, ia64, pci: Remove ACPI companion device from platform specific data Tomasz Nowicki
2016-01-13 13:20 ` [PATCH V3 13/21] pci, acpi: Provide generic way to assign bus domain number Tomasz Nowicki
2016-01-21 18:22   ` Lorenzo Pieralisi
2016-01-21 18:38     ` Tomasz Nowicki
2016-01-22 11:25       ` Lorenzo Pieralisi
2016-01-13 13:21 ` [PATCH V3 14/21] x86, ia64: Include acpi_pci_{add|remove}_bus to the default pcibios_{add|remove}_bus implementation Tomasz Nowicki
2016-01-14 16:33   ` Lorenzo Pieralisi
2016-01-14 17:45     ` Tomasz Nowicki
2016-01-13 13:21 ` [PATCH V3 15/21] acpi, mcfg: Implement two calls that might be used to inject/remove MCFG region Tomasz Nowicki
2016-01-13 13:21 ` [PATCH V3 16/21] x86, acpi, pci: Use equivalent function introduced in previous patch Tomasz Nowicki
2016-01-13 13:21 ` [PATCH V3 17/21] acpi, mcfg: Add default PCI config accessors implementation and initial support for related quirks Tomasz Nowicki
2016-01-13 13:21 ` [PATCH V3 18/21] ACPI, PCI: Refine the way to handle translation_offset for ACPI resources Tomasz Nowicki
2016-01-14 12:13   ` Lorenzo Pieralisi
2016-01-19 12:20   ` Lorenzo Pieralisi
2016-01-25  9:52     ` Lorenzo Pieralisi
2016-01-25 16:57       ` Mark Salter
2016-01-28 10:23     ` Hanjun Guo
2016-01-13 13:21 ` [PATCH V3 19/21] pci, acpi: Support for ACPI based generic PCI host controller init Tomasz Nowicki
2016-01-15  9:57   ` Hanjun Guo
2016-01-18  9:57     ` Tomasz Nowicki
2016-01-18  9:25   ` liudongdong (C)
2016-01-18 10:34     ` Tomasz Nowicki
2016-01-19 11:58   ` Lorenzo Pieralisi
2016-01-20 15:01     ` Tomasz Nowicki
2016-01-13 13:21 ` [PATCH V3 20/21] pci, acpi: Match PCI config space accessors against platfrom specific quirks Tomasz Nowicki
2016-01-14 15:36   ` Mark Salter [this message]
2016-01-18 12:41     ` Tomasz Nowicki
2016-01-19  1:49       ` liudongdong (C)
2016-01-19  7:55         ` Tomasz Nowicki
2016-01-19  8:52           ` liudongdong (C)
2016-01-13 13:21 ` [PATCH V3 21/21] arm64, pci, acpi: Start using ACPI based PCI host bridge driver for ARM64 Tomasz Nowicki
2016-01-13 15:24 ` [PATCH V3 00/21] MMCONFIG refactoring and support for ARM64 PCI hostbridge init based on ACPI Sinan Kaya
2016-01-13 15:27   ` Tomasz Nowicki
2016-01-14 13:44 ` Graeme Gregory
2016-01-14 14:00   ` Catalin Marinas
2016-01-14 14:09     ` Mark Salter
2016-01-14 14:50       ` Catalin Marinas
2016-01-14 14:59         ` Mark Salter
2016-01-14 14:01   ` Mark Salter
2016-01-14 14:15     ` Graeme Gregory
2016-01-14 14:24       ` Mark Salter
2016-01-15 12:12         ` Graeme Gregory
2016-01-18 14:04           ` Graeme Gregory
2016-01-19 20:25             ` Bjorn Helgaas
2016-01-19 20:40               ` Russell King - ARM Linux
2016-01-19 23:37                 ` Mark Salter
2016-01-14 15:29 ` Mark Salter
2016-01-14 15:38   ` Sinan Kaya
2016-01-14 16:12     ` Lorenzo Pieralisi
2016-01-14 16:38       ` Mark Salter
2016-01-14 17:07         ` Lorenzo Pieralisi
2016-01-14 17:32           ` Mark Salter
2016-01-14 17:59             ` Lorenzo Pieralisi
2016-01-14 18:44               ` Mark Salter
2016-01-14 22:51   ` Jeremy Linton
2016-01-14 22:55 ` Jeremy Linton
2016-01-15 11:00 ` Hanjun Guo
2016-01-18 14:37   ` Hanjun Guo
2016-01-29  6:43 ` liudongdong (C)
2016-02-01 19:58 ` Duc Dang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1452785776.28109.22.camel@redhat.com \
    --to=msalter@redhat.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).