Merge branch 'topic/soix' into drm-intel-next-queued
Jesse's SOix work required some patches from acpi-next, so pull it in through a topic barnch. Conflicts: drivers/gpu/drm/i915/i915_drv.c drivers/gpu/drm/i915/intel_pm.c Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
commit
5d0cf3d6e0
|
@ -7,19 +7,30 @@ Description:
|
|||
subsystem.
|
||||
|
||||
What: /sys/power/state
|
||||
Date: August 2006
|
||||
Date: May 2014
|
||||
Contact: Rafael J. Wysocki <rjw@rjwysocki.net>
|
||||
Description:
|
||||
The /sys/power/state file controls the system power state.
|
||||
Reading from this file returns what states are supported,
|
||||
which is hard-coded to 'freeze' (Low-Power Idle), 'standby'
|
||||
(Power-On Suspend), 'mem' (Suspend-to-RAM), and 'disk'
|
||||
(Suspend-to-Disk).
|
||||
The /sys/power/state file controls system sleep states.
|
||||
Reading from this file returns the available sleep state
|
||||
labels, which may be "mem", "standby", "freeze" and "disk"
|
||||
(hibernation). The meanings of the first three labels depend on
|
||||
the relative_sleep_states command line argument as follows:
|
||||
1) relative_sleep_states = 1
|
||||
"mem", "standby", "freeze" represent non-hibernation sleep
|
||||
states from the deepest ("mem", always present) to the
|
||||
shallowest ("freeze"). "standby" and "freeze" may or may
|
||||
not be present depending on the capabilities of the
|
||||
platform. "freeze" can only be present if "standby" is
|
||||
present.
|
||||
2) relative_sleep_states = 0 (default)
|
||||
"mem" - "suspend-to-RAM", present if supported.
|
||||
"standby" - "power-on suspend", present if supported.
|
||||
"freeze" - "suspend-to-idle", always present.
|
||||
|
||||
Writing to this file one of these strings causes the system to
|
||||
transition into that state. Please see the file
|
||||
Documentation/power/states.txt for a description of each of
|
||||
these states.
|
||||
transition into the corresponding state, if available. See
|
||||
Documentation/power/states.txt for a description of what
|
||||
"suspend-to-RAM", "power-on suspend" and "suspend-to-idle" mean.
|
||||
|
||||
What: /sys/power/disk
|
||||
Date: September 2006
|
||||
|
|
|
@ -214,6 +214,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
unusable. The "log_buf_len" parameter may be useful
|
||||
if you need to capture more output.
|
||||
|
||||
acpi_force_table_verification [HW,ACPI]
|
||||
Enable table checksum verification during early stage.
|
||||
By default, this is disabled due to x86 early mapping
|
||||
size limitation.
|
||||
|
||||
acpi_irq_balance [HW,ACPI]
|
||||
ACPI will balance active IRQs
|
||||
default in APIC mode
|
||||
|
@ -237,7 +242,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
This feature is enabled by default.
|
||||
This option allows to turn off the feature.
|
||||
|
||||
acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT
|
||||
acpi_no_static_ssdt [HW,ACPI]
|
||||
Disable installation of static SSDTs at early boot time
|
||||
By default, SSDTs contained in the RSDT/XSDT will be
|
||||
installed automatically and they will appear under
|
||||
/sys/firmware/acpi/tables.
|
||||
This option turns off this feature.
|
||||
Note that specifying this option does not affect
|
||||
dynamic table installation which will install SSDT
|
||||
tables to /sys/firmware/acpi/tables/dynamic.
|
||||
|
||||
acpica_no_return_repair [HW, ACPI]
|
||||
Disable AML predefined validation mechanism
|
||||
|
@ -2889,6 +2902,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
[KNL, SMP] Set scheduler's default relax_domain_level.
|
||||
See Documentation/cgroups/cpusets.txt.
|
||||
|
||||
relative_sleep_states=
|
||||
[SUSPEND] Use sleep state labeling where the deepest
|
||||
state available other than hibernation is always "mem".
|
||||
Format: { "0" | "1" }
|
||||
0 -- Traditional sleep state labels.
|
||||
1 -- Relative sleep state labels.
|
||||
|
||||
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
||||
|
||||
reservetop= [X86-32]
|
||||
|
@ -3461,7 +3481,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
the allocated input device; If set to 0, video driver
|
||||
will only send out the event without touching backlight
|
||||
brightness level.
|
||||
default: 1
|
||||
default: 0
|
||||
|
||||
virtio_mmio.device=
|
||||
[VMMIO] Memory mapped virtio (platform) device.
|
||||
|
|
|
@ -2,6 +2,7 @@ Device Power Management
|
|||
|
||||
Copyright (c) 2010-2011 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
|
||||
Copyright (c) 2010 Alan Stern <stern@rowland.harvard.edu>
|
||||
Copyright (c) 2014 Intel Corp., Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
|
||||
|
||||
Most of the code in Linux is device drivers, so most of the Linux power
|
||||
|
@ -326,6 +327,20 @@ the phases are:
|
|||
driver in some way for the upcoming system power transition, but it
|
||||
should not put the device into a low-power state.
|
||||
|
||||
For devices supporting runtime power management, the return value of the
|
||||
prepare callback can be used to indicate to the PM core that it may
|
||||
safely leave the device in runtime suspend (if runtime-suspended
|
||||
already), provided that all of the device's descendants are also left in
|
||||
runtime suspend. Namely, if the prepare callback returns a positive
|
||||
number and that happens for all of the descendants of the device too,
|
||||
and all of them (including the device itself) are runtime-suspended, the
|
||||
PM core will skip the suspend, suspend_late and suspend_noirq suspend
|
||||
phases as well as the resume_noirq, resume_early and resume phases of
|
||||
the following system resume for all of these devices. In that case,
|
||||
the complete callback will be called directly after the prepare callback
|
||||
and is entirely responsible for bringing the device back to the
|
||||
functional state as appropriate.
|
||||
|
||||
2. The suspend methods should quiesce the device to stop it from performing
|
||||
I/O. They also may save the device registers and put it into the
|
||||
appropriate low-power state, depending on the bus type the device is on,
|
||||
|
@ -400,12 +415,23 @@ When resuming from freeze, standby or memory sleep, the phases are:
|
|||
the resume callbacks occur; it's not necessary to wait until the
|
||||
complete phase.
|
||||
|
||||
Moreover, if the preceding prepare callback returned a positive number,
|
||||
the device may have been left in runtime suspend throughout the whole
|
||||
system suspend and resume (the suspend, suspend_late, suspend_noirq
|
||||
phases of system suspend and the resume_noirq, resume_early, resume
|
||||
phases of system resume may have been skipped for it). In that case,
|
||||
the complete callback is entirely responsible for bringing the device
|
||||
back to the functional state after system suspend if necessary. [For
|
||||
example, it may need to queue up a runtime resume request for the device
|
||||
for this purpose.] To check if that is the case, the complete callback
|
||||
can consult the device's power.direct_complete flag. Namely, if that
|
||||
flag is set when the complete callback is being run, it has been called
|
||||
directly after the preceding prepare and special action may be required
|
||||
to make the device work correctly afterward.
|
||||
|
||||
At the end of these phases, drivers should be as functional as they were before
|
||||
suspending: I/O can be performed using DMA and IRQs, and the relevant clocks are
|
||||
gated on. Even if the device was in a low-power state before the system sleep
|
||||
because of runtime power management, afterwards it should be back in its
|
||||
full-power state. There are multiple reasons why it's best to do this; they are
|
||||
discussed in more detail in Documentation/power/runtime_pm.txt.
|
||||
gated on.
|
||||
|
||||
However, the details here may again be platform-specific. For example,
|
||||
some systems support multiple "run" states, and the mode in effect at
|
||||
|
|
|
@ -2,6 +2,7 @@ Runtime Power Management Framework for I/O Devices
|
|||
|
||||
(C) 2009-2011 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
|
||||
(C) 2010 Alan Stern <stern@rowland.harvard.edu>
|
||||
(C) 2014 Intel Corp., Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
|
||||
1. Introduction
|
||||
|
||||
|
@ -444,6 +445,10 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
|
|||
bool pm_runtime_status_suspended(struct device *dev);
|
||||
- return true if the device's runtime PM status is 'suspended'
|
||||
|
||||
bool pm_runtime_suspended_if_enabled(struct device *dev);
|
||||
- return true if the device's runtime PM status is 'suspended' and its
|
||||
'power.disable_depth' field is equal to 1
|
||||
|
||||
void pm_runtime_allow(struct device *dev);
|
||||
- set the power.runtime_auto flag for the device and decrease its usage
|
||||
counter (used by the /sys/devices/.../power/control interface to
|
||||
|
@ -644,6 +649,18 @@ place (in particular, if the system is not waking up from hibernation), it may
|
|||
be more efficient to leave the devices that had been suspended before the system
|
||||
suspend began in the suspended state.
|
||||
|
||||
To this end, the PM core provides a mechanism allowing some coordination between
|
||||
different levels of device hierarchy. Namely, if a system suspend .prepare()
|
||||
callback returns a positive number for a device, that indicates to the PM core
|
||||
that the device appears to be runtime-suspended and its state is fine, so it
|
||||
may be left in runtime suspend provided that all of its descendants are also
|
||||
left in runtime suspend. If that happens, the PM core will not execute any
|
||||
system suspend and resume callbacks for all of those devices, except for the
|
||||
complete callback, which is then entirely responsible for handling the device
|
||||
as appropriate. This only applies to system suspend transitions that are not
|
||||
related to hibernation (see Documentation/power/devices.txt for more
|
||||
information).
|
||||
|
||||
The PM core does its best to reduce the probability of race conditions between
|
||||
the runtime PM and system suspend/resume (and hibernation) callbacks by carrying
|
||||
out the following operations:
|
||||
|
|
|
@ -1,62 +1,87 @@
|
|||
System Power Management Sleep States
|
||||
|
||||
System Power Management States
|
||||
(C) 2014 Intel Corp., Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
|
||||
The kernel supports up to four system sleep states generically, although three
|
||||
of them depend on the platform support code to implement the low-level details
|
||||
for each state.
|
||||
|
||||
The kernel supports four power management states generically, though
|
||||
one is generic and the other three are dependent on platform support
|
||||
code to implement the low-level details for each state.
|
||||
This file describes each state, what they are
|
||||
commonly called, what ACPI state they map to, and what string to write
|
||||
to /sys/power/state to enter that state
|
||||
The states are represented by strings that can be read or written to the
|
||||
/sys/power/state file. Those strings may be "mem", "standby", "freeze" and
|
||||
"disk", where the last one always represents hibernation (Suspend-To-Disk) and
|
||||
the meaning of the remaining ones depends on the relative_sleep_states command
|
||||
line argument.
|
||||
|
||||
state: Freeze / Low-Power Idle
|
||||
For relative_sleep_states=1, the strings "mem", "standby" and "freeze" label the
|
||||
available non-hibernation sleep states from the deepest to the shallowest,
|
||||
respectively. In that case, "mem" is always present in /sys/power/state,
|
||||
because there is at least one non-hibernation sleep state in every system. If
|
||||
the given system supports two non-hibernation sleep states, "standby" is present
|
||||
in /sys/power/state in addition to "mem". If the system supports three
|
||||
non-hibernation sleep states, "freeze" will be present in /sys/power/state in
|
||||
addition to "mem" and "standby".
|
||||
|
||||
For relative_sleep_states=0, which is the default, the following descriptions
|
||||
apply.
|
||||
|
||||
state: Suspend-To-Idle
|
||||
ACPI state: S0
|
||||
String: "freeze"
|
||||
Label: "freeze"
|
||||
|
||||
This state is a generic, pure software, light-weight, low-power state.
|
||||
It allows more energy to be saved relative to idle by freezing user
|
||||
This state is a generic, pure software, light-weight, system sleep state.
|
||||
It allows more energy to be saved relative to runtime idle by freezing user
|
||||
space and putting all I/O devices into low-power states (possibly
|
||||
lower-power than available at run time), such that the processors can
|
||||
spend more time in their idle states.
|
||||
This state can be used for platforms without Standby/Suspend-to-RAM
|
||||
|
||||
This state can be used for platforms without Power-On Suspend/Suspend-to-RAM
|
||||
support, or it can be used in addition to Suspend-to-RAM (memory sleep)
|
||||
to provide reduced resume latency.
|
||||
to provide reduced resume latency. It is always supported.
|
||||
|
||||
|
||||
State: Standby / Power-On Suspend
|
||||
ACPI State: S1
|
||||
String: "standby"
|
||||
Label: "standby"
|
||||
|
||||
This state offers minimal, though real, power savings, while providing
|
||||
a very low-latency transition back to a working system. No operating
|
||||
state is lost (the CPU retains power), so the system easily starts up
|
||||
This state, if supported, offers moderate, though real, power savings, while
|
||||
providing a relatively low-latency transition back to a working system. No
|
||||
operating state is lost (the CPU retains power), so the system easily starts up
|
||||
again where it left off.
|
||||
|
||||
We try to put devices in a low-power state equivalent to D1, which
|
||||
also offers low power savings, but low resume latency. Not all devices
|
||||
support D1, and those that don't are left on.
|
||||
In addition to freezing user space and putting all I/O devices into low-power
|
||||
states, which is done for Suspend-To-Idle too, nonboot CPUs are taken offline
|
||||
and all low-level system functions are suspended during transitions into this
|
||||
state. For this reason, it should allow more energy to be saved relative to
|
||||
Suspend-To-Idle, but the resume latency will generally be greater than for that
|
||||
state.
|
||||
|
||||
|
||||
State: Suspend-to-RAM
|
||||
ACPI State: S3
|
||||
String: "mem"
|
||||
Label: "mem"
|
||||
|
||||
This state offers significant power savings as everything in the
|
||||
system is put into a low-power state, except for memory, which is
|
||||
placed in self-refresh mode to retain its contents.
|
||||
This state, if supported, offers significant power savings as everything in the
|
||||
system is put into a low-power state, except for memory, which should be placed
|
||||
into the self-refresh mode to retain its contents. All of the steps carried out
|
||||
when entering Power-On Suspend are also carried out during transitions to STR.
|
||||
Additional operations may take place depending on the platform capabilities. In
|
||||
particular, on ACPI systems the kernel passes control to the BIOS (platform
|
||||
firmware) as the last step during STR transitions and that usually results in
|
||||
powering down some more low-level components that aren't directly controlled by
|
||||
the kernel.
|
||||
|
||||
System and device state is saved and kept in memory. All devices are
|
||||
suspended and put into D3. In many cases, all peripheral buses lose
|
||||
power when entering STR, so devices must be able to handle the
|
||||
transition back to the On state.
|
||||
System and device state is saved and kept in memory. All devices are suspended
|
||||
and put into low-power states. In many cases, all peripheral buses lose power
|
||||
when entering STR, so devices must be able to handle the transition back to the
|
||||
"on" state.
|
||||
|
||||
For at least ACPI, STR requires some minimal boot-strapping code to
|
||||
resume the system from STR. This may be true on other platforms.
|
||||
For at least ACPI, STR requires some minimal boot-strapping code to resume the
|
||||
system from it. This may be the case on other platforms too.
|
||||
|
||||
|
||||
State: Suspend-to-disk
|
||||
ACPI State: S4
|
||||
String: "disk"
|
||||
Label: "disk"
|
||||
|
||||
This state offers the greatest power savings, and can be used even in
|
||||
the absence of low-level platform support for power management. This
|
||||
|
|
|
@ -220,7 +220,10 @@ Q: After resuming, system is paging heavily, leading to very bad interactivity.
|
|||
|
||||
A: Try running
|
||||
|
||||
cat `cat /proc/[0-9]*/maps | grep / | sed 's:.* /:/:' | sort -u` > /dev/null
|
||||
cat /proc/[0-9]*/maps | grep / | sed 's:.* /:/:' | sort -u | while read file
|
||||
do
|
||||
test -f "$file" && cat "$file" > /dev/null
|
||||
done
|
||||
|
||||
after resume. swapoff -a; swapon -a may also be useful.
|
||||
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* IA64 specific ACPICA environments and implementation
|
||||
*
|
||||
* Copyright (C) 2014, Intel Corporation
|
||||
* Author: Lv Zheng <lv.zheng@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IA64_ACENV_H
|
||||
#define _ASM_IA64_ACENV_H
|
||||
|
||||
#include <asm/intrinsics.h>
|
||||
|
||||
#define COMPILER_DEPENDENT_INT64 long
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned long
|
||||
|
||||
/* Asm macros */
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
static inline int
|
||||
ia64_acpi_acquire_global_lock(unsigned int *lock)
|
||||
{
|
||||
unsigned int old, new, val;
|
||||
do {
|
||||
old = *lock;
|
||||
new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
|
||||
val = ia64_cmpxchg4_acq(lock, new, old);
|
||||
} while (unlikely (val != old));
|
||||
return (new < 3) ? -1 : 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
ia64_acpi_release_global_lock(unsigned int *lock)
|
||||
{
|
||||
unsigned int old, new, val;
|
||||
do {
|
||||
old = *lock;
|
||||
new = old & ~0x3;
|
||||
val = ia64_cmpxchg4_acq(lock, new, old);
|
||||
} while (unlikely (val != old));
|
||||
return old & 0x1;
|
||||
}
|
||||
|
||||
#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = ia64_acpi_acquire_global_lock(&facs->global_lock))
|
||||
|
||||
#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = ia64_acpi_release_global_lock(&facs->global_lock))
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_IA64_ACENV_H */
|
|
@ -34,57 +34,8 @@
|
|||
#include <linux/numa.h>
|
||||
#include <asm/numa.h>
|
||||
|
||||
#define COMPILER_DEPENDENT_INT64 long
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned long
|
||||
|
||||
/*
|
||||
* Calling conventions:
|
||||
*
|
||||
* ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads)
|
||||
* ACPI_EXTERNAL_XFACE - External ACPI interfaces
|
||||
* ACPI_INTERNAL_XFACE - Internal ACPI interfaces
|
||||
* ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces
|
||||
*/
|
||||
#define ACPI_SYSTEM_XFACE
|
||||
#define ACPI_EXTERNAL_XFACE
|
||||
#define ACPI_INTERNAL_XFACE
|
||||
#define ACPI_INTERNAL_VAR_XFACE
|
||||
|
||||
/* Asm macros */
|
||||
|
||||
#define ACPI_FLUSH_CPU_CACHE()
|
||||
|
||||
static inline int
|
||||
ia64_acpi_acquire_global_lock (unsigned int *lock)
|
||||
{
|
||||
unsigned int old, new, val;
|
||||
do {
|
||||
old = *lock;
|
||||
new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
|
||||
val = ia64_cmpxchg4_acq(lock, new, old);
|
||||
} while (unlikely (val != old));
|
||||
return (new < 3) ? -1 : 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
ia64_acpi_release_global_lock (unsigned int *lock)
|
||||
{
|
||||
unsigned int old, new, val;
|
||||
do {
|
||||
old = *lock;
|
||||
new = old & ~0x3;
|
||||
val = ia64_cmpxchg4_acq(lock, new, old);
|
||||
} while (unlikely (val != old));
|
||||
return old & 0x1;
|
||||
}
|
||||
|
||||
#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = ia64_acpi_acquire_global_lock(&facs->global_lock))
|
||||
|
||||
#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = ia64_acpi_release_global_lock(&facs->global_lock))
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
extern int acpi_lapic;
|
||||
#define acpi_disabled 0 /* ACPI always enabled on IA64 */
|
||||
#define acpi_noirq 0 /* ACPI always enabled on IA64 */
|
||||
#define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */
|
||||
|
@ -92,7 +43,6 @@ ia64_acpi_release_global_lock (unsigned int *lock)
|
|||
#endif
|
||||
#define acpi_processor_cstate_check(x) (x) /* no idle limits on IA64 :) */
|
||||
static inline void disable_acpi(void) { }
|
||||
static inline void pci_acpi_crs_quirks(void) { }
|
||||
|
||||
#ifdef CONFIG_IA64_GENERIC
|
||||
const char *acpi_get_sysname (void);
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
|
||||
#define PREFIX "ACPI: "
|
||||
|
||||
int acpi_lapic;
|
||||
unsigned int acpi_cpei_override;
|
||||
unsigned int acpi_cpei_phys_cpuid;
|
||||
|
||||
|
@ -676,6 +677,8 @@ int __init early_acpi_boot_init(void)
|
|||
if (ret < 1)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Error parsing MADT - no LAPIC entries\n");
|
||||
else
|
||||
acpi_lapic = 1;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
if (available_cpus == 0) {
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* X86 specific ACPICA environments and implementation
|
||||
*
|
||||
* Copyright (C) 2014, Intel Corporation
|
||||
* Author: Lv Zheng <lv.zheng@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_X86_ACENV_H
|
||||
#define _ASM_X86_ACENV_H
|
||||
|
||||
#include <asm/special_insns.h>
|
||||
|
||||
/* Asm macros */
|
||||
|
||||
#define ACPI_FLUSH_CPU_CACHE() wbinvd()
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
int __acpi_acquire_global_lock(unsigned int *lock);
|
||||
int __acpi_release_global_lock(unsigned int *lock);
|
||||
|
||||
#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = __acpi_acquire_global_lock(&facs->global_lock))
|
||||
|
||||
#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = __acpi_release_global_lock(&facs->global_lock))
|
||||
|
||||
/*
|
||||
* Math helper asm macros
|
||||
*/
|
||||
#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
|
||||
asm("divl %2;" \
|
||||
: "=a"(q32), "=d"(r32) \
|
||||
: "r"(d32), \
|
||||
"0"(n_lo), "1"(n_hi))
|
||||
|
||||
#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
|
||||
asm("shrl $1,%2 ;" \
|
||||
"rcrl $1,%3;" \
|
||||
: "=r"(n_hi), "=r"(n_lo) \
|
||||
: "0"(n_hi), "1"(n_lo))
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_ACENV_H */
|
|
@ -32,51 +32,6 @@
|
|||
#include <asm/mpspec.h>
|
||||
#include <asm/realmode.h>
|
||||
|
||||
#define COMPILER_DEPENDENT_INT64 long long
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned long long
|
||||
|
||||
/*
|
||||
* Calling conventions:
|
||||
*
|
||||
* ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads)
|
||||
* ACPI_EXTERNAL_XFACE - External ACPI interfaces
|
||||
* ACPI_INTERNAL_XFACE - Internal ACPI interfaces
|
||||
* ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces
|
||||
*/
|
||||
#define ACPI_SYSTEM_XFACE
|
||||
#define ACPI_EXTERNAL_XFACE
|
||||
#define ACPI_INTERNAL_XFACE
|
||||
#define ACPI_INTERNAL_VAR_XFACE
|
||||
|
||||
/* Asm macros */
|
||||
|
||||
#define ACPI_FLUSH_CPU_CACHE() wbinvd()
|
||||
|
||||
int __acpi_acquire_global_lock(unsigned int *lock);
|
||||
int __acpi_release_global_lock(unsigned int *lock);
|
||||
|
||||
#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = __acpi_acquire_global_lock(&facs->global_lock))
|
||||
|
||||
#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq) \
|
||||
((Acq) = __acpi_release_global_lock(&facs->global_lock))
|
||||
|
||||
/*
|
||||
* Math helper asm macros
|
||||
*/
|
||||
#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
|
||||
asm("divl %2;" \
|
||||
: "=a"(q32), "=d"(r32) \
|
||||
: "r"(d32), \
|
||||
"0"(n_lo), "1"(n_hi))
|
||||
|
||||
|
||||
#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
|
||||
asm("shrl $1,%2 ;" \
|
||||
"rcrl $1,%3;" \
|
||||
: "=r"(n_hi), "=r"(n_lo) \
|
||||
: "0"(n_hi), "1"(n_lo))
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
extern int acpi_lapic;
|
||||
extern int acpi_ioapic;
|
||||
|
|
|
@ -39,8 +39,9 @@ acpi-y += processor_core.o
|
|||
acpi-y += ec.o
|
||||
acpi-$(CONFIG_ACPI_DOCK) += dock.o
|
||||
acpi-y += pci_root.o pci_link.o pci_irq.o
|
||||
acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
|
||||
acpi-y += acpi_lpss.o
|
||||
acpi-y += acpi_platform.o
|
||||
acpi-y += acpi_pnp.o
|
||||
acpi-y += power.o
|
||||
acpi-y += event.o
|
||||
acpi-y += sysfs.o
|
||||
|
@ -63,9 +64,9 @@ obj-$(CONFIG_ACPI_FAN) += fan.o
|
|||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
|
||||
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
|
||||
obj-$(CONFIG_ACPI_CONTAINER) += container.o
|
||||
obj-y += container.o
|
||||
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
|
||||
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
|
||||
obj-y += acpi_memhotplug.o
|
||||
obj-$(CONFIG_ACPI_BATTERY) += battery.o
|
||||
obj-$(CONFIG_ACPI_SBS) += sbshc.o
|
||||
obj-$(CONFIG_ACPI_SBS) += sbs.o
|
||||
|
|
|
@ -68,7 +68,7 @@ static int acpi_install_cmos_rtc_space_handler(struct acpi_device *adev,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void acpi_remove_cmos_rtc_space_handler(struct acpi_device *adev)
|
||||
|
|
|
@ -220,13 +220,13 @@ static int __init extlog_init(void)
|
|||
goto err;
|
||||
}
|
||||
|
||||
extlog_l1_hdr = acpi_os_map_memory(l1_dirbase, l1_hdr_size);
|
||||
extlog_l1_hdr = acpi_os_map_iomem(l1_dirbase, l1_hdr_size);
|
||||
l1_head = (struct extlog_l1_head *)extlog_l1_hdr;
|
||||
l1_size = l1_head->total_len;
|
||||
l1_percpu_entry = l1_head->entries;
|
||||
elog_base = l1_head->elog_base;
|
||||
elog_size = l1_head->elog_len;
|
||||
acpi_os_unmap_memory(extlog_l1_hdr, l1_hdr_size);
|
||||
acpi_os_unmap_iomem(extlog_l1_hdr, l1_hdr_size);
|
||||
release_mem_region(l1_dirbase, l1_hdr_size);
|
||||
|
||||
/* remap L1 header again based on completed information */
|
||||
|
@ -237,7 +237,7 @@ static int __init extlog_init(void)
|
|||
(unsigned long long)l1_dirbase + l1_size);
|
||||
goto err;
|
||||
}
|
||||
extlog_l1_addr = acpi_os_map_memory(l1_dirbase, l1_size);
|
||||
extlog_l1_addr = acpi_os_map_iomem(l1_dirbase, l1_size);
|
||||
l1_entry_base = (u64 *)((u8 *)extlog_l1_addr + l1_hdr_size);
|
||||
|
||||
/* remap elog table */
|
||||
|
@ -248,7 +248,7 @@ static int __init extlog_init(void)
|
|||
(unsigned long long)elog_base + elog_size);
|
||||
goto err_release_l1_dir;
|
||||
}
|
||||
elog_addr = acpi_os_map_memory(elog_base, elog_size);
|
||||
elog_addr = acpi_os_map_iomem(elog_base, elog_size);
|
||||
|
||||
rc = -ENOMEM;
|
||||
/* allocate buffer to save elog record */
|
||||
|
@ -270,11 +270,11 @@ static int __init extlog_init(void)
|
|||
|
||||
err_release_elog:
|
||||
if (elog_addr)
|
||||
acpi_os_unmap_memory(elog_addr, elog_size);
|
||||
acpi_os_unmap_iomem(elog_addr, elog_size);
|
||||
release_mem_region(elog_base, elog_size);
|
||||
err_release_l1_dir:
|
||||
if (extlog_l1_addr)
|
||||
acpi_os_unmap_memory(extlog_l1_addr, l1_size);
|
||||
acpi_os_unmap_iomem(extlog_l1_addr, l1_size);
|
||||
release_mem_region(l1_dirbase, l1_size);
|
||||
err:
|
||||
pr_warn(FW_BUG "Extended error log disabled because of problems parsing f/w tables\n");
|
||||
|
@ -287,9 +287,9 @@ static void __exit extlog_exit(void)
|
|||
mce_unregister_decode_chain(&extlog_mce_dec);
|
||||
((struct extlog_l1_head *)extlog_l1_addr)->flags &= ~FLAG_OS_OPTIN;
|
||||
if (extlog_l1_addr)
|
||||
acpi_os_unmap_memory(extlog_l1_addr, l1_size);
|
||||
acpi_os_unmap_iomem(extlog_l1_addr, l1_size);
|
||||
if (elog_addr)
|
||||
acpi_os_unmap_memory(elog_addr, elog_size);
|
||||
acpi_os_unmap_iomem(elog_addr, elog_size);
|
||||
release_mem_region(elog_base, elog_size);
|
||||
release_mem_region(l1_dirbase, l1_size);
|
||||
kfree(elog_buf);
|
||||
|
|
|
@ -19,15 +19,21 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/platform_data/clk-lpss.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
ACPI_MODULE_NAME("acpi_lpss");
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_LPSS
|
||||
|
||||
#define LPSS_ADDR(desc) ((unsigned long)&desc)
|
||||
|
||||
#define LPSS_CLK_SIZE 0x04
|
||||
#define LPSS_LTR_SIZE 0x18
|
||||
|
||||
/* Offsets relative to LPSS_PRIVATE_OFFSET */
|
||||
#define LPSS_CLK_DIVIDER_DEF_MASK (BIT(1) | BIT(16))
|
||||
#define LPSS_GENERAL 0x08
|
||||
#define LPSS_GENERAL_LTR_MODE_SW BIT(2)
|
||||
#define LPSS_GENERAL_UART_RTS_OVRD BIT(3)
|
||||
|
@ -43,6 +49,8 @@ ACPI_MODULE_NAME("acpi_lpss");
|
|||
#define LPSS_TX_INT 0x20
|
||||
#define LPSS_TX_INT_MASK BIT(1)
|
||||
|
||||
#define LPSS_PRV_REG_COUNT 9
|
||||
|
||||
struct lpss_shared_clock {
|
||||
const char *name;
|
||||
unsigned long rate;
|
||||
|
@ -57,7 +65,9 @@ struct lpss_device_desc {
|
|||
bool ltr_required;
|
||||
unsigned int prv_offset;
|
||||
size_t prv_size_override;
|
||||
bool clk_divider;
|
||||
bool clk_gate;
|
||||
bool save_ctx;
|
||||
struct lpss_shared_clock *shared_clock;
|
||||
void (*setup)(struct lpss_private_data *pdata);
|
||||
};
|
||||
|
@ -72,6 +82,7 @@ struct lpss_private_data {
|
|||
resource_size_t mmio_size;
|
||||
struct clk *clk;
|
||||
const struct lpss_device_desc *dev_desc;
|
||||
u32 prv_reg_ctx[LPSS_PRV_REG_COUNT];
|
||||
};
|
||||
|
||||
static void lpss_uart_setup(struct lpss_private_data *pdata)
|
||||
|
@ -89,6 +100,14 @@ static void lpss_uart_setup(struct lpss_private_data *pdata)
|
|||
}
|
||||
|
||||
static struct lpss_device_desc lpt_dev_desc = {
|
||||
.clk_required = true,
|
||||
.prv_offset = 0x800,
|
||||
.ltr_required = true,
|
||||
.clk_divider = true,
|
||||
.clk_gate = true,
|
||||
};
|
||||
|
||||
static struct lpss_device_desc lpt_i2c_dev_desc = {
|
||||
.clk_required = true,
|
||||
.prv_offset = 0x800,
|
||||
.ltr_required = true,
|
||||
|
@ -99,6 +118,7 @@ static struct lpss_device_desc lpt_uart_dev_desc = {
|
|||
.clk_required = true,
|
||||
.prv_offset = 0x800,
|
||||
.ltr_required = true,
|
||||
.clk_divider = true,
|
||||
.clk_gate = true,
|
||||
.setup = lpss_uart_setup,
|
||||
};
|
||||
|
@ -116,32 +136,25 @@ static struct lpss_shared_clock pwm_clock = {
|
|||
|
||||
static struct lpss_device_desc byt_pwm_dev_desc = {
|
||||
.clk_required = true,
|
||||
.save_ctx = true,
|
||||
.shared_clock = &pwm_clock,
|
||||
};
|
||||
|
||||
static struct lpss_shared_clock uart_clock = {
|
||||
.name = "uart_clk",
|
||||
.rate = 44236800,
|
||||
};
|
||||
|
||||
static struct lpss_device_desc byt_uart_dev_desc = {
|
||||
.clk_required = true,
|
||||
.prv_offset = 0x800,
|
||||
.clk_divider = true,
|
||||
.clk_gate = true,
|
||||
.shared_clock = &uart_clock,
|
||||
.save_ctx = true,
|
||||
.setup = lpss_uart_setup,
|
||||
};
|
||||
|
||||
static struct lpss_shared_clock spi_clock = {
|
||||
.name = "spi_clk",
|
||||
.rate = 50000000,
|
||||
};
|
||||
|
||||
static struct lpss_device_desc byt_spi_dev_desc = {
|
||||
.clk_required = true,
|
||||
.prv_offset = 0x400,
|
||||
.clk_divider = true,
|
||||
.clk_gate = true,
|
||||
.shared_clock = &spi_clock,
|
||||
.save_ctx = true,
|
||||
};
|
||||
|
||||
static struct lpss_device_desc byt_sdio_dev_desc = {
|
||||
|
@ -156,43 +169,52 @@ static struct lpss_shared_clock i2c_clock = {
|
|||
static struct lpss_device_desc byt_i2c_dev_desc = {
|
||||
.clk_required = true,
|
||||
.prv_offset = 0x800,
|
||||
.save_ctx = true,
|
||||
.shared_clock = &i2c_clock,
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
#define LPSS_ADDR(desc) (0UL)
|
||||
|
||||
#endif /* CONFIG_X86_INTEL_LPSS */
|
||||
|
||||
static const struct acpi_device_id acpi_lpss_device_ids[] = {
|
||||
/* Generic LPSS devices */
|
||||
{ "INTL9C60", (unsigned long)&lpss_dma_desc },
|
||||
{ "INTL9C60", LPSS_ADDR(lpss_dma_desc) },
|
||||
|
||||
/* Lynxpoint LPSS devices */
|
||||
{ "INT33C0", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT33C1", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT33C2", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT33C3", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT33C4", (unsigned long)&lpt_uart_dev_desc },
|
||||
{ "INT33C5", (unsigned long)&lpt_uart_dev_desc },
|
||||
{ "INT33C6", (unsigned long)&lpt_sdio_dev_desc },
|
||||
{ "INT33C0", LPSS_ADDR(lpt_dev_desc) },
|
||||
{ "INT33C1", LPSS_ADDR(lpt_dev_desc) },
|
||||
{ "INT33C2", LPSS_ADDR(lpt_i2c_dev_desc) },
|
||||
{ "INT33C3", LPSS_ADDR(lpt_i2c_dev_desc) },
|
||||
{ "INT33C4", LPSS_ADDR(lpt_uart_dev_desc) },
|
||||
{ "INT33C5", LPSS_ADDR(lpt_uart_dev_desc) },
|
||||
{ "INT33C6", LPSS_ADDR(lpt_sdio_dev_desc) },
|
||||
{ "INT33C7", },
|
||||
|
||||
/* BayTrail LPSS devices */
|
||||
{ "80860F09", (unsigned long)&byt_pwm_dev_desc },
|
||||
{ "80860F0A", (unsigned long)&byt_uart_dev_desc },
|
||||
{ "80860F0E", (unsigned long)&byt_spi_dev_desc },
|
||||
{ "80860F14", (unsigned long)&byt_sdio_dev_desc },
|
||||
{ "80860F41", (unsigned long)&byt_i2c_dev_desc },
|
||||
{ "80860F09", LPSS_ADDR(byt_pwm_dev_desc) },
|
||||
{ "80860F0A", LPSS_ADDR(byt_uart_dev_desc) },
|
||||
{ "80860F0E", LPSS_ADDR(byt_spi_dev_desc) },
|
||||
{ "80860F14", LPSS_ADDR(byt_sdio_dev_desc) },
|
||||
{ "80860F41", LPSS_ADDR(byt_i2c_dev_desc) },
|
||||
{ "INT33B2", },
|
||||
|
||||
{ "INT3430", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3431", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3432", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3433", (unsigned long)&lpt_dev_desc },
|
||||
{ "INT3434", (unsigned long)&lpt_uart_dev_desc },
|
||||
{ "INT3435", (unsigned long)&lpt_uart_dev_desc },
|
||||
{ "INT3436", (unsigned long)&lpt_sdio_dev_desc },
|
||||
{ "INT3430", LPSS_ADDR(lpt_dev_desc) },
|
||||
{ "INT3431", LPSS_ADDR(lpt_dev_desc) },
|
||||
{ "INT3432", LPSS_ADDR(lpt_i2c_dev_desc) },
|
||||
{ "INT3433", LPSS_ADDR(lpt_i2c_dev_desc) },
|
||||
{ "INT3434", LPSS_ADDR(lpt_uart_dev_desc) },
|
||||
{ "INT3435", LPSS_ADDR(lpt_uart_dev_desc) },
|
||||
{ "INT3436", LPSS_ADDR(lpt_sdio_dev_desc) },
|
||||
{ "INT3437", },
|
||||
|
||||
{ }
|
||||
};
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_LPSS
|
||||
|
||||
static int is_memory(struct acpi_resource *res, void *not_used)
|
||||
{
|
||||
struct resource r;
|
||||
|
@ -212,9 +234,11 @@ static int register_device_clock(struct acpi_device *adev,
|
|||
{
|
||||
const struct lpss_device_desc *dev_desc = pdata->dev_desc;
|
||||
struct lpss_shared_clock *shared_clock = dev_desc->shared_clock;
|
||||
const char *devname = dev_name(&adev->dev);
|
||||
struct clk *clk = ERR_PTR(-ENODEV);
|
||||
struct lpss_clk_data *clk_data;
|
||||
const char *parent;
|
||||
const char *parent, *clk_name;
|
||||
void __iomem *prv_base;
|
||||
|
||||
if (!lpss_clk_dev)
|
||||
lpt_register_clock_device();
|
||||
|
@ -225,7 +249,7 @@ static int register_device_clock(struct acpi_device *adev,
|
|||
|
||||
if (dev_desc->clkdev_name) {
|
||||
clk_register_clkdev(clk_data->clk, dev_desc->clkdev_name,
|
||||
dev_name(&adev->dev));
|
||||
devname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -234,6 +258,7 @@ static int register_device_clock(struct acpi_device *adev,
|
|||
return -ENODATA;
|
||||
|
||||
parent = clk_data->name;
|
||||
prv_base = pdata->mmio_base + dev_desc->prv_offset;
|
||||
|
||||
if (shared_clock) {
|
||||
clk = shared_clock->clk;
|
||||
|
@ -247,16 +272,41 @@ static int register_device_clock(struct acpi_device *adev,
|
|||
}
|
||||
|
||||
if (dev_desc->clk_gate) {
|
||||
clk = clk_register_gate(NULL, dev_name(&adev->dev), parent, 0,
|
||||
pdata->mmio_base + dev_desc->prv_offset,
|
||||
0, 0, NULL);
|
||||
pdata->clk = clk;
|
||||
clk = clk_register_gate(NULL, devname, parent, 0,
|
||||
prv_base, 0, 0, NULL);
|
||||
parent = devname;
|
||||
}
|
||||
|
||||
if (dev_desc->clk_divider) {
|
||||
/* Prevent division by zero */
|
||||
if (!readl(prv_base))
|
||||
writel(LPSS_CLK_DIVIDER_DEF_MASK, prv_base);
|
||||
|
||||
clk_name = kasprintf(GFP_KERNEL, "%s-div", devname);
|
||||
if (!clk_name)
|
||||
return -ENOMEM;
|
||||
clk = clk_register_fractional_divider(NULL, clk_name, parent,
|
||||
0, prv_base,
|
||||
1, 15, 16, 15, 0, NULL);
|
||||
parent = clk_name;
|
||||
|
||||
clk_name = kasprintf(GFP_KERNEL, "%s-update", devname);
|
||||
if (!clk_name) {
|
||||
kfree(parent);
|
||||
return -ENOMEM;
|
||||
}
|
||||
clk = clk_register_gate(NULL, clk_name, parent,
|
||||
CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE,
|
||||
prv_base, 31, 0, NULL);
|
||||
kfree(parent);
|
||||
kfree(clk_name);
|
||||
}
|
||||
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
|
||||
clk_register_clkdev(clk, NULL, dev_name(&adev->dev));
|
||||
pdata->clk = clk;
|
||||
clk_register_clkdev(clk, NULL, devname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -267,12 +317,14 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
struct lpss_private_data *pdata;
|
||||
struct resource_list_entry *rentry;
|
||||
struct list_head resource_list;
|
||||
struct platform_device *pdev;
|
||||
int ret;
|
||||
|
||||
dev_desc = (struct lpss_device_desc *)id->driver_data;
|
||||
if (!dev_desc)
|
||||
return acpi_create_platform_device(adev, id);
|
||||
|
||||
if (!dev_desc) {
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
|
||||
}
|
||||
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
return -ENOMEM;
|
||||
|
@ -322,10 +374,13 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
dev_desc->setup(pdata);
|
||||
|
||||
adev->driver_data = pdata;
|
||||
ret = acpi_create_platform_device(adev, id);
|
||||
if (ret > 0)
|
||||
return ret;
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
if (!IS_ERR_OR_NULL(pdev)) {
|
||||
device_enable_async_suspend(&pdev->dev);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ret = PTR_ERR(pdev);
|
||||
adev->driver_data = NULL;
|
||||
|
||||
err_out:
|
||||
|
@ -449,6 +504,126 @@ static void acpi_lpss_set_ltr(struct device *dev, s32 val)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/**
|
||||
* acpi_lpss_save_ctx() - Save the private registers of LPSS device
|
||||
* @dev: LPSS device
|
||||
*
|
||||
* Most LPSS devices have private registers which may loose their context when
|
||||
* the device is powered down. acpi_lpss_save_ctx() saves those registers into
|
||||
* prv_reg_ctx array.
|
||||
*/
|
||||
static void acpi_lpss_save_ctx(struct device *dev)
|
||||
{
|
||||
struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < LPSS_PRV_REG_COUNT; i++) {
|
||||
unsigned long offset = i * sizeof(u32);
|
||||
|
||||
pdata->prv_reg_ctx[i] = __lpss_reg_read(pdata, offset);
|
||||
dev_dbg(dev, "saving 0x%08x from LPSS reg at offset 0x%02lx\n",
|
||||
pdata->prv_reg_ctx[i], offset);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_lpss_restore_ctx() - Restore the private registers of LPSS device
|
||||
* @dev: LPSS device
|
||||
*
|
||||
* Restores the registers that were previously stored with acpi_lpss_save_ctx().
|
||||
*/
|
||||
static void acpi_lpss_restore_ctx(struct device *dev)
|
||||
{
|
||||
struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* The following delay is needed or the subsequent write operations may
|
||||
* fail. The LPSS devices are actually PCI devices and the PCI spec
|
||||
* expects 10ms delay before the device can be accessed after D3 to D0
|
||||
* transition.
|
||||
*/
|
||||
msleep(10);
|
||||
|
||||
for (i = 0; i < LPSS_PRV_REG_COUNT; i++) {
|
||||
unsigned long offset = i * sizeof(u32);
|
||||
|
||||
__lpss_reg_write(pdata->prv_reg_ctx[i], pdata, offset);
|
||||
dev_dbg(dev, "restoring 0x%08x to LPSS reg at offset 0x%02lx\n",
|
||||
pdata->prv_reg_ctx[i], offset);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int acpi_lpss_suspend_late(struct device *dev)
|
||||
{
|
||||
int ret = pm_generic_suspend_late(dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
acpi_lpss_save_ctx(dev);
|
||||
return acpi_dev_suspend_late(dev);
|
||||
}
|
||||
|
||||
static int acpi_lpss_restore_early(struct device *dev)
|
||||
{
|
||||
int ret = acpi_dev_resume_early(dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
acpi_lpss_restore_ctx(dev);
|
||||
return pm_generic_resume_early(dev);
|
||||
}
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
static int acpi_lpss_runtime_suspend(struct device *dev)
|
||||
{
|
||||
int ret = pm_generic_runtime_suspend(dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
acpi_lpss_save_ctx(dev);
|
||||
return acpi_dev_runtime_suspend(dev);
|
||||
}
|
||||
|
||||
static int acpi_lpss_runtime_resume(struct device *dev)
|
||||
{
|
||||
int ret = acpi_dev_runtime_resume(dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
acpi_lpss_restore_ctx(dev);
|
||||
return pm_generic_runtime_resume(dev);
|
||||
}
|
||||
#endif /* CONFIG_PM_RUNTIME */
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static struct dev_pm_domain acpi_lpss_pm_domain = {
|
||||
.ops = {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend_late = acpi_lpss_suspend_late,
|
||||
.restore_early = acpi_lpss_restore_early,
|
||||
.prepare = acpi_subsys_prepare,
|
||||
.complete = acpi_subsys_complete,
|
||||
.suspend = acpi_subsys_suspend,
|
||||
.resume_early = acpi_subsys_resume_early,
|
||||
.freeze = acpi_subsys_freeze,
|
||||
.poweroff = acpi_subsys_suspend,
|
||||
.poweroff_late = acpi_subsys_suspend_late,
|
||||
#endif
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
.runtime_suspend = acpi_lpss_runtime_suspend,
|
||||
.runtime_resume = acpi_lpss_runtime_resume,
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
static int acpi_lpss_platform_notify(struct notifier_block *nb,
|
||||
unsigned long action, void *data)
|
||||
{
|
||||
|
@ -456,7 +631,6 @@ static int acpi_lpss_platform_notify(struct notifier_block *nb,
|
|||
struct lpss_private_data *pdata;
|
||||
struct acpi_device *adev;
|
||||
const struct acpi_device_id *id;
|
||||
int ret = 0;
|
||||
|
||||
id = acpi_match_device(acpi_lpss_device_ids, &pdev->dev);
|
||||
if (!id || !id->driver_data)
|
||||
|
@ -466,7 +640,7 @@ static int acpi_lpss_platform_notify(struct notifier_block *nb,
|
|||
return 0;
|
||||
|
||||
pdata = acpi_driver_data(adev);
|
||||
if (!pdata || !pdata->mmio_base || !pdata->dev_desc->ltr_required)
|
||||
if (!pdata || !pdata->mmio_base)
|
||||
return 0;
|
||||
|
||||
if (pdata->mmio_size < pdata->dev_desc->prv_offset + LPSS_LTR_SIZE) {
|
||||
|
@ -474,12 +648,27 @@ static int acpi_lpss_platform_notify(struct notifier_block *nb,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (action == BUS_NOTIFY_ADD_DEVICE)
|
||||
ret = sysfs_create_group(&pdev->dev.kobj, &lpss_attr_group);
|
||||
else if (action == BUS_NOTIFY_DEL_DEVICE)
|
||||
sysfs_remove_group(&pdev->dev.kobj, &lpss_attr_group);
|
||||
switch (action) {
|
||||
case BUS_NOTIFY_BOUND_DRIVER:
|
||||
if (pdata->dev_desc->save_ctx)
|
||||
pdev->dev.pm_domain = &acpi_lpss_pm_domain;
|
||||
break;
|
||||
case BUS_NOTIFY_UNBOUND_DRIVER:
|
||||
if (pdata->dev_desc->save_ctx)
|
||||
pdev->dev.pm_domain = NULL;
|
||||
break;
|
||||
case BUS_NOTIFY_ADD_DEVICE:
|
||||
if (pdata->dev_desc->ltr_required)
|
||||
return sysfs_create_group(&pdev->dev.kobj,
|
||||
&lpss_attr_group);
|
||||
case BUS_NOTIFY_DEL_DEVICE:
|
||||
if (pdata->dev_desc->ltr_required)
|
||||
sysfs_remove_group(&pdev->dev.kobj, &lpss_attr_group);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct notifier_block acpi_lpss_nb = {
|
||||
|
@ -518,3 +707,16 @@ void __init acpi_lpss_init(void)
|
|||
acpi_scan_add_handler(&lpss_handler);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static struct acpi_scan_handler lpss_handler = {
|
||||
.ids = acpi_lpss_device_ids,
|
||||
};
|
||||
|
||||
void __init acpi_lpss_init(void)
|
||||
{
|
||||
acpi_scan_add_handler(&lpss_handler);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_X86_INTEL_LPSS */
|
||||
|
|
|
@ -44,6 +44,13 @@
|
|||
|
||||
ACPI_MODULE_NAME("acpi_memhotplug");
|
||||
|
||||
static const struct acpi_device_id memory_device_ids[] = {
|
||||
{ACPI_MEMORY_DEVICE_HID, 0},
|
||||
{"", 0},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
|
||||
|
||||
/* Memory Device States */
|
||||
#define MEMORY_INVALID_STATE 0
|
||||
#define MEMORY_POWER_ON_STATE 1
|
||||
|
@ -53,11 +60,6 @@ static int acpi_memory_device_add(struct acpi_device *device,
|
|||
const struct acpi_device_id *not_used);
|
||||
static void acpi_memory_device_remove(struct acpi_device *device);
|
||||
|
||||
static const struct acpi_device_id memory_device_ids[] = {
|
||||
{ACPI_MEMORY_DEVICE_HID, 0},
|
||||
{"", 0},
|
||||
};
|
||||
|
||||
static struct acpi_scan_handler memory_device_handler = {
|
||||
.ids = memory_device_ids,
|
||||
.attach = acpi_memory_device_add,
|
||||
|
@ -364,9 +366,11 @@ static bool __initdata acpi_no_memhotplug;
|
|||
|
||||
void __init acpi_memory_hotplug_init(void)
|
||||
{
|
||||
if (acpi_no_memhotplug)
|
||||
if (acpi_no_memhotplug) {
|
||||
memory_device_handler.attach = NULL;
|
||||
acpi_scan_add_handler(&memory_device_handler);
|
||||
return;
|
||||
|
||||
}
|
||||
acpi_scan_add_handler_with_hotplug(&memory_device_handler, "memory");
|
||||
}
|
||||
|
||||
|
@ -376,3 +380,16 @@ static int __init disable_acpi_memory_hotplug(char *str)
|
|||
return 1;
|
||||
}
|
||||
__setup("acpi_no_memhotplug", disable_acpi_memory_hotplug);
|
||||
|
||||
#else
|
||||
|
||||
static struct acpi_scan_handler memory_device_handler = {
|
||||
.ids = memory_device_ids,
|
||||
};
|
||||
|
||||
void __init acpi_memory_hotplug_init(void)
|
||||
{
|
||||
acpi_scan_add_handler(&memory_device_handler);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ACPI_HOTPLUG_MEMORY */
|
||||
|
|
|
@ -156,12 +156,13 @@ static int power_saving_thread(void *data)
|
|||
|
||||
while (!kthread_should_stop()) {
|
||||
int cpu;
|
||||
u64 expire_time;
|
||||
unsigned long expire_time;
|
||||
|
||||
try_to_freeze();
|
||||
|
||||
/* round robin to cpus */
|
||||
if (last_jiffies + round_robin_time * HZ < jiffies) {
|
||||
expire_time = last_jiffies + round_robin_time * HZ;
|
||||
if (time_before(expire_time, jiffies)) {
|
||||
last_jiffies = jiffies;
|
||||
round_robin_cpu(tsk_index);
|
||||
}
|
||||
|
@ -200,7 +201,7 @@ static int power_saving_thread(void *data)
|
|||
CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu);
|
||||
local_irq_enable();
|
||||
|
||||
if (jiffies > expire_time) {
|
||||
if (time_before(expire_time, jiffies)) {
|
||||
do_sleep = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -215,8 +216,15 @@ static int power_saving_thread(void *data)
|
|||
* borrow CPU time from this CPU and cause RT task use > 95%
|
||||
* CPU time. To make 'avoid starvation' work, takes a nap here.
|
||||
*/
|
||||
if (do_sleep)
|
||||
if (unlikely(do_sleep))
|
||||
schedule_timeout_killable(HZ * idle_pct / 100);
|
||||
|
||||
/* If an external event has set the need_resched flag, then
|
||||
* we need to deal with it, or this loop will continue to
|
||||
* spin without calling __mwait().
|
||||
*/
|
||||
if (unlikely(need_resched()))
|
||||
schedule();
|
||||
}
|
||||
|
||||
exit_round_robin(tsk_index);
|
||||
|
|
|
@ -22,27 +22,16 @@
|
|||
|
||||
ACPI_MODULE_NAME("platform");
|
||||
|
||||
/*
|
||||
* The following ACPI IDs are known to be suitable for representing as
|
||||
* platform devices.
|
||||
*/
|
||||
static const struct acpi_device_id acpi_platform_device_ids[] = {
|
||||
|
||||
{ "PNP0D40" },
|
||||
{ "VPC2004" },
|
||||
{ "BCM4752" },
|
||||
|
||||
/* Intel Smart Sound Technology */
|
||||
{ "INT33C8" },
|
||||
{ "80860F28" },
|
||||
|
||||
{ }
|
||||
static const struct acpi_device_id forbidden_id_list[] = {
|
||||
{"PNP0000", 0}, /* PIC */
|
||||
{"PNP0100", 0}, /* Timer */
|
||||
{"PNP0200", 0}, /* AT DMA Controller */
|
||||
{"", 0},
|
||||
};
|
||||
|
||||
/**
|
||||
* acpi_create_platform_device - Create platform device for ACPI device node
|
||||
* @adev: ACPI device node to create a platform device for.
|
||||
* @id: ACPI device ID used to match @adev.
|
||||
*
|
||||
* Check if the given @adev can be represented as a platform device and, if
|
||||
* that's the case, create and register a platform device, populate its common
|
||||
|
@ -50,8 +39,7 @@ static const struct acpi_device_id acpi_platform_device_ids[] = {
|
|||
*
|
||||
* Name of the platform device will be the same as @adev's.
|
||||
*/
|
||||
int acpi_create_platform_device(struct acpi_device *adev,
|
||||
const struct acpi_device_id *id)
|
||||
struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
|
||||
{
|
||||
struct platform_device *pdev = NULL;
|
||||
struct acpi_device *acpi_parent;
|
||||
|
@ -63,19 +51,22 @@ int acpi_create_platform_device(struct acpi_device *adev,
|
|||
|
||||
/* If the ACPI node already has a physical device attached, skip it. */
|
||||
if (adev->physical_node_count)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
if (!acpi_match_device_ids(adev, forbidden_id_list))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
INIT_LIST_HEAD(&resource_list);
|
||||
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
|
||||
if (count < 0) {
|
||||
return 0;
|
||||
return NULL;
|
||||
} else if (count > 0) {
|
||||
resources = kmalloc(count * sizeof(struct resource),
|
||||
GFP_KERNEL);
|
||||
if (!resources) {
|
||||
dev_err(&adev->dev, "No memory for resources\n");
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
count = 0;
|
||||
list_for_each_entry(rentry, &resource_list, node)
|
||||
|
@ -112,25 +103,13 @@ int acpi_create_platform_device(struct acpi_device *adev,
|
|||
pdevinfo.num_res = count;
|
||||
pdevinfo.acpi_node.companion = adev;
|
||||
pdev = platform_device_register_full(&pdevinfo);
|
||||
if (IS_ERR(pdev)) {
|
||||
if (IS_ERR(pdev))
|
||||
dev_err(&adev->dev, "platform device creation failed: %ld\n",
|
||||
PTR_ERR(pdev));
|
||||
pdev = NULL;
|
||||
} else {
|
||||
else
|
||||
dev_dbg(&adev->dev, "created platform device %s\n",
|
||||
dev_name(&pdev->dev));
|
||||
}
|
||||
|
||||
kfree(resources);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct acpi_scan_handler platform_handler = {
|
||||
.ids = acpi_platform_device_ids,
|
||||
.attach = acpi_create_platform_device,
|
||||
};
|
||||
|
||||
void __init acpi_platform_init(void)
|
||||
{
|
||||
acpi_scan_add_handler(&platform_handler);
|
||||
return pdev;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,395 @@
|
|||
/*
|
||||
* ACPI support for PNP bus type
|
||||
*
|
||||
* Copyright (C) 2014, Intel Corporation
|
||||
* Authors: Zhang Rui <rui.zhang@intel.com>
|
||||
* Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
static const struct acpi_device_id acpi_pnp_device_ids[] = {
|
||||
/* pata_isapnp */
|
||||
{"PNP0600"}, /* Generic ESDI/IDE/ATA compatible hard disk controller */
|
||||
/* floppy */
|
||||
{"PNP0700"},
|
||||
/* ipmi_si */
|
||||
{"IPI0001"},
|
||||
/* tpm_inf_pnp */
|
||||
{"IFX0101"}, /* Infineon TPMs */
|
||||
{"IFX0102"}, /* Infineon TPMs */
|
||||
/*tpm_tis */
|
||||
{"PNP0C31"}, /* TPM */
|
||||
{"ATM1200"}, /* Atmel */
|
||||
{"IFX0102"}, /* Infineon */
|
||||
{"BCM0101"}, /* Broadcom */
|
||||
{"BCM0102"}, /* Broadcom */
|
||||
{"NSC1200"}, /* National */
|
||||
{"ICO0102"}, /* Intel */
|
||||
/* ide */
|
||||
{"PNP0600"}, /* Generic ESDI/IDE/ATA compatible hard disk controller */
|
||||
/* ns558 */
|
||||
{"ASB16fd"}, /* AdLib NSC16 */
|
||||
{"AZT3001"}, /* AZT1008 */
|
||||
{"CDC0001"}, /* Opl3-SAx */
|
||||
{"CSC0001"}, /* CS4232 */
|
||||
{"CSC000f"}, /* CS4236 */
|
||||
{"CSC0101"}, /* CS4327 */
|
||||
{"CTL7001"}, /* SB16 */
|
||||
{"CTL7002"}, /* AWE64 */
|
||||
{"CTL7005"}, /* Vibra16 */
|
||||
{"ENS2020"}, /* SoundscapeVIVO */
|
||||
{"ESS0001"}, /* ES1869 */
|
||||
{"ESS0005"}, /* ES1878 */
|
||||
{"ESS6880"}, /* ES688 */
|
||||
{"IBM0012"}, /* CS4232 */
|
||||
{"OPT0001"}, /* OPTi Audio16 */
|
||||
{"YMH0006"}, /* Opl3-SA */
|
||||
{"YMH0022"}, /* Opl3-SAx */
|
||||
{"PNPb02f"}, /* Generic */
|
||||
/* i8042 kbd */
|
||||
{"PNP0300"},
|
||||
{"PNP0301"},
|
||||
{"PNP0302"},
|
||||
{"PNP0303"},
|
||||
{"PNP0304"},
|
||||
{"PNP0305"},
|
||||
{"PNP0306"},
|
||||
{"PNP0309"},
|
||||
{"PNP030a"},
|
||||
{"PNP030b"},
|
||||
{"PNP0320"},
|
||||
{"PNP0343"},
|
||||
{"PNP0344"},
|
||||
{"PNP0345"},
|
||||
{"CPQA0D7"},
|
||||
/* i8042 aux */
|
||||
{"AUI0200"},
|
||||
{"FJC6000"},
|
||||
{"FJC6001"},
|
||||
{"PNP0f03"},
|
||||
{"PNP0f0b"},
|
||||
{"PNP0f0e"},
|
||||
{"PNP0f12"},
|
||||
{"PNP0f13"},
|
||||
{"PNP0f19"},
|
||||
{"PNP0f1c"},
|
||||
{"SYN0801"},
|
||||
/* fcpnp */
|
||||
{"AVM0900"},
|
||||
/* radio-cadet */
|
||||
{"MSM0c24"}, /* ADS Cadet AM/FM Radio Card */
|
||||
/* radio-gemtek */
|
||||
{"ADS7183"}, /* AOpen FX-3D/Pro Radio */
|
||||
/* radio-sf16fmr2 */
|
||||
{"MFRad13"}, /* tuner subdevice of SF16-FMD2 */
|
||||
/* ene_ir */
|
||||
{"ENE0100"},
|
||||
{"ENE0200"},
|
||||
{"ENE0201"},
|
||||
{"ENE0202"},
|
||||
/* fintek-cir */
|
||||
{"FIT0002"}, /* CIR */
|
||||
/* ite-cir */
|
||||
{"ITE8704"}, /* Default model */
|
||||
{"ITE8713"}, /* CIR found in EEEBox 1501U */
|
||||
{"ITE8708"}, /* Bridged IT8512 */
|
||||
{"ITE8709"}, /* SRAM-Bridged IT8512 */
|
||||
/* nuvoton-cir */
|
||||
{"WEC0530"}, /* CIR */
|
||||
{"NTN0530"}, /* CIR for new chip's pnp id */
|
||||
/* Winbond CIR */
|
||||
{"WEC1022"},
|
||||
/* wbsd */
|
||||
{"WEC0517"},
|
||||
{"WEC0518"},
|
||||
/* Winbond CIR */
|
||||
{"TCM5090"}, /* 3Com Etherlink III (TP) */
|
||||
{"TCM5091"}, /* 3Com Etherlink III */
|
||||
{"TCM5094"}, /* 3Com Etherlink III (combo) */
|
||||
{"TCM5095"}, /* 3Com Etherlink III (TPO) */
|
||||
{"TCM5098"}, /* 3Com Etherlink III (TPC) */
|
||||
{"PNP80f7"}, /* 3Com Etherlink III compatible */
|
||||
{"PNP80f8"}, /* 3Com Etherlink III compatible */
|
||||
/* nsc-ircc */
|
||||
{"NSC6001"},
|
||||
{"HWPC224"},
|
||||
{"IBM0071"},
|
||||
/* smsc-ircc2 */
|
||||
{"SMCf010"},
|
||||
/* sb1000 */
|
||||
{"GIC1000"},
|
||||
/* parport_pc */
|
||||
{"PNP0400"}, /* Standard LPT Printer Port */
|
||||
{"PNP0401"}, /* ECP Printer Port */
|
||||
/* apple-gmux */
|
||||
{"APP000B"},
|
||||
/* fujitsu-laptop.c */
|
||||
{"FUJ02bf"},
|
||||
{"FUJ02B1"},
|
||||
{"FUJ02E3"},
|
||||
/* system */
|
||||
{"PNP0c02"}, /* General ID for reserving resources */
|
||||
{"PNP0c01"}, /* memory controller */
|
||||
/* rtc_cmos */
|
||||
{"PNP0b00"},
|
||||
{"PNP0b01"},
|
||||
{"PNP0b02"},
|
||||
/* c6xdigio */
|
||||
{"PNP0400"}, /* Standard LPT Printer Port */
|
||||
{"PNP0401"}, /* ECP Printer Port */
|
||||
/* ni_atmio.c */
|
||||
{"NIC1900"},
|
||||
{"NIC2400"},
|
||||
{"NIC2500"},
|
||||
{"NIC2600"},
|
||||
{"NIC2700"},
|
||||
/* serial */
|
||||
{"AAC000F"}, /* Archtek America Corp. Archtek SmartLink Modem 3334BT Plug & Play */
|
||||
{"ADC0001"}, /* Anchor Datacomm BV. SXPro 144 External Data Fax Modem Plug & Play */
|
||||
{"ADC0002"}, /* SXPro 288 External Data Fax Modem Plug & Play */
|
||||
{"AEI0250"}, /* PROLiNK 1456VH ISA PnP K56flex Fax Modem */
|
||||
{"AEI1240"}, /* Actiontec ISA PNP 56K X2 Fax Modem */
|
||||
{"AKY1021"}, /* Rockwell 56K ACF II Fax+Data+Voice Modem */
|
||||
{"AZT4001"}, /* AZT3005 PnP SOUND DEVICE */
|
||||
{"BDP3336"}, /* Best Data Products Inc. Smart One 336F PnP Modem */
|
||||
{"BRI0A49"}, /* Boca Complete Ofc Communicator 14.4 Data-FAX */
|
||||
{"BRI1400"}, /* Boca Research 33,600 ACF Modem */
|
||||
{"BRI3400"}, /* Boca 33.6 Kbps Internal FD34FSVD */
|
||||
{"BRI0A49"}, /* Boca 33.6 Kbps Internal FD34FSVD */
|
||||
{"BDP3336"}, /* Best Data Products Inc. Smart One 336F PnP Modem */
|
||||
{"CPI4050"}, /* Computer Peripherals Inc. EuroViVa CommCenter-33.6 SP PnP */
|
||||
{"CTL3001"}, /* Creative Labs Phone Blaster 28.8 DSVD PnP Voice */
|
||||
{"CTL3011"}, /* Creative Labs Modem Blaster 28.8 DSVD PnP Voice */
|
||||
{"DAV0336"}, /* Davicom ISA 33.6K Modem */
|
||||
{"DMB1032"}, /* Creative Modem Blaster Flash56 DI5601-1 */
|
||||
{"DMB2001"}, /* Creative Modem Blaster V.90 DI5660 */
|
||||
{"ETT0002"}, /* E-Tech CyberBULLET PC56RVP */
|
||||
{"FUJ0202"}, /* Fujitsu 33600 PnP-I2 R Plug & Play */
|
||||
{"FUJ0205"}, /* Fujitsu FMV-FX431 Plug & Play */
|
||||
{"FUJ0206"}, /* Fujitsu 33600 PnP-I4 R Plug & Play */
|
||||
{"FUJ0209"}, /* Fujitsu Fax Voice 33600 PNP-I5 R Plug & Play */
|
||||
{"GVC000F"}, /* Archtek SmartLink Modem 3334BT Plug & Play */
|
||||
{"GVC0303"}, /* Archtek SmartLink Modem 3334BRV 33.6K Data Fax Voice */
|
||||
{"HAY0001"}, /* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */
|
||||
{"HAY000C"}, /* Hayes Optima 336 V.34 + FAX + Voice PnP */
|
||||
{"HAY000D"}, /* Hayes Optima 336B V.34 + FAX + Voice PnP */
|
||||
{"HAY5670"}, /* Hayes Accura 56K Ext Fax Modem PnP */
|
||||
{"HAY5674"}, /* Hayes Accura 56K Ext Fax Modem PnP */
|
||||
{"HAY5675"}, /* Hayes Accura 56K Fax Modem PnP */
|
||||
{"HAYF000"}, /* Hayes 288, V.34 + FAX */
|
||||
{"HAYF001"}, /* Hayes Optima 288 V.34 + FAX + Voice, Plug & Play */
|
||||
{"IBM0033"}, /* IBM Thinkpad 701 Internal Modem Voice */
|
||||
{"PNP4972"}, /* Intermec CV60 touchscreen port */
|
||||
{"IXDC801"}, /* Intertex 28k8 33k6 Voice EXT PnP */
|
||||
{"IXDC901"}, /* Intertex 33k6 56k Voice EXT PnP */
|
||||
{"IXDD801"}, /* Intertex 28k8 33k6 Voice SP EXT PnP */
|
||||
{"IXDD901"}, /* Intertex 33k6 56k Voice SP EXT PnP */
|
||||
{"IXDF401"}, /* Intertex 28k8 33k6 Voice SP INT PnP */
|
||||
{"IXDF801"}, /* Intertex 28k8 33k6 Voice SP EXT PnP */
|
||||
{"IXDF901"}, /* Intertex 33k6 56k Voice SP EXT PnP */
|
||||
{"KOR4522"}, /* KORTEX 28800 Externe PnP */
|
||||
{"KORF661"}, /* KXPro 33.6 Vocal ASVD PnP */
|
||||
{"LAS4040"}, /* LASAT Internet 33600 PnP */
|
||||
{"LAS4540"}, /* Lasat Safire 560 PnP */
|
||||
{"LAS5440"}, /* Lasat Safire 336 PnP */
|
||||
{"MNP0281"}, /* Microcom TravelPorte FAST V.34 Plug & Play */
|
||||
{"MNP0336"}, /* Microcom DeskPorte V.34 FAST or FAST+ Plug & Play */
|
||||
{"MNP0339"}, /* Microcom DeskPorte FAST EP 28.8 Plug & Play */
|
||||
{"MNP0342"}, /* Microcom DeskPorte 28.8P Plug & Play */
|
||||
{"MNP0500"}, /* Microcom DeskPorte FAST ES 28.8 Plug & Play */
|
||||
{"MNP0501"}, /* Microcom DeskPorte FAST ES 28.8 Plug & Play */
|
||||
{"MNP0502"}, /* Microcom DeskPorte 28.8S Internal Plug & Play */
|
||||
{"MOT1105"}, /* Motorola BitSURFR Plug & Play */
|
||||
{"MOT1111"}, /* Motorola TA210 Plug & Play */
|
||||
{"MOT1114"}, /* Motorola HMTA 200 (ISDN) Plug & Play */
|
||||
{"MOT1115"}, /* Motorola BitSURFR Plug & Play */
|
||||
{"MOT1190"}, /* Motorola Lifestyle 28.8 Internal */
|
||||
{"MOT1501"}, /* Motorola V.3400 Plug & Play */
|
||||
{"MOT1502"}, /* Motorola Lifestyle 28.8 V.34 Plug & Play */
|
||||
{"MOT1505"}, /* Motorola Power 28.8 V.34 Plug & Play */
|
||||
{"MOT1509"}, /* Motorola ModemSURFR External 28.8 Plug & Play */
|
||||
{"MOT150A"}, /* Motorola Premier 33.6 Desktop Plug & Play */
|
||||
{"MOT150F"}, /* Motorola VoiceSURFR 56K External PnP */
|
||||
{"MOT1510"}, /* Motorola ModemSURFR 56K External PnP */
|
||||
{"MOT1550"}, /* Motorola ModemSURFR 56K Internal PnP */
|
||||
{"MOT1560"}, /* Motorola ModemSURFR Internal 28.8 Plug & Play */
|
||||
{"MOT1580"}, /* Motorola Premier 33.6 Internal Plug & Play */
|
||||
{"MOT15B0"}, /* Motorola OnlineSURFR 28.8 Internal Plug & Play */
|
||||
{"MOT15F0"}, /* Motorola VoiceSURFR 56K Internal PnP */
|
||||
{"MVX00A1"}, /* Deskline K56 Phone System PnP */
|
||||
{"MVX00F2"}, /* PC Rider K56 Phone System PnP */
|
||||
{"nEC8241"}, /* NEC 98NOTE SPEAKER PHONE FAX MODEM(33600bps) */
|
||||
{"PMC2430"}, /* Pace 56 Voice Internal Plug & Play Modem */
|
||||
{"PNP0500"}, /* Generic standard PC COM port */
|
||||
{"PNP0501"}, /* Generic 16550A-compatible COM port */
|
||||
{"PNPC000"}, /* Compaq 14400 Modem */
|
||||
{"PNPC001"}, /* Compaq 2400/9600 Modem */
|
||||
{"PNPC031"}, /* Dial-Up Networking Serial Cable between 2 PCs */
|
||||
{"PNPC032"}, /* Dial-Up Networking Parallel Cable between 2 PCs */
|
||||
{"PNPC100"}, /* Standard 9600 bps Modem */
|
||||
{"PNPC101"}, /* Standard 14400 bps Modem */
|
||||
{"PNPC102"}, /* Standard 28800 bps Modem */
|
||||
{"PNPC103"}, /* Standard Modem */
|
||||
{"PNPC104"}, /* Standard 9600 bps Modem */
|
||||
{"PNPC105"}, /* Standard 14400 bps Modem */
|
||||
{"PNPC106"}, /* Standard 28800 bps Modem */
|
||||
{"PNPC107"}, /* Standard Modem */
|
||||
{"PNPC108"}, /* Standard 9600 bps Modem */
|
||||
{"PNPC109"}, /* Standard 14400 bps Modem */
|
||||
{"PNPC10A"}, /* Standard 28800 bps Modem */
|
||||
{"PNPC10B"}, /* Standard Modem */
|
||||
{"PNPC10C"}, /* Standard 9600 bps Modem */
|
||||
{"PNPC10D"}, /* Standard 14400 bps Modem */
|
||||
{"PNPC10E"}, /* Standard 28800 bps Modem */
|
||||
{"PNPC10F"}, /* Standard Modem */
|
||||
{"PNP2000"}, /* Standard PCMCIA Card Modem */
|
||||
{"ROK0030"}, /* Rockwell 33.6 DPF Internal PnP, Modular Technology 33.6 Internal PnP */
|
||||
{"ROK0100"}, /* KORTEX 14400 Externe PnP */
|
||||
{"ROK4120"}, /* Rockwell 28.8 */
|
||||
{"ROK4920"}, /* Viking 28.8 INTERNAL Fax+Data+Voice PnP */
|
||||
{"RSS00A0"}, /* Rockwell 33.6 DPF External PnP, BT Prologue 33.6 External PnP, Modular Technology 33.6 External PnP */
|
||||
{"RSS0262"}, /* Viking 56K FAX INT */
|
||||
{"RSS0250"}, /* K56 par,VV,Voice,Speakphone,AudioSpan,PnP */
|
||||
{"SUP1310"}, /* SupraExpress 28.8 Data/Fax PnP modem */
|
||||
{"SUP1381"}, /* SupraExpress 336i PnP Voice Modem */
|
||||
{"SUP1421"}, /* SupraExpress 33.6 Data/Fax PnP modem */
|
||||
{"SUP1590"}, /* SupraExpress 33.6 Data/Fax PnP modem */
|
||||
{"SUP1620"}, /* SupraExpress 336i Sp ASVD */
|
||||
{"SUP1760"}, /* SupraExpress 33.6 Data/Fax PnP modem */
|
||||
{"SUP2171"}, /* SupraExpress 56i Sp Intl */
|
||||
{"TEX0011"}, /* Phoebe Micro 33.6 Data Fax 1433VQH Plug & Play */
|
||||
{"UAC000F"}, /* Archtek SmartLink Modem 3334BT Plug & Play */
|
||||
{"USR0000"}, /* 3Com Corp. Gateway Telepath IIvi 33.6 */
|
||||
{"USR0002"}, /* U.S. Robotics Sporster 33.6K Fax INT PnP */
|
||||
{"USR0004"}, /* Sportster Vi 14.4 PnP FAX Voicemail */
|
||||
{"USR0006"}, /* U.S. Robotics 33.6K Voice INT PnP */
|
||||
{"USR0007"}, /* U.S. Robotics 33.6K Voice EXT PnP */
|
||||
{"USR0009"}, /* U.S. Robotics Courier V.Everything INT PnP */
|
||||
{"USR2002"}, /* U.S. Robotics 33.6K Voice INT PnP */
|
||||
{"USR2070"}, /* U.S. Robotics 56K Voice INT PnP */
|
||||
{"USR2080"}, /* U.S. Robotics 56K Voice EXT PnP */
|
||||
{"USR3031"}, /* U.S. Robotics 56K FAX INT */
|
||||
{"USR3050"}, /* U.S. Robotics 56K FAX INT */
|
||||
{"USR3070"}, /* U.S. Robotics 56K Voice INT PnP */
|
||||
{"USR3080"}, /* U.S. Robotics 56K Voice EXT PnP */
|
||||
{"USR3090"}, /* U.S. Robotics 56K Voice INT PnP */
|
||||
{"USR9100"}, /* U.S. Robotics 56K Message */
|
||||
{"USR9160"}, /* U.S. Robotics 56K FAX EXT PnP */
|
||||
{"USR9170"}, /* U.S. Robotics 56K FAX INT PnP */
|
||||
{"USR9180"}, /* U.S. Robotics 56K Voice EXT PnP */
|
||||
{"USR9190"}, /* U.S. Robotics 56K Voice INT PnP */
|
||||
{"WACFXXX"}, /* Wacom tablets */
|
||||
{"FPI2002"}, /* Compaq touchscreen */
|
||||
{"FUJ02B2"}, /* Fujitsu Stylistic touchscreens */
|
||||
{"FUJ02B3"},
|
||||
{"FUJ02B4"}, /* Fujitsu Stylistic LT touchscreens */
|
||||
{"FUJ02B6"}, /* Passive Fujitsu Stylistic touchscreens */
|
||||
{"FUJ02B7"},
|
||||
{"FUJ02B8"},
|
||||
{"FUJ02B9"},
|
||||
{"FUJ02BC"},
|
||||
{"FUJ02E5"}, /* Fujitsu Wacom Tablet PC device */
|
||||
{"FUJ02E6"}, /* Fujitsu P-series tablet PC device */
|
||||
{"FUJ02E7"}, /* Fujitsu Wacom 2FGT Tablet PC device */
|
||||
{"FUJ02E9"}, /* Fujitsu Wacom 1FGT Tablet PC device */
|
||||
{"LTS0001"}, /* LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in disguise) */
|
||||
{"WCI0003"}, /* Rockwell's (PORALiNK) 33600 INT PNP */
|
||||
{"WEC1022"}, /* Winbond CIR port, should not be probed. We should keep track of it to prevent the legacy serial driver from probing it */
|
||||
/* scl200wdt */
|
||||
{"NSC0800"}, /* National Semiconductor PC87307/PC97307 watchdog component */
|
||||
/* mpu401 */
|
||||
{"PNPb006"},
|
||||
/* cs423x-pnpbios */
|
||||
{"CSC0100"},
|
||||
{"CSC0000"},
|
||||
{"GIM0100"}, /* Guillemot Turtlebeach something appears to be cs4232 compatible */
|
||||
/* es18xx-pnpbios */
|
||||
{"ESS1869"},
|
||||
{"ESS1879"},
|
||||
/* snd-opl3sa2-pnpbios */
|
||||
{"YMH0021"},
|
||||
{"NMX2210"}, /* Gateway Solo 2500 */
|
||||
{""},
|
||||
};
|
||||
|
||||
static bool is_hex_digit(char c)
|
||||
{
|
||||
return (c >= 0 && c <= '9') || (c >= 'A' && c <= 'F');
|
||||
}
|
||||
|
||||
static bool matching_id(char *idstr, char *list_id)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (memcmp(idstr, list_id, 3))
|
||||
return false;
|
||||
|
||||
for (i = 3; i < 7; i++) {
|
||||
char c = toupper(idstr[i]);
|
||||
|
||||
if (!is_hex_digit(c)
|
||||
|| (list_id[i] != 'X' && c != toupper(list_id[i])))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool acpi_pnp_match(char *idstr, const struct acpi_device_id **matchid)
|
||||
{
|
||||
const struct acpi_device_id *devid;
|
||||
|
||||
for (devid = acpi_pnp_device_ids; devid->id[0]; devid++)
|
||||
if (matching_id(idstr, (char *)devid->id)) {
|
||||
if (matchid)
|
||||
*matchid = devid;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int acpi_pnp_attach(struct acpi_device *adev,
|
||||
const struct acpi_device_id *id)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct acpi_scan_handler acpi_pnp_handler = {
|
||||
.ids = acpi_pnp_device_ids,
|
||||
.match = acpi_pnp_match,
|
||||
.attach = acpi_pnp_attach,
|
||||
};
|
||||
|
||||
/*
|
||||
* For CMOS RTC devices, the PNP ACPI scan handler does not work, because
|
||||
* there is a CMOS RTC ACPI scan handler installed already, so we need to
|
||||
* check those devices and enumerate them to the PNP bus directly.
|
||||
*/
|
||||
static int is_cmos_rtc_device(struct acpi_device *adev)
|
||||
{
|
||||
struct acpi_device_id ids[] = {
|
||||
{ "PNP0B00" },
|
||||
{ "PNP0B01" },
|
||||
{ "PNP0B02" },
|
||||
{""},
|
||||
};
|
||||
return !acpi_match_device_ids(adev, ids);
|
||||
}
|
||||
|
||||
bool acpi_is_pnp_device(struct acpi_device *adev)
|
||||
{
|
||||
return adev->handler == &acpi_pnp_handler || is_cmos_rtc_device(adev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_is_pnp_device);
|
||||
|
||||
void __init acpi_pnp_init(void)
|
||||
{
|
||||
acpi_scan_add_handler(&acpi_pnp_handler);
|
||||
}
|
|
@ -268,7 +268,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
|
|||
pr->apic_id = apic_id;
|
||||
|
||||
cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id);
|
||||
if (!cpu0_initialized) {
|
||||
if (!cpu0_initialized && !acpi_lapic) {
|
||||
cpu0_initialized = 1;
|
||||
/* Handle UP system running SMP kernel, with no LAPIC in MADT */
|
||||
if ((cpu_index == -1) && (num_online_cpus() == 1))
|
||||
|
|
|
@ -135,6 +135,7 @@ acpi-y += \
|
|||
rsxface.o
|
||||
|
||||
acpi-y += \
|
||||
tbdata.o \
|
||||
tbfadt.o \
|
||||
tbfind.o \
|
||||
tbinstal.o \
|
||||
|
|
|
@ -0,0 +1,170 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: acapps - common include for ACPI applications/tools
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2014, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef _ACAPPS
|
||||
#define _ACAPPS
|
||||
|
||||
/* Common info for tool signons */
|
||||
|
||||
#define ACPICA_NAME "Intel ACPI Component Architecture"
|
||||
#define ACPICA_COPYRIGHT "Copyright (c) 2000 - 2014 Intel Corporation"
|
||||
|
||||
#if ACPI_MACHINE_WIDTH == 64
|
||||
#define ACPI_WIDTH "-64"
|
||||
|
||||
#elif ACPI_MACHINE_WIDTH == 32
|
||||
#define ACPI_WIDTH "-32"
|
||||
|
||||
#else
|
||||
#error unknown ACPI_MACHINE_WIDTH
|
||||
#define ACPI_WIDTH "-??"
|
||||
|
||||
#endif
|
||||
|
||||
/* Macros for signons and file headers */
|
||||
|
||||
#define ACPI_COMMON_SIGNON(utility_name) \
|
||||
"\n%s\n%s version %8.8X%s [%s]\n%s\n\n", \
|
||||
ACPICA_NAME, \
|
||||
utility_name, ((u32) ACPI_CA_VERSION), ACPI_WIDTH, __DATE__, \
|
||||
ACPICA_COPYRIGHT
|
||||
|
||||
#define ACPI_COMMON_HEADER(utility_name, prefix) \
|
||||
"%s%s\n%s%s version %8.8X%s [%s]\n%s%s\n%s\n", \
|
||||
prefix, ACPICA_NAME, \
|
||||
prefix, utility_name, ((u32) ACPI_CA_VERSION), ACPI_WIDTH, __DATE__, \
|
||||
prefix, ACPICA_COPYRIGHT, \
|
||||
prefix
|
||||
|
||||
/* Macros for usage messages */
|
||||
|
||||
#define ACPI_USAGE_HEADER(usage) \
|
||||
printf ("Usage: %s\nOptions:\n", usage);
|
||||
|
||||
#define ACPI_OPTION(name, description) \
|
||||
printf (" %-18s%s\n", name, description);
|
||||
|
||||
#define FILE_SUFFIX_DISASSEMBLY "dsl"
|
||||
#define ACPI_TABLE_FILE_SUFFIX ".dat"
|
||||
|
||||
/*
|
||||
* getopt
|
||||
*/
|
||||
int acpi_getopt(int argc, char **argv, char *opts);
|
||||
|
||||
int acpi_getopt_argument(int argc, char **argv);
|
||||
|
||||
extern int acpi_gbl_optind;
|
||||
extern int acpi_gbl_opterr;
|
||||
extern int acpi_gbl_sub_opt_char;
|
||||
extern char *acpi_gbl_optarg;
|
||||
|
||||
/*
|
||||
* cmfsize - Common get file size function
|
||||
*/
|
||||
u32 cm_get_file_size(FILE * file);
|
||||
|
||||
#ifndef ACPI_DUMP_APP
|
||||
/*
|
||||
* adisasm
|
||||
*/
|
||||
acpi_status
|
||||
ad_aml_disassemble(u8 out_to_file,
|
||||
char *filename, char *prefix, char **out_filename);
|
||||
|
||||
void ad_print_statistics(void);
|
||||
|
||||
acpi_status ad_find_dsdt(u8 **dsdt_ptr, u32 *dsdt_length);
|
||||
|
||||
void ad_dump_tables(void);
|
||||
|
||||
acpi_status ad_get_local_tables(void);
|
||||
|
||||
acpi_status
|
||||
ad_parse_table(struct acpi_table_header *table,
|
||||
acpi_owner_id * owner_id, u8 load_table, u8 external);
|
||||
|
||||
acpi_status ad_display_tables(char *filename, struct acpi_table_header *table);
|
||||
|
||||
acpi_status ad_display_statistics(void);
|
||||
|
||||
/*
|
||||
* adwalk
|
||||
*/
|
||||
void
|
||||
acpi_dm_cross_reference_namespace(union acpi_parse_object *parse_tree_root,
|
||||
struct acpi_namespace_node *namespace_root,
|
||||
acpi_owner_id owner_id);
|
||||
|
||||
void acpi_dm_dump_tree(union acpi_parse_object *origin);
|
||||
|
||||
void acpi_dm_find_orphan_methods(union acpi_parse_object *origin);
|
||||
|
||||
void
|
||||
acpi_dm_finish_namespace_load(union acpi_parse_object *parse_tree_root,
|
||||
struct acpi_namespace_node *namespace_root,
|
||||
acpi_owner_id owner_id);
|
||||
|
||||
void
|
||||
acpi_dm_convert_resource_indexes(union acpi_parse_object *parse_tree_root,
|
||||
struct acpi_namespace_node *namespace_root);
|
||||
|
||||
/*
|
||||
* adfile
|
||||
*/
|
||||
acpi_status ad_initialize(void);
|
||||
|
||||
char *fl_generate_filename(char *input_filename, char *suffix);
|
||||
|
||||
acpi_status
|
||||
fl_split_input_pathname(char *input_path,
|
||||
char **out_directory_path, char **out_filename);
|
||||
|
||||
char *ad_generate_filename(char *prefix, char *table_id);
|
||||
|
||||
void
|
||||
ad_write_table(struct acpi_table_header *table,
|
||||
u32 length, char *table_name, char *oem_table_id);
|
||||
#endif
|
||||
|
||||
#endif /* _ACAPPS */
|
|
@ -104,9 +104,10 @@ acpi_status acpi_ev_finish_gpe(struct acpi_gpe_event_info *gpe_event_info);
|
|||
*/
|
||||
acpi_status
|
||||
acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||
struct acpi_generic_address *gpe_block_address,
|
||||
u64 address,
|
||||
u8 space_id,
|
||||
u32 register_count,
|
||||
u8 gpe_block_base_number,
|
||||
u16 gpe_block_base_number,
|
||||
u32 interrupt_number,
|
||||
struct acpi_gpe_block_info **return_gpe_block);
|
||||
|
||||
|
|
|
@ -44,144 +44,14 @@
|
|||
#ifndef __ACGLOBAL_H__
|
||||
#define __ACGLOBAL_H__
|
||||
|
||||
/*
|
||||
* Ensure that the globals are actually defined and initialized only once.
|
||||
*
|
||||
* The use of these macros allows a single list of globals (here) in order
|
||||
* to simplify maintenance of the code.
|
||||
*/
|
||||
#ifdef DEFINE_ACPI_GLOBALS
|
||||
#define ACPI_GLOBAL(type,name) \
|
||||
extern type name; \
|
||||
type name
|
||||
|
||||
#define ACPI_INIT_GLOBAL(type,name,value) \
|
||||
type name=value
|
||||
|
||||
#else
|
||||
#define ACPI_GLOBAL(type,name) \
|
||||
extern type name
|
||||
|
||||
#define ACPI_INIT_GLOBAL(type,name,value) \
|
||||
extern type name
|
||||
#endif
|
||||
|
||||
#ifdef DEFINE_ACPI_GLOBALS
|
||||
|
||||
/* Public globals, available from outside ACPICA subsystem */
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Runtime configuration (static defaults that can be overriden at runtime)
|
||||
* Globals related to the ACPI tables
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Enable "slack" in the AML interpreter? Default is FALSE, and the
|
||||
* interpreter strictly follows the ACPI specification. Setting to TRUE
|
||||
* allows the interpreter to ignore certain errors and/or bad AML constructs.
|
||||
*
|
||||
* Currently, these features are enabled by this flag:
|
||||
*
|
||||
* 1) Allow "implicit return" of last value in a control method
|
||||
* 2) Allow access beyond the end of an operation region
|
||||
* 3) Allow access to uninitialized locals/args (auto-init to integer 0)
|
||||
* 4) Allow ANY object type to be a source operand for the Store() operator
|
||||
* 5) Allow unresolved references (invalid target name) in package objects
|
||||
* 6) Enable warning messages for behavior that is not ACPI spec compliant
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_enable_interpreter_slack, FALSE);
|
||||
/* Master list of all ACPI tables that were found in the RSDT/XSDT */
|
||||
|
||||
/*
|
||||
* Automatically serialize all methods that create named objects? Default
|
||||
* is TRUE, meaning that all non_serialized methods are scanned once at
|
||||
* table load time to determine those that create named objects. Methods
|
||||
* that create named objects are marked Serialized in order to prevent
|
||||
* possible run-time problems if they are entered by more than one thread.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_auto_serialize_methods, TRUE);
|
||||
|
||||
/*
|
||||
* Create the predefined _OSI method in the namespace? Default is TRUE
|
||||
* because ACPI CA is fully compatible with other ACPI implementations.
|
||||
* Changing this will revert ACPI CA (and machine ASL) to pre-OSI behavior.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_create_osi_method, TRUE);
|
||||
|
||||
/*
|
||||
* Optionally use default values for the ACPI register widths. Set this to
|
||||
* TRUE to use the defaults, if an FADT contains incorrect widths/lengths.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_use_default_register_widths, TRUE);
|
||||
|
||||
/*
|
||||
* Optionally enable output from the AML Debug Object.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_enable_aml_debug_object, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally copy the entire DSDT to local memory (instead of simply
|
||||
* mapping it.) There are some BIOSs that corrupt or replace the original
|
||||
* DSDT, creating the need for this option. Default is FALSE, do not copy
|
||||
* the DSDT.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_copy_dsdt_locally, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally ignore an XSDT if present and use the RSDT instead.
|
||||
* Although the ACPI specification requires that an XSDT be used instead
|
||||
* of the RSDT, the XSDT has been found to be corrupt or ill-formed on
|
||||
* some machines. Default behavior is to use the XSDT if present.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_do_not_use_xsdt, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally use 32-bit FADT addresses if and when there is a conflict
|
||||
* (address mismatch) between the 32-bit and 64-bit versions of the
|
||||
* address. Although ACPICA adheres to the ACPI specification which
|
||||
* requires the use of the corresponding 64-bit address if it is non-zero,
|
||||
* some machines have been found to have a corrupted non-zero 64-bit
|
||||
* address. Default is TRUE, favor the 32-bit addresses.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_use32_bit_fadt_addresses, TRUE);
|
||||
|
||||
/*
|
||||
* Optionally truncate I/O addresses to 16 bits. Provides compatibility
|
||||
* with other ACPI implementations. NOTE: During ACPICA initialization,
|
||||
* this value is set to TRUE if any Windows OSI strings have been
|
||||
* requested by the BIOS.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_truncate_io_addresses, FALSE);
|
||||
|
||||
/*
|
||||
* Disable runtime checking and repair of values returned by control methods.
|
||||
* Use only if the repair is causing a problem on a particular machine.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_auto_repair, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally do not load any SSDTs from the RSDT/XSDT during initialization.
|
||||
* This can be useful for debugging ACPI problems on some machines.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_ssdt_table_load, FALSE);
|
||||
|
||||
/*
|
||||
* We keep track of the latest version of Windows that has been requested by
|
||||
* the BIOS.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_osi_data, 0);
|
||||
|
||||
#endif /* DEFINE_ACPI_GLOBALS */
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* ACPI Table globals
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Master list of all ACPI tables that were found in the RSDT/XSDT.
|
||||
*/
|
||||
ACPI_GLOBAL(struct acpi_table_list, acpi_gbl_root_table_list);
|
||||
|
||||
/* DSDT information. Used to check for DSDT corruption */
|
||||
|
@ -279,7 +149,6 @@ ACPI_GLOBAL(acpi_exception_handler, acpi_gbl_exception_handler);
|
|||
ACPI_GLOBAL(acpi_init_handler, acpi_gbl_init_handler);
|
||||
ACPI_GLOBAL(acpi_table_handler, acpi_gbl_table_handler);
|
||||
ACPI_GLOBAL(void *, acpi_gbl_table_handler_context);
|
||||
ACPI_GLOBAL(struct acpi_walk_state *, acpi_gbl_breakpoint_walk);
|
||||
ACPI_GLOBAL(acpi_interface_handler, acpi_gbl_interface_handler);
|
||||
ACPI_GLOBAL(struct acpi_sci_handler_info *, acpi_gbl_sci_handler_list);
|
||||
|
||||
|
@ -296,7 +165,6 @@ ACPI_GLOBAL(u8, acpi_gbl_reg_methods_executed);
|
|||
/* Misc */
|
||||
|
||||
ACPI_GLOBAL(u32, acpi_gbl_original_mode);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_rsdp_original_location);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_ns_lookup_count);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_ps_find_count);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_pm1_enable_register_save);
|
||||
|
@ -483,11 +351,6 @@ ACPI_GLOBAL(u16, acpi_gbl_node_type_count_misc);
|
|||
ACPI_GLOBAL(u32, acpi_gbl_num_nodes);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_num_objects);
|
||||
|
||||
ACPI_GLOBAL(u32, acpi_gbl_size_of_parse_tree);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_size_of_method_trees);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_size_of_node_entries);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_size_of_acpi_objects);
|
||||
|
||||
#endif /* ACPI_DEBUGGER */
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -509,5 +372,6 @@ ACPI_INIT_GLOBAL(ACPI_FILE, acpi_gbl_debug_file, NULL);
|
|||
****************************************************************************/
|
||||
|
||||
extern const struct ah_predefined_name asl_predefined_info[];
|
||||
extern const struct ah_device_id asl_device_ids[];
|
||||
|
||||
#endif /* __ACGLOBAL_H__ */
|
||||
|
|
|
@ -450,9 +450,9 @@ struct acpi_gpe_event_info {
|
|||
struct acpi_gpe_register_info {
|
||||
struct acpi_generic_address status_address; /* Address of status reg */
|
||||
struct acpi_generic_address enable_address; /* Address of enable reg */
|
||||
u16 base_gpe_number; /* Base GPE number for this register */
|
||||
u8 enable_for_wake; /* GPEs to keep enabled when sleeping */
|
||||
u8 enable_for_run; /* GPEs to keep enabled when running */
|
||||
u8 base_gpe_number; /* Base GPE number for this register */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -466,11 +466,12 @@ struct acpi_gpe_block_info {
|
|||
struct acpi_gpe_xrupt_info *xrupt_block; /* Backpointer to interrupt block */
|
||||
struct acpi_gpe_register_info *register_info; /* One per GPE register pair */
|
||||
struct acpi_gpe_event_info *event_info; /* One for each GPE */
|
||||
struct acpi_generic_address block_address; /* Base address of the block */
|
||||
u64 address; /* Base address of the block */
|
||||
u32 register_count; /* Number of register pairs in block */
|
||||
u16 gpe_count; /* Number of individual GPEs in block */
|
||||
u8 block_base_number; /* Base GPE number for this block */
|
||||
u8 initialized; /* TRUE if this block is initialized */
|
||||
u16 block_base_number; /* Base GPE number for this block */
|
||||
u8 space_id;
|
||||
u8 initialized; /* TRUE if this block is initialized */
|
||||
};
|
||||
|
||||
/* Information about GPE interrupt handlers, one per each interrupt level used for GPEs */
|
||||
|
@ -733,7 +734,8 @@ union acpi_parse_value {
|
|||
#define ACPI_DASM_MATCHOP 0x06 /* Parent opcode is a Match() operator */
|
||||
#define ACPI_DASM_LNOT_PREFIX 0x07 /* Start of a Lnot_equal (etc.) pair of opcodes */
|
||||
#define ACPI_DASM_LNOT_SUFFIX 0x08 /* End of a Lnot_equal (etc.) pair of opcodes */
|
||||
#define ACPI_DASM_IGNORE 0x09 /* Not used at this time */
|
||||
#define ACPI_DASM_HID_STRING 0x09 /* String is a _HID or _CID */
|
||||
#define ACPI_DASM_IGNORE 0x0A /* Not used at this time */
|
||||
|
||||
/*
|
||||
* Generic operation (for example: If, While, Store)
|
||||
|
@ -1147,4 +1149,9 @@ struct ah_predefined_name {
|
|||
#endif
|
||||
};
|
||||
|
||||
struct ah_device_id {
|
||||
char *name;
|
||||
char *description;
|
||||
};
|
||||
|
||||
#endif /* __ACLOCAL_H__ */
|
||||
|
|
|
@ -586,6 +586,10 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
|
|||
{{"_LID", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}},
|
||||
|
||||
{{"_LPD", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}}, /* Variable-length (1 Int(rev), n Pkg (2 Int) */
|
||||
PACKAGE_INFO(ACPI_PTYPE2_REV_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0),
|
||||
|
||||
{{"_MAT", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_BUFFER)}},
|
||||
|
||||
|
@ -698,12 +702,6 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
|
|||
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}}, /* Variable-length (Refs) */
|
||||
PACKAGE_INFO(ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0),
|
||||
|
||||
{{"_PRP", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}}, /* Variable-length (Pkgs) each: 1 Str, 1 Int/Str/Pkg */
|
||||
PACKAGE_INFO(ACPI_PTYPE2, ACPI_RTYPE_STRING, 1,
|
||||
ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING |
|
||||
ACPI_RTYPE_PACKAGE | ACPI_RTYPE_REFERENCE, 1, 0),
|
||||
|
||||
{{"_PRS", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_BUFFER)}},
|
||||
|
||||
|
|
|
@ -53,6 +53,31 @@ acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp);
|
|||
|
||||
u8 *acpi_tb_scan_memory_for_rsdp(u8 *start_address, u32 length);
|
||||
|
||||
/*
|
||||
* tbdata - table data structure management
|
||||
*/
|
||||
acpi_status acpi_tb_get_next_root_index(u32 *table_index);
|
||||
|
||||
void
|
||||
acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
|
||||
acpi_physical_address address,
|
||||
u8 flags, struct acpi_table_header *table);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_acquire_temp_table(struct acpi_table_desc *table_desc,
|
||||
acpi_physical_address address, u8 flags);
|
||||
|
||||
void acpi_tb_release_temp_table(struct acpi_table_desc *table_desc);
|
||||
|
||||
acpi_status acpi_tb_validate_temp_table(struct acpi_table_desc *table_desc);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_verify_temp_table(struct acpi_table_desc *table_desc, char *signature);
|
||||
|
||||
u8 acpi_tb_is_table_loaded(u32 table_index);
|
||||
|
||||
void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded);
|
||||
|
||||
/*
|
||||
* tbfadt - FADT parse/convert/validate
|
||||
*/
|
||||
|
@ -72,22 +97,32 @@ acpi_tb_find_table(char *signature,
|
|||
*/
|
||||
acpi_status acpi_tb_resize_root_table_list(void);
|
||||
|
||||
acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc);
|
||||
acpi_status acpi_tb_validate_table(struct acpi_table_desc *table_desc);
|
||||
|
||||
struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
||||
*table_header,
|
||||
struct acpi_table_desc
|
||||
*table_desc);
|
||||
void acpi_tb_invalidate_table(struct acpi_table_desc *table_desc);
|
||||
|
||||
void acpi_tb_override_table(struct acpi_table_desc *old_table_desc);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index);
|
||||
acpi_tb_acquire_table(struct acpi_table_desc *table_desc,
|
||||
struct acpi_table_header **table_ptr,
|
||||
u32 *table_length, u8 *table_flags);
|
||||
|
||||
void
|
||||
acpi_tb_release_table(struct acpi_table_header *table,
|
||||
u32 table_length, u8 table_flags);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_install_standard_table(acpi_physical_address address,
|
||||
u8 flags,
|
||||
u8 reload, u8 override, u32 *table_index);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_store_table(acpi_physical_address address,
|
||||
struct acpi_table_header *table,
|
||||
u32 length, u8 flags, u32 *table_index);
|
||||
|
||||
void acpi_tb_delete_table(struct acpi_table_desc *table_desc);
|
||||
void acpi_tb_uninstall_table(struct acpi_table_desc *table_desc);
|
||||
|
||||
void acpi_tb_terminate(void);
|
||||
|
||||
|
@ -99,10 +134,6 @@ acpi_status acpi_tb_release_owner_id(u32 table_index);
|
|||
|
||||
acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id);
|
||||
|
||||
u8 acpi_tb_is_table_loaded(u32 table_index);
|
||||
|
||||
void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded);
|
||||
|
||||
/*
|
||||
* tbutils - table manager utilities
|
||||
*/
|
||||
|
@ -124,8 +155,13 @@ void acpi_tb_check_dsdt_header(void);
|
|||
struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index);
|
||||
|
||||
void
|
||||
acpi_tb_install_table(acpi_physical_address address,
|
||||
char *signature, u32 table_index);
|
||||
acpi_tb_install_table_with_override(u32 table_index,
|
||||
struct acpi_table_desc *new_table_desc,
|
||||
u8 override);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_install_fixed_table(acpi_physical_address address,
|
||||
char *signature, u32 table_index);
|
||||
|
||||
acpi_status acpi_tb_parse_root_table(acpi_physical_address rsdp_address);
|
||||
|
||||
|
|
|
@ -176,8 +176,7 @@ acpi_status acpi_ut_init_globals(void);
|
|||
|
||||
char *acpi_ut_get_mutex_name(u32 mutex_id);
|
||||
|
||||
const char *acpi_ut_get_notify_name(u32 notify_value);
|
||||
|
||||
const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type);
|
||||
#endif
|
||||
|
||||
char *acpi_ut_get_type_name(acpi_object_type type);
|
||||
|
@ -737,4 +736,11 @@ acpi_ut_method_error(const char *module_name,
|
|||
struct acpi_namespace_node *node,
|
||||
const char *path, acpi_status lookup_status);
|
||||
|
||||
/*
|
||||
* Utility functions for ACPI names and IDs
|
||||
*/
|
||||
const struct ah_predefined_name *acpi_ah_match_predefined_name(char *nameseg);
|
||||
|
||||
const struct ah_device_id *acpi_ah_match_hardware_id(char *hid);
|
||||
|
||||
#endif /* _ACUTILS_H */
|
||||
|
|
|
@ -383,7 +383,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
|||
if (!(gpe_register_info->enable_for_run |
|
||||
gpe_register_info->enable_for_wake)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
||||
"Ignore disabled registers for GPE%02X-GPE%02X: "
|
||||
"Ignore disabled registers for GPE %02X-%02X: "
|
||||
"RunEnable=%02X, WakeEnable=%02X\n",
|
||||
gpe_register_info->
|
||||
base_gpe_number,
|
||||
|
@ -416,7 +416,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
||||
"Read registers for GPE%02X-GPE%02X: Status=%02X, Enable=%02X, "
|
||||
"Read registers for GPE %02X-%02X: Status=%02X, Enable=%02X, "
|
||||
"RunEnable=%02X, WakeEnable=%02X\n",
|
||||
gpe_register_info->base_gpe_number,
|
||||
gpe_register_info->base_gpe_number +
|
||||
|
@ -706,7 +706,8 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
status = acpi_hw_clear_gpe(gpe_event_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to clear GPE%02X", gpe_number));
|
||||
"Unable to clear GPE %02X",
|
||||
gpe_number));
|
||||
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
}
|
||||
|
@ -723,7 +724,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to disable GPE%02X", gpe_number));
|
||||
"Unable to disable GPE %02X", gpe_number));
|
||||
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
|
||||
|
@ -764,7 +765,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
gpe_event_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to queue handler for GPE%02X - event disabled",
|
||||
"Unable to queue handler for GPE %02X - event disabled",
|
||||
gpe_number));
|
||||
}
|
||||
break;
|
||||
|
@ -776,7 +777,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
* a GPE to be enabled if it has no handler or method.
|
||||
*/
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"No handler or method for GPE%02X, disabling event",
|
||||
"No handler or method for GPE %02X, disabling event",
|
||||
gpe_number));
|
||||
|
||||
break;
|
||||
|
|
|
@ -252,21 +252,17 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
|
|||
|
||||
/* Init the register_info for this GPE register (8 GPEs) */
|
||||
|
||||
this_register->base_gpe_number =
|
||||
(u8) (gpe_block->block_base_number +
|
||||
(i * ACPI_GPE_REGISTER_WIDTH));
|
||||
this_register->base_gpe_number = (u16)
|
||||
(gpe_block->block_base_number +
|
||||
(i * ACPI_GPE_REGISTER_WIDTH));
|
||||
|
||||
this_register->status_address.address =
|
||||
gpe_block->block_address.address + i;
|
||||
this_register->status_address.address = gpe_block->address + i;
|
||||
|
||||
this_register->enable_address.address =
|
||||
gpe_block->block_address.address + i +
|
||||
gpe_block->register_count;
|
||||
gpe_block->address + i + gpe_block->register_count;
|
||||
|
||||
this_register->status_address.space_id =
|
||||
gpe_block->block_address.space_id;
|
||||
this_register->enable_address.space_id =
|
||||
gpe_block->block_address.space_id;
|
||||
this_register->status_address.space_id = gpe_block->space_id;
|
||||
this_register->enable_address.space_id = gpe_block->space_id;
|
||||
this_register->status_address.bit_width =
|
||||
ACPI_GPE_REGISTER_WIDTH;
|
||||
this_register->enable_address.bit_width =
|
||||
|
@ -334,9 +330,10 @@ error_exit:
|
|||
|
||||
acpi_status
|
||||
acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||
struct acpi_generic_address *gpe_block_address,
|
||||
u64 address,
|
||||
u8 space_id,
|
||||
u32 register_count,
|
||||
u8 gpe_block_base_number,
|
||||
u16 gpe_block_base_number,
|
||||
u32 interrupt_number,
|
||||
struct acpi_gpe_block_info **return_gpe_block)
|
||||
{
|
||||
|
@ -359,15 +356,14 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
|||
|
||||
/* Initialize the new GPE block */
|
||||
|
||||
gpe_block->address = address;
|
||||
gpe_block->space_id = space_id;
|
||||
gpe_block->node = gpe_device;
|
||||
gpe_block->gpe_count = (u16)(register_count * ACPI_GPE_REGISTER_WIDTH);
|
||||
gpe_block->initialized = FALSE;
|
||||
gpe_block->register_count = register_count;
|
||||
gpe_block->block_base_number = gpe_block_base_number;
|
||||
|
||||
ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address,
|
||||
sizeof(struct acpi_generic_address));
|
||||
|
||||
/*
|
||||
* Create the register_info and event_info sub-structures
|
||||
* Note: disables and clears all GPEs in the block
|
||||
|
@ -408,12 +404,14 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
" Initialized GPE %02X to %02X [%4.4s] %u regs on interrupt 0x%X\n",
|
||||
" Initialized GPE %02X to %02X [%4.4s] %u regs on interrupt 0x%X%s\n",
|
||||
(u32)gpe_block->block_base_number,
|
||||
(u32)(gpe_block->block_base_number +
|
||||
(gpe_block->gpe_count - 1)),
|
||||
gpe_device->name.ascii, gpe_block->register_count,
|
||||
interrupt_number));
|
||||
interrupt_number,
|
||||
interrupt_number ==
|
||||
acpi_gbl_FADT.sci_interrupt ? " (SCI)" : ""));
|
||||
|
||||
/* Update global count of currently available GPEs */
|
||||
|
||||
|
|
|
@ -131,8 +131,10 @@ acpi_status acpi_ev_gpe_initialize(void)
|
|||
/* Install GPE Block 0 */
|
||||
|
||||
status = acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device,
|
||||
&acpi_gbl_FADT.xgpe0_block,
|
||||
register_count0, 0,
|
||||
acpi_gbl_FADT.xgpe0_block.
|
||||
address,
|
||||
acpi_gbl_FADT.xgpe0_block.
|
||||
space_id, register_count0, 0,
|
||||
acpi_gbl_FADT.sci_interrupt,
|
||||
&acpi_gbl_gpe_fadt_blocks[0]);
|
||||
|
||||
|
@ -169,8 +171,10 @@ acpi_status acpi_ev_gpe_initialize(void)
|
|||
|
||||
status =
|
||||
acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device,
|
||||
&acpi_gbl_FADT.xgpe1_block,
|
||||
register_count1,
|
||||
acpi_gbl_FADT.xgpe1_block.
|
||||
address,
|
||||
acpi_gbl_FADT.xgpe1_block.
|
||||
space_id, register_count1,
|
||||
acpi_gbl_FADT.gpe1_base,
|
||||
acpi_gbl_FADT.
|
||||
sci_interrupt,
|
||||
|
|
|
@ -167,7 +167,8 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
|
|||
"Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
|
||||
acpi_ut_get_node_name(node),
|
||||
acpi_ut_get_type_name(node->type), notify_value,
|
||||
acpi_ut_get_notify_name(notify_value), node));
|
||||
acpi_ut_get_notify_name(notify_value, ACPI_TYPE_ANY),
|
||||
node));
|
||||
|
||||
status = acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_ev_notify_dispatch,
|
||||
info);
|
||||
|
|
|
@ -117,7 +117,7 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
|
|||
ACPI_FUNCTION_TRACE(ev_sci_xrupt_handler);
|
||||
|
||||
/*
|
||||
* We are guaranteed by the ACPI CA initialization/shutdown code that
|
||||
* We are guaranteed by the ACPICA initialization/shutdown code that
|
||||
* if this interrupt handler is installed, ACPI is enabled.
|
||||
*/
|
||||
|
||||
|
|
|
@ -239,7 +239,7 @@ acpi_remove_notify_handler(acpi_handle device,
|
|||
union acpi_operand_object *obj_desc;
|
||||
union acpi_operand_object *handler_obj;
|
||||
union acpi_operand_object *previous_handler_obj;
|
||||
acpi_status status;
|
||||
acpi_status status = AE_OK;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_remove_notify_handler);
|
||||
|
@ -251,20 +251,17 @@ acpi_remove_notify_handler(acpi_handle device,
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Make sure all deferred notify tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Root Object. Global handlers are removed here */
|
||||
|
||||
if (device == ACPI_ROOT_OBJECT) {
|
||||
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++) {
|
||||
if (handler_type & (i + 1)) {
|
||||
status =
|
||||
acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (!acpi_gbl_global_notify[i].handler ||
|
||||
(acpi_gbl_global_notify[i].handler !=
|
||||
handler)) {
|
||||
|
@ -277,31 +274,40 @@ acpi_remove_notify_handler(acpi_handle device,
|
|||
|
||||
acpi_gbl_global_notify[i].handler = NULL;
|
||||
acpi_gbl_global_notify[i].context = NULL;
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
/* Make sure all deferred notify tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
}
|
||||
}
|
||||
|
||||
goto unlock_and_exit;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* All other objects: Are Notifies allowed on this object? */
|
||||
|
||||
if (!acpi_ev_is_notify_object(node)) {
|
||||
status = AE_TYPE;
|
||||
goto unlock_and_exit;
|
||||
return_ACPI_STATUS(AE_TYPE);
|
||||
}
|
||||
|
||||
/* Must have an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (!obj_desc) {
|
||||
status = AE_NOT_EXIST;
|
||||
goto unlock_and_exit;
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/* Internal object exists. Find the handler and remove it */
|
||||
|
||||
for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++) {
|
||||
if (handler_type & (i + 1)) {
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
handler_obj = obj_desc->common_notify.notify_list[i];
|
||||
previous_handler_obj = NULL;
|
||||
|
||||
|
@ -329,10 +335,17 @@ acpi_remove_notify_handler(acpi_handle device,
|
|||
handler_obj->notify.next[i];
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
/* Make sure all deferred notify tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
acpi_ut_remove_reference(handler_obj);
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -457,6 +470,8 @@ exit:
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_install_sci_handler)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_remove_sci_handler
|
||||
|
@ -468,7 +483,6 @@ exit:
|
|||
* DESCRIPTION: Remove a handler for a System Control Interrupt.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_remove_sci_handler(acpi_sci_handler address)
|
||||
{
|
||||
struct acpi_sci_handler_info *prev_sci_handler;
|
||||
|
@ -522,6 +536,8 @@ unlock_and_exit:
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_remove_sci_handler)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_install_global_event_handler
|
||||
|
@ -537,7 +553,6 @@ unlock_and_exit:
|
|||
* Can be used to update event counters, etc.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_install_global_event_handler(acpi_gbl_event_handler handler, void *context)
|
||||
{
|
||||
|
@ -840,10 +855,6 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Make sure all deferred GPE tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -895,9 +906,17 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
|
|||
(void)acpi_ev_add_gpe_reference(gpe_event_info);
|
||||
}
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
|
||||
/* Make sure all deferred GPE tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
|
||||
/* Now we can free the handler object */
|
||||
|
||||
ACPI_FREE(handler);
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
unlock_and_exit:
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
|
|
|
@ -599,9 +599,10 @@ acpi_install_gpe_block(acpi_handle gpe_device,
|
|||
* For user-installed GPE Block Devices, the gpe_block_base_number
|
||||
* is always zero
|
||||
*/
|
||||
status =
|
||||
acpi_ev_create_gpe_block(node, gpe_block_address, register_count, 0,
|
||||
interrupt_number, &gpe_block);
|
||||
status = acpi_ev_create_gpe_block(node, gpe_block_address->address,
|
||||
gpe_block_address->space_id,
|
||||
register_count, 0, interrupt_number,
|
||||
&gpe_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
|
|
@ -343,16 +343,14 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
union acpi_operand_object *ddb_handle;
|
||||
struct acpi_table_header *table_header;
|
||||
struct acpi_table_header *table;
|
||||
struct acpi_table_desc table_desc;
|
||||
u32 table_index;
|
||||
acpi_status status;
|
||||
u32 length;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_load_op);
|
||||
|
||||
ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
|
||||
|
||||
/* Source Object can be either an op_region or a Buffer/Field */
|
||||
|
||||
switch (obj_desc->common.type) {
|
||||
|
@ -380,17 +378,17 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* Get the table header first so we can get the table length */
|
||||
|
||||
table = ACPI_ALLOCATE(sizeof(struct acpi_table_header));
|
||||
if (!table) {
|
||||
table_header = ACPI_ALLOCATE(sizeof(struct acpi_table_header));
|
||||
if (!table_header) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_ex_region_read(obj_desc,
|
||||
sizeof(struct acpi_table_header),
|
||||
ACPI_CAST_PTR(u8, table));
|
||||
length = table->length;
|
||||
ACPI_FREE(table);
|
||||
ACPI_CAST_PTR(u8, table_header));
|
||||
length = table_header->length;
|
||||
ACPI_FREE(table_header);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -420,22 +418,19 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* Allocate a buffer for the table */
|
||||
|
||||
table_desc.pointer = ACPI_ALLOCATE(length);
|
||||
if (!table_desc.pointer) {
|
||||
table = ACPI_ALLOCATE(length);
|
||||
if (!table) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Read the entire table */
|
||||
|
||||
status = acpi_ex_region_read(obj_desc, length,
|
||||
ACPI_CAST_PTR(u8,
|
||||
table_desc.pointer));
|
||||
ACPI_CAST_PTR(u8, table));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_FREE(table_desc.pointer);
|
||||
ACPI_FREE(table);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
table_desc.address = obj_desc->region.address;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */
|
||||
|
@ -452,10 +447,10 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* Get the actual table length from the table header */
|
||||
|
||||
table =
|
||||
table_header =
|
||||
ACPI_CAST_PTR(struct acpi_table_header,
|
||||
obj_desc->buffer.pointer);
|
||||
length = table->length;
|
||||
length = table_header->length;
|
||||
|
||||
/* Table cannot extend beyond the buffer */
|
||||
|
||||
|
@ -470,13 +465,12 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
* Copy the table from the buffer because the buffer could be modified
|
||||
* or even deleted in the future
|
||||
*/
|
||||
table_desc.pointer = ACPI_ALLOCATE(length);
|
||||
if (!table_desc.pointer) {
|
||||
table = ACPI_ALLOCATE(length);
|
||||
if (!table) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
ACPI_MEMCPY(table_desc.pointer, table, length);
|
||||
table_desc.address = ACPI_TO_INTEGER(table_desc.pointer);
|
||||
ACPI_MEMCPY(table, table_header, length);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -484,27 +478,32 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/* Validate table checksum (will not get validated in tb_add_table) */
|
||||
|
||||
status = acpi_tb_verify_checksum(table_desc.pointer, length);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_FREE(table_desc.pointer);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Complete the table descriptor */
|
||||
|
||||
table_desc.length = length;
|
||||
table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
|
||||
|
||||
/* Install the new table into the local data structures */
|
||||
|
||||
status = acpi_tb_add_table(&table_desc, &table_index);
|
||||
ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:"));
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
status = acpi_tb_install_standard_table(ACPI_PTR_TO_PHYSADDR(table),
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
|
||||
TRUE, TRUE, &table_index);
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* Delete allocated table buffer */
|
||||
|
||||
acpi_tb_delete_table(&table_desc);
|
||||
ACPI_FREE(table);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: Now table is "INSTALLED", it must be validated before
|
||||
* loading.
|
||||
*/
|
||||
status =
|
||||
acpi_tb_validate_table(&acpi_gbl_root_table_list.
|
||||
tables[table_index]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -536,9 +535,6 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:"));
|
||||
acpi_tb_print_table_header(0, table_desc.pointer);
|
||||
|
||||
/* Remove the reference by added by acpi_ex_store above */
|
||||
|
||||
acpi_ut_remove_reference(ddb_handle);
|
||||
|
@ -546,8 +542,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
/* Invoke table handler if present */
|
||||
|
||||
if (acpi_gbl_table_handler) {
|
||||
(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_LOAD,
|
||||
table_desc.pointer,
|
||||
(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_LOAD, table,
|
||||
acpi_gbl_table_handler_context);
|
||||
}
|
||||
|
||||
|
@ -575,6 +570,13 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
|||
|
||||
ACPI_FUNCTION_TRACE(ex_unload_table);
|
||||
|
||||
/*
|
||||
* Temporarily emit a warning so that the ASL for the machine can be
|
||||
* hopefully obtained. This is to say that the Unload() operator is
|
||||
* extremely rare if not completely unused.
|
||||
*/
|
||||
ACPI_WARNING((AE_INFO, "Received request to unload an ACPI table"));
|
||||
|
||||
/*
|
||||
* Validate the handle
|
||||
* Although the handle is partially validated in acpi_ex_reconfiguration()
|
||||
|
|
|
@ -134,9 +134,11 @@ static struct acpi_exdump_info acpi_ex_dump_method[9] = {
|
|||
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"}
|
||||
};
|
||||
|
||||
static struct acpi_exdump_info acpi_ex_dump_mutex[5] = {
|
||||
static struct acpi_exdump_info acpi_ex_dump_mutex[6] = {
|
||||
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL},
|
||||
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"},
|
||||
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.original_sync_level),
|
||||
"Original Sync Level"},
|
||||
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"},
|
||||
{ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth),
|
||||
"Acquire Depth"},
|
||||
|
|
|
@ -140,11 +140,12 @@ acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id,
|
|||
/* Walk the list, updating the PCI device/function/bus numbers */
|
||||
|
||||
status = acpi_hw_process_pci_list(pci_id, list_head);
|
||||
|
||||
/* Delete the list */
|
||||
|
||||
acpi_hw_delete_pci_list(list_head);
|
||||
}
|
||||
|
||||
/* Always delete the list */
|
||||
|
||||
acpi_hw_delete_pci_list(list_head);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -187,6 +188,10 @@ acpi_hw_build_pci_list(acpi_handle root_pci_device,
|
|||
while (1) {
|
||||
status = acpi_get_parent(current_device, &parent_device);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* Must delete the list before exit */
|
||||
|
||||
acpi_hw_delete_pci_list(*return_list_head);
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
@ -199,6 +204,10 @@ acpi_hw_build_pci_list(acpi_handle root_pci_device,
|
|||
|
||||
list_element = ACPI_ALLOCATE(sizeof(struct acpi_pci_device));
|
||||
if (!list_element) {
|
||||
|
||||
/* Must delete the list before exit */
|
||||
|
||||
acpi_hw_delete_pci_list(*return_list_head);
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
|
|
|
@ -72,6 +72,8 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
|||
void *resource;
|
||||
void *current_resource_ptr;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_buffer_to_resource);
|
||||
|
||||
/*
|
||||
* Note: we allow AE_AML_NO_RESOURCE_END_TAG, since an end tag
|
||||
* is not required here.
|
||||
|
@ -85,7 +87,7 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
|||
status = AE_OK;
|
||||
}
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Allocate a buffer for the converted resource */
|
||||
|
@ -93,7 +95,7 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
|||
resource = ACPI_ALLOCATE_ZEROED(list_size_needed);
|
||||
current_resource_ptr = resource;
|
||||
if (!resource) {
|
||||
return (AE_NO_MEMORY);
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Perform the AML-to-Resource conversion */
|
||||
|
@ -110,9 +112,11 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
|||
*resource_ptr = resource;
|
||||
}
|
||||
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_buffer_to_resource)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_rs_create_resource_list
|
||||
|
@ -130,10 +134,9 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
|||
* of device resources.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
|
||||
struct acpi_buffer * output_buffer)
|
||||
struct acpi_buffer *output_buffer)
|
||||
{
|
||||
|
||||
acpi_status status;
|
||||
|
|
|
@ -0,0 +1,760 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: tbdata - Table manager data structure functions
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2014, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_TABLES
|
||||
ACPI_MODULE_NAME("tbdata")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_init_table_descriptor
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor
|
||||
* address - Physical address of the table
|
||||
* flags - Allocation flags of the table
|
||||
* table - Pointer to the table
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Initialize a new table descriptor
|
||||
*
|
||||
******************************************************************************/
|
||||
void
|
||||
acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
|
||||
acpi_physical_address address,
|
||||
u8 flags, struct acpi_table_header *table)
|
||||
{
|
||||
|
||||
/*
|
||||
* Initialize the table descriptor. Set the pointer to NULL, since the
|
||||
* table is not fully mapped at this time.
|
||||
*/
|
||||
ACPI_MEMSET(table_desc, 0, sizeof(struct acpi_table_desc));
|
||||
table_desc->address = address;
|
||||
table_desc->length = table->length;
|
||||
table_desc->flags = flags;
|
||||
ACPI_MOVE_32_TO_32(table_desc->signature.ascii, table->signature);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_acquire_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor
|
||||
* table_ptr - Where table is returned
|
||||
* table_length - Where table length is returned
|
||||
* table_flags - Where table allocation flags are returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Acquire an ACPI table. It can be used for tables not
|
||||
* maintained in the acpi_gbl_root_table_list.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_tb_acquire_table(struct acpi_table_desc *table_desc,
|
||||
struct acpi_table_header **table_ptr,
|
||||
u32 *table_length, u8 *table_flags)
|
||||
{
|
||||
struct acpi_table_header *table = NULL;
|
||||
|
||||
switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
|
||||
case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
|
||||
|
||||
table =
|
||||
acpi_os_map_memory(table_desc->address, table_desc->length);
|
||||
break;
|
||||
|
||||
case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
|
||||
case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
|
||||
|
||||
table =
|
||||
ACPI_CAST_PTR(struct acpi_table_header,
|
||||
table_desc->address);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Table is not valid yet */
|
||||
|
||||
if (!table) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Fill the return values */
|
||||
|
||||
*table_ptr = table;
|
||||
*table_length = table_desc->length;
|
||||
*table_flags = table_desc->flags;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_release_table
|
||||
*
|
||||
* PARAMETERS: table - Pointer for the table
|
||||
* table_length - Length for the table
|
||||
* table_flags - Allocation flags for the table
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Release a table. The inverse of acpi_tb_acquire_table().
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_tb_release_table(struct acpi_table_header *table,
|
||||
u32 table_length, u8 table_flags)
|
||||
{
|
||||
|
||||
switch (table_flags & ACPI_TABLE_ORIGIN_MASK) {
|
||||
case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
|
||||
|
||||
acpi_os_unmap_memory(table, table_length);
|
||||
break;
|
||||
|
||||
case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
|
||||
case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_acquire_temp_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor to be acquired
|
||||
* address - Address of the table
|
||||
* flags - Allocation flags of the table
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: This function validates the table header to obtain the length
|
||||
* of a table and fills the table descriptor to make its state as
|
||||
* "INSTALLED". Such a table descriptor is only used for verified
|
||||
* installation.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_tb_acquire_temp_table(struct acpi_table_desc *table_desc,
|
||||
acpi_physical_address address, u8 flags)
|
||||
{
|
||||
struct acpi_table_header *table_header;
|
||||
|
||||
switch (flags & ACPI_TABLE_ORIGIN_MASK) {
|
||||
case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
|
||||
|
||||
/* Get the length of the full table from the header */
|
||||
|
||||
table_header =
|
||||
acpi_os_map_memory(address,
|
||||
sizeof(struct acpi_table_header));
|
||||
if (!table_header) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
acpi_tb_init_table_descriptor(table_desc, address, flags,
|
||||
table_header);
|
||||
acpi_os_unmap_memory(table_header,
|
||||
sizeof(struct acpi_table_header));
|
||||
return (AE_OK);
|
||||
|
||||
case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
|
||||
case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
|
||||
|
||||
table_header = ACPI_CAST_PTR(struct acpi_table_header, address);
|
||||
if (!table_header) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
acpi_tb_init_table_descriptor(table_desc, address, flags,
|
||||
table_header);
|
||||
return (AE_OK);
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Table is not valid yet */
|
||||
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_release_temp_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor to be released
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: The inverse of acpi_tb_acquire_temp_table().
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
void acpi_tb_release_temp_table(struct acpi_table_desc *table_desc)
|
||||
{
|
||||
|
||||
/*
|
||||
* Note that the .Address is maintained by the callers of
|
||||
* acpi_tb_acquire_temp_table(), thus do not invoke acpi_tb_uninstall_table()
|
||||
* where .Address will be freed.
|
||||
*/
|
||||
acpi_tb_invalidate_table(table_desc);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: This function is called to validate the table, the returned
|
||||
* table descriptor is in "VALIDATED" state.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_validate_table(struct acpi_table_desc *table_desc)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_validate_table);
|
||||
|
||||
/* Validate the table if necessary */
|
||||
|
||||
if (!table_desc->pointer) {
|
||||
status = acpi_tb_acquire_table(table_desc, &table_desc->pointer,
|
||||
&table_desc->length,
|
||||
&table_desc->flags);
|
||||
if (!table_desc->pointer) {
|
||||
status = AE_NO_MEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_invalidate_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
|
||||
* acpi_tb_validate_table().
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_tb_invalidate_table(struct acpi_table_desc *table_desc)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_invalidate_table);
|
||||
|
||||
/* Table must be validated */
|
||||
|
||||
if (!table_desc->pointer) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
acpi_tb_release_table(table_desc->pointer, table_desc->length,
|
||||
table_desc->flags);
|
||||
table_desc->pointer = NULL;
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_temp_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: This function is called to validate the table, the returned
|
||||
* table descriptor is in "VALIDATED" state.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_validate_temp_table(struct acpi_table_desc *table_desc)
|
||||
{
|
||||
|
||||
if (!table_desc->pointer && !acpi_gbl_verify_table_checksum) {
|
||||
/*
|
||||
* Only validates the header of the table.
|
||||
* Note that Length contains the size of the mapping after invoking
|
||||
* this work around, this value is required by
|
||||
* acpi_tb_release_temp_table().
|
||||
* We can do this because in acpi_init_table_descriptor(), the Length
|
||||
* field of the installed descriptor is filled with the actual
|
||||
* table length obtaining from the table header.
|
||||
*/
|
||||
table_desc->length = sizeof(struct acpi_table_header);
|
||||
}
|
||||
|
||||
return (acpi_tb_validate_table(table_desc));
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_verify_temp_table
|
||||
*
|
||||
* PARAMETERS: table_desc - Table descriptor
|
||||
* signature - Table signature to verify
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: This function is called to validate and verify the table, the
|
||||
* returned table descriptor is in "VALIDATED" state.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_tb_verify_temp_table(struct acpi_table_desc * table_desc, char *signature)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_verify_temp_table);
|
||||
|
||||
/* Validate the table */
|
||||
|
||||
status = acpi_tb_validate_temp_table(table_desc);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* If a particular signature is expected (DSDT/FACS), it must match */
|
||||
|
||||
if (signature && !ACPI_COMPARE_NAME(&table_desc->signature, signature)) {
|
||||
ACPI_BIOS_ERROR((AE_INFO,
|
||||
"Invalid signature 0x%X for ACPI table, expected [%s]",
|
||||
table_desc->signature.integer, signature));
|
||||
status = AE_BAD_SIGNATURE;
|
||||
goto invalidate_and_exit;
|
||||
}
|
||||
|
||||
/* Verify the checksum */
|
||||
|
||||
if (acpi_gbl_verify_table_checksum) {
|
||||
status =
|
||||
acpi_tb_verify_checksum(table_desc->pointer,
|
||||
table_desc->length);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
|
||||
"%4.4s " ACPI_PRINTF_UINT
|
||||
" Attempted table install failed",
|
||||
acpi_ut_valid_acpi_name(table_desc->
|
||||
signature.
|
||||
ascii) ?
|
||||
table_desc->signature.ascii : "????",
|
||||
ACPI_FORMAT_TO_UINT(table_desc->
|
||||
address)));
|
||||
goto invalidate_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
invalidate_and_exit:
|
||||
acpi_tb_invalidate_table(table_desc);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_resize_root_table_list
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Expand the size of global table array
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_resize_root_table_list(void)
|
||||
{
|
||||
struct acpi_table_desc *tables;
|
||||
u32 table_count;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_resize_root_table_list);
|
||||
|
||||
/* allow_resize flag is a parameter to acpi_initialize_tables */
|
||||
|
||||
if (!(acpi_gbl_root_table_list.flags & ACPI_ROOT_ALLOW_RESIZE)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Resize of Root Table Array is not allowed"));
|
||||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
||||
/* Increase the Table Array size */
|
||||
|
||||
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
|
||||
table_count = acpi_gbl_root_table_list.max_table_count;
|
||||
} else {
|
||||
table_count = acpi_gbl_root_table_list.current_table_count;
|
||||
}
|
||||
|
||||
tables = ACPI_ALLOCATE_ZEROED(((acpi_size) table_count +
|
||||
ACPI_ROOT_TABLE_SIZE_INCREMENT) *
|
||||
sizeof(struct acpi_table_desc));
|
||||
if (!tables) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not allocate new root table array"));
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Copy and free the previous table array */
|
||||
|
||||
if (acpi_gbl_root_table_list.tables) {
|
||||
ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables,
|
||||
(acpi_size) table_count *
|
||||
sizeof(struct acpi_table_desc));
|
||||
|
||||
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
|
||||
ACPI_FREE(acpi_gbl_root_table_list.tables);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_gbl_root_table_list.tables = tables;
|
||||
acpi_gbl_root_table_list.max_table_count =
|
||||
table_count + ACPI_ROOT_TABLE_SIZE_INCREMENT;
|
||||
acpi_gbl_root_table_list.flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_get_next_root_index
|
||||
*
|
||||
* PARAMETERS: table_index - Where table index is returned
|
||||
*
|
||||
* RETURN: Status and table index.
|
||||
*
|
||||
* DESCRIPTION: Allocate a new ACPI table entry to the global table list
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_get_next_root_index(u32 *table_index)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
/* Ensure that there is room for the table in the Root Table List */
|
||||
|
||||
if (acpi_gbl_root_table_list.current_table_count >=
|
||||
acpi_gbl_root_table_list.max_table_count) {
|
||||
status = acpi_tb_resize_root_table_list();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
|
||||
*table_index = acpi_gbl_root_table_list.current_table_count;
|
||||
acpi_gbl_root_table_list.current_table_count++;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_terminate
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Delete all internal ACPI tables
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_tb_terminate(void)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_terminate);
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
/* Delete the individual tables */
|
||||
|
||||
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
|
||||
acpi_tb_uninstall_table(&acpi_gbl_root_table_list.tables[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete the root table array if allocated locally. Array cannot be
|
||||
* mapped, so we don't need to check for that flag.
|
||||
*/
|
||||
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
|
||||
ACPI_FREE(acpi_gbl_root_table_list.tables);
|
||||
}
|
||||
|
||||
acpi_gbl_root_table_list.tables = NULL;
|
||||
acpi_gbl_root_table_list.flags = 0;
|
||||
acpi_gbl_root_table_list.current_table_count = 0;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n"));
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_delete_namespace_by_owner
|
||||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Delete all namespace objects created when this table was loaded.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index)
|
||||
{
|
||||
acpi_owner_id owner_id;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_delete_namespace_by_owner);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (table_index >= acpi_gbl_root_table_list.current_table_count) {
|
||||
|
||||
/* The table index does not exist */
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/* Get the owner ID for this table, used to delete namespace nodes */
|
||||
|
||||
owner_id = acpi_gbl_root_table_list.tables[table_index].owner_id;
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
/*
|
||||
* Need to acquire the namespace writer lock to prevent interference
|
||||
* with any concurrent namespace walks. The interpreter must be
|
||||
* released during the deletion since the acquisition of the deletion
|
||||
* lock may block, and also since the execution of a namespace walk
|
||||
* must be allowed to use the interpreter.
|
||||
*/
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
|
||||
status = acpi_ut_acquire_write_lock(&acpi_gbl_namespace_rw_lock);
|
||||
|
||||
acpi_ns_delete_namespace_by_owner(owner_id);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ut_release_write_lock(&acpi_gbl_namespace_rw_lock);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_allocate_owner_id
|
||||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Allocates owner_id in table_desc
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_allocate_owner_id(u32 table_index)
|
||||
{
|
||||
acpi_status status = AE_BAD_PARAMETER;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_allocate_owner_id);
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.current_table_count) {
|
||||
status =
|
||||
acpi_ut_allocate_owner_id(&
|
||||
(acpi_gbl_root_table_list.
|
||||
tables[table_index].owner_id));
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_release_owner_id
|
||||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Releases owner_id in table_desc
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_release_owner_id(u32 table_index)
|
||||
{
|
||||
acpi_status status = AE_BAD_PARAMETER;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_release_owner_id);
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.current_table_count) {
|
||||
acpi_ut_release_owner_id(&
|
||||
(acpi_gbl_root_table_list.
|
||||
tables[table_index].owner_id));
|
||||
status = AE_OK;
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_get_owner_id
|
||||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
* owner_id - Where the table owner_id is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: returns owner_id for the ACPI table
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id * owner_id)
|
||||
{
|
||||
acpi_status status = AE_BAD_PARAMETER;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_get_owner_id);
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.current_table_count) {
|
||||
*owner_id =
|
||||
acpi_gbl_root_table_list.tables[table_index].owner_id;
|
||||
status = AE_OK;
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_is_table_loaded
|
||||
*
|
||||
* PARAMETERS: table_index - Index into the root table
|
||||
*
|
||||
* RETURN: Table Loaded Flag
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_tb_is_table_loaded(u32 table_index)
|
||||
{
|
||||
u8 is_loaded = FALSE;
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.current_table_count) {
|
||||
is_loaded = (u8)
|
||||
(acpi_gbl_root_table_list.tables[table_index].flags &
|
||||
ACPI_TABLE_IS_LOADED);
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return (is_loaded);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_set_table_loaded_flag
|
||||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
* is_loaded - TRUE if table is loaded, FALSE otherwise
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded)
|
||||
{
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.current_table_count) {
|
||||
if (is_loaded) {
|
||||
acpi_gbl_root_table_list.tables[table_index].flags |=
|
||||
ACPI_TABLE_IS_LOADED;
|
||||
} else {
|
||||
acpi_gbl_root_table_list.tables[table_index].flags &=
|
||||
~ACPI_TABLE_IS_LOADED;
|
||||
}
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
}
|
|
@ -52,7 +52,8 @@ ACPI_MODULE_NAME("tbfadt")
|
|||
static void
|
||||
acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
|
||||
u8 space_id,
|
||||
u8 byte_width, u64 address, char *register_name);
|
||||
u8 byte_width,
|
||||
u64 address, char *register_name, u8 flags);
|
||||
|
||||
static void acpi_tb_convert_fadt(void);
|
||||
|
||||
|
@ -69,13 +70,14 @@ typedef struct acpi_fadt_info {
|
|||
u16 address32;
|
||||
u16 length;
|
||||
u8 default_length;
|
||||
u8 type;
|
||||
u8 flags;
|
||||
|
||||
} acpi_fadt_info;
|
||||
|
||||
#define ACPI_FADT_OPTIONAL 0
|
||||
#define ACPI_FADT_REQUIRED 1
|
||||
#define ACPI_FADT_SEPARATE_LENGTH 2
|
||||
#define ACPI_FADT_GPE_REGISTER 4
|
||||
|
||||
static struct acpi_fadt_info fadt_info_table[] = {
|
||||
{"Pm1aEventBlock",
|
||||
|
@ -125,14 +127,14 @@ static struct acpi_fadt_info fadt_info_table[] = {
|
|||
ACPI_FADT_OFFSET(gpe0_block),
|
||||
ACPI_FADT_OFFSET(gpe0_block_length),
|
||||
0,
|
||||
ACPI_FADT_SEPARATE_LENGTH},
|
||||
ACPI_FADT_SEPARATE_LENGTH | ACPI_FADT_GPE_REGISTER},
|
||||
|
||||
{"Gpe1Block",
|
||||
ACPI_FADT_OFFSET(xgpe1_block),
|
||||
ACPI_FADT_OFFSET(gpe1_block),
|
||||
ACPI_FADT_OFFSET(gpe1_block_length),
|
||||
0,
|
||||
ACPI_FADT_SEPARATE_LENGTH}
|
||||
ACPI_FADT_SEPARATE_LENGTH | ACPI_FADT_GPE_REGISTER}
|
||||
};
|
||||
|
||||
#define ACPI_FADT_INFO_ENTRIES \
|
||||
|
@ -189,19 +191,29 @@ static struct acpi_fadt_pm_info fadt_pm_info_table[] = {
|
|||
static void
|
||||
acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
|
||||
u8 space_id,
|
||||
u8 byte_width, u64 address, char *register_name)
|
||||
u8 byte_width,
|
||||
u64 address, char *register_name, u8 flags)
|
||||
{
|
||||
u8 bit_width;
|
||||
|
||||
/* Bit width field in the GAS is only one byte long, 255 max */
|
||||
|
||||
/*
|
||||
* Bit width field in the GAS is only one byte long, 255 max.
|
||||
* Check for bit_width overflow in GAS.
|
||||
*/
|
||||
bit_width = (u8)(byte_width * 8);
|
||||
|
||||
if (byte_width > 31) { /* (31*8)=248 */
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"%s - 32-bit FADT register is too long (%u bytes, %u bits) "
|
||||
"to convert to GAS struct - 255 bits max, truncating",
|
||||
register_name, byte_width, (byte_width * 8)));
|
||||
if (byte_width > 31) { /* (31*8)=248, (32*8)=256 */
|
||||
/*
|
||||
* No error for GPE blocks, because we do not use the bit_width
|
||||
* for GPEs, the legacy length (byte_width) is used instead to
|
||||
* allow for a large number of GPEs.
|
||||
*/
|
||||
if (!(flags & ACPI_FADT_GPE_REGISTER)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"%s - 32-bit FADT register is too long (%u bytes, %u bits) "
|
||||
"to convert to GAS struct - 255 bits max, truncating",
|
||||
register_name, byte_width,
|
||||
(byte_width * 8)));
|
||||
}
|
||||
|
||||
bit_width = 255;
|
||||
}
|
||||
|
@ -332,15 +344,15 @@ void acpi_tb_parse_fadt(u32 table_index)
|
|||
|
||||
/* Obtain the DSDT and FACS tables via their addresses within the FADT */
|
||||
|
||||
acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xdsdt,
|
||||
ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
|
||||
acpi_tb_install_fixed_table((acpi_physical_address) acpi_gbl_FADT.Xdsdt,
|
||||
ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
|
||||
|
||||
/* If Hardware Reduced flag is set, there is no FACS */
|
||||
|
||||
if (!acpi_gbl_reduced_hardware) {
|
||||
acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.
|
||||
Xfacs, ACPI_SIG_FACS,
|
||||
ACPI_TABLE_INDEX_FACS);
|
||||
acpi_tb_install_fixed_table((acpi_physical_address)
|
||||
acpi_gbl_FADT.Xfacs, ACPI_SIG_FACS,
|
||||
ACPI_TABLE_INDEX_FACS);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -450,6 +462,7 @@ static void acpi_tb_convert_fadt(void)
|
|||
struct acpi_generic_address *address64;
|
||||
u32 address32;
|
||||
u8 length;
|
||||
u8 flags;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
|
@ -515,6 +528,7 @@ static void acpi_tb_convert_fadt(void)
|
|||
fadt_info_table[i].length);
|
||||
|
||||
name = fadt_info_table[i].name;
|
||||
flags = fadt_info_table[i].flags;
|
||||
|
||||
/*
|
||||
* Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"
|
||||
|
@ -554,7 +568,7 @@ static void acpi_tb_convert_fadt(void)
|
|||
[i].
|
||||
length),
|
||||
(u64)address32,
|
||||
name);
|
||||
name, flags);
|
||||
} else if (address64->address != (u64)address32) {
|
||||
|
||||
/* Address mismatch */
|
||||
|
@ -582,7 +596,8 @@ static void acpi_tb_convert_fadt(void)
|
|||
length),
|
||||
(u64)
|
||||
address32,
|
||||
name);
|
||||
name,
|
||||
flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -603,7 +618,7 @@ static void acpi_tb_convert_fadt(void)
|
|||
address64->bit_width));
|
||||
}
|
||||
|
||||
if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) {
|
||||
if (fadt_info_table[i].flags & ACPI_FADT_REQUIRED) {
|
||||
/*
|
||||
* Field is required (Pm1a_event, Pm1a_control).
|
||||
* Both the address and length must be non-zero.
|
||||
|
@ -617,7 +632,7 @@ static void acpi_tb_convert_fadt(void)
|
|||
address),
|
||||
length));
|
||||
}
|
||||
} else if (fadt_info_table[i].type & ACPI_FADT_SEPARATE_LENGTH) {
|
||||
} else if (fadt_info_table[i].flags & ACPI_FADT_SEPARATE_LENGTH) {
|
||||
/*
|
||||
* Field is optional (Pm2_control, GPE0, GPE1) AND has its own
|
||||
* length field. If present, both the address and length must
|
||||
|
@ -726,7 +741,7 @@ static void acpi_tb_setup_fadt_registers(void)
|
|||
(fadt_pm_info_table[i].
|
||||
register_num *
|
||||
pm1_register_byte_width),
|
||||
"PmRegisters");
|
||||
"PmRegisters", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,8 +99,8 @@ acpi_tb_find_table(char *signature,
|
|||
/* Table is not currently mapped, map it */
|
||||
|
||||
status =
|
||||
acpi_tb_verify_table(&acpi_gbl_root_table_list.
|
||||
tables[i]);
|
||||
acpi_tb_validate_table(&acpi_gbl_root_table_list.
|
||||
tables[i]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -49,8 +49,6 @@
|
|||
ACPI_MODULE_NAME("tbutils")
|
||||
|
||||
/* Local prototypes */
|
||||
static acpi_status acpi_tb_validate_xsdt(acpi_physical_address address);
|
||||
|
||||
static acpi_physical_address
|
||||
acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size);
|
||||
|
||||
|
@ -178,9 +176,13 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index)
|
|||
}
|
||||
|
||||
ACPI_MEMCPY(new_table, table_desc->pointer, table_desc->length);
|
||||
acpi_tb_delete_table(table_desc);
|
||||
table_desc->pointer = new_table;
|
||||
table_desc->flags = ACPI_TABLE_ORIGIN_ALLOCATED;
|
||||
acpi_tb_uninstall_table(table_desc);
|
||||
|
||||
acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT],
|
||||
ACPI_PTR_TO_PHYSADDR(new_table),
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
|
||||
new_table);
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Forced DSDT copy: length 0x%05X copied locally, original unmapped",
|
||||
|
@ -189,116 +191,6 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index)
|
|||
return (new_table);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_install_table
|
||||
*
|
||||
* PARAMETERS: address - Physical address of DSDT or FACS
|
||||
* signature - Table signature, NULL if no need to
|
||||
* match
|
||||
* table_index - Index into root table array
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Install an ACPI table into the global data structure. The
|
||||
* table override mechanism is called to allow the host
|
||||
* OS to replace any table before it is installed in the root
|
||||
* table array.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_tb_install_table(acpi_physical_address address,
|
||||
char *signature, u32 table_index)
|
||||
{
|
||||
struct acpi_table_header *table;
|
||||
struct acpi_table_header *final_table;
|
||||
struct acpi_table_desc *table_desc;
|
||||
|
||||
if (!address) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Null physical address for ACPI table [%s]",
|
||||
signature));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Map just the table header */
|
||||
|
||||
table = acpi_os_map_memory(address, sizeof(struct acpi_table_header));
|
||||
if (!table) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not map memory for table [%s] at %p",
|
||||
signature, ACPI_CAST_PTR(void, address)));
|
||||
return;
|
||||
}
|
||||
|
||||
/* If a particular signature is expected (DSDT/FACS), it must match */
|
||||
|
||||
if (signature && !ACPI_COMPARE_NAME(table->signature, signature)) {
|
||||
ACPI_BIOS_ERROR((AE_INFO,
|
||||
"Invalid signature 0x%X for ACPI table, expected [%s]",
|
||||
*ACPI_CAST_PTR(u32, table->signature),
|
||||
signature));
|
||||
goto unmap_and_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the table entry. Set the pointer to NULL, since the
|
||||
* table is not fully mapped at this time.
|
||||
*/
|
||||
table_desc = &acpi_gbl_root_table_list.tables[table_index];
|
||||
|
||||
table_desc->address = address;
|
||||
table_desc->pointer = NULL;
|
||||
table_desc->length = table->length;
|
||||
table_desc->flags = ACPI_TABLE_ORIGIN_MAPPED;
|
||||
ACPI_MOVE_32_TO_32(table_desc->signature.ascii, table->signature);
|
||||
|
||||
/*
|
||||
* ACPI Table Override:
|
||||
*
|
||||
* Before we install the table, let the host OS override it with a new
|
||||
* one if desired. Any table within the RSDT/XSDT can be replaced,
|
||||
* including the DSDT which is pointed to by the FADT.
|
||||
*
|
||||
* NOTE: If the table is overridden, then final_table will contain a
|
||||
* mapped pointer to the full new table. If the table is not overridden,
|
||||
* or if there has been a physical override, then the table will be
|
||||
* fully mapped later (in verify table). In any case, we must
|
||||
* unmap the header that was mapped above.
|
||||
*/
|
||||
final_table = acpi_tb_table_override(table, table_desc);
|
||||
if (!final_table) {
|
||||
final_table = table; /* There was no override */
|
||||
}
|
||||
|
||||
acpi_tb_print_table_header(table_desc->address, final_table);
|
||||
|
||||
/* Set the global integer width (based upon revision of the DSDT) */
|
||||
|
||||
if (table_index == ACPI_TABLE_INDEX_DSDT) {
|
||||
acpi_ut_set_integer_width(final_table->revision);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have a physical override during this early loading of the ACPI
|
||||
* tables, unmap the table for now. It will be mapped again later when
|
||||
* it is actually used. This supports very early loading of ACPI tables,
|
||||
* before virtual memory is fully initialized and running within the
|
||||
* host OS. Note: A logical override has the ACPI_TABLE_ORIGIN_OVERRIDE
|
||||
* flag set and will not be deleted below.
|
||||
*/
|
||||
if (final_table != table) {
|
||||
acpi_tb_delete_table(table_desc);
|
||||
}
|
||||
|
||||
unmap_and_exit:
|
||||
|
||||
/* Always unmap the table header that we mapped above */
|
||||
|
||||
acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_get_root_table_entry
|
||||
|
@ -355,87 +247,6 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size)
|
|||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_xsdt
|
||||
*
|
||||
* PARAMETERS: address - Physical address of the XSDT (from RSDP)
|
||||
*
|
||||
* RETURN: Status. AE_OK if the table appears to be valid.
|
||||
*
|
||||
* DESCRIPTION: Validate an XSDT to ensure that it is of minimum size and does
|
||||
* not contain any NULL entries. A problem that is seen in the
|
||||
* field is that the XSDT exists, but is actually useless because
|
||||
* of one or more (or all) NULL entries.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status acpi_tb_validate_xsdt(acpi_physical_address xsdt_address)
|
||||
{
|
||||
struct acpi_table_header *table;
|
||||
u8 *next_entry;
|
||||
acpi_physical_address address;
|
||||
u32 length;
|
||||
u32 entry_count;
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
/* Get the XSDT length */
|
||||
|
||||
table =
|
||||
acpi_os_map_memory(xsdt_address, sizeof(struct acpi_table_header));
|
||||
if (!table) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
length = table->length;
|
||||
acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
|
||||
|
||||
/*
|
||||
* Minimum XSDT length is the size of the standard ACPI header
|
||||
* plus one physical address entry
|
||||
*/
|
||||
if (length < (sizeof(struct acpi_table_header) + ACPI_XSDT_ENTRY_SIZE)) {
|
||||
return (AE_INVALID_TABLE_LENGTH);
|
||||
}
|
||||
|
||||
/* Map the entire XSDT */
|
||||
|
||||
table = acpi_os_map_memory(xsdt_address, length);
|
||||
if (!table) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Get the number of entries and pointer to first entry */
|
||||
|
||||
status = AE_OK;
|
||||
next_entry = ACPI_ADD_PTR(u8, table, sizeof(struct acpi_table_header));
|
||||
entry_count = (u32)((table->length - sizeof(struct acpi_table_header)) /
|
||||
ACPI_XSDT_ENTRY_SIZE);
|
||||
|
||||
/* Validate each entry (physical address) within the XSDT */
|
||||
|
||||
for (i = 0; i < entry_count; i++) {
|
||||
address =
|
||||
acpi_tb_get_root_table_entry(next_entry,
|
||||
ACPI_XSDT_ENTRY_SIZE);
|
||||
if (!address) {
|
||||
|
||||
/* Detected a NULL entry, XSDT is invalid */
|
||||
|
||||
status = AE_NULL_ENTRY;
|
||||
break;
|
||||
}
|
||||
|
||||
next_entry += ACPI_XSDT_ENTRY_SIZE;
|
||||
}
|
||||
|
||||
/* Unmap table */
|
||||
|
||||
acpi_os_unmap_memory(table, length);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_parse_root_table
|
||||
|
@ -461,10 +272,10 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
|||
u32 table_count;
|
||||
struct acpi_table_header *table;
|
||||
acpi_physical_address address;
|
||||
acpi_physical_address rsdt_address;
|
||||
u32 length;
|
||||
u8 *table_entry;
|
||||
acpi_status status;
|
||||
u32 table_index;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_parse_root_table);
|
||||
|
||||
|
@ -489,14 +300,11 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
|||
* as per the ACPI specification.
|
||||
*/
|
||||
address = (acpi_physical_address) rsdp->xsdt_physical_address;
|
||||
rsdt_address =
|
||||
(acpi_physical_address) rsdp->rsdt_physical_address;
|
||||
table_entry_size = ACPI_XSDT_ENTRY_SIZE;
|
||||
} else {
|
||||
/* Root table is an RSDT (32-bit physical addresses) */
|
||||
|
||||
address = (acpi_physical_address) rsdp->rsdt_physical_address;
|
||||
rsdt_address = address;
|
||||
table_entry_size = ACPI_RSDT_ENTRY_SIZE;
|
||||
}
|
||||
|
||||
|
@ -506,24 +314,6 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
|||
*/
|
||||
acpi_os_unmap_memory(rsdp, sizeof(struct acpi_table_rsdp));
|
||||
|
||||
/*
|
||||
* If it is present and used, validate the XSDT for access/size
|
||||
* and ensure that all table entries are at least non-NULL
|
||||
*/
|
||||
if (table_entry_size == ACPI_XSDT_ENTRY_SIZE) {
|
||||
status = acpi_tb_validate_xsdt(address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_BIOS_WARNING((AE_INFO,
|
||||
"XSDT is invalid (%s), using RSDT",
|
||||
acpi_format_exception(status)));
|
||||
|
||||
/* Fall back to the RSDT */
|
||||
|
||||
address = rsdt_address;
|
||||
table_entry_size = ACPI_RSDT_ENTRY_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Map the RSDT/XSDT table header to get the full table length */
|
||||
|
||||
table = acpi_os_map_memory(address, sizeof(struct acpi_table_header));
|
||||
|
@ -576,55 +366,36 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
|||
/* Initialize the root table array from the RSDT/XSDT */
|
||||
|
||||
for (i = 0; i < table_count; i++) {
|
||||
if (acpi_gbl_root_table_list.current_table_count >=
|
||||
acpi_gbl_root_table_list.max_table_count) {
|
||||
|
||||
/* There is no more room in the root table array, attempt resize */
|
||||
|
||||
status = acpi_tb_resize_root_table_list();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Truncating %u table entries!",
|
||||
(unsigned) (table_count -
|
||||
(acpi_gbl_root_table_list.
|
||||
current_table_count -
|
||||
2))));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */
|
||||
|
||||
acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.
|
||||
current_table_count].address =
|
||||
address =
|
||||
acpi_tb_get_root_table_entry(table_entry, table_entry_size);
|
||||
|
||||
table_entry += table_entry_size;
|
||||
acpi_gbl_root_table_list.current_table_count++;
|
||||
}
|
||||
/* Skip NULL entries in RSDT/XSDT */
|
||||
|
||||
/*
|
||||
* It is not possible to map more than one entry in some environments,
|
||||
* so unmap the root table here before mapping other tables
|
||||
*/
|
||||
acpi_os_unmap_memory(table, length);
|
||||
|
||||
/*
|
||||
* Complete the initialization of the root table array by examining
|
||||
* the header of each table
|
||||
*/
|
||||
for (i = 2; i < acpi_gbl_root_table_list.current_table_count; i++) {
|
||||
acpi_tb_install_table(acpi_gbl_root_table_list.tables[i].
|
||||
address, NULL, i);
|
||||
|
||||
/* Special case for FADT - validate it then get the DSDT and FACS */
|
||||
|
||||
if (ACPI_COMPARE_NAME
|
||||
(&acpi_gbl_root_table_list.tables[i].signature,
|
||||
ACPI_SIG_FADT)) {
|
||||
acpi_tb_parse_fadt(i);
|
||||
if (!address) {
|
||||
goto next_table;
|
||||
}
|
||||
|
||||
status = acpi_tb_install_standard_table(address,
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL,
|
||||
FALSE, TRUE,
|
||||
&table_index);
|
||||
|
||||
if (ACPI_SUCCESS(status) &&
|
||||
ACPI_COMPARE_NAME(&acpi_gbl_root_table_list.
|
||||
tables[table_index].signature,
|
||||
ACPI_SIG_FADT)) {
|
||||
acpi_tb_parse_fadt(table_index);
|
||||
}
|
||||
|
||||
next_table:
|
||||
|
||||
table_entry += table_entry_size;
|
||||
}
|
||||
|
||||
acpi_os_unmap_memory(table, length);
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
|
|
@ -206,8 +206,8 @@ acpi_status
|
|||
acpi_get_table_header(char *signature,
|
||||
u32 instance, struct acpi_table_header *out_table_header)
|
||||
{
|
||||
u32 i;
|
||||
u32 j;
|
||||
u32 i;
|
||||
u32 j;
|
||||
struct acpi_table_header *header;
|
||||
|
||||
/* Parameter validation */
|
||||
|
@ -233,7 +233,7 @@ acpi_get_table_header(char *signature,
|
|||
if (!acpi_gbl_root_table_list.tables[i].pointer) {
|
||||
if ((acpi_gbl_root_table_list.tables[i].flags &
|
||||
ACPI_TABLE_ORIGIN_MASK) ==
|
||||
ACPI_TABLE_ORIGIN_MAPPED) {
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL) {
|
||||
header =
|
||||
acpi_os_map_memory(acpi_gbl_root_table_list.
|
||||
tables[i].address,
|
||||
|
@ -321,8 +321,8 @@ acpi_get_table_with_size(char *signature,
|
|||
u32 instance, struct acpi_table_header **out_table,
|
||||
acpi_size *tbl_size)
|
||||
{
|
||||
u32 i;
|
||||
u32 j;
|
||||
u32 i;
|
||||
u32 j;
|
||||
acpi_status status;
|
||||
|
||||
/* Parameter validation */
|
||||
|
@ -346,7 +346,7 @@ acpi_get_table_with_size(char *signature,
|
|||
}
|
||||
|
||||
status =
|
||||
acpi_tb_verify_table(&acpi_gbl_root_table_list.tables[i]);
|
||||
acpi_tb_validate_table(&acpi_gbl_root_table_list.tables[i]);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
*out_table = acpi_gbl_root_table_list.tables[i].pointer;
|
||||
*tbl_size = acpi_gbl_root_table_list.tables[i].length;
|
||||
|
@ -390,7 +390,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_table)
|
|||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_get_table_by_index(u32 table_index, struct acpi_table_header **table)
|
||||
acpi_get_table_by_index(u32 table_index, struct acpi_table_header ** table)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
|
@ -416,8 +416,8 @@ acpi_get_table_by_index(u32 table_index, struct acpi_table_header **table)
|
|||
/* Table is not mapped, map it */
|
||||
|
||||
status =
|
||||
acpi_tb_verify_table(&acpi_gbl_root_table_list.
|
||||
tables[table_index]);
|
||||
acpi_tb_validate_table(&acpi_gbl_root_table_list.
|
||||
tables[table_index]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(status);
|
||||
|
|
|
@ -117,7 +117,7 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
tables[ACPI_TABLE_INDEX_DSDT].signature),
|
||||
ACPI_SIG_DSDT)
|
||||
||
|
||||
ACPI_FAILURE(acpi_tb_verify_table
|
||||
ACPI_FAILURE(acpi_tb_validate_table
|
||||
(&acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT]))) {
|
||||
status = AE_NO_ACPI_TABLES;
|
||||
|
@ -128,7 +128,7 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
* Save the DSDT pointer for simple access. This is the mapped memory
|
||||
* address. We must take care here because the address of the .Tables
|
||||
* array can change dynamically as tables are loaded at run-time. Note:
|
||||
* .Pointer field is not validated until after call to acpi_tb_verify_table.
|
||||
* .Pointer field is not validated until after call to acpi_tb_validate_table.
|
||||
*/
|
||||
acpi_gbl_DSDT =
|
||||
acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer;
|
||||
|
@ -174,24 +174,11 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
(acpi_gbl_root_table_list.tables[i].
|
||||
signature), ACPI_SIG_PSDT))
|
||||
||
|
||||
ACPI_FAILURE(acpi_tb_verify_table
|
||||
ACPI_FAILURE(acpi_tb_validate_table
|
||||
(&acpi_gbl_root_table_list.tables[i]))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Optionally do not load any SSDTs from the RSDT/XSDT. This can
|
||||
* be useful for debugging ACPI problems on some machines.
|
||||
*/
|
||||
if (acpi_gbl_disable_ssdt_table_load) {
|
||||
ACPI_INFO((AE_INFO, "Ignoring %4.4s at %p",
|
||||
acpi_gbl_root_table_list.tables[i].signature.
|
||||
ascii, ACPI_CAST_PTR(void,
|
||||
acpi_gbl_root_table_list.
|
||||
tables[i].address)));
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Ignore errors while loading tables, get as many as possible */
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
@ -206,6 +193,45 @@ unlock_and_exit:
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_install_table
|
||||
*
|
||||
* PARAMETERS: address - Address of the ACPI table to be installed.
|
||||
* physical - Whether the address is a physical table
|
||||
* address or not
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Dynamically install an ACPI table.
|
||||
* Note: This function should only be invoked after
|
||||
* acpi_initialize_tables() and before acpi_load_tables().
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status __init
|
||||
acpi_install_table(acpi_physical_address address, u8 physical)
|
||||
{
|
||||
acpi_status status;
|
||||
u8 flags;
|
||||
u32 table_index;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_install_table);
|
||||
|
||||
if (physical) {
|
||||
flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL;
|
||||
} else {
|
||||
flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL;
|
||||
}
|
||||
|
||||
status = acpi_tb_install_standard_table(address, flags,
|
||||
FALSE, FALSE, &table_index);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_load_table
|
||||
|
@ -222,11 +248,9 @@ unlock_and_exit:
|
|||
* to ensure that the table is not deleted or unmapped.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_load_table(struct acpi_table_header *table)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_table_desc table_desc;
|
||||
u32 table_index;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_load_table);
|
||||
|
@ -237,14 +261,6 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Init local table descriptor */
|
||||
|
||||
ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
|
||||
table_desc.address = ACPI_PTR_TO_PHYSADDR(table);
|
||||
table_desc.pointer = table;
|
||||
table_desc.length = table->length;
|
||||
table_desc.flags = ACPI_TABLE_ORIGIN_UNKNOWN;
|
||||
|
||||
/* Must acquire the interpreter lock during this operation */
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
|
||||
|
@ -255,7 +271,24 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
|
|||
/* Install the table and load it into the namespace */
|
||||
|
||||
ACPI_INFO((AE_INFO, "Host-directed Dynamic ACPI Table Load:"));
|
||||
status = acpi_tb_add_table(&table_desc, &table_index);
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
status = acpi_tb_install_standard_table(ACPI_PTR_TO_PHYSADDR(table),
|
||||
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
|
||||
TRUE, FALSE, &table_index);
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: Now table is "INSTALLED", it must be validated before
|
||||
* using.
|
||||
*/
|
||||
status =
|
||||
acpi_tb_validate_table(&acpi_gbl_root_table_list.
|
||||
tables[table_index]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
|
|
@ -462,7 +462,7 @@ char *acpi_ut_get_mutex_name(u32 mutex_id)
|
|||
|
||||
/* Names for Notify() values, used for debug output */
|
||||
|
||||
static const char *acpi_gbl_notify_value_names[ACPI_NOTIFY_MAX + 1] = {
|
||||
static const char *acpi_gbl_generic_notify[ACPI_NOTIFY_MAX + 1] = {
|
||||
/* 00 */ "Bus Check",
|
||||
/* 01 */ "Device Check",
|
||||
/* 02 */ "Device Wake",
|
||||
|
@ -473,23 +473,75 @@ static const char *acpi_gbl_notify_value_names[ACPI_NOTIFY_MAX + 1] = {
|
|||
/* 07 */ "Power Fault",
|
||||
/* 08 */ "Capabilities Check",
|
||||
/* 09 */ "Device PLD Check",
|
||||
/* 10 */ "Reserved",
|
||||
/* 11 */ "System Locality Update",
|
||||
/* 12 */ "Shutdown Request"
|
||||
/* 0A */ "Reserved",
|
||||
/* 0B */ "System Locality Update",
|
||||
/* 0C */ "Shutdown Request"
|
||||
};
|
||||
|
||||
const char *acpi_ut_get_notify_name(u32 notify_value)
|
||||
static const char *acpi_gbl_device_notify[4] = {
|
||||
/* 80 */ "Status Change",
|
||||
/* 81 */ "Information Change",
|
||||
/* 82 */ "Device-Specific Change",
|
||||
/* 83 */ "Device-Specific Change"
|
||||
};
|
||||
|
||||
static const char *acpi_gbl_processor_notify[4] = {
|
||||
/* 80 */ "Performance Capability Change",
|
||||
/* 81 */ "C-State Change",
|
||||
/* 82 */ "Throttling Capability Change",
|
||||
/* 83 */ "Device-Specific Change"
|
||||
};
|
||||
|
||||
static const char *acpi_gbl_thermal_notify[4] = {
|
||||
/* 80 */ "Thermal Status Change",
|
||||
/* 81 */ "Thermal Trip Point Change",
|
||||
/* 82 */ "Thermal Device List Change",
|
||||
/* 83 */ "Thermal Relationship Change"
|
||||
};
|
||||
|
||||
const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type)
|
||||
{
|
||||
|
||||
/* 00 - 0C are common to all object types */
|
||||
|
||||
if (notify_value <= ACPI_NOTIFY_MAX) {
|
||||
return (acpi_gbl_notify_value_names[notify_value]);
|
||||
} else if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
|
||||
return ("Reserved");
|
||||
} else if (notify_value <= ACPI_MAX_DEVICE_SPECIFIC_NOTIFY) {
|
||||
return ("Device Specific");
|
||||
} else {
|
||||
return ("Hardware Specific");
|
||||
return (acpi_gbl_generic_notify[notify_value]);
|
||||
}
|
||||
|
||||
/* 0D - 7F are reserved */
|
||||
|
||||
if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
|
||||
return ("Reserved");
|
||||
}
|
||||
|
||||
/* 80 - 83 are per-object-type */
|
||||
|
||||
if (notify_value <= 0x83) {
|
||||
switch (type) {
|
||||
case ACPI_TYPE_ANY:
|
||||
case ACPI_TYPE_DEVICE:
|
||||
return (acpi_gbl_device_notify[notify_value - 0x80]);
|
||||
|
||||
case ACPI_TYPE_PROCESSOR:
|
||||
return (acpi_gbl_processor_notify[notify_value - 0x80]);
|
||||
|
||||
case ACPI_TYPE_THERMAL:
|
||||
return (acpi_gbl_thermal_notify[notify_value - 0x80]);
|
||||
|
||||
default:
|
||||
return ("Target object type does not support notifies");
|
||||
}
|
||||
}
|
||||
|
||||
/* 84 - BF are device-specific */
|
||||
|
||||
if (notify_value <= ACPI_MAX_DEVICE_SPECIFIC_NOTIFY) {
|
||||
return ("Device-Specific");
|
||||
}
|
||||
|
||||
/* C0 and above are hardware-specific */
|
||||
|
||||
return ("Hardware-Specific");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -55,28 +55,7 @@ ACPI_MODULE_NAME("utglobal")
|
|||
* Static global variable initialization.
|
||||
*
|
||||
******************************************************************************/
|
||||
/* Debug output control masks */
|
||||
u32 acpi_dbg_level = ACPI_DEBUG_DEFAULT;
|
||||
|
||||
u32 acpi_dbg_layer = 0;
|
||||
|
||||
/* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
|
||||
|
||||
struct acpi_table_fadt acpi_gbl_FADT;
|
||||
u32 acpi_gbl_trace_flags;
|
||||
acpi_name acpi_gbl_trace_method_name;
|
||||
u8 acpi_gbl_system_awake_and_running;
|
||||
u32 acpi_current_gpe_count;
|
||||
|
||||
/*
|
||||
* ACPI 5.0 introduces the concept of a "reduced hardware platform", meaning
|
||||
* that the ACPI hardware is no longer required. A flag in the FADT indicates
|
||||
* a reduced HW machine, and that flag is duplicated here for convenience.
|
||||
*/
|
||||
u8 acpi_gbl_reduced_hardware;
|
||||
|
||||
/* Various state name strings */
|
||||
|
||||
const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = {
|
||||
"\\_S0_",
|
||||
"\\_S1_",
|
||||
|
@ -337,7 +316,6 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_gbl_acpi_hardware_present = TRUE;
|
||||
acpi_gbl_last_owner_id_index = 0;
|
||||
acpi_gbl_next_owner_id_offset = 0;
|
||||
acpi_gbl_trace_method_name = 0;
|
||||
acpi_gbl_trace_dbg_level = 0;
|
||||
acpi_gbl_trace_dbg_layer = 0;
|
||||
acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
|
||||
|
@ -377,9 +355,7 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_gbl_disable_mem_tracking = FALSE;
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_DEBUGGER
|
||||
acpi_gbl_db_terminate_threads = FALSE;
|
||||
#endif
|
||||
ACPI_DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = FALSE);
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
|
|
@ -353,7 +353,7 @@ void acpi_ut_print_string(char *string, u16 max_length)
|
|||
}
|
||||
|
||||
acpi_os_printf("\"");
|
||||
for (i = 0; string[i] && (i < max_length); i++) {
|
||||
for (i = 0; (i < max_length) && string[i]; i++) {
|
||||
|
||||
/* Escape sequences */
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@ ACPI_MODULE_NAME("utxferror")
|
|||
* This module is used for the in-kernel ACPICA as well as the ACPICA
|
||||
* tools/applications.
|
||||
*/
|
||||
#ifndef ACPI_NO_ERROR_MESSAGES /* Entire module */
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_error
|
||||
|
@ -249,3 +250,4 @@ acpi_bios_warning(const char *module_name,
|
|||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_bios_warning)
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
||||
|
|
|
@ -202,7 +202,7 @@ static void check_vendor_extension(u64 paddr,
|
|||
|
||||
if (!offset)
|
||||
return;
|
||||
v = acpi_os_map_memory(paddr + offset, sizeof(*v));
|
||||
v = acpi_os_map_iomem(paddr + offset, sizeof(*v));
|
||||
if (!v)
|
||||
return;
|
||||
sbdf = v->pcie_sbdf;
|
||||
|
@ -210,7 +210,7 @@ static void check_vendor_extension(u64 paddr,
|
|||
sbdf >> 24, (sbdf >> 16) & 0xff,
|
||||
(sbdf >> 11) & 0x1f, (sbdf >> 8) & 0x7,
|
||||
v->vendor_id, v->device_id, v->rev_id);
|
||||
acpi_os_unmap_memory(v, sizeof(*v));
|
||||
acpi_os_unmap_iomem(v, sizeof(*v));
|
||||
}
|
||||
|
||||
static void *einj_get_parameter_address(void)
|
||||
|
@ -236,7 +236,7 @@ static void *einj_get_parameter_address(void)
|
|||
if (pa_v5) {
|
||||
struct set_error_type_with_address *v5param;
|
||||
|
||||
v5param = acpi_os_map_memory(pa_v5, sizeof(*v5param));
|
||||
v5param = acpi_os_map_iomem(pa_v5, sizeof(*v5param));
|
||||
if (v5param) {
|
||||
acpi5 = 1;
|
||||
check_vendor_extension(pa_v5, v5param);
|
||||
|
@ -246,11 +246,11 @@ static void *einj_get_parameter_address(void)
|
|||
if (param_extension && pa_v4) {
|
||||
struct einj_parameter *v4param;
|
||||
|
||||
v4param = acpi_os_map_memory(pa_v4, sizeof(*v4param));
|
||||
v4param = acpi_os_map_iomem(pa_v4, sizeof(*v4param));
|
||||
if (!v4param)
|
||||
return NULL;
|
||||
if (v4param->reserved1 || v4param->reserved2) {
|
||||
acpi_os_unmap_memory(v4param, sizeof(*v4param));
|
||||
acpi_os_unmap_iomem(v4param, sizeof(*v4param));
|
||||
return NULL;
|
||||
}
|
||||
return v4param;
|
||||
|
@ -794,7 +794,7 @@ err_unmap:
|
|||
sizeof(struct set_error_type_with_address) :
|
||||
sizeof(struct einj_parameter);
|
||||
|
||||
acpi_os_unmap_memory(einj_param, size);
|
||||
acpi_os_unmap_iomem(einj_param, size);
|
||||
}
|
||||
apei_exec_post_unmap_gars(&ctx);
|
||||
err_release:
|
||||
|
@ -816,7 +816,7 @@ static void __exit einj_exit(void)
|
|||
sizeof(struct set_error_type_with_address) :
|
||||
sizeof(struct einj_parameter);
|
||||
|
||||
acpi_os_unmap_memory(einj_param, size);
|
||||
acpi_os_unmap_iomem(einj_param, size);
|
||||
}
|
||||
einj_exec_ctx_init(&ctx);
|
||||
apei_exec_post_unmap_gars(&ctx);
|
||||
|
|
|
@ -56,6 +56,10 @@
|
|||
/* Battery power unit: 0 means mW, 1 means mA */
|
||||
#define ACPI_BATTERY_POWER_UNIT_MA 1
|
||||
|
||||
#define ACPI_BATTERY_STATE_DISCHARGING 0x1
|
||||
#define ACPI_BATTERY_STATE_CHARGING 0x2
|
||||
#define ACPI_BATTERY_STATE_CRITICAL 0x4
|
||||
|
||||
#define _COMPONENT ACPI_BATTERY_COMPONENT
|
||||
|
||||
ACPI_MODULE_NAME("battery");
|
||||
|
@ -169,7 +173,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery);
|
|||
|
||||
static int acpi_battery_is_charged(struct acpi_battery *battery)
|
||||
{
|
||||
/* either charging or discharging */
|
||||
/* charging, discharging or critical low */
|
||||
if (battery->state != 0)
|
||||
return 0;
|
||||
|
||||
|
@ -204,9 +208,9 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
|||
return -ENODEV;
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
if (battery->state & 0x01)
|
||||
if (battery->state & ACPI_BATTERY_STATE_DISCHARGING)
|
||||
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
else if (battery->state & 0x02)
|
||||
else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
|
||||
val->intval = POWER_SUPPLY_STATUS_CHARGING;
|
||||
else if (acpi_battery_is_charged(battery))
|
||||
val->intval = POWER_SUPPLY_STATUS_FULL;
|
||||
|
@ -269,6 +273,17 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
|||
else
|
||||
val->intval = 0;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
|
||||
if (battery->state & ACPI_BATTERY_STATE_CRITICAL)
|
||||
val->intval = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
|
||||
else if (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
|
||||
(battery->capacity_now <= battery->alarm))
|
||||
val->intval = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
|
||||
else if (acpi_battery_is_charged(battery))
|
||||
val->intval = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
|
||||
else
|
||||
val->intval = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_MODEL_NAME:
|
||||
val->strval = battery->model_number;
|
||||
break;
|
||||
|
@ -296,6 +311,7 @@ static enum power_supply_property charge_battery_props[] = {
|
|||
POWER_SUPPLY_PROP_CHARGE_FULL,
|
||||
POWER_SUPPLY_PROP_CHARGE_NOW,
|
||||
POWER_SUPPLY_PROP_CAPACITY,
|
||||
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
|
||||
POWER_SUPPLY_PROP_MODEL_NAME,
|
||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||
POWER_SUPPLY_PROP_SERIAL_NUMBER,
|
||||
|
@ -313,6 +329,7 @@ static enum power_supply_property energy_battery_props[] = {
|
|||
POWER_SUPPLY_PROP_ENERGY_FULL,
|
||||
POWER_SUPPLY_PROP_ENERGY_NOW,
|
||||
POWER_SUPPLY_PROP_CAPACITY,
|
||||
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
|
||||
POWER_SUPPLY_PROP_MODEL_NAME,
|
||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||
POWER_SUPPLY_PROP_SERIAL_NUMBER,
|
||||
|
@ -605,7 +622,8 @@ static int sysfs_add_battery(struct acpi_battery *battery)
|
|||
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
|
||||
battery->bat.get_property = acpi_battery_get_property;
|
||||
|
||||
result = power_supply_register(&battery->device->dev, &battery->bat);
|
||||
result = power_supply_register_no_ws(&battery->device->dev, &battery->bat);
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
return device_create_file(battery->bat.dev, &alarm_attr);
|
||||
|
@ -696,7 +714,7 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
|
|||
}
|
||||
}
|
||||
|
||||
static int acpi_battery_update(struct acpi_battery *battery)
|
||||
static int acpi_battery_update(struct acpi_battery *battery, bool resume)
|
||||
{
|
||||
int result, old_present = acpi_battery_present(battery);
|
||||
result = acpi_battery_get_status(battery);
|
||||
|
@ -707,6 +725,10 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
|||
battery->update_time = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (resume)
|
||||
return 0;
|
||||
|
||||
if (!battery->update_time ||
|
||||
old_present != acpi_battery_present(battery)) {
|
||||
result = acpi_battery_get_info(battery);
|
||||
|
@ -720,7 +742,19 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
|||
return result;
|
||||
}
|
||||
result = acpi_battery_get_state(battery);
|
||||
if (result)
|
||||
return result;
|
||||
acpi_battery_quirks(battery);
|
||||
|
||||
/*
|
||||
* Wakeup the system if battery is critical low
|
||||
* or lower than the alarm level
|
||||
*/
|
||||
if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
|
||||
(test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
|
||||
(battery->capacity_now <= battery->alarm)))
|
||||
pm_wakeup_event(&battery->device->dev, 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -915,7 +949,7 @@ static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = {
|
|||
static int acpi_battery_read(int fid, struct seq_file *seq)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
int result = acpi_battery_update(battery);
|
||||
int result = acpi_battery_update(battery, false);
|
||||
return acpi_print_funcs[fid](seq, result);
|
||||
}
|
||||
|
||||
|
@ -1030,7 +1064,7 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
|||
old = battery->bat.dev;
|
||||
if (event == ACPI_BATTERY_NOTIFY_INFO)
|
||||
acpi_battery_refresh(battery);
|
||||
acpi_battery_update(battery);
|
||||
acpi_battery_update(battery, false);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
dev_name(&device->dev), event,
|
||||
acpi_battery_present(battery));
|
||||
|
@ -1045,13 +1079,27 @@ static int battery_notify(struct notifier_block *nb,
|
|||
{
|
||||
struct acpi_battery *battery = container_of(nb, struct acpi_battery,
|
||||
pm_nb);
|
||||
int result;
|
||||
|
||||
switch (mode) {
|
||||
case PM_POST_HIBERNATION:
|
||||
case PM_POST_SUSPEND:
|
||||
if (battery->bat.dev) {
|
||||
sysfs_remove_battery(battery);
|
||||
sysfs_add_battery(battery);
|
||||
}
|
||||
if (!acpi_battery_present(battery))
|
||||
return 0;
|
||||
|
||||
if (!battery->bat.dev) {
|
||||
result = acpi_battery_get_info(battery);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
result = sysfs_add_battery(battery);
|
||||
if (result)
|
||||
return result;
|
||||
} else
|
||||
acpi_battery_refresh(battery);
|
||||
|
||||
acpi_battery_init_alarm(battery);
|
||||
acpi_battery_get_state(battery);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1087,7 +1135,7 @@ static int acpi_battery_add(struct acpi_device *device)
|
|||
mutex_init(&battery->sysfs_lock);
|
||||
if (acpi_has_method(battery->device->handle, "_BIX"))
|
||||
set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
|
||||
result = acpi_battery_update(battery);
|
||||
result = acpi_battery_update(battery, false);
|
||||
if (result)
|
||||
goto fail;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
|
@ -1107,6 +1155,8 @@ static int acpi_battery_add(struct acpi_device *device)
|
|||
battery->pm_nb.notifier_call = battery_notify;
|
||||
register_pm_notifier(&battery->pm_nb);
|
||||
|
||||
device_init_wakeup(&device->dev, 1);
|
||||
|
||||
return result;
|
||||
|
||||
fail:
|
||||
|
@ -1123,6 +1173,7 @@ static int acpi_battery_remove(struct acpi_device *device)
|
|||
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return -EINVAL;
|
||||
device_init_wakeup(&device->dev, 0);
|
||||
battery = acpi_driver_data(device);
|
||||
unregister_pm_notifier(&battery->pm_nb);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
|
@ -1149,7 +1200,7 @@ static int acpi_battery_resume(struct device *dev)
|
|||
return -EINVAL;
|
||||
|
||||
battery->update_time = 0;
|
||||
acpi_battery_update(battery);
|
||||
acpi_battery_update(battery, true);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -52,6 +52,12 @@ struct proc_dir_entry *acpi_root_dir;
|
|||
EXPORT_SYMBOL(acpi_root_dir);
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
||||
static inline int set_copy_dsdt(const struct dmi_system_id *id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int set_copy_dsdt(const struct dmi_system_id *id)
|
||||
{
|
||||
printk(KERN_NOTICE "%s detected - "
|
||||
|
@ -59,6 +65,7 @@ static int set_copy_dsdt(const struct dmi_system_id *id)
|
|||
acpi_gbl_copy_dsdt_locally = 1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct dmi_system_id dsdt_dmi_table[] __initdata = {
|
||||
/*
|
||||
|
@ -132,6 +139,21 @@ void acpi_bus_private_data_handler(acpi_handle handle,
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_bus_private_data_handler);
|
||||
|
||||
int acpi_bus_attach_private_data(acpi_handle handle, void *data)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_attach_data(handle,
|
||||
acpi_bus_private_data_handler, data);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_handle_debug(handle, "Error attaching device data\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_attach_private_data);
|
||||
|
||||
int acpi_bus_get_private_data(acpi_handle handle, void **data)
|
||||
{
|
||||
acpi_status status;
|
||||
|
@ -140,15 +162,20 @@ int acpi_bus_get_private_data(acpi_handle handle, void **data)
|
|||
return -EINVAL;
|
||||
|
||||
status = acpi_get_data(handle, acpi_bus_private_data_handler, data);
|
||||
if (ACPI_FAILURE(status) || !*data) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No context for object [%p]\n",
|
||||
handle));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_handle_debug(handle, "No context for object\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_bus_get_private_data);
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_get_private_data);
|
||||
|
||||
void acpi_bus_detach_private_data(acpi_handle handle)
|
||||
{
|
||||
acpi_detach_data(handle, acpi_bus_private_data_handler);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_detach_private_data);
|
||||
|
||||
void acpi_bus_no_hotplug(acpi_handle handle)
|
||||
{
|
||||
|
@ -340,16 +367,18 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
|
|||
{
|
||||
struct acpi_device *adev;
|
||||
struct acpi_driver *driver;
|
||||
acpi_status status;
|
||||
u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
|
||||
bool hotplug_event = false;
|
||||
|
||||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
acpi_handle_debug(handle, "ACPI_NOTIFY_BUS_CHECK event\n");
|
||||
hotplug_event = true;
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_CHECK event\n");
|
||||
hotplug_event = true;
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_DEVICE_WAKE:
|
||||
|
@ -358,6 +387,7 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
|
|||
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n");
|
||||
hotplug_event = true;
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_DEVICE_CHECK_LIGHT:
|
||||
|
@ -393,16 +423,9 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
|
|||
(driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
|
||||
driver->ops.notify(adev, type);
|
||||
|
||||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
status = acpi_hotplug_schedule(adev, type);
|
||||
if (ACPI_SUCCESS(status))
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (hotplug_event && ACPI_SUCCESS(acpi_hotplug_schedule(adev, type)))
|
||||
return;
|
||||
|
||||
acpi_bus_put_acpi_device(adev);
|
||||
return;
|
||||
|
||||
|
@ -466,6 +489,9 @@ void __init acpi_early_init(void)
|
|||
|
||||
printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION);
|
||||
|
||||
/* It's safe to verify table checksums during late stage */
|
||||
acpi_gbl_verify_table_checksum = TRUE;
|
||||
|
||||
/* enable workarounds, unless strict ACPI spec. compliance */
|
||||
if (!acpi_strict)
|
||||
acpi_gbl_enable_interpreter_slack = TRUE;
|
||||
|
|
|
@ -41,6 +41,8 @@ static const struct acpi_device_id container_device_ids[] = {
|
|||
{"", 0},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_CONTAINER
|
||||
|
||||
static int acpi_container_offline(struct container_dev *cdev)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(&cdev->dev);
|
||||
|
@ -107,7 +109,20 @@ static struct acpi_scan_handler container_handler = {
|
|||
},
|
||||
};
|
||||
|
||||
void __init acpi_container_init(void)
|
||||
{
|
||||
acpi_scan_add_handler(&container_handler);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static struct acpi_scan_handler container_handler = {
|
||||
.ids = container_device_ids,
|
||||
};
|
||||
|
||||
void __init acpi_container_init(void)
|
||||
{
|
||||
acpi_scan_add_handler_with_hotplug(&container_handler, "container");
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ACPI_CONTAINER */
|
||||
|
|
|
@ -900,17 +900,46 @@ EXPORT_SYMBOL_GPL(acpi_dev_resume_early);
|
|||
*/
|
||||
int acpi_subsys_prepare(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* Devices having power.ignore_children set may still be necessary for
|
||||
* suspending their children in the next phase of device suspend.
|
||||
*/
|
||||
if (dev->power.ignore_children)
|
||||
pm_runtime_resume(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
u32 sys_target;
|
||||
int ret, state;
|
||||
|
||||
return pm_generic_prepare(dev);
|
||||
ret = pm_generic_prepare(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!adev || !pm_runtime_suspended(dev)
|
||||
|| device_may_wakeup(dev) != !!adev->wakeup.prepare_count)
|
||||
return 0;
|
||||
|
||||
sys_target = acpi_target_system_state();
|
||||
if (sys_target == ACPI_STATE_S0)
|
||||
return 1;
|
||||
|
||||
if (adev->power.flags.dsw_present)
|
||||
return 0;
|
||||
|
||||
ret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);
|
||||
return !ret && state == adev->power.state;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_subsys_prepare);
|
||||
|
||||
/**
|
||||
* acpi_subsys_complete - Finalize device's resume during system resume.
|
||||
* @dev: Device to handle.
|
||||
*/
|
||||
void acpi_subsys_complete(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* If the device had been runtime-suspended before the system went into
|
||||
* the sleep state it is going out of and it has never been resumed till
|
||||
* now, resume it in case the firmware powered it up.
|
||||
*/
|
||||
if (dev->power.direct_complete)
|
||||
pm_request_resume(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_subsys_complete);
|
||||
|
||||
/**
|
||||
* acpi_subsys_suspend - Run the device driver's suspend callback.
|
||||
* @dev: Device to handle.
|
||||
|
@ -923,6 +952,7 @@ int acpi_subsys_suspend(struct device *dev)
|
|||
pm_runtime_resume(dev);
|
||||
return pm_generic_suspend(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_subsys_suspend);
|
||||
|
||||
/**
|
||||
* acpi_subsys_suspend_late - Suspend device using ACPI.
|
||||
|
@ -968,6 +998,7 @@ int acpi_subsys_freeze(struct device *dev)
|
|||
pm_runtime_resume(dev);
|
||||
return pm_generic_freeze(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_subsys_freeze);
|
||||
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
|
@ -979,6 +1010,7 @@ static struct dev_pm_domain acpi_general_pm_domain = {
|
|||
#endif
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.prepare = acpi_subsys_prepare,
|
||||
.complete = acpi_subsys_complete,
|
||||
.suspend = acpi_subsys_suspend,
|
||||
.suspend_late = acpi_subsys_suspend_late,
|
||||
.resume_early = acpi_subsys_resume_early,
|
||||
|
|
|
@ -30,12 +30,10 @@ void acpi_pci_root_init(void);
|
|||
void acpi_pci_link_init(void);
|
||||
void acpi_processor_init(void);
|
||||
void acpi_platform_init(void);
|
||||
void acpi_pnp_init(void);
|
||||
int acpi_sysfs_init(void);
|
||||
#ifdef CONFIG_ACPI_CONTAINER
|
||||
void acpi_container_init(void);
|
||||
#else
|
||||
static inline void acpi_container_init(void) {}
|
||||
#endif
|
||||
void acpi_memory_hotplug_init(void);
|
||||
#ifdef CONFIG_ACPI_DOCK
|
||||
void register_dock_dependent_device(struct acpi_device *adev,
|
||||
acpi_handle dshandle);
|
||||
|
@ -47,11 +45,6 @@ static inline void register_dock_dependent_device(struct acpi_device *adev,
|
|||
static inline int dock_notify(struct acpi_device *adev, u32 event) { return -ENODEV; }
|
||||
static inline void acpi_dock_add(struct acpi_device *adev) {}
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_MEMORY
|
||||
void acpi_memory_hotplug_init(void);
|
||||
#else
|
||||
static inline void acpi_memory_hotplug_init(void) {}
|
||||
#endif
|
||||
#ifdef CONFIG_X86
|
||||
void acpi_cmos_rtc_init(void);
|
||||
#else
|
||||
|
@ -72,11 +65,7 @@ int acpi_debugfs_init(void);
|
|||
#else
|
||||
static inline void acpi_debugfs_init(void) { return; }
|
||||
#endif
|
||||
#ifdef CONFIG_X86_INTEL_LPSS
|
||||
void acpi_lpss_init(void);
|
||||
#else
|
||||
static inline void acpi_lpss_init(void) {}
|
||||
#endif
|
||||
|
||||
acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src);
|
||||
bool acpi_queue_hotplug_work(struct work_struct *work);
|
||||
|
@ -180,8 +169,7 @@ static inline void suspend_nvs_restore(void) {}
|
|||
-------------------------------------------------------------------------- */
|
||||
struct platform_device;
|
||||
|
||||
int acpi_create_platform_device(struct acpi_device *adev,
|
||||
const struct acpi_device_id *id);
|
||||
struct platform_device *acpi_create_platform_device(struct acpi_device *adev);
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Video
|
||||
|
|
|
@ -139,8 +139,8 @@ void suspend_nvs_free(void)
|
|||
iounmap(entry->kaddr);
|
||||
entry->unmap = false;
|
||||
} else {
|
||||
acpi_os_unmap_memory(entry->kaddr,
|
||||
entry->size);
|
||||
acpi_os_unmap_iomem(entry->kaddr,
|
||||
entry->size);
|
||||
}
|
||||
entry->kaddr = NULL;
|
||||
}
|
||||
|
|
|
@ -355,7 +355,7 @@ static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr)
|
|||
}
|
||||
|
||||
void __iomem *__init_refok
|
||||
acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
||||
acpi_os_map_iomem(acpi_physical_address phys, acpi_size size)
|
||||
{
|
||||
struct acpi_ioremap *map;
|
||||
void __iomem *virt;
|
||||
|
@ -401,10 +401,17 @@ acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
|||
|
||||
list_add_tail_rcu(&map->list, &acpi_ioremaps);
|
||||
|
||||
out:
|
||||
out:
|
||||
mutex_unlock(&acpi_ioremap_lock);
|
||||
return map->virt + (phys - map->phys);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_os_map_iomem);
|
||||
|
||||
void *__init_refok
|
||||
acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
||||
{
|
||||
return (void *)acpi_os_map_iomem(phys, size);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_os_map_memory);
|
||||
|
||||
static void acpi_os_drop_map_ref(struct acpi_ioremap *map)
|
||||
|
@ -422,7 +429,7 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map)
|
|||
}
|
||||
}
|
||||
|
||||
void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
|
||||
void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
|
||||
{
|
||||
struct acpi_ioremap *map;
|
||||
|
||||
|
@ -443,6 +450,12 @@ void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
|
|||
|
||||
acpi_os_map_cleanup(map);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem);
|
||||
|
||||
void __ref acpi_os_unmap_memory(void *virt, acpi_size size)
|
||||
{
|
||||
return acpi_os_unmap_iomem((void __iomem *)virt, size);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
|
||||
|
||||
void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
|
||||
|
@ -464,7 +477,7 @@ int acpi_os_map_generic_address(struct acpi_generic_address *gas)
|
|||
if (!addr || !gas->bit_width)
|
||||
return -EINVAL;
|
||||
|
||||
virt = acpi_os_map_memory(addr, gas->bit_width / 8);
|
||||
virt = acpi_os_map_iomem(addr, gas->bit_width / 8);
|
||||
if (!virt)
|
||||
return -EIO;
|
||||
|
||||
|
@ -1770,16 +1783,15 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int __init acpi_no_auto_ssdt_setup(char *s)
|
||||
static int __init acpi_no_static_ssdt_setup(char *s)
|
||||
{
|
||||
printk(KERN_NOTICE PREFIX "SSDT auto-load disabled\n");
|
||||
acpi_gbl_disable_ssdt_table_install = TRUE;
|
||||
pr_info("ACPI: static SSDT installation disabled\n");
|
||||
|
||||
acpi_gbl_disable_ssdt_table_load = TRUE;
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup);
|
||||
early_param("acpi_no_static_ssdt", acpi_no_static_ssdt_setup);
|
||||
|
||||
static int __init acpi_disable_return_repair(char *s)
|
||||
{
|
||||
|
|
|
@ -121,6 +121,13 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb,
|
|||
struct acpi_processor *pr = per_cpu(processors, cpu);
|
||||
struct acpi_device *device;
|
||||
|
||||
/*
|
||||
* CPU_STARTING and CPU_DYING must not sleep. Return here since
|
||||
* acpi_bus_get_device() may sleep.
|
||||
*/
|
||||
if (action == CPU_STARTING || action == CPU_DYING)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (!pr || acpi_bus_get_device(pr->handle, &device))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ EXPORT_SYMBOL_GPL(acpi_initialize_hp_context);
|
|||
|
||||
int acpi_scan_add_handler(struct acpi_scan_handler *handler)
|
||||
{
|
||||
if (!handler || !handler->attach)
|
||||
if (!handler)
|
||||
return -EINVAL;
|
||||
|
||||
list_add_tail(&handler->list_node, &acpi_scan_handlers_list);
|
||||
|
@ -1551,9 +1551,13 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)
|
|||
*/
|
||||
if (acpi_has_method(device->handle, "_PSC"))
|
||||
device->power.flags.explicit_get = 1;
|
||||
|
||||
if (acpi_has_method(device->handle, "_IRC"))
|
||||
device->power.flags.inrush_current = 1;
|
||||
|
||||
if (acpi_has_method(device->handle, "_DSW"))
|
||||
device->power.flags.dsw_present = 1;
|
||||
|
||||
/*
|
||||
* Enumerate supported power management states
|
||||
*/
|
||||
|
@ -1793,8 +1797,10 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
|
|||
return;
|
||||
}
|
||||
|
||||
if (info->valid & ACPI_VALID_HID)
|
||||
if (info->valid & ACPI_VALID_HID) {
|
||||
acpi_add_id(pnp, info->hardware_id.string);
|
||||
pnp->type.platform_id = 1;
|
||||
}
|
||||
if (info->valid & ACPI_VALID_CID) {
|
||||
cid_list = &info->compatible_id_list;
|
||||
for (i = 0; i < cid_list->count; i++)
|
||||
|
@ -1973,6 +1979,9 @@ static bool acpi_scan_handler_matching(struct acpi_scan_handler *handler,
|
|||
{
|
||||
const struct acpi_device_id *devid;
|
||||
|
||||
if (handler->match)
|
||||
return handler->match(idstr, matchid);
|
||||
|
||||
for (devid = handler->ids; devid->id[0]; devid++)
|
||||
if (!strcmp((char *)devid->id, idstr)) {
|
||||
if (matchid)
|
||||
|
@ -2061,6 +2070,44 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
|
|||
return AE_OK;
|
||||
}
|
||||
|
||||
static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data)
|
||||
{
|
||||
bool *is_spi_i2c_slave_p = data;
|
||||
|
||||
if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* devices that are connected to UART still need to be enumerated to
|
||||
* platform bus
|
||||
*/
|
||||
if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART)
|
||||
*is_spi_i2c_slave_p = true;
|
||||
|
||||
/* no need to do more checking */
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void acpi_default_enumeration(struct acpi_device *device)
|
||||
{
|
||||
struct list_head resource_list;
|
||||
bool is_spi_i2c_slave = false;
|
||||
|
||||
if (!device->pnp.type.platform_id || device->handler)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Do not enemerate SPI/I2C slaves as they will be enuerated by their
|
||||
* respective parents.
|
||||
*/
|
||||
INIT_LIST_HEAD(&resource_list);
|
||||
acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave,
|
||||
&is_spi_i2c_slave);
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
if (!is_spi_i2c_slave)
|
||||
acpi_create_platform_device(device);
|
||||
}
|
||||
|
||||
static int acpi_scan_attach_handler(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_hardware_id *hwid;
|
||||
|
@ -2072,6 +2119,10 @@ static int acpi_scan_attach_handler(struct acpi_device *device)
|
|||
|
||||
handler = acpi_scan_match_handler(hwid->id, &devid);
|
||||
if (handler) {
|
||||
if (!handler->attach) {
|
||||
device->pnp.type.platform_id = 0;
|
||||
continue;
|
||||
}
|
||||
device->handler = handler;
|
||||
ret = handler->attach(device, devid);
|
||||
if (ret > 0)
|
||||
|
@ -2082,6 +2133,9 @@ static int acpi_scan_attach_handler(struct acpi_device *device)
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (!ret)
|
||||
acpi_default_enumeration(device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2241,11 +2295,11 @@ int __init acpi_scan_init(void)
|
|||
acpi_pci_root_init();
|
||||
acpi_pci_link_init();
|
||||
acpi_processor_init();
|
||||
acpi_platform_init();
|
||||
acpi_lpss_init();
|
||||
acpi_cmos_rtc_init();
|
||||
acpi_container_init();
|
||||
acpi_memory_hotplug_init();
|
||||
acpi_pnp_init();
|
||||
|
||||
mutex_lock(&acpi_scan_lock);
|
||||
/*
|
||||
|
@ -2259,12 +2313,16 @@ int __init acpi_scan_init(void)
|
|||
if (result)
|
||||
goto out;
|
||||
|
||||
result = acpi_bus_scan_fixed();
|
||||
if (result) {
|
||||
acpi_detach_data(acpi_root->handle, acpi_scan_drop_device);
|
||||
acpi_device_del(acpi_root);
|
||||
put_device(&acpi_root->dev);
|
||||
goto out;
|
||||
/* Fixed feature devices do not exist on HW-reduced platform */
|
||||
if (!acpi_gbl_reduced_hardware) {
|
||||
result = acpi_bus_scan_fixed();
|
||||
if (result) {
|
||||
acpi_detach_data(acpi_root->handle,
|
||||
acpi_scan_drop_device);
|
||||
acpi_device_del(acpi_root);
|
||||
put_device(&acpi_root->dev);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
acpi_update_all_gpes();
|
||||
|
|
|
@ -89,6 +89,7 @@ u32 acpi_target_system_state(void)
|
|||
{
|
||||
return acpi_target_sleep_state;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_target_system_state);
|
||||
|
||||
static bool pwr_btn_event_pending;
|
||||
|
||||
|
@ -611,6 +612,22 @@ static const struct platform_suspend_ops acpi_suspend_ops_old = {
|
|||
.recover = acpi_pm_finish,
|
||||
};
|
||||
|
||||
static int acpi_freeze_begin(void)
|
||||
{
|
||||
acpi_scan_lock_acquire();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_freeze_end(void)
|
||||
{
|
||||
acpi_scan_lock_release();
|
||||
}
|
||||
|
||||
static const struct platform_freeze_ops acpi_freeze_ops = {
|
||||
.begin = acpi_freeze_begin,
|
||||
.end = acpi_freeze_end,
|
||||
};
|
||||
|
||||
static void acpi_sleep_suspend_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -621,7 +638,9 @@ static void acpi_sleep_suspend_setup(void)
|
|||
|
||||
suspend_set_ops(old_suspend_ordering ?
|
||||
&acpi_suspend_ops_old : &acpi_suspend_ops);
|
||||
freeze_set_ops(&acpi_freeze_ops);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SUSPEND */
|
||||
static inline void acpi_sleep_suspend_setup(void) {}
|
||||
#endif /* !CONFIG_SUSPEND */
|
||||
|
|
|
@ -44,6 +44,12 @@ static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;
|
|||
|
||||
static int acpi_apic_instance __initdata;
|
||||
|
||||
/*
|
||||
* Disable table checksum verification for the early stage due to the size
|
||||
* limitation of the current x86 early mapping implementation.
|
||||
*/
|
||||
static bool acpi_verify_table_checksum __initdata = false;
|
||||
|
||||
void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
|
||||
{
|
||||
if (!header)
|
||||
|
@ -333,6 +339,14 @@ int __init acpi_table_init(void)
|
|||
{
|
||||
acpi_status status;
|
||||
|
||||
if (acpi_verify_table_checksum) {
|
||||
pr_info("Early table checksum verification enabled\n");
|
||||
acpi_gbl_verify_table_checksum = TRUE;
|
||||
} else {
|
||||
pr_info("Early table checksum verification disabled\n");
|
||||
acpi_gbl_verify_table_checksum = FALSE;
|
||||
}
|
||||
|
||||
status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -EINVAL;
|
||||
|
@ -354,3 +368,12 @@ static int __init acpi_parse_apic_instance(char *str)
|
|||
}
|
||||
|
||||
early_param("acpi_apic_instance", acpi_parse_apic_instance);
|
||||
|
||||
static int __init acpi_force_table_verification_setup(char *s)
|
||||
{
|
||||
acpi_verify_table_checksum = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("acpi_force_table_verification", acpi_force_table_verification_setup);
|
||||
|
|
|
@ -925,13 +925,10 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
status = acpi_attach_data(tz->device->handle,
|
||||
acpi_bus_private_data_handler,
|
||||
tz->thermal_zone);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_err(PREFIX "Error attaching device data\n");
|
||||
status = acpi_bus_attach_private_data(tz->device->handle,
|
||||
tz->thermal_zone);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
tz->tz_enabled = 1;
|
||||
|
||||
|
@ -946,7 +943,7 @@ static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
|
|||
sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
|
||||
thermal_zone_device_unregister(tz->thermal_zone);
|
||||
tz->thermal_zone = NULL;
|
||||
acpi_detach_data(tz->device->handle, acpi_bus_private_data_handler);
|
||||
acpi_bus_detach_private_data(tz->device->handle);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dynamic_debug.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
@ -456,6 +457,24 @@ acpi_evaluate_ost(acpi_handle handle, u32 source_event, u32 status_code,
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_evaluate_ost);
|
||||
|
||||
/**
|
||||
* acpi_handle_path: Return the object path of handle
|
||||
*
|
||||
* Caller must free the returned buffer
|
||||
*/
|
||||
static char *acpi_handle_path(acpi_handle handle)
|
||||
{
|
||||
struct acpi_buffer buffer = {
|
||||
.length = ACPI_ALLOCATE_BUFFER,
|
||||
.pointer = NULL
|
||||
};
|
||||
|
||||
if (in_interrupt() ||
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer) != AE_OK)
|
||||
return NULL;
|
||||
return buffer.pointer;
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_handle_printk: Print message with ACPI prefix and object path
|
||||
*
|
||||
|
@ -469,29 +488,50 @@ acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...)
|
|||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
struct acpi_buffer buffer = {
|
||||
.length = ACPI_ALLOCATE_BUFFER,
|
||||
.pointer = NULL
|
||||
};
|
||||
const char *path;
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
if (in_interrupt() ||
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer) != AE_OK)
|
||||
path = "<n/a>";
|
||||
else
|
||||
path = buffer.pointer;
|
||||
|
||||
printk("%sACPI: %s: %pV", level, path, &vaf);
|
||||
path = acpi_handle_path(handle);
|
||||
printk("%sACPI: %s: %pV", level, path ? path : "<n/a>" , &vaf);
|
||||
|
||||
va_end(args);
|
||||
kfree(buffer.pointer);
|
||||
kfree(path);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_handle_printk);
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
/**
|
||||
* __acpi_handle_debug: pr_debug with ACPI prefix and object path
|
||||
*
|
||||
* This function is called through acpi_handle_debug macro and debug
|
||||
* prints a message with ACPI prefix and object path. This function
|
||||
* acquires the global namespace mutex to obtain an object path. In
|
||||
* interrupt context, it shows the object path as <n/a>.
|
||||
*/
|
||||
void
|
||||
__acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
const char *path;
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
path = acpi_handle_path(handle);
|
||||
__dynamic_pr_debug(descriptor, "ACPI: %s: %pV", path ? path : "<n/a>", &vaf);
|
||||
|
||||
va_end(args);
|
||||
kfree(path);
|
||||
}
|
||||
EXPORT_SYMBOL(__acpi_handle_debug);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* acpi_has_method: Check whether @handle has a method named @name
|
||||
* @handle: ACPI device handle
|
||||
|
|
|
@ -68,7 +68,7 @@ MODULE_AUTHOR("Bruno Ducrot");
|
|||
MODULE_DESCRIPTION("ACPI Video Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static bool brightness_switch_enabled = 1;
|
||||
static bool brightness_switch_enabled;
|
||||
module_param(brightness_switch_enabled, bool, 0644);
|
||||
|
||||
/*
|
||||
|
@ -150,6 +150,8 @@ struct acpi_video_enumerated_device {
|
|||
|
||||
struct acpi_video_bus {
|
||||
struct acpi_device *device;
|
||||
bool backlight_registered;
|
||||
bool backlight_notifier_registered;
|
||||
u8 dos_setting;
|
||||
struct acpi_video_enumerated_device *attached_array;
|
||||
u8 attached_count;
|
||||
|
@ -161,6 +163,7 @@ struct acpi_video_bus {
|
|||
struct input_dev *input;
|
||||
char phys[32]; /* for input device */
|
||||
struct notifier_block pm_nb;
|
||||
struct notifier_block backlight_nb;
|
||||
};
|
||||
|
||||
struct acpi_video_device_flags {
|
||||
|
@ -471,6 +474,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X230"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "ThinkPad W530",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W530"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "ThinkPad X1 Carbon",
|
||||
|
@ -487,6 +498,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "Lenovo Yoga 2 11",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Yoga 2 11"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "Thinkpad Helix",
|
||||
|
@ -519,6 +538,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5742G"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "Acer Aspire V5-171",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "V5-171"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "Acer Aspire V5-431",
|
||||
|
@ -527,6 +554,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-431"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "Acer Aspire V5-471G",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-471G"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "HP ProBook 4340s",
|
||||
|
@ -579,6 +614,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "HP EliteBook 8470p",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8470p"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_use_native_backlight,
|
||||
.ident = "HP EliteBook 8780w",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
|
@ -1658,88 +1701,92 @@ acpi_video_bus_match(acpi_handle handle, u32 level, void *context,
|
|||
|
||||
static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
|
||||
{
|
||||
if (acpi_video_verify_backlight_support()) {
|
||||
struct backlight_properties props;
|
||||
struct pci_dev *pdev;
|
||||
acpi_handle acpi_parent;
|
||||
struct device *parent = NULL;
|
||||
int result;
|
||||
static int count;
|
||||
char *name;
|
||||
struct backlight_properties props;
|
||||
struct pci_dev *pdev;
|
||||
acpi_handle acpi_parent;
|
||||
struct device *parent = NULL;
|
||||
int result;
|
||||
static int count;
|
||||
char *name;
|
||||
|
||||
result = acpi_video_init_brightness(device);
|
||||
if (result)
|
||||
return;
|
||||
name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
|
||||
if (!name)
|
||||
return;
|
||||
count++;
|
||||
result = acpi_video_init_brightness(device);
|
||||
if (result)
|
||||
return;
|
||||
name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
|
||||
if (!name)
|
||||
return;
|
||||
count++;
|
||||
|
||||
acpi_get_parent(device->dev->handle, &acpi_parent);
|
||||
acpi_get_parent(device->dev->handle, &acpi_parent);
|
||||
|
||||
pdev = acpi_get_pci_dev(acpi_parent);
|
||||
if (pdev) {
|
||||
parent = &pdev->dev;
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_FIRMWARE;
|
||||
props.max_brightness = device->brightness->count - 3;
|
||||
device->backlight = backlight_device_register(name,
|
||||
parent,
|
||||
device,
|
||||
&acpi_backlight_ops,
|
||||
&props);
|
||||
kfree(name);
|
||||
if (IS_ERR(device->backlight))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Save current brightness level in case we have to restore it
|
||||
* before acpi_video_device_lcd_set_level() is called next time.
|
||||
*/
|
||||
device->backlight->props.brightness =
|
||||
acpi_video_get_brightness(device->backlight);
|
||||
|
||||
device->cooling_dev = thermal_cooling_device_register("LCD",
|
||||
device->dev, &video_cooling_ops);
|
||||
if (IS_ERR(device->cooling_dev)) {
|
||||
/*
|
||||
* Set cooling_dev to NULL so we don't crash trying to
|
||||
* free it.
|
||||
* Also, why the hell we are returning early and
|
||||
* not attempt to register video output if cooling
|
||||
* device registration failed?
|
||||
* -- dtor
|
||||
*/
|
||||
device->cooling_dev = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
dev_info(&device->dev->dev, "registered as cooling_device%d\n",
|
||||
device->cooling_dev->id);
|
||||
result = sysfs_create_link(&device->dev->dev.kobj,
|
||||
&device->cooling_dev->device.kobj,
|
||||
"thermal_cooling");
|
||||
if (result)
|
||||
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
||||
result = sysfs_create_link(&device->cooling_dev->device.kobj,
|
||||
&device->dev->dev.kobj, "device");
|
||||
if (result)
|
||||
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
||||
pdev = acpi_get_pci_dev(acpi_parent);
|
||||
if (pdev) {
|
||||
parent = &pdev->dev;
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_FIRMWARE;
|
||||
props.max_brightness = device->brightness->count - 3;
|
||||
device->backlight = backlight_device_register(name,
|
||||
parent,
|
||||
device,
|
||||
&acpi_backlight_ops,
|
||||
&props);
|
||||
kfree(name);
|
||||
if (IS_ERR(device->backlight))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Save current brightness level in case we have to restore it
|
||||
* before acpi_video_device_lcd_set_level() is called next time.
|
||||
*/
|
||||
device->backlight->props.brightness =
|
||||
acpi_video_get_brightness(device->backlight);
|
||||
|
||||
device->cooling_dev = thermal_cooling_device_register("LCD",
|
||||
device->dev, &video_cooling_ops);
|
||||
if (IS_ERR(device->cooling_dev)) {
|
||||
/*
|
||||
* Set cooling_dev to NULL so we don't crash trying to free it.
|
||||
* Also, why the hell we are returning early and not attempt to
|
||||
* register video output if cooling device registration failed?
|
||||
* -- dtor
|
||||
*/
|
||||
device->cooling_dev = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
dev_info(&device->dev->dev, "registered as cooling_device%d\n",
|
||||
device->cooling_dev->id);
|
||||
result = sysfs_create_link(&device->dev->dev.kobj,
|
||||
&device->cooling_dev->device.kobj,
|
||||
"thermal_cooling");
|
||||
if (result)
|
||||
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
||||
result = sysfs_create_link(&device->cooling_dev->device.kobj,
|
||||
&device->dev->dev.kobj, "device");
|
||||
if (result)
|
||||
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
||||
}
|
||||
|
||||
static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
|
||||
{
|
||||
struct acpi_video_device *dev;
|
||||
|
||||
if (video->backlight_registered)
|
||||
return 0;
|
||||
|
||||
if (!acpi_video_verify_backlight_support())
|
||||
return 0;
|
||||
|
||||
mutex_lock(&video->device_list_lock);
|
||||
list_for_each_entry(dev, &video->video_device_list, entry)
|
||||
acpi_video_dev_register_backlight(dev);
|
||||
mutex_unlock(&video->device_list_lock);
|
||||
|
||||
video->backlight_registered = true;
|
||||
|
||||
video->pm_nb.notifier_call = acpi_video_resume;
|
||||
video->pm_nb.priority = 0;
|
||||
return register_pm_notifier(&video->pm_nb);
|
||||
|
@ -1767,13 +1814,20 @@ static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device
|
|||
static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video)
|
||||
{
|
||||
struct acpi_video_device *dev;
|
||||
int error = unregister_pm_notifier(&video->pm_nb);
|
||||
int error;
|
||||
|
||||
if (!video->backlight_registered)
|
||||
return 0;
|
||||
|
||||
error = unregister_pm_notifier(&video->pm_nb);
|
||||
|
||||
mutex_lock(&video->device_list_lock);
|
||||
list_for_each_entry(dev, &video->video_device_list, entry)
|
||||
acpi_video_dev_unregister_backlight(dev);
|
||||
mutex_unlock(&video->device_list_lock);
|
||||
|
||||
video->backlight_registered = false;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -1867,6 +1921,56 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
|
|||
video->input = NULL;
|
||||
}
|
||||
|
||||
static int acpi_video_backlight_notify(struct notifier_block *nb,
|
||||
unsigned long val, void *bd)
|
||||
{
|
||||
struct backlight_device *backlight = bd;
|
||||
struct acpi_video_bus *video;
|
||||
|
||||
/* acpi_video_verify_backlight_support only cares about raw devices */
|
||||
if (backlight->props.type != BACKLIGHT_RAW)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
video = container_of(nb, struct acpi_video_bus, backlight_nb);
|
||||
|
||||
switch (val) {
|
||||
case BACKLIGHT_REGISTERED:
|
||||
if (!acpi_video_verify_backlight_support())
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
break;
|
||||
case BACKLIGHT_UNREGISTERED:
|
||||
acpi_video_bus_register_backlight(video);
|
||||
break;
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_add_backlight_notify_handler(
|
||||
struct acpi_video_bus *video)
|
||||
{
|
||||
int error;
|
||||
|
||||
video->backlight_nb.notifier_call = acpi_video_backlight_notify;
|
||||
video->backlight_nb.priority = 0;
|
||||
error = backlight_register_notifier(&video->backlight_nb);
|
||||
if (error == 0)
|
||||
video->backlight_notifier_registered = true;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_remove_backlight_notify_handler(
|
||||
struct acpi_video_bus *video)
|
||||
{
|
||||
if (!video->backlight_notifier_registered)
|
||||
return 0;
|
||||
|
||||
video->backlight_notifier_registered = false;
|
||||
|
||||
return backlight_unregister_notifier(&video->backlight_nb);
|
||||
}
|
||||
|
||||
static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
|
||||
{
|
||||
struct acpi_video_device *dev, *next;
|
||||
|
@ -1948,6 +2052,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
|||
|
||||
acpi_video_bus_register_backlight(video);
|
||||
acpi_video_bus_add_notify_handler(video);
|
||||
acpi_video_bus_add_backlight_notify_handler(video);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1971,6 +2076,7 @@ static int acpi_video_bus_remove(struct acpi_device *device)
|
|||
|
||||
video = acpi_driver_data(device);
|
||||
|
||||
acpi_video_bus_remove_backlight_notify_handler(video);
|
||||
acpi_video_bus_remove_notify_handler(video);
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
acpi_video_bus_put_devices(video);
|
||||
|
@ -2061,6 +2167,20 @@ void acpi_video_unregister(void)
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_video_unregister);
|
||||
|
||||
void acpi_video_unregister_backlight(void)
|
||||
{
|
||||
struct acpi_video_bus *video;
|
||||
|
||||
if (!register_count)
|
||||
return;
|
||||
|
||||
mutex_lock(&video_list_lock);
|
||||
list_for_each_entry(video, &video_bus_head, entry)
|
||||
acpi_video_bus_unregister_backlight(video);
|
||||
mutex_unlock(&video_list_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_unregister_backlight);
|
||||
|
||||
/*
|
||||
* This is kind of nasty. Hardware using Intel chipsets may require
|
||||
* the video opregion code to be run first in order to initialise
|
||||
|
|
|
@ -479,7 +479,7 @@ static int device_resume_noirq(struct device *dev, pm_message_t state, bool asyn
|
|||
TRACE_DEVICE(dev);
|
||||
TRACE_RESUME(0);
|
||||
|
||||
if (dev->power.syscore)
|
||||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Out;
|
||||
|
||||
if (!dev->power.is_noirq_suspended)
|
||||
|
@ -605,7 +605,7 @@ static int device_resume_early(struct device *dev, pm_message_t state, bool asyn
|
|||
TRACE_DEVICE(dev);
|
||||
TRACE_RESUME(0);
|
||||
|
||||
if (dev->power.syscore)
|
||||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Out;
|
||||
|
||||
if (!dev->power.is_late_suspended)
|
||||
|
@ -735,6 +735,12 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
|
|||
if (dev->power.syscore)
|
||||
goto Complete;
|
||||
|
||||
if (dev->power.direct_complete) {
|
||||
/* Match the pm_runtime_disable() in __device_suspend(). */
|
||||
pm_runtime_enable(dev);
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
dpm_wait(dev->parent, async);
|
||||
dpm_watchdog_set(&wd, dev);
|
||||
device_lock(dev);
|
||||
|
@ -1007,7 +1013,7 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
|
|||
goto Complete;
|
||||
}
|
||||
|
||||
if (dev->power.syscore)
|
||||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Complete;
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
@ -1146,7 +1152,7 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
|
|||
goto Complete;
|
||||
}
|
||||
|
||||
if (dev->power.syscore)
|
||||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Complete;
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
@ -1332,6 +1338,17 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
|||
if (dev->power.syscore)
|
||||
goto Complete;
|
||||
|
||||
if (dev->power.direct_complete) {
|
||||
if (pm_runtime_status_suspended(dev)) {
|
||||
pm_runtime_disable(dev);
|
||||
if (pm_runtime_suspended_if_enabled(dev))
|
||||
goto Complete;
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
}
|
||||
dev->power.direct_complete = false;
|
||||
}
|
||||
|
||||
dpm_watchdog_set(&wd, dev);
|
||||
device_lock(dev);
|
||||
|
||||
|
@ -1382,10 +1399,19 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
|||
|
||||
End:
|
||||
if (!error) {
|
||||
struct device *parent = dev->parent;
|
||||
|
||||
dev->power.is_suspended = true;
|
||||
if (dev->power.wakeup_path
|
||||
&& dev->parent && !dev->parent->power.ignore_children)
|
||||
dev->parent->power.wakeup_path = true;
|
||||
if (parent) {
|
||||
spin_lock_irq(&parent->power.lock);
|
||||
|
||||
dev->parent->power.direct_complete = false;
|
||||
if (dev->power.wakeup_path
|
||||
&& !dev->parent->power.ignore_children)
|
||||
dev->parent->power.wakeup_path = true;
|
||||
|
||||
spin_unlock_irq(&parent->power.lock);
|
||||
}
|
||||
}
|
||||
|
||||
device_unlock(dev);
|
||||
|
@ -1487,7 +1513,7 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|||
{
|
||||
int (*callback)(struct device *) = NULL;
|
||||
char *info = NULL;
|
||||
int error = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (dev->power.syscore)
|
||||
return 0;
|
||||
|
@ -1523,17 +1549,27 @@ static int device_prepare(struct device *dev, pm_message_t state)
|
|||
callback = dev->driver->pm->prepare;
|
||||
}
|
||||
|
||||
if (callback) {
|
||||
error = callback(dev);
|
||||
suspend_report_result(callback, error);
|
||||
}
|
||||
if (callback)
|
||||
ret = callback(dev);
|
||||
|
||||
device_unlock(dev);
|
||||
|
||||
if (error)
|
||||
if (ret < 0) {
|
||||
suspend_report_result(callback, ret);
|
||||
pm_runtime_put(dev);
|
||||
|
||||
return error;
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* A positive return value from ->prepare() means "this device appears
|
||||
* to be runtime-suspended and its state is fine, so if it really is
|
||||
* runtime-suspended, you can leave it in that state provided that you
|
||||
* will do the same thing with all of its descendants". This only
|
||||
* applies to suspend transitions, however.
|
||||
*/
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.direct_complete = ret > 0 && state.event == PM_EVENT_SUSPEND;
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -318,10 +318,16 @@ int device_init_wakeup(struct device *dev, bool enable)
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!dev)
|
||||
return -EINVAL;
|
||||
|
||||
if (enable) {
|
||||
device_set_wakeup_capable(dev, true);
|
||||
ret = device_wakeup_enable(dev);
|
||||
} else {
|
||||
if (dev->power.can_wakeup)
|
||||
device_wakeup_disable(dev);
|
||||
|
||||
device_set_wakeup_capable(dev, false);
|
||||
}
|
||||
|
||||
|
|
|
@ -95,7 +95,7 @@ int read_log(struct tpm_bios_log *log)
|
|||
|
||||
log->bios_event_log_end = log->bios_event_log + len;
|
||||
|
||||
virt = acpi_os_map_memory(start, len);
|
||||
virt = acpi_os_map_iomem(start, len);
|
||||
if (!virt) {
|
||||
kfree(log->bios_event_log);
|
||||
printk("%s: ERROR - Unable to map memory\n", __func__);
|
||||
|
@ -104,6 +104,6 @@ int read_log(struct tpm_bios_log *log)
|
|||
|
||||
memcpy_fromio(log->bios_event_log, virt, len);
|
||||
|
||||
acpi_os_unmap_memory(virt, len);
|
||||
acpi_os_unmap_iomem(virt, len);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ obj-$(CONFIG_COMMON_CLK) += clk-fixed-rate.o
|
|||
obj-$(CONFIG_COMMON_CLK) += clk-gate.o
|
||||
obj-$(CONFIG_COMMON_CLK) += clk-mux.o
|
||||
obj-$(CONFIG_COMMON_CLK) += clk-composite.o
|
||||
obj-$(CONFIG_COMMON_CLK) += clk-fractional-divider.o
|
||||
|
||||
# hardware specific clock types
|
||||
# please keep this section sorted lexicographically by file/directory path name
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Adjustable fractional divider clock implementation.
|
||||
* Output rate = (m / n) * parent_rate.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/gcd.h>
|
||||
|
||||
#define to_clk_fd(_hw) container_of(_hw, struct clk_fractional_divider, hw)
|
||||
|
||||
static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_fractional_divider *fd = to_clk_fd(hw);
|
||||
unsigned long flags = 0;
|
||||
u32 val, m, n;
|
||||
u64 ret;
|
||||
|
||||
if (fd->lock)
|
||||
spin_lock_irqsave(fd->lock, flags);
|
||||
|
||||
val = clk_readl(fd->reg);
|
||||
|
||||
if (fd->lock)
|
||||
spin_unlock_irqrestore(fd->lock, flags);
|
||||
|
||||
m = (val & fd->mmask) >> fd->mshift;
|
||||
n = (val & fd->nmask) >> fd->nshift;
|
||||
|
||||
ret = parent_rate * m;
|
||||
do_div(ret, n);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *prate)
|
||||
{
|
||||
struct clk_fractional_divider *fd = to_clk_fd(hw);
|
||||
unsigned maxn = (fd->nmask >> fd->nshift) + 1;
|
||||
unsigned div;
|
||||
|
||||
if (!rate || rate >= *prate)
|
||||
return *prate;
|
||||
|
||||
div = gcd(*prate, rate);
|
||||
|
||||
while ((*prate / div) > maxn) {
|
||||
div <<= 1;
|
||||
rate <<= 1;
|
||||
}
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_fractional_divider *fd = to_clk_fd(hw);
|
||||
unsigned long flags = 0;
|
||||
unsigned long div;
|
||||
unsigned n, m;
|
||||
u32 val;
|
||||
|
||||
div = gcd(parent_rate, rate);
|
||||
m = rate / div;
|
||||
n = parent_rate / div;
|
||||
|
||||
if (fd->lock)
|
||||
spin_lock_irqsave(fd->lock, flags);
|
||||
|
||||
val = clk_readl(fd->reg);
|
||||
val &= ~(fd->mmask | fd->nmask);
|
||||
val |= (m << fd->mshift) | (n << fd->nshift);
|
||||
clk_writel(val, fd->reg);
|
||||
|
||||
if (fd->lock)
|
||||
spin_unlock_irqrestore(fd->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct clk_ops clk_fractional_divider_ops = {
|
||||
.recalc_rate = clk_fd_recalc_rate,
|
||||
.round_rate = clk_fd_round_rate,
|
||||
.set_rate = clk_fd_set_rate,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_fractional_divider_ops);
|
||||
|
||||
struct clk *clk_register_fractional_divider(struct device *dev,
|
||||
const char *name, const char *parent_name, unsigned long flags,
|
||||
void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, u8 nwidth,
|
||||
u8 clk_divider_flags, spinlock_t *lock)
|
||||
{
|
||||
struct clk_fractional_divider *fd;
|
||||
struct clk_init_data init;
|
||||
struct clk *clk;
|
||||
|
||||
fd = kzalloc(sizeof(*fd), GFP_KERNEL);
|
||||
if (!fd) {
|
||||
dev_err(dev, "could not allocate fractional divider clk\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
init.name = name;
|
||||
init.ops = &clk_fractional_divider_ops;
|
||||
init.flags = flags | CLK_IS_BASIC;
|
||||
init.parent_names = parent_name ? &parent_name : NULL;
|
||||
init.num_parents = parent_name ? 1 : 0;
|
||||
|
||||
fd->reg = reg;
|
||||
fd->mshift = mshift;
|
||||
fd->mmask = (BIT(mwidth) - 1) << mshift;
|
||||
fd->nshift = nshift;
|
||||
fd->nmask = (BIT(nwidth) - 1) << nshift;
|
||||
fd->flags = clk_divider_flags;
|
||||
fd->lock = lock;
|
||||
fd->hw.init = &init;
|
||||
|
||||
clk = clk_register(dev, &fd->hw);
|
||||
if (IS_ERR(clk))
|
||||
kfree(fd);
|
||||
|
||||
return clk;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_register_fractional_divider);
|
|
@ -40,10 +40,10 @@
|
|||
#define BYT_TURBO_VIDS 0x66d
|
||||
|
||||
|
||||
#define FRAC_BITS 6
|
||||
#define FRAC_BITS 8
|
||||
#define int_tofp(X) ((int64_t)(X) << FRAC_BITS)
|
||||
#define fp_toint(X) ((X) >> FRAC_BITS)
|
||||
#define FP_ROUNDUP(X) ((X) += 1 << FRAC_BITS)
|
||||
|
||||
|
||||
static inline int32_t mul_fp(int32_t x, int32_t y)
|
||||
{
|
||||
|
@ -59,8 +59,8 @@ struct sample {
|
|||
int32_t core_pct_busy;
|
||||
u64 aperf;
|
||||
u64 mperf;
|
||||
unsigned long long tsc;
|
||||
int freq;
|
||||
ktime_t time;
|
||||
};
|
||||
|
||||
struct pstate_data {
|
||||
|
@ -98,9 +98,9 @@ struct cpudata {
|
|||
struct vid_data vid;
|
||||
struct _pid pid;
|
||||
|
||||
ktime_t last_sample_time;
|
||||
u64 prev_aperf;
|
||||
u64 prev_mperf;
|
||||
unsigned long long prev_tsc;
|
||||
struct sample sample;
|
||||
};
|
||||
|
||||
|
@ -200,7 +200,10 @@ static signed int pid_calc(struct _pid *pid, int32_t busy)
|
|||
pid->last_err = fp_error;
|
||||
|
||||
result = pterm + mul_fp(pid->integral, pid->i_gain) + dterm;
|
||||
|
||||
if (result >= 0)
|
||||
result = result + (1 << (FRAC_BITS-1));
|
||||
else
|
||||
result = result - (1 << (FRAC_BITS-1));
|
||||
return (signed int)fp_toint(result);
|
||||
}
|
||||
|
||||
|
@ -560,47 +563,42 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
|
|||
static inline void intel_pstate_calc_busy(struct cpudata *cpu,
|
||||
struct sample *sample)
|
||||
{
|
||||
int32_t core_pct;
|
||||
int32_t c0_pct;
|
||||
int64_t core_pct;
|
||||
int32_t rem;
|
||||
|
||||
core_pct = div_fp(int_tofp((sample->aperf)),
|
||||
int_tofp((sample->mperf)));
|
||||
core_pct = mul_fp(core_pct, int_tofp(100));
|
||||
FP_ROUNDUP(core_pct);
|
||||
core_pct = int_tofp(sample->aperf) * int_tofp(100);
|
||||
core_pct = div_u64_rem(core_pct, int_tofp(sample->mperf), &rem);
|
||||
|
||||
c0_pct = div_fp(int_tofp(sample->mperf), int_tofp(sample->tsc));
|
||||
if ((rem << 1) >= int_tofp(sample->mperf))
|
||||
core_pct += 1;
|
||||
|
||||
sample->freq = fp_toint(
|
||||
mul_fp(int_tofp(cpu->pstate.max_pstate * 1000), core_pct));
|
||||
|
||||
sample->core_pct_busy = mul_fp(core_pct, c0_pct);
|
||||
sample->core_pct_busy = (int32_t)core_pct;
|
||||
}
|
||||
|
||||
static inline void intel_pstate_sample(struct cpudata *cpu)
|
||||
{
|
||||
u64 aperf, mperf;
|
||||
unsigned long long tsc;
|
||||
|
||||
rdmsrl(MSR_IA32_APERF, aperf);
|
||||
rdmsrl(MSR_IA32_MPERF, mperf);
|
||||
tsc = native_read_tsc();
|
||||
|
||||
aperf = aperf >> FRAC_BITS;
|
||||
mperf = mperf >> FRAC_BITS;
|
||||
tsc = tsc >> FRAC_BITS;
|
||||
|
||||
cpu->last_sample_time = cpu->sample.time;
|
||||
cpu->sample.time = ktime_get();
|
||||
cpu->sample.aperf = aperf;
|
||||
cpu->sample.mperf = mperf;
|
||||
cpu->sample.tsc = tsc;
|
||||
cpu->sample.aperf -= cpu->prev_aperf;
|
||||
cpu->sample.mperf -= cpu->prev_mperf;
|
||||
cpu->sample.tsc -= cpu->prev_tsc;
|
||||
|
||||
intel_pstate_calc_busy(cpu, &cpu->sample);
|
||||
|
||||
cpu->prev_aperf = aperf;
|
||||
cpu->prev_mperf = mperf;
|
||||
cpu->prev_tsc = tsc;
|
||||
}
|
||||
|
||||
static inline void intel_pstate_set_sample_time(struct cpudata *cpu)
|
||||
|
@ -614,13 +612,25 @@ static inline void intel_pstate_set_sample_time(struct cpudata *cpu)
|
|||
|
||||
static inline int32_t intel_pstate_get_scaled_busy(struct cpudata *cpu)
|
||||
{
|
||||
int32_t core_busy, max_pstate, current_pstate;
|
||||
int32_t core_busy, max_pstate, current_pstate, sample_ratio;
|
||||
u32 duration_us;
|
||||
u32 sample_time;
|
||||
|
||||
core_busy = cpu->sample.core_pct_busy;
|
||||
max_pstate = int_tofp(cpu->pstate.max_pstate);
|
||||
current_pstate = int_tofp(cpu->pstate.current_pstate);
|
||||
core_busy = mul_fp(core_busy, div_fp(max_pstate, current_pstate));
|
||||
return FP_ROUNDUP(core_busy);
|
||||
|
||||
sample_time = (pid_params.sample_rate_ms * USEC_PER_MSEC);
|
||||
duration_us = (u32) ktime_us_delta(cpu->sample.time,
|
||||
cpu->last_sample_time);
|
||||
if (duration_us > sample_time * 3) {
|
||||
sample_ratio = div_fp(int_tofp(sample_time),
|
||||
int_tofp(duration_us));
|
||||
core_busy = mul_fp(core_busy, sample_ratio);
|
||||
}
|
||||
|
||||
return core_busy;
|
||||
}
|
||||
|
||||
static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu)
|
||||
|
|
|
@ -13,6 +13,12 @@ config ARM_BIG_LITTLE_CPUIDLE
|
|||
define different C-states for little and big cores through the
|
||||
multiple CPU idle drivers infrastructure.
|
||||
|
||||
config ARM_CLPS711X_CPUIDLE
|
||||
bool "CPU Idle Driver for CLPS711X processors"
|
||||
depends on ARCH_CLPS711X || COMPILE_TEST
|
||||
help
|
||||
Select this to enable cpuidle on Cirrus Logic CLPS711X SOCs.
|
||||
|
||||
config ARM_HIGHBANK_CPUIDLE
|
||||
bool "CPU Idle Driver for Calxeda processors"
|
||||
depends on ARM_PSCI
|
||||
|
|
|
@ -8,6 +8,7 @@ obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
|
|||
##################################################################################
|
||||
# ARM SoC drivers
|
||||
obj-$(CONFIG_ARM_BIG_LITTLE_CPUIDLE) += cpuidle-big_little.o
|
||||
obj-$(CONFIG_ARM_CLPS711X_CPUIDLE) += cpuidle-clps711x.o
|
||||
obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE) += cpuidle-calxeda.o
|
||||
obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o
|
||||
obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* CLPS711X CPU idle driver
|
||||
*
|
||||
* Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define CLPS711X_CPUIDLE_NAME "clps711x-cpuidle"
|
||||
|
||||
static void __iomem *clps711x_halt;
|
||||
|
||||
static int clps711x_cpuidle_halt(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index)
|
||||
{
|
||||
writel(0xaa, clps711x_halt);
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
static struct cpuidle_driver clps711x_idle_driver = {
|
||||
.name = CLPS711X_CPUIDLE_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.states[0] = {
|
||||
.name = "HALT",
|
||||
.desc = "CLPS711X HALT",
|
||||
.enter = clps711x_cpuidle_halt,
|
||||
.exit_latency = 1,
|
||||
},
|
||||
.state_count = 1,
|
||||
};
|
||||
|
||||
static int __init clps711x_cpuidle_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
clps711x_halt = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(clps711x_halt))
|
||||
return PTR_ERR(clps711x_halt);
|
||||
|
||||
return cpuidle_register(&clps711x_idle_driver, NULL);
|
||||
}
|
||||
|
||||
static struct platform_driver clps711x_cpuidle_driver = {
|
||||
.driver = {
|
||||
.name = CLPS711X_CPUIDLE_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
module_platform_driver_probe(clps711x_cpuidle_driver, clps711x_cpuidle_probe);
|
||||
|
||||
MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
|
||||
MODULE_DESCRIPTION("CLPS711X CPU idle driver");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -32,6 +32,7 @@ LIST_HEAD(cpuidle_detected_devices);
|
|||
static int enabled_devices;
|
||||
static int off __read_mostly;
|
||||
static int initialized __read_mostly;
|
||||
static bool use_deepest_state __read_mostly;
|
||||
|
||||
int cpuidle_disabled(void)
|
||||
{
|
||||
|
@ -65,23 +66,42 @@ int cpuidle_play_dead(void)
|
|||
}
|
||||
|
||||
/**
|
||||
* cpuidle_enabled - check if the cpuidle framework is ready
|
||||
* @dev: cpuidle device for this cpu
|
||||
* @drv: cpuidle driver for this cpu
|
||||
* cpuidle_use_deepest_state - Enable/disable the "deepest idle" mode.
|
||||
* @enable: Whether enable or disable the feature.
|
||||
*
|
||||
* Return 0 on success, otherwise:
|
||||
* -NODEV : the cpuidle framework is not available
|
||||
* -EBUSY : the cpuidle framework is not initialized
|
||||
* If the "deepest idle" mode is enabled, cpuidle will ignore the governor and
|
||||
* always use the state with the greatest exit latency (out of the states that
|
||||
* are not disabled).
|
||||
*
|
||||
* This function can only be called after cpuidle_pause() to avoid races.
|
||||
*/
|
||||
int cpuidle_enabled(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
||||
void cpuidle_use_deepest_state(bool enable)
|
||||
{
|
||||
if (off || !initialized)
|
||||
return -ENODEV;
|
||||
use_deepest_state = enable;
|
||||
}
|
||||
|
||||
if (!drv || !dev || !dev->enabled)
|
||||
return -EBUSY;
|
||||
/**
|
||||
* cpuidle_find_deepest_state - Find the state of the greatest exit latency.
|
||||
* @drv: cpuidle driver for a given CPU.
|
||||
* @dev: cpuidle device for a given CPU.
|
||||
*/
|
||||
static int cpuidle_find_deepest_state(struct cpuidle_driver *drv,
|
||||
struct cpuidle_device *dev)
|
||||
{
|
||||
unsigned int latency_req = 0;
|
||||
int i, ret = CPUIDLE_DRIVER_STATE_START - 1;
|
||||
|
||||
return 0;
|
||||
for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) {
|
||||
struct cpuidle_state *s = &drv->states[i];
|
||||
struct cpuidle_state_usage *su = &dev->states_usage[i];
|
||||
|
||||
if (s->disabled || su->disable || s->exit_latency <= latency_req)
|
||||
continue;
|
||||
|
||||
latency_req = s->exit_latency;
|
||||
ret = i;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -138,6 +158,15 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,
|
|||
*/
|
||||
int cpuidle_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
||||
{
|
||||
if (off || !initialized)
|
||||
return -ENODEV;
|
||||
|
||||
if (!drv || !dev || !dev->enabled)
|
||||
return -EBUSY;
|
||||
|
||||
if (unlikely(use_deepest_state))
|
||||
return cpuidle_find_deepest_state(drv, dev);
|
||||
|
||||
return cpuidle_curr_governor->select(drv, dev);
|
||||
}
|
||||
|
||||
|
@ -169,7 +198,7 @@ int cpuidle_enter(struct cpuidle_driver *drv, struct cpuidle_device *dev,
|
|||
*/
|
||||
void cpuidle_reflect(struct cpuidle_device *dev, int index)
|
||||
{
|
||||
if (cpuidle_curr_governor->reflect)
|
||||
if (cpuidle_curr_governor->reflect && !unlikely(use_deepest_state))
|
||||
cpuidle_curr_governor->reflect(dev, index);
|
||||
}
|
||||
|
||||
|
|
|
@ -296,7 +296,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|||
data->needs_update = 0;
|
||||
}
|
||||
|
||||
data->last_state_idx = 0;
|
||||
data->last_state_idx = CPUIDLE_DRIVER_STATE_START - 1;
|
||||
|
||||
/* Special case when user has set very strict latency requirement */
|
||||
if (unlikely(latency_req == 0))
|
||||
|
@ -310,13 +310,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|||
|
||||
data->bucket = which_bucket(data->next_timer_us);
|
||||
|
||||
/*
|
||||
* if the correction factor is 0 (eg first time init or cpu hotplug
|
||||
* etc), we actually want to start out with a unity factor.
|
||||
*/
|
||||
if (data->correction_factor[data->bucket] == 0)
|
||||
data->correction_factor[data->bucket] = RESOLUTION * DECAY;
|
||||
|
||||
/*
|
||||
* Force the result of multiplication to be 64 bits even if both
|
||||
* operands are 32 bits.
|
||||
|
@ -466,9 +459,17 @@ static int menu_enable_device(struct cpuidle_driver *drv,
|
|||
struct cpuidle_device *dev)
|
||||
{
|
||||
struct menu_device *data = &per_cpu(menu_devices, dev->cpu);
|
||||
int i;
|
||||
|
||||
memset(data, 0, sizeof(struct menu_device));
|
||||
|
||||
/*
|
||||
* if the correction factor is 0 (eg first time init or cpu hotplug
|
||||
* etc), we actually want to start out with a unity factor.
|
||||
*/
|
||||
for(i = 0; i < BUCKETS; i++)
|
||||
data->correction_factor[i] = RESOLUTION * DECAY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/i915_drm.h>
|
||||
#include "i915_drv.h"
|
||||
|
@ -493,6 +494,7 @@ static int i915_drm_freeze(struct drm_device *dev)
|
|||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_crtc *crtc;
|
||||
pci_power_t opregion_target_state;
|
||||
|
||||
intel_runtime_pm_get(dev_priv);
|
||||
|
||||
|
@ -523,7 +525,7 @@ static int i915_drm_freeze(struct drm_device *dev)
|
|||
drm_irq_uninstall(dev);
|
||||
dev_priv->enable_hotplug_processing = false;
|
||||
|
||||
intel_disable_gt_powersave(dev);
|
||||
intel_suspend_gt_powersave(dev);
|
||||
|
||||
/*
|
||||
* Disable CRTCs directly since we want to preserve sw state
|
||||
|
@ -542,8 +544,14 @@ static int i915_drm_freeze(struct drm_device *dev)
|
|||
|
||||
i915_save_state(dev);
|
||||
|
||||
if (acpi_target_system_state() >= ACPI_STATE_S3)
|
||||
opregion_target_state = PCI_D3cold;
|
||||
else
|
||||
opregion_target_state = PCI_D1;
|
||||
intel_opregion_notify_adapter(dev, opregion_target_state);
|
||||
|
||||
intel_uncore_forcewake_reset(dev, false);
|
||||
intel_opregion_fini(dev);
|
||||
intel_uncore_fini(dev);
|
||||
|
||||
console_lock();
|
||||
intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED);
|
||||
|
@ -551,6 +559,8 @@ static int i915_drm_freeze(struct drm_device *dev)
|
|||
|
||||
dev_priv->suspend_count++;
|
||||
|
||||
intel_display_set_init_power(dev_priv, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -600,6 +610,9 @@ static int i915_drm_thaw_early(struct drm_device *dev)
|
|||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (IS_HASWELL(dev) || IS_BROADWELL(dev))
|
||||
hsw_disable_pc8(dev_priv);
|
||||
|
||||
intel_uncore_early_sanitize(dev, true);
|
||||
intel_uncore_sanitize(dev);
|
||||
intel_power_domains_init_hw(dev_priv);
|
||||
|
@ -672,6 +685,8 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)
|
|||
dev_priv->modeset_restore = MODESET_DONE;
|
||||
mutex_unlock(&dev_priv->modeset_restore_lock);
|
||||
|
||||
intel_opregion_notify_adapter(dev, PCI_D0);
|
||||
|
||||
intel_runtime_pm_put(dev_priv);
|
||||
return 0;
|
||||
}
|
||||
|
@ -881,6 +896,7 @@ static int i915_pm_suspend_late(struct device *dev)
|
|||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
||||
struct drm_i915_private *dev_priv = drm_dev->dev_private;
|
||||
|
||||
/*
|
||||
* We have a suspedn ordering issue with the snd-hda driver also
|
||||
|
@ -894,6 +910,9 @@ static int i915_pm_suspend_late(struct device *dev)
|
|||
if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
||||
return 0;
|
||||
|
||||
if (IS_HASWELL(drm_dev) || IS_BROADWELL(drm_dev))
|
||||
hsw_enable_pc8(dev_priv);
|
||||
|
||||
pci_disable_device(pdev);
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
|
||||
|
|
|
@ -2096,6 +2096,7 @@ extern void intel_uncore_early_sanitize(struct drm_device *dev,
|
|||
extern void intel_uncore_init(struct drm_device *dev);
|
||||
extern void intel_uncore_check_errors(struct drm_device *dev);
|
||||
extern void intel_uncore_fini(struct drm_device *dev);
|
||||
extern void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore);
|
||||
|
||||
void
|
||||
i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
|
||||
|
|
|
@ -967,6 +967,7 @@ void intel_init_gt_powersave(struct drm_device *dev);
|
|||
void intel_cleanup_gt_powersave(struct drm_device *dev);
|
||||
void intel_enable_gt_powersave(struct drm_device *dev);
|
||||
void intel_disable_gt_powersave(struct drm_device *dev);
|
||||
void intel_suspend_gt_powersave(struct drm_device *dev);
|
||||
void intel_reset_gt_powersave(struct drm_device *dev);
|
||||
void ironlake_teardown_rc6(struct drm_device *dev);
|
||||
void gen6_update_ring_freq(struct drm_device *dev);
|
||||
|
|
|
@ -4867,6 +4867,26 @@ void intel_cleanup_gt_powersave(struct drm_device *dev)
|
|||
valleyview_cleanup_gt_powersave(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_suspend_gt_powersave - suspend PM work and helper threads
|
||||
* @dev: drm device
|
||||
*
|
||||
* We don't want to disable RC6 or other features here, we just want
|
||||
* to make sure any work we've queued has finished and won't bother
|
||||
* us while we're suspended.
|
||||
*/
|
||||
void intel_suspend_gt_powersave(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
/* Interrupts should be disabled already to avoid re-arming. */
|
||||
WARN_ON(dev->irq_enabled);
|
||||
|
||||
flush_delayed_work(&dev_priv->rps.delayed_resume_work);
|
||||
|
||||
cancel_work_sync(&dev_priv->rps.work);
|
||||
}
|
||||
|
||||
void intel_disable_gt_powersave(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
@ -4878,10 +4898,8 @@ void intel_disable_gt_powersave(struct drm_device *dev)
|
|||
ironlake_disable_drps(dev);
|
||||
ironlake_disable_rc6(dev);
|
||||
} else if (INTEL_INFO(dev)->gen >= 6) {
|
||||
if (cancel_delayed_work_sync(&dev_priv->rps.delayed_resume_work))
|
||||
intel_runtime_pm_put(dev_priv);
|
||||
intel_suspend_gt_powersave(dev);
|
||||
|
||||
cancel_work_sync(&dev_priv->rps.work);
|
||||
mutex_lock(&dev_priv->rps.hw_lock);
|
||||
if (IS_CHERRYVIEW(dev))
|
||||
cherryview_disable_rps(dev);
|
||||
|
|
|
@ -316,7 +316,7 @@ static void gen6_force_wake_timer(unsigned long arg)
|
|||
intel_runtime_pm_put(dev_priv);
|
||||
}
|
||||
|
||||
static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
|
||||
void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
unsigned long irqflags;
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include "nouveau_drm.h"
|
||||
#include "nouveau_reg.h"
|
||||
|
@ -222,14 +221,6 @@ nouveau_backlight_init(struct drm_device *dev)
|
|||
struct nouveau_device *device = nv_device(drm->device);
|
||||
struct drm_connector *connector;
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
if (acpi_video_backlight_support()) {
|
||||
NV_INFO(drm, "ACPI backlight interface available, "
|
||||
"not registering our own\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS &&
|
||||
connector->connector_type != DRM_MODE_CONNECTOR_eDP)
|
||||
|
|
|
@ -570,6 +570,14 @@ static const struct dmi_system_id video_vendor_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5750"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_set_backlight_video_vendor,
|
||||
.ident = "Acer Aspire 5741",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -2228,7 +2236,7 @@ static int __init acer_wmi_init(void)
|
|||
pr_info("Brightness must be controlled by acpi video driver\n");
|
||||
} else {
|
||||
pr_info("Disabling ACPI video driver\n");
|
||||
acpi_video_unregister();
|
||||
acpi_video_unregister_backlight();
|
||||
}
|
||||
|
||||
if (wmi_has_guid(WMID_GUID3)) {
|
||||
|
|
|
@ -30,26 +30,6 @@
|
|||
|
||||
static int num;
|
||||
|
||||
/* We need only to blacklist devices that have already an acpi driver that
|
||||
* can't use pnp layer. We don't need to blacklist device that are directly
|
||||
* used by the kernel (PCI root, ...), as it is harmless and there were
|
||||
* already present in pnpbios. But there is an exception for devices that
|
||||
* have irqs (PIC, Timer) because we call acpi_register_gsi.
|
||||
* Finally, only devices that have a CRS method need to be in this list.
|
||||
*/
|
||||
static struct acpi_device_id excluded_id_list[] __initdata = {
|
||||
{"PNP0C09", 0}, /* EC */
|
||||
{"PNP0C0F", 0}, /* Link device */
|
||||
{"PNP0000", 0}, /* PIC */
|
||||
{"PNP0100", 0}, /* Timer */
|
||||
{"", 0},
|
||||
};
|
||||
|
||||
static inline int __init is_exclusive_device(struct acpi_device *dev)
|
||||
{
|
||||
return (!acpi_match_device_ids(dev, excluded_id_list));
|
||||
}
|
||||
|
||||
/*
|
||||
* Compatible Device IDs
|
||||
*/
|
||||
|
@ -266,7 +246,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
|
|||
if (!pnpid)
|
||||
return 0;
|
||||
|
||||
if (is_exclusive_device(device) || !device->status.present)
|
||||
if (!device->status.present)
|
||||
return 0;
|
||||
|
||||
dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid);
|
||||
|
@ -326,10 +306,10 @@ static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
|
|||
{
|
||||
struct acpi_device *device;
|
||||
|
||||
if (!acpi_bus_get_device(handle, &device))
|
||||
pnpacpi_add_device(device);
|
||||
else
|
||||
if (acpi_bus_get_device(handle, &device))
|
||||
return AE_CTRL_DEPTH;
|
||||
if (acpi_is_pnp_device(device))
|
||||
pnpacpi_add_device(device);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -537,7 +537,7 @@ static void psy_unregister_cooler(struct power_supply *psy)
|
|||
}
|
||||
#endif
|
||||
|
||||
int power_supply_register(struct device *parent, struct power_supply *psy)
|
||||
int __power_supply_register(struct device *parent, struct power_supply *psy, bool ws)
|
||||
{
|
||||
struct device *dev;
|
||||
int rc;
|
||||
|
@ -568,7 +568,7 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
|
|||
}
|
||||
|
||||
spin_lock_init(&psy->changed_lock);
|
||||
rc = device_init_wakeup(dev, true);
|
||||
rc = device_init_wakeup(dev, ws);
|
||||
if (rc)
|
||||
goto wakeup_init_failed;
|
||||
|
||||
|
@ -606,8 +606,19 @@ dev_set_name_failed:
|
|||
success:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int power_supply_register(struct device *parent, struct power_supply *psy)
|
||||
{
|
||||
return __power_supply_register(parent, psy, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(power_supply_register);
|
||||
|
||||
int power_supply_register_no_ws(struct device *parent, struct power_supply *psy)
|
||||
{
|
||||
return __power_supply_register(parent, psy, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(power_supply_register_no_ws);
|
||||
|
||||
void power_supply_unregister(struct power_supply *psy)
|
||||
{
|
||||
cancel_work_sync(&psy->changed_work);
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
static struct list_head backlight_dev_list;
|
||||
static struct mutex backlight_dev_list_mutex;
|
||||
static struct blocking_notifier_head backlight_notifier;
|
||||
|
||||
static const char *const backlight_types[] = {
|
||||
[BACKLIGHT_RAW] = "raw",
|
||||
|
@ -370,6 +371,9 @@ struct backlight_device *backlight_device_register(const char *name,
|
|||
list_add(&new_bd->entry, &backlight_dev_list);
|
||||
mutex_unlock(&backlight_dev_list_mutex);
|
||||
|
||||
blocking_notifier_call_chain(&backlight_notifier,
|
||||
BACKLIGHT_REGISTERED, new_bd);
|
||||
|
||||
return new_bd;
|
||||
}
|
||||
EXPORT_SYMBOL(backlight_device_register);
|
||||
|
@ -413,6 +417,10 @@ void backlight_device_unregister(struct backlight_device *bd)
|
|||
pmac_backlight = NULL;
|
||||
mutex_unlock(&pmac_backlight_mutex);
|
||||
#endif
|
||||
|
||||
blocking_notifier_call_chain(&backlight_notifier,
|
||||
BACKLIGHT_UNREGISTERED, bd);
|
||||
|
||||
mutex_lock(&bd->ops_lock);
|
||||
bd->ops = NULL;
|
||||
mutex_unlock(&bd->ops_lock);
|
||||
|
@ -437,6 +445,36 @@ static int devm_backlight_device_match(struct device *dev, void *res,
|
|||
return *r == data;
|
||||
}
|
||||
|
||||
/**
|
||||
* backlight_register_notifier - get notified of backlight (un)registration
|
||||
* @nb: notifier block with the notifier to call on backlight (un)registration
|
||||
*
|
||||
* @return 0 on success, otherwise a negative error code
|
||||
*
|
||||
* Register a notifier to get notified when backlight devices get registered
|
||||
* or unregistered.
|
||||
*/
|
||||
int backlight_register_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return blocking_notifier_chain_register(&backlight_notifier, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(backlight_register_notifier);
|
||||
|
||||
/**
|
||||
* backlight_unregister_notifier - unregister a backlight notifier
|
||||
* @nb: notifier block to unregister
|
||||
*
|
||||
* @return 0 on success, otherwise a negative error code
|
||||
*
|
||||
* Register a notifier to get notified when backlight devices get registered
|
||||
* or unregistered.
|
||||
*/
|
||||
int backlight_unregister_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return blocking_notifier_chain_unregister(&backlight_notifier, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(backlight_unregister_notifier);
|
||||
|
||||
/**
|
||||
* devm_backlight_device_register - resource managed backlight_device_register()
|
||||
* @dev: the device to register
|
||||
|
@ -544,6 +582,8 @@ static int __init backlight_class_init(void)
|
|||
backlight_class->pm = &backlight_class_dev_pm_ops;
|
||||
INIT_LIST_HEAD(&backlight_dev_list);
|
||||
mutex_init(&backlight_dev_list_mutex);
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(&backlight_notifier);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,8 +62,6 @@
|
|||
#include <acpi/acrestyp.h> /* Resource Descriptor structs */
|
||||
#include <acpi/acpiosxf.h> /* OSL interfaces (ACPICA-to-OS) */
|
||||
#include <acpi/acpixf.h> /* ACPI core subsystem external interfaces */
|
||||
#ifdef ACPI_NATIVE_INTERFACE_HEADER
|
||||
#include ACPI_NATIVE_INTERFACE_HEADER
|
||||
#endif
|
||||
#include <acpi/platform/acenvex.h> /* Extra environment-specific items */
|
||||
|
||||
#endif /* __ACPI_H__ */
|
||||
|
|
|
@ -131,6 +131,7 @@ static inline struct acpi_hotplug_profile *to_acpi_hotplug_profile(
|
|||
struct acpi_scan_handler {
|
||||
const struct acpi_device_id *ids;
|
||||
struct list_head list_node;
|
||||
bool (*match)(char *idstr, const struct acpi_device_id **matchid);
|
||||
int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
|
||||
void (*detach)(struct acpi_device *dev);
|
||||
void (*bind)(struct device *phys_dev);
|
||||
|
@ -232,7 +233,8 @@ struct acpi_hardware_id {
|
|||
struct acpi_pnp_type {
|
||||
u32 hardware_id:1;
|
||||
u32 bus_address:1;
|
||||
u32 reserved:30;
|
||||
u32 platform_id:1;
|
||||
u32 reserved:29;
|
||||
};
|
||||
|
||||
struct acpi_device_pnp {
|
||||
|
@ -261,7 +263,8 @@ struct acpi_device_power_flags {
|
|||
u32 inrush_current:1; /* Serialize Dx->D0 */
|
||||
u32 power_removed:1; /* Optimize Dx->D0 */
|
||||
u32 ignore_parent:1; /* Power is independent of parent power state */
|
||||
u32 reserved:27;
|
||||
u32 dsw_present:1; /* _DSW present? */
|
||||
u32 reserved:26;
|
||||
};
|
||||
|
||||
struct acpi_device_power_state {
|
||||
|
@ -406,6 +409,8 @@ extern struct kobject *acpi_kobj;
|
|||
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
|
||||
void acpi_bus_private_data_handler(acpi_handle, void *);
|
||||
int acpi_bus_get_private_data(acpi_handle, void **);
|
||||
int acpi_bus_attach_private_data(acpi_handle, void *);
|
||||
void acpi_bus_detach_private_data(acpi_handle);
|
||||
void acpi_bus_no_hotplug(acpi_handle handle);
|
||||
extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
|
||||
extern int register_acpi_notifier(struct notifier_block *);
|
||||
|
|
|
@ -96,7 +96,12 @@ struct pci_dev *acpi_get_pci_dev(acpi_handle);
|
|||
/* Arch-defined function to add a bus to the system */
|
||||
|
||||
struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root);
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
void pci_acpi_crs_quirks(void);
|
||||
#else
|
||||
static inline void pci_acpi_crs_quirks(void) { }
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Processor
|
||||
|
|
|
@ -9,6 +9,9 @@ static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,
|
|||
return ioremap_cache(phys, size);
|
||||
}
|
||||
|
||||
void __iomem *__init_refok
|
||||
acpi_os_map_iomem(acpi_physical_address phys, acpi_size size);
|
||||
void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size);
|
||||
void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size);
|
||||
|
||||
int acpi_os_map_generic_address(struct acpi_generic_address *addr);
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20140214
|
||||
#define ACPI_CA_VERSION 0x20140424
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -55,50 +55,239 @@
|
|||
|
||||
extern u8 acpi_gbl_permanent_mmap;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Macros used for ACPICA globals and configuration
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Globals that are publically available
|
||||
* Ensure that global variables are defined and initialized only once.
|
||||
*
|
||||
* The use of these macros allows for a single list of globals (here)
|
||||
* in order to simplify maintenance of the code.
|
||||
*/
|
||||
extern u32 acpi_current_gpe_count;
|
||||
extern struct acpi_table_fadt acpi_gbl_FADT;
|
||||
extern u8 acpi_gbl_system_awake_and_running;
|
||||
extern u8 acpi_gbl_reduced_hardware; /* ACPI 5.0 */
|
||||
extern u8 acpi_gbl_osi_data;
|
||||
#ifdef DEFINE_ACPI_GLOBALS
|
||||
#define ACPI_GLOBAL(type,name) \
|
||||
extern type name; \
|
||||
type name
|
||||
|
||||
/* Runtime configuration of debug print levels */
|
||||
#define ACPI_INIT_GLOBAL(type,name,value) \
|
||||
type name=value
|
||||
|
||||
extern u32 acpi_dbg_level;
|
||||
extern u32 acpi_dbg_layer;
|
||||
#else
|
||||
#ifndef ACPI_GLOBAL
|
||||
#define ACPI_GLOBAL(type,name) \
|
||||
extern type name
|
||||
#endif
|
||||
|
||||
/* ACPICA runtime options */
|
||||
|
||||
extern u8 acpi_gbl_auto_serialize_methods;
|
||||
extern u8 acpi_gbl_copy_dsdt_locally;
|
||||
extern u8 acpi_gbl_create_osi_method;
|
||||
extern u8 acpi_gbl_disable_auto_repair;
|
||||
extern u8 acpi_gbl_disable_ssdt_table_load;
|
||||
extern u8 acpi_gbl_do_not_use_xsdt;
|
||||
extern u8 acpi_gbl_enable_aml_debug_object;
|
||||
extern u8 acpi_gbl_enable_interpreter_slack;
|
||||
extern u32 acpi_gbl_trace_flags;
|
||||
extern acpi_name acpi_gbl_trace_method_name;
|
||||
extern u8 acpi_gbl_truncate_io_addresses;
|
||||
extern u8 acpi_gbl_use32_bit_fadt_addresses;
|
||||
extern u8 acpi_gbl_use_default_register_widths;
|
||||
#ifndef ACPI_INIT_GLOBAL
|
||||
#define ACPI_INIT_GLOBAL(type,name,value) \
|
||||
extern type name
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Hardware-reduced prototypes. All interfaces that use these macros will
|
||||
* be configured out of the ACPICA build if the ACPI_REDUCED_HARDWARE flag
|
||||
* These macros configure the various ACPICA interfaces. They are
|
||||
* useful for generating stub inline functions for features that are
|
||||
* configured out of the current kernel or ACPICA application.
|
||||
*/
|
||||
#ifndef ACPI_EXTERNAL_RETURN_STATUS
|
||||
#define ACPI_EXTERNAL_RETURN_STATUS(prototype) \
|
||||
prototype;
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_EXTERNAL_RETURN_OK
|
||||
#define ACPI_EXTERNAL_RETURN_OK(prototype) \
|
||||
prototype;
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_EXTERNAL_RETURN_VOID
|
||||
#define ACPI_EXTERNAL_RETURN_VOID(prototype) \
|
||||
prototype;
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_EXTERNAL_RETURN_UINT32
|
||||
#define ACPI_EXTERNAL_RETURN_UINT32(prototype) \
|
||||
prototype;
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_EXTERNAL_RETURN_PTR
|
||||
#define ACPI_EXTERNAL_RETURN_PTR(prototype) \
|
||||
prototype;
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Public globals and runtime configuration options
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Enable "slack mode" of the AML interpreter? Default is FALSE, and the
|
||||
* interpreter strictly follows the ACPI specification. Setting to TRUE
|
||||
* allows the interpreter to ignore certain errors and/or bad AML constructs.
|
||||
*
|
||||
* Currently, these features are enabled by this flag:
|
||||
*
|
||||
* 1) Allow "implicit return" of last value in a control method
|
||||
* 2) Allow access beyond the end of an operation region
|
||||
* 3) Allow access to uninitialized locals/args (auto-init to integer 0)
|
||||
* 4) Allow ANY object type to be a source operand for the Store() operator
|
||||
* 5) Allow unresolved references (invalid target name) in package objects
|
||||
* 6) Enable warning messages for behavior that is not ACPI spec compliant
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_enable_interpreter_slack, FALSE);
|
||||
|
||||
/*
|
||||
* Automatically serialize all methods that create named objects? Default
|
||||
* is TRUE, meaning that all non_serialized methods are scanned once at
|
||||
* table load time to determine those that create named objects. Methods
|
||||
* that create named objects are marked Serialized in order to prevent
|
||||
* possible run-time problems if they are entered by more than one thread.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_auto_serialize_methods, TRUE);
|
||||
|
||||
/*
|
||||
* Create the predefined _OSI method in the namespace? Default is TRUE
|
||||
* because ACPICA is fully compatible with other ACPI implementations.
|
||||
* Changing this will revert ACPICA (and machine ASL) to pre-OSI behavior.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_create_osi_method, TRUE);
|
||||
|
||||
/*
|
||||
* Optionally use default values for the ACPI register widths. Set this to
|
||||
* TRUE to use the defaults, if an FADT contains incorrect widths/lengths.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_use_default_register_widths, TRUE);
|
||||
|
||||
/*
|
||||
* Whether or not to verify the table checksum before installation. Set
|
||||
* this to TRUE to verify the table checksum before install it to the table
|
||||
* manager. Note that enabling this option causes errors to happen in some
|
||||
* OSPMs during early initialization stages. Default behavior is to do such
|
||||
* verification.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_verify_table_checksum, TRUE);
|
||||
|
||||
/*
|
||||
* Optionally enable output from the AML Debug Object.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_enable_aml_debug_object, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally copy the entire DSDT to local memory (instead of simply
|
||||
* mapping it.) There are some BIOSs that corrupt or replace the original
|
||||
* DSDT, creating the need for this option. Default is FALSE, do not copy
|
||||
* the DSDT.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_copy_dsdt_locally, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally ignore an XSDT if present and use the RSDT instead.
|
||||
* Although the ACPI specification requires that an XSDT be used instead
|
||||
* of the RSDT, the XSDT has been found to be corrupt or ill-formed on
|
||||
* some machines. Default behavior is to use the XSDT if present.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_do_not_use_xsdt, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally use 32-bit FADT addresses if and when there is a conflict
|
||||
* (address mismatch) between the 32-bit and 64-bit versions of the
|
||||
* address. Although ACPICA adheres to the ACPI specification which
|
||||
* requires the use of the corresponding 64-bit address if it is non-zero,
|
||||
* some machines have been found to have a corrupted non-zero 64-bit
|
||||
* address. Default is TRUE, favor the 32-bit addresses.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_use32_bit_fadt_addresses, TRUE);
|
||||
|
||||
/*
|
||||
* Optionally truncate I/O addresses to 16 bits. Provides compatibility
|
||||
* with other ACPI implementations. NOTE: During ACPICA initialization,
|
||||
* this value is set to TRUE if any Windows OSI strings have been
|
||||
* requested by the BIOS.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_truncate_io_addresses, FALSE);
|
||||
|
||||
/*
|
||||
* Disable runtime checking and repair of values returned by control methods.
|
||||
* Use only if the repair is causing a problem on a particular machine.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_auto_repair, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally do not install any SSDTs from the RSDT/XSDT during initialization.
|
||||
* This can be useful for debugging ACPI problems on some machines.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_disable_ssdt_table_install, FALSE);
|
||||
|
||||
/*
|
||||
* We keep track of the latest version of Windows that has been requested by
|
||||
* the BIOS. ACPI 5.0.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_osi_data, 0);
|
||||
|
||||
/*
|
||||
* ACPI 5.0 introduces the concept of a "reduced hardware platform", meaning
|
||||
* that the ACPI hardware is no longer required. A flag in the FADT indicates
|
||||
* a reduced HW machine, and that flag is duplicated here for convenience.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_reduced_hardware, FALSE);
|
||||
|
||||
/*
|
||||
* This mechanism is used to trace a specified AML method. The method is
|
||||
* traced each time it is executed.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_trace_flags, 0);
|
||||
ACPI_INIT_GLOBAL(acpi_name, acpi_gbl_trace_method_name, 0);
|
||||
|
||||
/*
|
||||
* Runtime configuration of debug output control masks. We want the debug
|
||||
* switches statically initialized so they are already set when the debugger
|
||||
* is entered.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u32, acpi_dbg_level, ACPI_DEBUG_DEFAULT);
|
||||
ACPI_INIT_GLOBAL(u32, acpi_dbg_layer, 0);
|
||||
|
||||
/*
|
||||
* Other miscellaneous globals
|
||||
*/
|
||||
ACPI_GLOBAL(struct acpi_table_fadt, acpi_gbl_FADT);
|
||||
ACPI_GLOBAL(u32, acpi_current_gpe_count);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* ACPICA public interface configuration.
|
||||
*
|
||||
* Interfaces that are configured out of the ACPICA build are replaced
|
||||
* by inlined stubs by default.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Hardware-reduced prototypes (default: Not hardware reduced).
|
||||
*
|
||||
* All ACPICA hardware-related interfaces that use these macros will be
|
||||
* configured out of the ACPICA build if the ACPI_REDUCED_HARDWARE flag
|
||||
* is set to TRUE.
|
||||
*
|
||||
* Note: This static build option for reduced hardware is intended to
|
||||
* reduce ACPICA code size if desired or necessary. However, even if this
|
||||
* option is not specified, the runtime behavior of ACPICA is dependent
|
||||
* on the actual FADT reduced hardware flag (HW_REDUCED_ACPI). If set,
|
||||
* the flag will enable similar behavior -- ACPICA will not attempt
|
||||
* to access any ACPI-relate hardware (SCI, GPEs, Fixed Events, etc.)
|
||||
*/
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
#define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \
|
||||
prototype;
|
||||
ACPI_EXTERNAL_RETURN_STATUS(prototype)
|
||||
|
||||
#define ACPI_HW_DEPENDENT_RETURN_OK(prototype) \
|
||||
prototype;
|
||||
ACPI_EXTERNAL_RETURN_OK(prototype)
|
||||
|
||||
#define ACPI_HW_DEPENDENT_RETURN_VOID(prototype) \
|
||||
prototype;
|
||||
ACPI_EXTERNAL_RETURN_VOID(prototype)
|
||||
|
||||
#else
|
||||
#define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \
|
||||
|
@ -112,20 +301,61 @@ extern u8 acpi_gbl_use_default_register_widths;
|
|||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
/*
|
||||
* Error message prototypes (default: error messages enabled).
|
||||
*
|
||||
* All interfaces related to error and warning messages
|
||||
* will be configured out of the ACPICA build if the
|
||||
* ACPI_NO_ERROR_MESSAGE flag is defined.
|
||||
*/
|
||||
#ifndef ACPI_NO_ERROR_MESSAGES
|
||||
#define ACPI_MSG_DEPENDENT_RETURN_VOID(prototype) \
|
||||
prototype;
|
||||
|
||||
#else
|
||||
#define ACPI_MSG_DEPENDENT_RETURN_VOID(prototype) \
|
||||
static ACPI_INLINE prototype {return;}
|
||||
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
||||
|
||||
/*
|
||||
* Debugging output prototypes (default: no debug output).
|
||||
*
|
||||
* All interfaces related to debug output messages
|
||||
* will be configured out of the ACPICA build unless the
|
||||
* ACPI_DEBUG_OUTPUT flag is defined.
|
||||
*/
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
#define ACPI_DBG_DEPENDENT_RETURN_VOID(prototype) \
|
||||
prototype;
|
||||
|
||||
#else
|
||||
#define ACPI_DBG_DEPENDENT_RETURN_VOID(prototype) \
|
||||
static ACPI_INLINE prototype {return;}
|
||||
|
||||
#endif /* ACPI_DEBUG_OUTPUT */
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* ACPICA public interface prototypes
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Initialization
|
||||
*/
|
||||
acpi_status __init
|
||||
acpi_initialize_tables(struct acpi_table_desc *initial_storage,
|
||||
u32 initial_table_count, u8 allow_resize);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
|
||||
acpi_initialize_tables(struct acpi_table_desc
|
||||
*initial_storage,
|
||||
u32 initial_table_count,
|
||||
u8 allow_resize))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_initialize_subsystem(void))
|
||||
|
||||
acpi_status __init acpi_initialize_subsystem(void);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_enable_subsystem(u32 flags))
|
||||
|
||||
acpi_status __init acpi_enable_subsystem(u32 flags);
|
||||
|
||||
acpi_status __init acpi_initialize_objects(u32 flags);
|
||||
|
||||
acpi_status __init acpi_terminate(void);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
|
||||
acpi_initialize_objects(u32 flags))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_terminate(void))
|
||||
|
||||
/*
|
||||
* Miscellaneous global interfaces
|
||||
|
@ -133,155 +363,170 @@ acpi_status __init acpi_terminate(void);
|
|||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable(void))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable(void))
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status acpi_subsystem_status(void);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_subsystem_status(void))
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status acpi_get_system_info(struct acpi_buffer *ret_buffer);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_system_info(struct acpi_buffer
|
||||
*ret_buffer))
|
||||
#endif
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_statistics(struct acpi_statistics *stats))
|
||||
ACPI_EXTERNAL_RETURN_PTR(const char
|
||||
*acpi_format_exception(acpi_status exception))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_purge_cached_objects(void))
|
||||
|
||||
acpi_status acpi_get_statistics(struct acpi_statistics *stats);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_interface(acpi_string interface_name))
|
||||
|
||||
const char *acpi_format_exception(acpi_status exception);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_remove_interface(acpi_string interface_name))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_update_interfaces(u8 action))
|
||||
|
||||
acpi_status acpi_purge_cached_objects(void);
|
||||
|
||||
acpi_status acpi_install_interface(acpi_string interface_name);
|
||||
|
||||
acpi_status acpi_remove_interface(acpi_string interface_name);
|
||||
|
||||
acpi_status acpi_update_interfaces(u8 action);
|
||||
|
||||
u32
|
||||
acpi_check_address_range(acpi_adr_space_type space_id,
|
||||
acpi_physical_address address,
|
||||
acpi_size length, u8 warn);
|
||||
|
||||
acpi_status
|
||||
acpi_decode_pld_buffer(u8 *in_buffer,
|
||||
acpi_size length, struct acpi_pld_info **return_buffer);
|
||||
ACPI_EXTERNAL_RETURN_UINT32(u32
|
||||
acpi_check_address_range(acpi_adr_space_type
|
||||
space_id,
|
||||
acpi_physical_address
|
||||
address, acpi_size length,
|
||||
u8 warn))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_decode_pld_buffer(u8 *in_buffer,
|
||||
acpi_size length,
|
||||
struct acpi_pld_info
|
||||
**return_buffer))
|
||||
|
||||
/*
|
||||
* ACPI table load/unload interfaces
|
||||
*/
|
||||
acpi_status acpi_load_table(struct acpi_table_header *table);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
|
||||
acpi_install_table(acpi_physical_address address,
|
||||
u8 physical))
|
||||
|
||||
acpi_status acpi_unload_parent_table(acpi_handle object);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_load_table(struct acpi_table_header *table))
|
||||
|
||||
acpi_status __init acpi_load_tables(void);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_unload_parent_table(acpi_handle object))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_load_tables(void))
|
||||
|
||||
/*
|
||||
* ACPI table manipulation interfaces
|
||||
*/
|
||||
acpi_status __init acpi_reallocate_root_table(void);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_reallocate_root_table(void))
|
||||
|
||||
acpi_status __init acpi_find_root_pointer(acpi_size *rsdp_address);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
|
||||
acpi_find_root_pointer(acpi_size * rsdp_address))
|
||||
|
||||
acpi_status acpi_unload_table_id(acpi_owner_id id);
|
||||
|
||||
acpi_status
|
||||
acpi_get_table_header(acpi_string signature,
|
||||
u32 instance, struct acpi_table_header *out_table_header);
|
||||
|
||||
acpi_status
|
||||
acpi_get_table_with_size(acpi_string signature,
|
||||
u32 instance, struct acpi_table_header **out_table,
|
||||
acpi_size *tbl_size);
|
||||
|
||||
acpi_status
|
||||
acpi_get_table(acpi_string signature,
|
||||
u32 instance, struct acpi_table_header **out_table);
|
||||
|
||||
acpi_status
|
||||
acpi_get_table_by_index(u32 table_index, struct acpi_table_header **out_table);
|
||||
|
||||
acpi_status
|
||||
acpi_install_table_handler(acpi_table_handler handler, void *context);
|
||||
|
||||
acpi_status acpi_remove_table_handler(acpi_table_handler handler);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_table_header(acpi_string signature,
|
||||
u32 instance,
|
||||
struct acpi_table_header
|
||||
*out_table_header))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_table(acpi_string signature, u32 instance,
|
||||
struct acpi_table_header
|
||||
**out_table))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_table_by_index(u32 table_index,
|
||||
struct acpi_table_header
|
||||
**out_table))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_table_handler(acpi_table_handler
|
||||
handler, void *context))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_remove_table_handler(acpi_table_handler
|
||||
handler))
|
||||
|
||||
/*
|
||||
* Namespace and name interfaces
|
||||
*/
|
||||
acpi_status
|
||||
acpi_walk_namespace(acpi_object_type type,
|
||||
acpi_handle start_object,
|
||||
u32 max_depth,
|
||||
acpi_walk_callback descending_callback,
|
||||
acpi_walk_callback ascending_callback,
|
||||
void *context, void **return_value);
|
||||
|
||||
acpi_status
|
||||
acpi_get_devices(const char *HID,
|
||||
acpi_walk_callback user_function,
|
||||
void *context, void **return_value);
|
||||
|
||||
acpi_status
|
||||
acpi_get_name(acpi_handle object,
|
||||
u32 name_type, struct acpi_buffer *ret_path_ptr);
|
||||
|
||||
acpi_status
|
||||
acpi_get_handle(acpi_handle parent,
|
||||
acpi_string pathname, acpi_handle * ret_handle);
|
||||
|
||||
acpi_status
|
||||
acpi_attach_data(acpi_handle object, acpi_object_handler handler, void *data);
|
||||
|
||||
acpi_status acpi_detach_data(acpi_handle object, acpi_object_handler handler);
|
||||
|
||||
acpi_status
|
||||
acpi_get_data_full(acpi_handle object, acpi_object_handler handler, void **data,
|
||||
void (*callback)(void *));
|
||||
|
||||
acpi_status
|
||||
acpi_get_data(acpi_handle object, acpi_object_handler handler, void **data);
|
||||
|
||||
acpi_status
|
||||
acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_walk_namespace(acpi_object_type type,
|
||||
acpi_handle start_object,
|
||||
u32 max_depth,
|
||||
acpi_walk_callback
|
||||
descending_callback,
|
||||
acpi_walk_callback
|
||||
ascending_callback,
|
||||
void *context,
|
||||
void **return_value))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_devices(const char *HID,
|
||||
acpi_walk_callback user_function,
|
||||
void *context,
|
||||
void **return_value))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_name(acpi_handle object, u32 name_type,
|
||||
struct acpi_buffer *ret_path_ptr))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_handle(acpi_handle parent,
|
||||
acpi_string pathname,
|
||||
acpi_handle * ret_handle))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_attach_data(acpi_handle object,
|
||||
acpi_object_handler handler,
|
||||
void *data))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_detach_data(acpi_handle object,
|
||||
acpi_object_handler handler))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_data(acpi_handle object,
|
||||
acpi_object_handler handler,
|
||||
void **data))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_debug_trace(char *name, u32 debug_level,
|
||||
u32 debug_layer, u32 flags))
|
||||
|
||||
/*
|
||||
* Object manipulation and enumeration
|
||||
*/
|
||||
acpi_status
|
||||
acpi_evaluate_object(acpi_handle object,
|
||||
acpi_string pathname,
|
||||
struct acpi_object_list *parameter_objects,
|
||||
struct acpi_buffer *return_object_buffer);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_evaluate_object(acpi_handle object,
|
||||
acpi_string pathname,
|
||||
struct acpi_object_list
|
||||
*parameter_objects,
|
||||
struct acpi_buffer
|
||||
*return_object_buffer))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_evaluate_object_typed(acpi_handle object,
|
||||
acpi_string pathname,
|
||||
struct acpi_object_list
|
||||
*external_params,
|
||||
struct acpi_buffer
|
||||
*return_buffer,
|
||||
acpi_object_type
|
||||
return_type))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_object_info(acpi_handle object,
|
||||
struct acpi_device_info
|
||||
**return_buffer))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_install_method(u8 *buffer))
|
||||
|
||||
acpi_status
|
||||
acpi_evaluate_object_typed(acpi_handle object,
|
||||
acpi_string pathname,
|
||||
struct acpi_object_list *external_params,
|
||||
struct acpi_buffer *return_buffer,
|
||||
acpi_object_type return_type);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_next_object(acpi_object_type type,
|
||||
acpi_handle parent,
|
||||
acpi_handle child,
|
||||
acpi_handle * out_handle))
|
||||
|
||||
acpi_status
|
||||
acpi_get_object_info(acpi_handle object,
|
||||
struct acpi_device_info **return_buffer);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_type(acpi_handle object,
|
||||
acpi_object_type * out_type))
|
||||
|
||||
acpi_status acpi_install_method(u8 *buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_get_next_object(acpi_object_type type,
|
||||
acpi_handle parent,
|
||||
acpi_handle child, acpi_handle * out_handle);
|
||||
|
||||
acpi_status acpi_get_type(acpi_handle object, acpi_object_type * out_type);
|
||||
|
||||
acpi_status acpi_get_id(acpi_handle object, acpi_owner_id * out_type);
|
||||
|
||||
acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_parent(acpi_handle object,
|
||||
acpi_handle * out_handle))
|
||||
|
||||
/*
|
||||
* Handler interfaces
|
||||
*/
|
||||
acpi_status
|
||||
acpi_install_initialization_handler(acpi_init_handler handler, u32 function);
|
||||
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_initialization_handler
|
||||
(acpi_init_handler handler, u32 function))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_sci_handler(acpi_sci_handler
|
||||
address,
|
||||
void *context))
|
||||
acpi_install_sci_handler(acpi_sci_handler
|
||||
address,
|
||||
void *context))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_remove_sci_handler(acpi_sci_handler
|
||||
address))
|
||||
|
@ -313,30 +558,42 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
|||
u32 gpe_number,
|
||||
acpi_gpe_handler
|
||||
address))
|
||||
acpi_status acpi_install_notify_handler(acpi_handle device, u32 handler_type,
|
||||
acpi_notify_handler handler,
|
||||
void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_remove_notify_handler(acpi_handle device,
|
||||
u32 handler_type, acpi_notify_handler handler);
|
||||
|
||||
acpi_status
|
||||
acpi_install_address_space_handler(acpi_handle device,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler,
|
||||
acpi_adr_space_setup setup, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_remove_address_space_handler(acpi_handle device,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler);
|
||||
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_notify_handler(acpi_handle device,
|
||||
u32 handler_type,
|
||||
acpi_notify_handler
|
||||
handler,
|
||||
void *context))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_remove_notify_handler(acpi_handle device,
|
||||
u32 handler_type,
|
||||
acpi_notify_handler
|
||||
handler))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_address_space_handler(acpi_handle
|
||||
device,
|
||||
acpi_adr_space_type
|
||||
space_id,
|
||||
acpi_adr_space_handler
|
||||
handler,
|
||||
acpi_adr_space_setup
|
||||
setup,
|
||||
void *context))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_remove_address_space_handler(acpi_handle
|
||||
device,
|
||||
acpi_adr_space_type
|
||||
space_id,
|
||||
acpi_adr_space_handler
|
||||
handler))
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status acpi_install_exception_handler(acpi_exception_handler handler);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_exception_handler
|
||||
(acpi_exception_handler handler))
|
||||
#endif
|
||||
|
||||
acpi_status acpi_install_interface_handler(acpi_interface_handler handler);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_install_interface_handler
|
||||
(acpi_interface_handler handler))
|
||||
|
||||
/*
|
||||
* Global Lock interfaces
|
||||
|
@ -351,10 +608,14 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
|||
/*
|
||||
* Interfaces to AML mutex objects
|
||||
*/
|
||||
acpi_status
|
||||
acpi_acquire_mutex(acpi_handle handle, acpi_string pathname, u16 timeout);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_acquire_mutex(acpi_handle handle,
|
||||
acpi_string pathname,
|
||||
u16 timeout))
|
||||
|
||||
acpi_status acpi_release_mutex(acpi_handle handle, acpi_string pathname);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_release_mutex(acpi_handle handle,
|
||||
acpi_string pathname))
|
||||
|
||||
/*
|
||||
* Fixed Event interfaces
|
||||
|
@ -434,57 +695,69 @@ typedef
|
|||
acpi_status(*acpi_walk_resource_callback) (struct acpi_resource * resource,
|
||||
void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_get_vendor_resource(acpi_handle device,
|
||||
char *name,
|
||||
struct acpi_vendor_uuid *uuid,
|
||||
struct acpi_buffer *ret_buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_get_current_resources(acpi_handle device, struct acpi_buffer *ret_buffer);
|
||||
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_vendor_resource(acpi_handle device,
|
||||
char *name,
|
||||
struct acpi_vendor_uuid
|
||||
*uuid,
|
||||
struct acpi_buffer
|
||||
*ret_buffer))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_current_resources(acpi_handle device,
|
||||
struct acpi_buffer
|
||||
*ret_buffer))
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status
|
||||
acpi_get_possible_resources(acpi_handle device, struct acpi_buffer *ret_buffer);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_possible_resources(acpi_handle device,
|
||||
struct acpi_buffer
|
||||
*ret_buffer))
|
||||
#endif
|
||||
|
||||
acpi_status
|
||||
acpi_get_event_resources(acpi_handle device_handle,
|
||||
struct acpi_buffer *ret_buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_walk_resource_buffer(struct acpi_buffer *buffer,
|
||||
acpi_walk_resource_callback user_function,
|
||||
void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_walk_resources(acpi_handle device,
|
||||
char *name,
|
||||
acpi_walk_resource_callback user_function, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_set_current_resources(acpi_handle device, struct acpi_buffer *in_buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_get_irq_routing_table(acpi_handle device, struct acpi_buffer *ret_buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_resource_to_address64(struct acpi_resource *resource,
|
||||
struct acpi_resource_address64 *out);
|
||||
|
||||
acpi_status
|
||||
acpi_buffer_to_resource(u8 *aml_buffer,
|
||||
u16 aml_buffer_length,
|
||||
struct acpi_resource **resource_ptr);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_event_resources(acpi_handle device_handle,
|
||||
struct acpi_buffer
|
||||
*ret_buffer))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_walk_resource_buffer(struct acpi_buffer
|
||||
*buffer,
|
||||
acpi_walk_resource_callback
|
||||
user_function,
|
||||
void *context))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_walk_resources(acpi_handle device, char *name,
|
||||
acpi_walk_resource_callback
|
||||
user_function, void *context))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_set_current_resources(acpi_handle device,
|
||||
struct acpi_buffer
|
||||
*in_buffer))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_irq_routing_table(acpi_handle device,
|
||||
struct acpi_buffer
|
||||
*ret_buffer))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_resource_to_address64(struct acpi_resource
|
||||
*resource,
|
||||
struct
|
||||
acpi_resource_address64
|
||||
*out))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_buffer_to_resource(u8 *aml_buffer,
|
||||
u16 aml_buffer_length,
|
||||
struct acpi_resource
|
||||
**resource_ptr))
|
||||
|
||||
/*
|
||||
* Hardware (ACPI device) interfaces
|
||||
*/
|
||||
acpi_status acpi_reset(void);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_reset(void))
|
||||
|
||||
acpi_status acpi_read(u64 *value, struct acpi_generic_address *reg);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_read(u64 *value,
|
||||
struct acpi_generic_address *reg))
|
||||
|
||||
acpi_status acpi_write(u64 value, struct acpi_generic_address *reg);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_write(u64 value,
|
||||
struct acpi_generic_address *reg))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_read_bit_register(u32 register_id,
|
||||
|
@ -497,18 +770,20 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
|||
/*
|
||||
* Sleep/Wake interfaces
|
||||
*/
|
||||
acpi_status
|
||||
acpi_get_sleep_type_data(u8 sleep_state, u8 *slp_typ_a, u8 *slp_typ_b);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_sleep_type_data(u8 sleep_state,
|
||||
u8 *slp_typ_a,
|
||||
u8 *slp_typ_b))
|
||||
|
||||
acpi_status acpi_enter_sleep_state_prep(u8 sleep_state);
|
||||
|
||||
acpi_status acpi_enter_sleep_state(u8 sleep_state);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_enter_sleep_state_prep(u8 sleep_state))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_enter_sleep_state(u8 sleep_state))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enter_sleep_state_s4bios(void))
|
||||
|
||||
acpi_status acpi_leave_sleep_state_prep(u8 sleep_state);
|
||||
|
||||
acpi_status acpi_leave_sleep_state(u8 sleep_state);
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_leave_sleep_state_prep(u8 sleep_state))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_leave_sleep_state(u8 sleep_state))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_set_firmware_waking_vector(u32
|
||||
|
@ -535,53 +810,72 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
|||
/*
|
||||
* Error/Warning output
|
||||
*/
|
||||
ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_error(const char *module_name, u32 line_number, const char *format, ...);
|
||||
|
||||
ACPI_PRINTF_LIKE(4)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_exception(const char *module_name,
|
||||
u32 line_number, acpi_status status, const char *format, ...);
|
||||
|
||||
ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_warning(const char *module_name, u32 line_number, const char *format, ...);
|
||||
|
||||
ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_info(const char *module_name, u32 line_number, const char *format, ...);
|
||||
|
||||
ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_bios_error(const char *module_name,
|
||||
u32 line_number, const char *format, ...);
|
||||
|
||||
ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_bios_warning(const char *module_name,
|
||||
u32 line_number, const char *format, ...);
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *format, ...))
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(4)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_exception(const char *module_name,
|
||||
u32 line_number,
|
||||
acpi_status status,
|
||||
const char *format, ...))
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_warning(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *format, ...))
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_info(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *format, ...))
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_bios_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *format, ...))
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_bios_warning(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *format, ...))
|
||||
|
||||
/*
|
||||
* Debug output
|
||||
*/
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
ACPI_DBG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(6)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_debug_print(u32 requested_debug_level,
|
||||
u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name,
|
||||
u32 component_id,
|
||||
const char *format, ...))
|
||||
ACPI_DBG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(6)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_debug_print_raw(u32 requested_debug_level,
|
||||
u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name,
|
||||
u32 component_id,
|
||||
const char *format, ...))
|
||||
|
||||
ACPI_PRINTF_LIKE(6)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_debug_print(u32 requested_debug_level,
|
||||
u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name,
|
||||
u32 component_id, const char *format, ...);
|
||||
/*
|
||||
* Divergences
|
||||
*/
|
||||
acpi_status acpi_get_id(acpi_handle object, acpi_owner_id * out_type);
|
||||
|
||||
ACPI_PRINTF_LIKE(6)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_debug_print_raw(u32 requested_debug_level,
|
||||
u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name,
|
||||
u32 component_id, const char *format, ...);
|
||||
#endif
|
||||
acpi_status acpi_unload_table_id(acpi_owner_id id);
|
||||
|
||||
acpi_status
|
||||
acpi_get_table_with_size(acpi_string signature,
|
||||
u32 instance, struct acpi_table_header **out_table,
|
||||
acpi_size *tbl_size);
|
||||
|
||||
acpi_status
|
||||
acpi_get_data_full(acpi_handle object, acpi_object_handler handler, void **data,
|
||||
void (*callback)(void *));
|
||||
|
||||
#endif /* __ACXFACE_H__ */
|
||||
|
|
|
@ -367,12 +367,11 @@ struct acpi_table_desc {
|
|||
|
||||
/* Masks for Flags field above */
|
||||
|
||||
#define ACPI_TABLE_ORIGIN_UNKNOWN (0)
|
||||
#define ACPI_TABLE_ORIGIN_MAPPED (1)
|
||||
#define ACPI_TABLE_ORIGIN_ALLOCATED (2)
|
||||
#define ACPI_TABLE_ORIGIN_OVERRIDE (4)
|
||||
#define ACPI_TABLE_ORIGIN_MASK (7)
|
||||
#define ACPI_TABLE_IS_LOADED (8)
|
||||
#define ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL (0) /* Virtual address, external maintained */
|
||||
#define ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL (1) /* Physical address, internally mapped */
|
||||
#define ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL (2) /* Virtual address, internallly allocated */
|
||||
#define ACPI_TABLE_ORIGIN_MASK (3)
|
||||
#define ACPI_TABLE_IS_LOADED (8)
|
||||
|
||||
/*
|
||||
* Get the remaining ACPI tables
|
||||
|
|
|
@ -675,7 +675,7 @@ enum acpi_madt_type {
|
|||
};
|
||||
|
||||
/*
|
||||
* MADT Sub-tables, correspond to Type in struct acpi_subtable_header
|
||||
* MADT Subtables, correspond to Type in struct acpi_subtable_header
|
||||
*/
|
||||
|
||||
/* 0: Processor Local APIC */
|
||||
|
@ -918,7 +918,7 @@ enum acpi_srat_type {
|
|||
};
|
||||
|
||||
/*
|
||||
* SRAT Sub-tables, correspond to Type in struct acpi_subtable_header
|
||||
* SRAT Subtables, correspond to Type in struct acpi_subtable_header
|
||||
*/
|
||||
|
||||
/* 0: Processor Local APIC/SAPIC Affinity */
|
||||
|
|
|
@ -70,6 +70,7 @@
|
|||
#define ACPI_SIG_HPET "HPET" /* High Precision Event Timer table */
|
||||
#define ACPI_SIG_IBFT "IBFT" /* iSCSI Boot Firmware Table */
|
||||
#define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */
|
||||
#define ACPI_SIG_LPIT "LPIT" /* Low Power Idle Table */
|
||||
#define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */
|
||||
#define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */
|
||||
#define ACPI_SIG_MTMR "MTMR" /* MID Timer table */
|
||||
|
@ -456,7 +457,7 @@ struct acpi_dmar_pci_path {
|
|||
};
|
||||
|
||||
/*
|
||||
* DMAR Sub-tables, correspond to Type in struct acpi_dmar_header
|
||||
* DMAR Subtables, correspond to Type in struct acpi_dmar_header
|
||||
*/
|
||||
|
||||
/* 0: Hardware Unit Definition */
|
||||
|
@ -820,7 +821,71 @@ struct acpi_ivrs_memory {
|
|||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* MCFG - PCI Memory Mapped Configuration table and sub-table
|
||||
* LPIT - Low Power Idle Table
|
||||
*
|
||||
* Conforms to "ACPI Low Power Idle Table (LPIT) and _LPD Proposal (DRAFT)"
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_table_lpit {
|
||||
struct acpi_table_header header; /* Common ACPI table header */
|
||||
};
|
||||
|
||||
/* LPIT subtable header */
|
||||
|
||||
struct acpi_lpit_header {
|
||||
u32 type; /* Subtable type */
|
||||
u32 length; /* Subtable length */
|
||||
u16 unique_id;
|
||||
u16 reserved;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/* Values for subtable Type above */
|
||||
|
||||
enum acpi_lpit_type {
|
||||
ACPI_LPIT_TYPE_NATIVE_CSTATE = 0x00,
|
||||
ACPI_LPIT_TYPE_SIMPLE_IO = 0x01
|
||||
};
|
||||
|
||||
/* Masks for Flags field above */
|
||||
|
||||
#define ACPI_LPIT_STATE_DISABLED (1)
|
||||
#define ACPI_LPIT_NO_COUNTER (1<<1)
|
||||
|
||||
/*
|
||||
* LPIT subtables, correspond to Type in struct acpi_lpit_header
|
||||
*/
|
||||
|
||||
/* 0x00: Native C-state instruction based LPI structure */
|
||||
|
||||
struct acpi_lpit_native {
|
||||
struct acpi_lpit_header header;
|
||||
struct acpi_generic_address entry_trigger;
|
||||
u32 residency;
|
||||
u32 latency;
|
||||
struct acpi_generic_address residency_counter;
|
||||
u64 counter_frequency;
|
||||
};
|
||||
|
||||
/* 0x01: Simple I/O based LPI structure */
|
||||
|
||||
struct acpi_lpit_io {
|
||||
struct acpi_lpit_header header;
|
||||
struct acpi_generic_address entry_trigger;
|
||||
u32 trigger_action;
|
||||
u64 trigger_value;
|
||||
u64 trigger_mask;
|
||||
struct acpi_generic_address minimum_idle_state;
|
||||
u32 residency;
|
||||
u32 latency;
|
||||
struct acpi_generic_address residency_counter;
|
||||
u64 counter_frequency;
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* MCFG - PCI Memory Mapped Configuration table and subtable
|
||||
* Version 1
|
||||
*
|
||||
* Conforms to "PCI Firmware Specification", Revision 3.0, June 20, 2005
|
||||
|
@ -923,7 +988,7 @@ enum acpi_slic_type {
|
|||
};
|
||||
|
||||
/*
|
||||
* SLIC Sub-tables, correspond to Type in struct acpi_slic_header
|
||||
* SLIC Subtables, correspond to Type in struct acpi_slic_header
|
||||
*/
|
||||
|
||||
/* 0: Public Key Structure */
|
||||
|
|
|
@ -329,6 +329,15 @@ typedef u32 acpi_physical_address;
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef ACPI_NO_MEM_ALLOCATIONS
|
||||
|
||||
#define ACPI_ALLOCATE(a) NULL
|
||||
#define ACPI_ALLOCATE_ZEROED(a) NULL
|
||||
#define ACPI_FREE(a)
|
||||
#define ACPI_MEM_TRACKING(a)
|
||||
|
||||
#else /* ACPI_NO_MEM_ALLOCATIONS */
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
/*
|
||||
* Memory allocation tracking (used by acpi_exec to detect memory leaks)
|
||||
|
@ -350,6 +359,8 @@ typedef u32 acpi_physical_address;
|
|||
|
||||
#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
|
||||
|
||||
#endif /* ACPI_NO_MEM_ALLOCATIONS */
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* ACPI Specification constants (Do not change unless the specification changes)
|
||||
|
@ -928,9 +939,19 @@ struct acpi_object_list {
|
|||
* Miscellaneous common Data Structures used by the interfaces
|
||||
*/
|
||||
#define ACPI_NO_BUFFER 0
|
||||
|
||||
#ifdef ACPI_NO_MEM_ALLOCATIONS
|
||||
|
||||
#define ACPI_ALLOCATE_BUFFER (acpi_size) (0)
|
||||
#define ACPI_ALLOCATE_LOCAL_BUFFER (acpi_size) (0)
|
||||
|
||||
#else /* ACPI_NO_MEM_ALLOCATIONS */
|
||||
|
||||
#define ACPI_ALLOCATE_BUFFER (acpi_size) (-1) /* Let ACPICA allocate buffer */
|
||||
#define ACPI_ALLOCATE_LOCAL_BUFFER (acpi_size) (-2) /* For internal use only (enables tracking) */
|
||||
|
||||
#endif /* ACPI_NO_MEM_ALLOCATIONS */
|
||||
|
||||
struct acpi_buffer {
|
||||
acpi_size length; /* Length in bytes of the buffer */
|
||||
void *pointer; /* pointer to buffer */
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Name: acenvex.h - Extra host and compiler configuration
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2014, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef __ACENVEX_H__
|
||||
#define __ACENVEX_H__
|
||||
|
||||
/*! [Begin] no source code translation */
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Extra host configuration files. All ACPICA headers are included before
|
||||
* including these files.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(_LINUX) || defined(__linux__)
|
||||
#include <acpi/platform/aclinuxex.h>
|
||||
|
||||
#endif
|
||||
|
||||
/*! [End] no source code translation !*/
|
||||
|
||||
#endif /* __ACENVEX_H__ */
|
|
@ -64,4 +64,15 @@
|
|||
*/
|
||||
#define ACPI_UNUSED_VAR __attribute__ ((unused))
|
||||
|
||||
/*
|
||||
* Some versions of gcc implement strchr() with a buggy macro. So,
|
||||
* undef it here. Prevents error messages of this form (usually from the
|
||||
* file getopt.c):
|
||||
*
|
||||
* error: logical '&&' with non-zero constant will always evaluate as true
|
||||
*/
|
||||
#ifdef strchr
|
||||
#undef strchr
|
||||
#endif
|
||||
|
||||
#endif /* __ACGCC_H__ */
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
|
||||
#define ACPI_USE_SYSTEM_CLIBRARY
|
||||
#define ACPI_USE_DO_WHILE_0
|
||||
#define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -71,7 +70,38 @@
|
|||
#ifdef EXPORT_ACPI_INTERFACES
|
||||
#include <linux/export.h>
|
||||
#endif
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/acenv.h>
|
||||
|
||||
#ifndef CONFIG_ACPI
|
||||
|
||||
/* External globals for __KERNEL__, stubs is needed */
|
||||
|
||||
#define ACPI_GLOBAL(t,a)
|
||||
#define ACPI_INIT_GLOBAL(t,a,b)
|
||||
|
||||
/* Generating stubs for configurable ACPICA macros */
|
||||
|
||||
#define ACPI_NO_MEM_ALLOCATIONS
|
||||
|
||||
/* Generating stubs for configurable ACPICA functions */
|
||||
|
||||
#define ACPI_NO_ERROR_MESSAGES
|
||||
#undef ACPI_DEBUG_OUTPUT
|
||||
|
||||
/* External interface for __KERNEL__, stub is needed */
|
||||
|
||||
#define ACPI_EXTERNAL_RETURN_STATUS(prototype) \
|
||||
static ACPI_INLINE prototype {return(AE_NOT_CONFIGURED);}
|
||||
#define ACPI_EXTERNAL_RETURN_OK(prototype) \
|
||||
static ACPI_INLINE prototype {return(AE_OK);}
|
||||
#define ACPI_EXTERNAL_RETURN_VOID(prototype) \
|
||||
static ACPI_INLINE prototype {return;}
|
||||
#define ACPI_EXTERNAL_RETURN_UINT32(prototype) \
|
||||
static ACPI_INLINE prototype {return(0);}
|
||||
#define ACPI_EXTERNAL_RETURN_PTR(prototype) \
|
||||
static ACPI_INLINE prototype {return(NULL);}
|
||||
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
/* Host-dependent types and defines for in-kernel ACPICA */
|
||||
|
||||
|
@ -83,6 +113,40 @@
|
|||
#define acpi_spinlock spinlock_t *
|
||||
#define acpi_cpu_flags unsigned long
|
||||
|
||||
/* Use native linux version of acpi_os_allocate_zeroed */
|
||||
|
||||
#define USE_NATIVE_ALLOCATE_ZEROED
|
||||
|
||||
/*
|
||||
* Overrides for in-kernel ACPICA
|
||||
*/
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_initialize
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_terminate
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_allocate
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_allocate_zeroed
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_free
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_object
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_thread_id
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_lock
|
||||
|
||||
/*
|
||||
* OSL interfaces used by debugger/disassembler
|
||||
*/
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_readable
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_writable
|
||||
|
||||
/*
|
||||
* OSL interfaces used by utilities
|
||||
*/
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_redirect_output
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_line
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_name
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_index
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_address
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_open_directory
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_next_filename
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_close_directory
|
||||
|
||||
#else /* !__KERNEL__ */
|
||||
|
||||
#include <stdarg.h>
|
||||
|
@ -91,22 +155,19 @@
|
|||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Disable kernel specific declarators */
|
||||
/* Define/disable kernel-specific declarators */
|
||||
|
||||
#ifndef __init
|
||||
#define __init
|
||||
#endif
|
||||
|
||||
#ifndef __iomem
|
||||
#define __iomem
|
||||
#endif
|
||||
|
||||
/* Host-dependent types and defines for user-space ACPICA */
|
||||
|
||||
#define ACPI_FLUSH_CPU_CACHE()
|
||||
#define ACPI_CAST_PTHREAD_T(pthread) ((acpi_thread_id) (pthread))
|
||||
|
||||
#if defined(__ia64__) || defined(__x86_64__) || defined(__aarch64__)
|
||||
#if defined(__ia64__) || defined(__x86_64__) ||\
|
||||
defined(__aarch64__) || defined(__PPC64__)
|
||||
#define ACPI_MACHINE_WIDTH 64
|
||||
#define COMPILER_DEPENDENT_INT64 long
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned long
|
||||
|
@ -127,136 +188,4 @@
|
|||
|
||||
#include <acpi/platform/acgcc.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/*
|
||||
* FIXME: Inclusion of actypes.h
|
||||
* Linux kernel need this before defining inline OSL interfaces as
|
||||
* actypes.h need to be included to find ACPICA type definitions.
|
||||
* Since from ACPICA's perspective, the actypes.h should be included after
|
||||
* acenv.h (aclinux.h), this leads to a inclusion mis-ordering issue.
|
||||
*/
|
||||
#include <acpi/actypes.h>
|
||||
|
||||
/*
|
||||
* Overrides for in-kernel ACPICA
|
||||
*/
|
||||
acpi_status __init acpi_os_initialize(void);
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_initialize
|
||||
|
||||
acpi_status acpi_os_terminate(void);
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_terminate
|
||||
|
||||
/*
|
||||
* Memory allocation/deallocation
|
||||
*/
|
||||
|
||||
/*
|
||||
* The irqs_disabled() check is for resume from RAM.
|
||||
* Interrupts are off during resume, just like they are for boot.
|
||||
* However, boot has (system_state != SYSTEM_RUNNING)
|
||||
* to quiet __might_sleep() in kmalloc() and resume does not.
|
||||
*/
|
||||
static inline void *acpi_os_allocate(acpi_size size)
|
||||
{
|
||||
return kmalloc(size, irqs_disabled()? GFP_ATOMIC : GFP_KERNEL);
|
||||
}
|
||||
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_allocate
|
||||
|
||||
/* Use native linux version of acpi_os_allocate_zeroed */
|
||||
|
||||
static inline void *acpi_os_allocate_zeroed(acpi_size size)
|
||||
{
|
||||
return kzalloc(size, irqs_disabled()? GFP_ATOMIC : GFP_KERNEL);
|
||||
}
|
||||
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_allocate_zeroed
|
||||
#define USE_NATIVE_ALLOCATE_ZEROED
|
||||
|
||||
static inline void acpi_os_free(void *memory)
|
||||
{
|
||||
kfree(memory);
|
||||
}
|
||||
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_free
|
||||
|
||||
static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
|
||||
{
|
||||
return kmem_cache_zalloc(cache,
|
||||
irqs_disabled()? GFP_ATOMIC : GFP_KERNEL);
|
||||
}
|
||||
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_object
|
||||
|
||||
static inline acpi_thread_id acpi_os_get_thread_id(void)
|
||||
{
|
||||
return (acpi_thread_id) (unsigned long)current;
|
||||
}
|
||||
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_thread_id
|
||||
|
||||
#ifndef CONFIG_PREEMPT
|
||||
|
||||
/*
|
||||
* Used within ACPICA to show where it is safe to preempt execution
|
||||
* when CONFIG_PREEMPT=n
|
||||
*/
|
||||
#define ACPI_PREEMPTION_POINT() \
|
||||
do { \
|
||||
if (!irqs_disabled()) \
|
||||
cond_resched(); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When lockdep is enabled, the spin_lock_init() macro stringifies it's
|
||||
* argument and uses that as a name for the lock in debugging.
|
||||
* By executing spin_lock_init() in a macro the key changes from "lock" for
|
||||
* all locks to the name of the argument of acpi_os_create_lock(), which
|
||||
* prevents lockdep from reporting false positives for ACPICA locks.
|
||||
*/
|
||||
#define acpi_os_create_lock(__handle) \
|
||||
({ \
|
||||
spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \
|
||||
if (lock) { \
|
||||
*(__handle) = lock; \
|
||||
spin_lock_init(*(__handle)); \
|
||||
} \
|
||||
lock ? AE_OK : AE_NO_MEMORY; \
|
||||
})
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_lock
|
||||
|
||||
void __iomem *acpi_os_map_memory(acpi_physical_address where, acpi_size length);
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_map_memory
|
||||
|
||||
void acpi_os_unmap_memory(void __iomem * logical_address, acpi_size size);
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_unmap_memory
|
||||
|
||||
/*
|
||||
* OSL interfaces used by debugger/disassembler
|
||||
*/
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_readable
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_writable
|
||||
|
||||
/*
|
||||
* OSL interfaces used by utilities
|
||||
*/
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_redirect_output
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_line
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_name
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_index
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_table_by_address
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_open_directory
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_next_filename
|
||||
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_close_directory
|
||||
|
||||
/*
|
||||
* OSL interfaces added by Linux
|
||||
*/
|
||||
void early_acpi_os_unmap_memory(void __iomem * virt, acpi_size size);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ACLINUX_H__ */
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Name: aclinuxex.h - Extra OS specific defines, etc. for Linux
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2014, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef __ACLINUXEX_H__
|
||||
#define __ACLINUXEX_H__
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/*
|
||||
* Overrides for in-kernel ACPICA
|
||||
*/
|
||||
acpi_status __init acpi_os_initialize(void);
|
||||
|
||||
acpi_status acpi_os_terminate(void);
|
||||
|
||||
/*
|
||||
* The irqs_disabled() check is for resume from RAM.
|
||||
* Interrupts are off during resume, just like they are for boot.
|
||||
* However, boot has (system_state != SYSTEM_RUNNING)
|
||||
* to quiet __might_sleep() in kmalloc() and resume does not.
|
||||
*/
|
||||
static inline void *acpi_os_allocate(acpi_size size)
|
||||
{
|
||||
return kmalloc(size, irqs_disabled()? GFP_ATOMIC : GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline void *acpi_os_allocate_zeroed(acpi_size size)
|
||||
{
|
||||
return kzalloc(size, irqs_disabled()? GFP_ATOMIC : GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline void acpi_os_free(void *memory)
|
||||
{
|
||||
kfree(memory);
|
||||
}
|
||||
|
||||
static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
|
||||
{
|
||||
return kmem_cache_zalloc(cache,
|
||||
irqs_disabled()? GFP_ATOMIC : GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline acpi_thread_id acpi_os_get_thread_id(void)
|
||||
{
|
||||
return (acpi_thread_id) (unsigned long)current;
|
||||
}
|
||||
|
||||
/*
|
||||
* When lockdep is enabled, the spin_lock_init() macro stringifies it's
|
||||
* argument and uses that as a name for the lock in debugging.
|
||||
* By executing spin_lock_init() in a macro the key changes from "lock" for
|
||||
* all locks to the name of the argument of acpi_os_create_lock(), which
|
||||
* prevents lockdep from reporting false positives for ACPICA locks.
|
||||
*/
|
||||
#define acpi_os_create_lock(__handle) \
|
||||
({ \
|
||||
spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \
|
||||
if (lock) { \
|
||||
*(__handle) = lock; \
|
||||
spin_lock_init(*(__handle)); \
|
||||
} \
|
||||
lock ? AE_OK : AE_NO_MEMORY; \
|
||||
})
|
||||
|
||||
/*
|
||||
* OSL interfaces added by Linux
|
||||
*/
|
||||
void early_acpi_os_unmap_memory(void __iomem * virt, acpi_size size);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ACLINUXEX_H__ */
|
|
@ -19,11 +19,13 @@ struct acpi_device;
|
|||
#if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE)
|
||||
extern int acpi_video_register(void);
|
||||
extern void acpi_video_unregister(void);
|
||||
extern void acpi_video_unregister_backlight(void);
|
||||
extern int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||
int device_id, void **edid);
|
||||
#else
|
||||
static inline int acpi_video_register(void) { return 0; }
|
||||
static inline void acpi_video_unregister(void) { return; }
|
||||
static inline void acpi_video_unregister_backlight(void) { return; }
|
||||
static inline int acpi_video_get_edid(struct acpi_device *device, int type,
|
||||
int device_id, void **edid)
|
||||
{
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue