Commit 3eb85368 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpi-pci'

* acpi-pci:
  ACPI: Make PCI slot detection driver depend on PCI
  ACPI/IORT: Stub out ACS functions when CONFIG_PCI is not set
  arm64: select ACPI PCI code only when both features are enabled
  PCI/ACPI: Allow ACPI to be built without CONFIG_PCI set
  ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is unset
  ACPI: Allow CONFIG_PCI to be unset for reboot
  ACPI: Move PCI reset to a separate function
parents 4cd9da8a 5c6a1177
...@@ -5,7 +5,7 @@ config ARM64 ...@@ -5,7 +5,7 @@ config ARM64
select ACPI_GTDT if ACPI select ACPI_GTDT if ACPI
select ACPI_IORT if ACPI select ACPI_IORT if ACPI
select ACPI_REDUCED_HARDWARE_ONLY if ACPI select ACPI_REDUCED_HARDWARE_ONLY if ACPI
select ACPI_MCFG if ACPI select ACPI_MCFG if (ACPI && PCI)
select ACPI_SPCR_TABLE if ACPI select ACPI_SPCR_TABLE if ACPI
select ACPI_PPTT if ACPI select ACPI_PPTT if ACPI
select ARCH_CLOCKSOURCE_DATA select ARCH_CLOCKSOURCE_DATA
...@@ -163,7 +163,7 @@ config ARM64 ...@@ -163,7 +163,7 @@ config ARM64
select OF select OF
select OF_EARLY_FLATTREE select OF_EARLY_FLATTREE
select OF_RESERVED_MEM select OF_RESERVED_MEM
select PCI_ECAM if ACPI select PCI_ECAM if (ACPI && PCI)
select POWER_RESET select POWER_RESET
select POWER_SUPPLY select POWER_SUPPLY
select REFCOUNT_FULL select REFCOUNT_FULL
......
...@@ -121,7 +121,14 @@ extern void __init dmi_check_pciprobe(void); ...@@ -121,7 +121,14 @@ extern void __init dmi_check_pciprobe(void);
extern void __init dmi_check_skip_isa_align(void); extern void __init dmi_check_skip_isa_align(void);
/* some common used subsys_initcalls */ /* some common used subsys_initcalls */
#ifdef CONFIG_PCI
extern int __init pci_acpi_init(void); extern int __init pci_acpi_init(void);
#else
static inline int __init pci_acpi_init(void)
{
return -EINVAL;
}
#endif
extern void __init pcibios_irq_init(void); extern void __init pcibios_irq_init(void);
extern int __init pcibios_init(void); extern int __init pcibios_init(void);
extern int pci_legacy_init(void); extern int pci_legacy_init(void);
......
...@@ -9,7 +9,6 @@ config ARCH_SUPPORTS_ACPI ...@@ -9,7 +9,6 @@ config ARCH_SUPPORTS_ACPI
menuconfig ACPI menuconfig ACPI
bool "ACPI (Advanced Configuration and Power Interface) Support" bool "ACPI (Advanced Configuration and Power Interface) Support"
depends on ARCH_SUPPORTS_ACPI depends on ARCH_SUPPORTS_ACPI
depends on PCI
select PNP select PNP
default y if X86 default y if X86
help help
...@@ -370,7 +369,7 @@ config ACPI_DEBUG ...@@ -370,7 +369,7 @@ config ACPI_DEBUG
config ACPI_PCI_SLOT config ACPI_PCI_SLOT
bool "PCI slot detection driver" bool "PCI slot detection driver"
depends on SYSFS depends on SYSFS && PCI
help help
This driver creates entries in /sys/bus/pci/slots/ for all PCI This driver creates entries in /sys/bus/pci/slots/ for all PCI
slots in the system. This can help correlate PCI bus addresses, slots in the system. This can help correlate PCI bus addresses,
......
...@@ -39,7 +39,7 @@ acpi-y += processor_core.o ...@@ -39,7 +39,7 @@ acpi-y += processor_core.o
acpi-$(CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC) += processor_pdc.o acpi-$(CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC) += processor_pdc.o
acpi-y += ec.o acpi-y += ec.o
acpi-$(CONFIG_ACPI_DOCK) += dock.o acpi-$(CONFIG_ACPI_DOCK) += dock.o
acpi-y += pci_root.o pci_link.o pci_irq.o acpi-$(CONFIG_PCI) += pci_root.o pci_link.o pci_irq.o
obj-$(CONFIG_ACPI_MCFG) += pci_mcfg.o obj-$(CONFIG_ACPI_MCFG) += pci_mcfg.o
acpi-y += acpi_lpss.o acpi_apd.o acpi-y += acpi_lpss.o acpi_apd.o
acpi-y += acpi_platform.o acpi-y += acpi_platform.o
......
...@@ -77,13 +77,13 @@ acpi-y += \ ...@@ -77,13 +77,13 @@ acpi-y += \
hwacpi.o \ hwacpi.o \
hwesleep.o \ hwesleep.o \
hwgpe.o \ hwgpe.o \
hwpci.o \
hwregs.o \ hwregs.o \
hwsleep.o \ hwsleep.o \
hwvalid.o \ hwvalid.o \
hwxface.o \ hwxface.o \
hwxfsleep.o hwxfsleep.o
acpi-$(CONFIG_PCI) += hwpci.o
acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o
acpi-y += \ acpi-y += \
......
...@@ -106,11 +106,20 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, ...@@ -106,11 +106,20 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
struct acpi_gpe_block_info *gpe_block, struct acpi_gpe_block_info *gpe_block,
void *context); void *context);
#ifdef ACPI_PCI_CONFIGURED
/* /*
* hwpci - PCI configuration support * hwpci - PCI configuration support
*/ */
acpi_status acpi_status
acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id, acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id,
acpi_handle root_pci_device, acpi_handle pci_region); acpi_handle root_pci_device, acpi_handle pci_region);
#else
static inline acpi_status
acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id, acpi_handle root_pci_device,
acpi_handle pci_region)
{
return AE_SUPPORT;
}
#endif
#endif /* __ACHWARE_H__ */ #endif /* __ACHWARE_H__ */
...@@ -364,25 +364,25 @@ acpi_ev_install_space_handler(struct acpi_namespace_node *node, ...@@ -364,25 +364,25 @@ acpi_ev_install_space_handler(struct acpi_namespace_node *node,
handler = acpi_ex_system_io_space_handler; handler = acpi_ex_system_io_space_handler;
setup = acpi_ev_io_space_region_setup; setup = acpi_ev_io_space_region_setup;
break; break;
#ifdef ACPI_PCI_CONFIGURED
case ACPI_ADR_SPACE_PCI_CONFIG: case ACPI_ADR_SPACE_PCI_CONFIG:
handler = acpi_ex_pci_config_space_handler; handler = acpi_ex_pci_config_space_handler;
setup = acpi_ev_pci_config_region_setup; setup = acpi_ev_pci_config_region_setup;
break; break;
#endif
case ACPI_ADR_SPACE_CMOS: case ACPI_ADR_SPACE_CMOS:
handler = acpi_ex_cmos_space_handler; handler = acpi_ex_cmos_space_handler;
setup = acpi_ev_cmos_region_setup; setup = acpi_ev_cmos_region_setup;
break; break;
#ifdef ACPI_PCI_CONFIGURED
case ACPI_ADR_SPACE_PCI_BAR_TARGET: case ACPI_ADR_SPACE_PCI_BAR_TARGET:
handler = acpi_ex_pci_bar_space_handler; handler = acpi_ex_pci_bar_space_handler;
setup = acpi_ev_pci_bar_region_setup; setup = acpi_ev_pci_bar_region_setup;
break; break;
#endif
case ACPI_ADR_SPACE_DATA_TABLE: case ACPI_ADR_SPACE_DATA_TABLE:
handler = acpi_ex_data_table_space_handler; handler = acpi_ex_data_table_space_handler;
......
...@@ -311,6 +311,7 @@ acpi_ex_system_io_space_handler(u32 function, ...@@ -311,6 +311,7 @@ acpi_ex_system_io_space_handler(u32 function,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
#ifdef ACPI_PCI_CONFIGURED
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ex_pci_config_space_handler * FUNCTION: acpi_ex_pci_config_space_handler
...@@ -387,6 +388,7 @@ acpi_ex_pci_config_space_handler(u32 function, ...@@ -387,6 +388,7 @@ acpi_ex_pci_config_space_handler(u32 function,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
#endif
/******************************************************************************* /*******************************************************************************
* *
...@@ -420,6 +422,7 @@ acpi_ex_cmos_space_handler(u32 function, ...@@ -420,6 +422,7 @@ acpi_ex_cmos_space_handler(u32 function,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
#ifdef ACPI_PCI_CONFIGURED
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ex_pci_bar_space_handler * FUNCTION: acpi_ex_pci_bar_space_handler
...@@ -451,6 +454,7 @@ acpi_ex_pci_bar_space_handler(u32 function, ...@@ -451,6 +454,7 @@ acpi_ex_pci_bar_space_handler(u32 function,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
#endif
/******************************************************************************* /*******************************************************************************
* *
......
...@@ -1435,8 +1435,14 @@ static int __init iort_add_platform_device(struct acpi_iort_node *node, ...@@ -1435,8 +1435,14 @@ static int __init iort_add_platform_device(struct acpi_iort_node *node,
return ret; return ret;
} }
static bool __init iort_enable_acs(struct acpi_iort_node *iort_node) #ifdef CONFIG_PCI
static void __init iort_enable_acs(struct acpi_iort_node *iort_node)
{ {
static bool acs_enabled __initdata;
if (acs_enabled)
return;
if (iort_node->type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX) { if (iort_node->type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX) {
struct acpi_iort_node *parent; struct acpi_iort_node *parent;
struct acpi_iort_id_mapping *map; struct acpi_iort_id_mapping *map;
...@@ -1458,13 +1464,15 @@ static bool __init iort_enable_acs(struct acpi_iort_node *iort_node) ...@@ -1458,13 +1464,15 @@ static bool __init iort_enable_acs(struct acpi_iort_node *iort_node)
if ((parent->type == ACPI_IORT_NODE_SMMU) || if ((parent->type == ACPI_IORT_NODE_SMMU) ||
(parent->type == ACPI_IORT_NODE_SMMU_V3)) { (parent->type == ACPI_IORT_NODE_SMMU_V3)) {
pci_request_acs(); pci_request_acs();
return true; acs_enabled = true;
return;
} }
} }
} }
return false;
} }
#else
static inline void iort_enable_acs(struct acpi_iort_node *iort_node) { }
#endif
static void __init iort_init_platform_devices(void) static void __init iort_init_platform_devices(void)
{ {
...@@ -1472,7 +1480,6 @@ static void __init iort_init_platform_devices(void) ...@@ -1472,7 +1480,6 @@ static void __init iort_init_platform_devices(void)
struct acpi_table_iort *iort; struct acpi_table_iort *iort;
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode;
int i, ret; int i, ret;
bool acs_enabled = false;
const struct iort_dev_config *ops; const struct iort_dev_config *ops;
/* /*
...@@ -1493,8 +1500,7 @@ static void __init iort_init_platform_devices(void) ...@@ -1493,8 +1500,7 @@ static void __init iort_init_platform_devices(void)
return; return;
} }
if (!acs_enabled) iort_enable_acs(iort_node);
acs_enabled = iort_enable_acs(iort_node);
ops = iort_get_dev_cfg(iort_node); ops = iort_get_dev_cfg(iort_node);
if (ops) { if (ops) {
......
...@@ -25,8 +25,13 @@ int acpi_osi_init(void); ...@@ -25,8 +25,13 @@ int acpi_osi_init(void);
acpi_status acpi_os_initialize1(void); acpi_status acpi_os_initialize1(void);
void init_acpi_device_notify(void); void init_acpi_device_notify(void);
int acpi_scan_init(void); int acpi_scan_init(void);
#ifdef CONFIG_PCI
void acpi_pci_root_init(void); void acpi_pci_root_init(void);
void acpi_pci_link_init(void); void acpi_pci_link_init(void);
#else
static inline void acpi_pci_root_init(void) {}
static inline void acpi_pci_link_init(void) {}
#endif
void acpi_processor_init(void); void acpi_processor_init(void);
void acpi_platform_init(void); void acpi_platform_init(void);
void acpi_pnp_init(void); void acpi_pnp_init(void);
......
...@@ -769,6 +769,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u64 value, u32 width) ...@@ -769,6 +769,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u64 value, u32 width)
return AE_OK; return AE_OK;
} }
#ifdef CONFIG_PCI
acpi_status acpi_status
acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
u64 *value, u32 width) u64 *value, u32 width)
...@@ -827,6 +828,7 @@ acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, ...@@ -827,6 +828,7 @@ acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
return (result ? AE_ERROR : AE_OK); return (result ? AE_ERROR : AE_OK);
} }
#endif
static void acpi_os_execute_deferred(struct work_struct *work) static void acpi_os_execute_deferred(struct work_struct *work)
{ {
......
...@@ -4,11 +4,35 @@ ...@@ -4,11 +4,35 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <acpi/reboot.h> #include <acpi/reboot.h>
#ifdef CONFIG_PCI
static void acpi_pci_reboot(struct acpi_generic_address *rr, u8 reset_value)
{
unsigned int devfn;
struct pci_bus *bus0;
/* The reset register can only live on bus 0. */
bus0 = pci_find_bus(0, 0);
if (!bus0)
return;
/* Form PCI device/function pair. */
devfn = PCI_DEVFN((rr->address >> 32) & 0xffff,
(rr->address >> 16) & 0xffff);
pr_debug("Resetting with ACPI PCI RESET_REG.\n");
/* Write the value that resets us. */
pci_bus_write_config_byte(bus0, devfn,
(rr->address & 0xffff), reset_value);
}
#else
static inline void acpi_pci_reboot(struct acpi_generic_address *rr,
u8 reset_value)
{
pr_warn_once("PCI configuration space access is not supported\n");
}
#endif
void acpi_reboot(void) void acpi_reboot(void)
{ {
struct acpi_generic_address *rr; struct acpi_generic_address *rr;
struct pci_bus *bus0;
unsigned int devfn;
u8 reset_value; u8 reset_value;
if (acpi_disabled) if (acpi_disabled)
...@@ -33,17 +57,7 @@ void acpi_reboot(void) ...@@ -33,17 +57,7 @@ void acpi_reboot(void)
* on a device on bus 0. */ * on a device on bus 0. */
switch (rr->space_id) { switch (rr->space_id) {
case ACPI_ADR_SPACE_PCI_CONFIG: case ACPI_ADR_SPACE_PCI_CONFIG:
/* The reset register can only live on bus 0. */ acpi_pci_reboot(rr, reset_value);
bus0 = pci_find_bus(0, 0);
if (!bus0)
return;
/* Form PCI device/function pair. */
devfn = PCI_DEVFN((rr->address >> 32) & 0xffff,
(rr->address >> 16) & 0xffff);
printk(KERN_DEBUG "Resetting with ACPI PCI RESET_REG.\n");
/* Write the value that resets us. */
pci_bus_write_config_byte(bus0, devfn,
(rr->address & 0xffff), reset_value);
break; break;
case ACPI_ADR_SPACE_SYSTEM_MEMORY: case ACPI_ADR_SPACE_SYSTEM_MEMORY:
......
...@@ -11,6 +11,7 @@ ifdef CONFIG_PCI ...@@ -11,6 +11,7 @@ ifdef CONFIG_PCI
obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_PROC_FS) += proc.o
obj-$(CONFIG_SYSFS) += slot.o obj-$(CONFIG_SYSFS) += slot.o
obj-$(CONFIG_OF) += of.o obj-$(CONFIG_OF) += of.o
obj-$(CONFIG_ACPI) += pci-acpi.o
endif endif
obj-$(CONFIG_PCI_QUIRKS) += quirks.o obj-$(CONFIG_PCI_QUIRKS) += quirks.o
...@@ -20,7 +21,6 @@ obj-$(CONFIG_PCI_MSI) += msi.o ...@@ -20,7 +21,6 @@ obj-$(CONFIG_PCI_MSI) += msi.o
obj-$(CONFIG_PCI_ATS) += ats.o obj-$(CONFIG_PCI_ATS) += ats.o
obj-$(CONFIG_PCI_IOV) += iov.o obj-$(CONFIG_PCI_IOV) += iov.o
obj-$(CONFIG_PCI_BRIDGE_EMUL) += pci-bridge-emul.o obj-$(CONFIG_PCI_BRIDGE_EMUL) += pci-bridge-emul.o
obj-$(CONFIG_ACPI) += pci-acpi.o
obj-$(CONFIG_PCI_LABEL) += pci-label.o obj-$(CONFIG_PCI_LABEL) += pci-label.o
obj-$(CONFIG_X86_INTEL_MID) += pci-mid.o obj-$(CONFIG_X86_INTEL_MID) += pci-mid.o
obj-$(CONFIG_PCI_SYSCALL) += syscall.o obj-$(CONFIG_PCI_SYSCALL) += syscall.o
......
...@@ -88,7 +88,14 @@ int acpi_pci_link_free_irq(acpi_handle handle); ...@@ -88,7 +88,14 @@ int acpi_pci_link_free_irq(acpi_handle handle);
struct pci_bus; struct pci_bus;
#ifdef CONFIG_PCI
struct pci_dev *acpi_get_pci_dev(acpi_handle); struct pci_dev *acpi_get_pci_dev(acpi_handle);
#else
static inline struct pci_dev *acpi_get_pci_dev(acpi_handle handle)
{
return NULL;
}
#endif
/* Arch-defined function to add a bus to the system */ /* Arch-defined function to add a bus to the system */
......
...@@ -33,6 +33,10 @@ ...@@ -33,6 +33,10 @@
/* Kernel specific ACPICA configuration */ /* Kernel specific ACPICA configuration */
#ifdef CONFIG_PCI
#define ACPI_PCI_CONFIGURED
#endif
#ifdef CONFIG_ACPI_REDUCED_HARDWARE_ONLY #ifdef CONFIG_ACPI_REDUCED_HARDWARE_ONLY
#define ACPI_REDUCED_HARDWARE 1 #define ACPI_REDUCED_HARDWARE 1
#endif #endif
......
...@@ -340,7 +340,14 @@ struct pci_dev; ...@@ -340,7 +340,14 @@ struct pci_dev;
int acpi_pci_irq_enable (struct pci_dev *dev); int acpi_pci_irq_enable (struct pci_dev *dev);
void acpi_penalize_isa_irq(int irq, int active); void acpi_penalize_isa_irq(int irq, int active);
bool acpi_isa_irq_available(int irq); bool acpi_isa_irq_available(int irq);
#ifdef CONFIG_PCI
void acpi_penalize_sci_irq(int irq, int trigger, int polarity); void acpi_penalize_sci_irq(int irq, int trigger, int polarity);
#else
static inline void acpi_penalize_sci_irq(int irq, int trigger,
int polarity)
{
}
#endif
void acpi_pci_irq_disable (struct pci_dev *dev); void acpi_pci_irq_disable (struct pci_dev *dev);
extern int ec_read(u8 addr, u8 *val); extern int ec_read(u8 addr, u8 *val);
......
...@@ -1960,7 +1960,11 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev, ...@@ -1960,7 +1960,11 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev,
enum pcie_reset_state state); enum pcie_reset_state state);
int pcibios_add_device(struct pci_dev *dev); int pcibios_add_device(struct pci_dev *dev);
void pcibios_release_device(struct pci_dev *dev); void pcibios_release_device(struct pci_dev *dev);
#ifdef CONFIG_PCI
void pcibios_penalize_isa_irq(int irq, int active); void pcibios_penalize_isa_irq(int irq, int active);
#else
static inline void pcibios_penalize_isa_irq(int irq, int active) {}
#endif
int pcibios_alloc_irq(struct pci_dev *dev); int pcibios_alloc_irq(struct pci_dev *dev);
void pcibios_free_irq(struct pci_dev *dev); void pcibios_free_irq(struct pci_dev *dev);
resource_size_t pcibios_default_alignment(void); resource_size_t pcibios_default_alignment(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment