linux/drivers/acpi
Lv Zheng 2eedd3d839 ACPICA: Events: Enable APIs to allow interrupt/polling adaptive request based GPE handling model
ACPICA commit da9a83e1a845f2d7332bdbc0632466b2595e5424

For acpi_set_gpe()/acpi_enable_gpe(), our target is to purify them to be APIs
that can be used for various GPE handling models, so we need them to be
pure GPE enabling APIs. GPE enabling/disabling has 2 use cases:
1. Driver may permanently enable/disable GPEs according to the usage
   counts.
   1. When upper layers (the users of the driver) submit requests to the
      driver, it means they care about the underlying hardware. GPE need
      to be enabled for the first request submission and disabled for the
      last request completion.
   2. When the GPE is shared between 2+ silicon logics. GPE need to be
      enabled for either silicon logic's driver and disabled when all of
      the drivers are not started.
   For these cases, acpi_enable_gpe()/acpi_disable_gpe() should be used. When
   the usage count is increased from 0 to 1, the GPE is enabled and it is
   disabled when the usage count is decrased from 1 to 0.
2. Driver may temporarily disables the GPE to enter an GPE polling mode and
   wants to re-enable it later.
   1. Prevent GPE storming: when a driver cannot fully solve the condition
      that triggered the GPE in the GPE context, in order not to trigger
      GPE storm, driver has to disable GPE to switch into the polling mode
      and re-enables it in the non interrupt context after the storming
      condition is cleared.
   2. Meet throughput requirement: some IO drivers need to poll hardware
      again and again until nothing indicated instead of just handling once
      for one interruption, this need to be done in the polling mode or the
      IO flood may prevent the GPE handler from returning.
   3. Meet realtime requirement: in order not to block CPU to handle higher
      realtime prioritized GPEs, lower priority GPEs can be handled in the
      polling mode.
   For these cases, acpi_set_gpe() should be used to switch to/from the
   polling mode.

This patch adds unconditional GPE enabling support into acpi_set_gpe() so
that this API can be used by the drivers to switch back from the GPE
polling mode unconditionally.

Originally this function includes GPE clearing logic in it.
First, the GPE clearing is typically used in the GPE handling code to:
1. Acknowledge the GPE when we know there is an edge triggered GPE raised
   and is about to handle it, otherwise the unexpected clearing may lead to
   a GPE loss;
2. Issue actions after we have handled a level triggered GPE, otherwise
   the unexpected clearing may trigger unwanted OSPM actions to the
   hardware (for example, clocking in out-dated write FIFO data).
Thus the GPE clearing is not suitable to be used in the GPE enabling APIs.
Second, the combination of acknowledging and enabling may also not be
expected by the hardware drivers. For GPE clearing, we have a seperate API
acpi_clear_gpe(). There are cases drivers do want the 2 operations to be
split. So splitting these 2 operations could facilitates drivers the
maximum possibilities to achieve success. For a combined one, we already
have acpi_finish_gpe() ready to be invoked.

Given the fact that drivers should complete all outstanding requests before
putting themselves into the sleep states, as this API is executed for
outstanding requests, it should also have nothing to do with the
"RUN"/"WAKE" distinguishing. That's why the acpi_set_gpe(ACPI_GPE_ENABLE)
should not be implemented by acpi_hw_low_set_gpe(ACPI_GPE_CONDITIONAL_ENABLE).

This patch thus converts acpi_set_gpe(ACPI_GPE_ENABLE) into
acpi_hw_low_set_gpe(ACPI_GPE_ENABLE) to achieve a seperate GPE enabling API.
Drivers then are encouraged to use this API when they need to switch
to/from the GPE polling mode.

