2008-10-23 13:26:29 +08:00
|
|
|
#ifndef _ASM_X86_PCI_H
|
|
|
|
#define _ASM_X86_PCI_H
|
2007-10-13 05:07:23 +08:00
|
|
|
|
|
|
|
#include <linux/mm.h> /* for struct page */
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/slab.h>
|
|
|
|
#include <linux/string.h>
|
2015-05-01 18:46:15 +08:00
|
|
|
#include <linux/scatterlist.h>
|
2007-10-13 05:07:23 +08:00
|
|
|
#include <asm/io.h>
|
2017-04-12 20:25:54 +08:00
|
|
|
#include <asm/pat.h>
|
2010-10-07 04:12:28 +08:00
|
|
|
#include <asm/x86_init.h>
|
2007-10-13 05:07:23 +08:00
|
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
|
|
|
|
struct pci_sysdata {
|
|
|
|
int domain; /* PCI domain */
|
|
|
|
int node; /* NUMA node */
|
ACPI / PCI: Set root bridge ACPI handle in advance
The ACPI handles of PCI root bridges need to be known to
acpi_bind_one(), so that it can create the appropriate
"firmware_node" and "physical_node" files for them, but currently
the way it gets to know those handles is not exactly straightforward
(to put it lightly).
This is how it works, roughly:
1. acpi_bus_scan() finds the handle of a PCI root bridge,
creates a struct acpi_device object for it and passes that
object to acpi_pci_root_add().
2. acpi_pci_root_add() creates a struct acpi_pci_root object,
populates its "device" field with its argument's address
(device->handle is the ACPI handle found in step 1).
3. The struct acpi_pci_root object created in step 2 is passed
to pci_acpi_scan_root() and used to get resources that are
passed to pci_create_root_bus().
4. pci_create_root_bus() creates a struct pci_host_bridge object
and passes its "dev" member to device_register().
5. platform_notify(), which for systems with ACPI is set to
acpi_platform_notify(), is called.
So far, so good. Now it starts to be "interesting".
6. acpi_find_bridge_device() is used to find the ACPI handle of
the given device (which is the PCI root bridge) and executes
acpi_pci_find_root_bridge(), among other things, for the
given device object.
7. acpi_pci_find_root_bridge() uses the name (sic!) of the given
device object to extract the segment and bus numbers of the PCI
root bridge and passes them to acpi_get_pci_rootbridge_handle().
8. acpi_get_pci_rootbridge_handle() browses the list of ACPI PCI
root bridges and finds the one that matches the given segment
and bus numbers. Its handle is then used to initialize the
ACPI handle of the PCI root bridge's device object by
acpi_bind_one(). However, this is *exactly* the ACPI handle we
started with in step 1.
Needless to say, this is quite embarassing, but it may be avoided
thanks to commit f3fd0c8 (ACPI: Allow ACPI handles of devices to be
initialized in advance), which makes it possible to initialize the
ACPI handle of a device before passing it to device_register().
Accordingly, add a new __weak routine, pcibios_root_bridge_prepare(),
defaulting to an empty implementation that can be replaced by the
interested architecutres (x86 and ia64 at the moment) with functions
that will set the root bridge's ACPI handle before its dev member is
passed to device_register(). Make both x86 and ia64 provide such
implementations of pcibios_root_bridge_prepare() and remove
acpi_pci_find_root_bridge() and acpi_get_pci_rootbridge_handle() that
aren't necessary any more.
Included is a fix for breakage on systems with non-ACPI PCI host
bridges from Bjorn Helgaas.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2013-01-10 05:33:37 +08:00
|
|
|
#ifdef CONFIG_ACPI
|
ACPI / driver core: Store an ACPI device pointer in struct acpi_dev_node
Modify struct acpi_dev_node to contain a pointer to struct acpi_device
associated with the given device object (that is, its ACPI companion
device) instead of an ACPI handle corresponding to it. Introduce two
new macros for manipulating that pointer in a CONFIG_ACPI-safe way,
ACPI_COMPANION() and ACPI_COMPANION_SET(), and rework the
ACPI_HANDLE() macro to take the above changes into account.
Drop the ACPI_HANDLE_SET() macro entirely and rework its users to
use ACPI_COMPANION_SET() instead. For some of them who used to
pass the result of acpi_get_child() directly to ACPI_HANDLE_SET()
introduce a helper routine acpi_preset_companion() doing an
equivalent thing.
The main motivation for doing this is that there are things
represented by struct acpi_device objects that don't have valid
ACPI handles (so called fixed ACPI hardware features, such as
power and sleep buttons) and we would like to create platform
device objects for them and "glue" them to their ACPI companions
in the usual way (which currently is impossible due to the
lack of valid ACPI handles). However, there are more reasons
why it may be useful.
First, struct acpi_device pointers allow of much better type checking
than void pointers which are ACPI handles, so it should be more
difficult to write buggy code using modified struct acpi_dev_node
and the new macros. Second, the change should help to reduce (over
time) the number of places in which the result of ACPI_HANDLE() is
passed to acpi_bus_get_device() in order to obtain a pointer to the
struct acpi_device associated with the given "physical" device,
because now that pointer is returned by ACPI_COMPANION() directly.
Finally, the change should make it easier to write generic code that
will build both for CONFIG_ACPI set and unset without adding explicit
compiler directives to it.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com> # on Haswell
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Aaron Lu <aaron.lu@intel.com> # for ATA and SDIO part
2013-11-12 05:41:56 +08:00
|
|
|
struct acpi_device *companion; /* ACPI companion device */
|
ACPI / PCI: Set root bridge ACPI handle in advance
The ACPI handles of PCI root bridges need to be known to
acpi_bind_one(), so that it can create the appropriate
"firmware_node" and "physical_node" files for them, but currently
the way it gets to know those handles is not exactly straightforward
(to put it lightly).
This is how it works, roughly:
1. acpi_bus_scan() finds the handle of a PCI root bridge,
creates a struct acpi_device object for it and passes that
object to acpi_pci_root_add().
2. acpi_pci_root_add() creates a struct acpi_pci_root object,
populates its "device" field with its argument's address
(device->handle is the ACPI handle found in step 1).
3. The struct acpi_pci_root object created in step 2 is passed
to pci_acpi_scan_root() and used to get resources that are
passed to pci_create_root_bus().
4. pci_create_root_bus() creates a struct pci_host_bridge object
and passes its "dev" member to device_register().
5. platform_notify(), which for systems with ACPI is set to
acpi_platform_notify(), is called.
So far, so good. Now it starts to be "interesting".
6. acpi_find_bridge_device() is used to find the ACPI handle of
the given device (which is the PCI root bridge) and executes
acpi_pci_find_root_bridge(), among other things, for the
given device object.
7. acpi_pci_find_root_bridge() uses the name (sic!) of the given
device object to extract the segment and bus numbers of the PCI
root bridge and passes them to acpi_get_pci_rootbridge_handle().
8. acpi_get_pci_rootbridge_handle() browses the list of ACPI PCI
root bridges and finds the one that matches the given segment
and bus numbers. Its handle is then used to initialize the
ACPI handle of the PCI root bridge's device object by
acpi_bind_one(). However, this is *exactly* the ACPI handle we
started with in step 1.
Needless to say, this is quite embarassing, but it may be avoided
thanks to commit f3fd0c8 (ACPI: Allow ACPI handles of devices to be
initialized in advance), which makes it possible to initialize the
ACPI handle of a device before passing it to device_register().
Accordingly, add a new __weak routine, pcibios_root_bridge_prepare(),
defaulting to an empty implementation that can be replaced by the
interested architecutres (x86 and ia64 at the moment) with functions
that will set the root bridge's ACPI handle before its dev member is
passed to device_register(). Make both x86 and ia64 provide such
implementations of pcibios_root_bridge_prepare() and remove
acpi_pci_find_root_bridge() and acpi_get_pci_rootbridge_handle() that
aren't necessary any more.
Included is a fix for breakage on systems with non-ACPI PCI host
bridges from Bjorn Helgaas.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2013-01-10 05:33:37 +08:00
|
|
|
#endif
|
2007-10-13 05:07:23 +08:00
|
|
|
#ifdef CONFIG_X86_64
|
2008-03-23 16:03:04 +08:00
|
|
|
void *iommu; /* IOMMU private data */
|
2007-10-13 05:07:23 +08:00
|
|
|
#endif
|
2016-02-17 05:56:21 +08:00
|
|
|
#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
|
|
|
|
void *fwnode; /* IRQ domain for MSI assignment */
|
|
|
|
#endif
|
2016-09-13 23:05:40 +08:00
|
|
|
#if IS_ENABLED(CONFIG_VMD)
|
|
|
|
bool vmd_domain; /* True if in Intel VMD domain */
|
|
|
|
#endif
|
2007-10-13 05:07:23 +08:00
|
|
|
};
|
|
|
|
|
2008-05-12 21:43:37 +08:00
|
|
|
extern int pci_routeirq;
|
2008-06-11 22:35:14 +08:00
|
|
|
extern int noioapicquirk;
|
2008-07-15 19:48:55 +08:00
|
|
|
extern int noioapicreroute;
|
2008-05-12 21:43:37 +08:00
|
|
|
|
2010-08-18 00:15:24 +08:00
|
|
|
#ifdef CONFIG_PCI
|
|
|
|
|
|
|
|
#ifdef CONFIG_PCI_DOMAINS
|
2007-10-13 05:07:23 +08:00
|
|
|
static inline int pci_domain_nr(struct pci_bus *bus)
|
|
|
|
{
|
|
|
|
struct pci_sysdata *sd = bus->sysdata;
|
2016-02-17 05:56:21 +08:00
|
|
|
|
2007-10-13 05:07:23 +08:00
|
|
|
return sd->domain;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int pci_proc_domain(struct pci_bus *bus)
|
|
|
|
{
|
|
|
|
return pci_domain_nr(bus);
|
|
|
|
}
|
2010-08-18 00:15:24 +08:00
|
|
|
#endif
|
2007-10-13 05:07:23 +08:00
|
|
|
|
2016-02-17 05:56:21 +08:00
|
|
|
#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
|
|
|
|
static inline void *_pci_root_bus_fwnode(struct pci_bus *bus)
|
|
|
|
{
|
|
|
|
struct pci_sysdata *sd = bus->sysdata;
|
|
|
|
|
|
|
|
return sd->fwnode;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define pci_root_bus_fwnode _pci_root_bus_fwnode
|
|
|
|
#endif
|
|
|
|
|
2016-09-13 23:05:40 +08:00
|
|
|
static inline bool is_vmd(struct pci_bus *bus)
|
|
|
|
{
|
|
|
|
#if IS_ENABLED(CONFIG_VMD)
|
|
|
|
struct pci_sysdata *sd = bus->sysdata;
|
|
|
|
|
|
|
|
return sd->vmd_domain;
|
|
|
|
#else
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2007-10-13 05:07:23 +08:00
|
|
|
/* Can be used to override the logic in pci_scan_bus for skipping
|
|
|
|
already-configured bus numbers - to be used for buggy BIOSes
|
|
|
|
or architectures with incomplete PCI setup by the loader */
|
|
|
|
|
|
|
|
extern unsigned int pcibios_assign_all_busses(void);
|
2009-08-29 22:24:51 +08:00
|
|
|
extern int pci_legacy_init(void);
|
2007-10-13 05:07:23 +08:00
|
|
|
#else
|
2017-03-17 05:50:03 +08:00
|
|
|
static inline int pcibios_assign_all_busses(void) { return 0; }
|
2007-10-13 05:07:23 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
extern unsigned long pci_mem_start;
|
|
|
|
#define PCIBIOS_MIN_IO 0x1000
|
|
|
|
#define PCIBIOS_MIN_MEM (pci_mem_start)
|
|
|
|
|
|
|
|
#define PCIBIOS_MIN_CARDBUS_IO 0x4000
|
|
|
|
|
2010-11-17 05:31:26 +08:00
|
|
|
extern int pcibios_enabled;
|
2007-10-13 05:07:23 +08:00
|
|
|
void pcibios_config_init(void);
|
2014-01-29 07:40:36 +08:00
|
|
|
void pcibios_scan_root(int bus);
|
2007-10-13 05:07:23 +08:00
|
|
|
|
|
|
|
void pcibios_set_master(struct pci_dev *dev);
|
|
|
|
struct irq_routing_table *pcibios_get_irq_routing_table(void);
|
|
|
|
int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
|
|
|
|
|
|
|
|
|
|
|
|
#define HAVE_PCI_MMAP
|
2017-04-12 20:25:54 +08:00
|
|
|
#define arch_can_pci_mmap_wc() pat_enabled()
|
2017-04-12 20:26:07 +08:00
|
|
|
#define ARCH_GENERIC_PCI_MMAP_RESOURCE
|
2007-10-13 05:07:23 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_PCI
|
2008-01-30 20:30:16 +08:00
|
|
|
extern void early_quirks(void);
|
|
|
|
#else
|
|
|
|
static inline void early_quirks(void) { }
|
2007-10-13 05:07:23 +08:00
|
|
|
#endif
|
|
|
|
|
2008-12-17 04:17:36 +08:00
|
|
|
extern void pci_iommu_alloc(void);
|
|
|
|
|
2010-10-07 04:12:28 +08:00
|
|
|
#ifdef CONFIG_PCI_MSI
|
|
|
|
/* implemented in arch/x86/kernel/apic/io_apic. */
|
2012-09-26 18:44:38 +08:00
|
|
|
struct msi_desc;
|
2010-10-07 04:12:28 +08:00
|
|
|
int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
|
|
|
|
void native_teardown_msi_irq(unsigned int irq);
|
2013-12-04 13:09:16 +08:00
|
|
|
void native_restore_msi_irqs(struct pci_dev *dev);
|
2010-10-07 04:12:28 +08:00
|
|
|
#else
|
|
|
|
#define native_setup_msi_irqs NULL
|
|
|
|
#define native_teardown_msi_irq NULL
|
|
|
|
#endif
|
2009-01-19 08:31:00 +08:00
|
|
|
|
2009-04-02 21:55:55 +08:00
|
|
|
#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
|
|
|
|
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
2012-10-03 01:01:25 +08:00
|
|
|
#include <asm/pci_64.h>
|
2007-10-13 05:07:23 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* generic pci stuff */
|
|
|
|
#include <asm-generic/pci.h>
|
|
|
|
|
2008-01-30 20:30:38 +08:00
|
|
|
#ifdef CONFIG_NUMA
|
|
|
|
/* Returns the node based on pci bus */
|
2008-12-26 19:53:38 +08:00
|
|
|
static inline int __pcibus_to_node(const struct pci_bus *bus)
|
2008-01-30 20:30:38 +08:00
|
|
|
{
|
2008-12-26 19:53:38 +08:00
|
|
|
const struct pci_sysdata *sd = bus->sysdata;
|
2008-01-30 20:30:38 +08:00
|
|
|
|
|
|
|
return sd->node;
|
|
|
|
}
|
2007-10-13 05:07:23 +08:00
|
|
|
|
2008-12-26 19:53:38 +08:00
|
|
|
static inline const struct cpumask *
|
|
|
|
cpumask_of_pcibus(const struct pci_bus *bus)
|
|
|
|
{
|
2009-09-18 18:41:10 +08:00
|
|
|
int node;
|
|
|
|
|
|
|
|
node = __pcibus_to_node(bus);
|
|
|
|
return (node == -1) ? cpu_online_mask :
|
|
|
|
cpumask_of_node(node);
|
2008-12-26 19:53:38 +08:00
|
|
|
}
|
2008-01-30 20:30:38 +08:00
|
|
|
#endif
|
2007-10-13 05:07:23 +08:00
|
|
|
|
2012-12-06 05:33:26 +08:00
|
|
|
struct pci_setup_rom {
|
|
|
|
struct setup_data data;
|
|
|
|
uint16_t vendor;
|
|
|
|
uint16_t devid;
|
|
|
|
uint64_t pcilen;
|
|
|
|
unsigned long segment;
|
|
|
|
unsigned long bus;
|
|
|
|
unsigned long device;
|
|
|
|
unsigned long function;
|
|
|
|
uint8_t romdata[0];
|
|
|
|
};
|
|
|
|
|
2008-10-23 13:26:29 +08:00
|
|
|
#endif /* _ASM_X86_PCI_H */
|