Note that the acpi_set_gpe()/acpi_finish_gpe() should be first introduced to
Linux using a divergence reduction patch before sending a linuxized version
of this patch. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/da9a83e1
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-02-05 15:34:51 +01:00
..
acpica ACPICA: Events: Enable APIs to allow interrupt/polling adaptive request based GPE handling model 2015-02-05 15:34:51 +01:00
apei Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
pmic ACPI / PMIC: AXP288: support virtual GPIO in ACPI table 2014-11-26 23:32:06 +01:00
ac.c Revert "ACPI / AC: Remove AC's proc directory." 2014-07-07 01:13:46 +02:00
acpi_cmos_rtc.c ACPI / RTC: Fix CMOS RTC opregion handler accesses to wrong addresses 2014-09-08 15:38:41 +02:00
acpi_extlog.c ACPI and power management updates for 3.17-rc1 2014-08-06 20:34:19 -07:00
acpi_ipmi.c ACPI / IPMI: Cleanup coding styles 2013-09-30 19:46:13 +02:00
acpi_lpss.c ACPI / PM: Drop CONFIG_PM_RUNTIME from the ACPI core 2014-12-04 00:50:19 +01:00
acpi_memhotplug.c ACPICA: Resources: Provide common part for struct acpi_resource_address structures. 2015-01-26 16:09:56 +01:00
acpi_pad.c cpumask: factor out show_cpumap into separate helper function 2014-11-07 11:45:00 -08:00
acpi_platform.c ACPI and power management updates for 3.18-rc2 2014-10-24 11:29:31 -07:00
acpi_pnp.c ACPI and power management updates for 3.18-rc1 2014-10-09 16:07:43 -04:00
acpi_processor.c ACPI / processor: Rename acpi_(un)map_lsapic() to acpi_(un)map_cpu() 2015-01-05 23:34:26 +01:00
battery.c ACPI: Add _DEP support to fix battery issue on Asus T100TA 2014-11-24 01:04:55 +01:00
battery.h ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
bgrt.c acpi: bgrt: fix build error due to attribute change 2013-08-22 08:34:39 -07:00
blacklist.c acpi: Remove _OSI(Linux) for ThinkPads 2014-12-04 04:03:55 -08:00
bus.c ACPIPHP / radeon / nouveau: Remove acpi_bus_no_hotplug() 2014-09-15 13:15:34 -06:00
button.c ACPI / button: Do not propagate wakeup-from-suspend events 2014-07-23 00:59:04 +02:00
cm_sbs.c ACPI: Revert "ACPI: Remove CONFIG_ACPI_PROCFS_POWER and cm_sbsc.c" 2014-05-06 01:52:09 +02:00
container.c ACPI / hotplug: Generate online uevents for ACPI containers 2014-09-21 02:58:18 +02:00
custom_method.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
debugfs.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
device_pm.c ACPI / PM: Fix PM initialization for devices that are not present 2015-01-05 22:49:52 +01:00
dock.c ACPI / dock: Drop dock_device_ids[] table 2014-04-07 14:11:35 +02:00
ec_sys.c ACPI / EC: Mark the function acpi_ec_add_debugfs() as static in ec_sys.c 2014-01-06 00:13:22 +01:00
ec.c ACPI / EC: Fix unexpected ec_remove_handlers() invocations 2014-12-15 15:10:23 +01:00
event.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
fan.c ACPI / Fan: Use bus id as the name for non PNP0C0B (Fan) devices 2014-12-11 00:29:02 +01:00
glue.c ACPI / scan: Add bind/unbind callbacks to struct acpi_scan_handler 2014-02-11 00:35:46 +01:00
hed.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
int340x_thermal.c ACPI/int340x_thermal: enumerate INT3401 for Intel SoC DTS thermal driver 2015-01-06 08:17:14 +08:00
internal.h ACPI: Add support for device specific properties 2014-11-04 21:58:21 +01:00
Kconfig Merge branches 'acpi-video' and 'acpi-pmic' 2014-12-08 19:54:45 +01:00
Makefile Merge branches 'acpi-video' and 'acpi-pmic' 2014-12-08 19:54:45 +01:00
numa.c ACPI / numa: Use __weak, not the gcc-specific version 2014-02-03 10:39:43 -07:00
nvs.c ACPI: Clean up acpi_os_map/unmap_memory() to eliminate __iomem. 2014-05-27 18:13:08 +02:00
osl.c ACPI / OSL: Add IRQ handler flushing support in the OSL. 2014-11-11 23:49:09 +01:00
pci_irq.c Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2014-12-19 14:02:02 -08:00
pci_link.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
pci_root.c ACPICA: Resources: Provide common part for struct acpi_resource_address structures. 2015-01-26 16:09:56 +01:00
pci_slot.c ACPI / PCI: Include appropriate header file in pci_slot.c 2014-01-06 00:13:22 +01:00
power.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
proc.c ACPI / proc: remove unneeded NULL check 2014-02-05 01:06:21 +01:00
processor_core.c ACPI / processor: Convert apic_id to phys_id to make it arch agnostic 2015-01-05 23:32:42 +01:00
processor_driver.c ACPI / processor: Make acpi_cpu_soft_notify() process CPU FROZEN events 2014-08-06 22:22:03 +02:00
processor_idle.c Merge branches 'pm-cpufreq' and 'pm-cpuidle' 2014-12-29 21:23:41 +01:00
processor_pdc.c ACPI / processor: Introduce ARCH_MIGHT_HAVE_ACPI_PDC 2014-07-21 13:50:58 +02:00
processor_perflib.c ACPI / processor: use acpi_evaluate_ost() to replace open-coded version 2014-02-21 00:27:47 +01:00
processor_thermal.c ACPI: correct minor typos 2013-12-07 01:38:45 +01:00
processor_throttling.c ACPI / processor: Rework processor throttling with work_on_cpu() 2014-02-27 00:21:05 +01:00
property.c ACPI / property: Drop size_prop from acpi_dev_get_property_reference() 2014-11-05 20:48:06 +01:00
reboot.c Revert "ACPI: ignore FADT reset-reg-sup flag" 2012-04-20 11:19:35 -07:00
resource.c ACPICA: Resources: Provide common part for struct acpi_resource_address structures. 2015-01-26 16:09:56 +01:00
sbs.c ACPI / SBS: Fix check in acpi_ac_get_present() 2014-09-28 01:27:42 +02:00
sbshc.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
sbshc.h
scan.c ACPI / PM: Fix PM initialization for devices that are not present 2015-01-05 22:49:52 +01:00
sleep.c ACPI / sleep: Drain outstanding events after disabling multiple GPEs 2014-12-01 23:51:13 +01:00
sleep.h ACPI: Drop power resources driver 2013-01-17 14:11:06 +01:00
sysfs.c ACPICA: Events: Reduce source code difference for the ACPI_EVENT_FLAG_HANDLE renaming. 2014-10-21 00:39:40 +02:00
tables.c ACPI / table: Always count matched and successfully parsed entries 2014-11-27 02:07:41 +01:00
thermal.c Thermal: move the KELVIN_TO_MILLICELSIUS macro to thermal.h 2014-10-10 13:57:15 +08:00
utils.c Merge branches 'acpi-scan', 'acpi-utils' and 'acpi-pm' 2014-12-18 18:42:56 +01:00
video_detect.c ACPI / video: force vendor backlight on Lenovo Ideapad Z570 2014-09-24 23:09:41 +02:00
video.c ACPI / video: Add disable_native_backlight quirk for Dell XPS15 L521X 2015-01-06 23:34:48 +01:00
wakeup.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00