mirror of
https://github.com/joel16/android_kernel_sony_msm8994.git
synced 2025-01-19 02:43:45 +00:00
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (94 commits) ACPICA: hide private headers ACPICA: create acpica/ directory ACPI: fix build warning ACPI : Use RSDT instead of XSDT by adding boot option of "acpi=rsdt" ACPI: Avoid array address overflow when _CST MWAIT hint bits are set fujitsu-laptop: Simplify SBLL/SBL2 backlight handling fujitsu-laptop: Add BL power, LED control and radio state information ACPICA: delete utcache.c ACPICA: delete acdisasm.h ACPICA: Update version to 20081204. ACPICA: FADT: Update error msgs for consistency ACPICA: FADT: set acpi_gbl_use_default_register_widths to TRUE by default ACPICA: FADT parsing changes and fixes ACPICA: Add ACPI_MUTEX_TYPE configuration option ACPICA: Fixes for various ACPI data tables ACPICA: Restructure includes into public/private ACPI: remove private acpica headers from driver files ACPI: reboot.c: use new acpi_reset interface ACPICA: New: acpi_reset interface - write to reset register ACPICA: Move all public H/W interfaces to new hwxface ...
This commit is contained in:
commit
a3a798c88a
@ -141,6 +141,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
ht -- run only enough ACPI to enable Hyper Threading
|
||||
strict -- Be less tolerant of platforms that are not
|
||||
strictly ACPI specification compliant.
|
||||
rsdt -- prefer RSDT over (default) XSDT
|
||||
|
||||
See also Documentation/power/pm.txt, pci=noacpi
|
||||
|
||||
@ -151,16 +152,20 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
default: 0
|
||||
|
||||
acpi_sleep= [HW,ACPI] Sleep options
|
||||
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, old_ordering }
|
||||
See Documentation/power/video.txt for s3_bios and s3_mode.
|
||||
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
|
||||
old_ordering, s4_nonvs }
|
||||
See Documentation/power/video.txt for information on
|
||||
s3_bios and s3_mode.
|
||||
s3_beep is for debugging; it makes the PC's speaker beep
|
||||
as soon as the kernel's real-mode entry point is called.
|
||||
s4_nohwsig prevents ACPI hardware signature from being
|
||||
used during resume from hibernation.
|
||||
old_ordering causes the ACPI 1.0 ordering of the _PTS
|
||||
control method, wrt putting devices into low power
|
||||
states, to be enforced (the ACPI 2.0 ordering of _PTS is
|
||||
used by default).
|
||||
control method, with respect to putting devices into
|
||||
low power states, to be enforced (the ACPI 2.0 ordering
|
||||
of _PTS is used by default).
|
||||
s4_nonvs prevents the kernel from saving/restoring the
|
||||
ACPI NVS memory during hibernation.
|
||||
|
||||
acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode
|
||||
Format: { level | edge | high | low }
|
||||
@ -195,7 +200,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
acpi_skip_timer_override [HW,ACPI]
|
||||
Recognize and ignore IRQ0/pin2 Interrupt Override.
|
||||
For broken nForce2 BIOS resulting in XT-PIC timer.
|
||||
acpi_use_timer_override [HW,ACPI}
|
||||
acpi_use_timer_override [HW,ACPI]
|
||||
Use timer override. For some broken Nvidia NF5 boards
|
||||
that require a timer override, but don't have
|
||||
HPET
|
||||
@ -878,17 +883,19 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
See Documentation/ide/ide.txt.
|
||||
|
||||
idle= [X86]
|
||||
Format: idle=poll or idle=mwait, idle=halt, idle=nomwait
|
||||
Poll forces a polling idle loop that can slightly improves the performance
|
||||
of waking up a idle CPU, but will use a lot of power and make the system
|
||||
run hot. Not recommended.
|
||||
idle=mwait. On systems which support MONITOR/MWAIT but the kernel chose
|
||||
to not use it because it doesn't save as much power as a normal idle
|
||||
loop use the MONITOR/MWAIT idle loop anyways. Performance should be the same
|
||||
as idle=poll.
|
||||
idle=halt. Halt is forced to be used for CPU idle.
|
||||
Format: idle=poll, idle=mwait, idle=halt, idle=nomwait
|
||||
Poll forces a polling idle loop that can slightly
|
||||
improve the performance of waking up a idle CPU, but
|
||||
will use a lot of power and make the system run hot.
|
||||
Not recommended.
|
||||
idle=mwait: On systems which support MONITOR/MWAIT but
|
||||
the kernel chose to not use it because it doesn't save
|
||||
as much power as a normal idle loop, use the
|
||||
MONITOR/MWAIT idle loop anyways. Performance should be
|
||||
the same as idle=poll.
|
||||
idle=halt: Halt is forced to be used for CPU idle.
|
||||
In such case C2/C3 won't be used again.
|
||||
idle=nomwait. Disable mwait for CPU C-states
|
||||
idle=nomwait: Disable mwait for CPU C-states
|
||||
|
||||
ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem
|
||||
Claim all unknown PCI IDE storage controllers.
|
||||
@ -1074,8 +1081,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
lapic [X86-32,APIC] Enable the local APIC even if BIOS
|
||||
disabled it.
|
||||
|
||||
lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in
|
||||
C2 power state.
|
||||
lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer
|
||||
in C2 power state.
|
||||
|
||||
libata.dma= [LIBATA] DMA control
|
||||
libata.dma=0 Disable all PATA and SATA DMA
|
||||
@ -2303,7 +2310,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
thermal.psv= [HW,ACPI]
|
||||
-1: disable all passive trip points
|
||||
<degrees C>: override all passive trip points to this value
|
||||
<degrees C>: override all passive trip points to this
|
||||
value
|
||||
|
||||
thermal.tzp= [HW,ACPI]
|
||||
Specify global default ACPI thermal zone polling rate
|
||||
|
@ -14,7 +14,6 @@
|
||||
#define _ASM_IA64_ACPI_EXT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
||||
extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length);
|
||||
|
||||
|
@ -9,8 +9,6 @@
|
||||
#ifndef _ASM_IA64_SN_ACPI_H
|
||||
#define _ASM_IA64_SN_ACPI_H
|
||||
|
||||
#include "acpi/acglobal.h"
|
||||
|
||||
extern int sn_acpi_rev;
|
||||
#define SN_ACPI_BASE_SUPPORT() (sn_acpi_rev >= 0x20101)
|
||||
|
||||
|
@ -65,6 +65,7 @@ EXPORT_SYMBOL(pm_idle);
|
||||
void (*pm_power_off) (void);
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
u32 acpi_rsdt_forced;
|
||||
unsigned int acpi_cpei_override;
|
||||
unsigned int acpi_cpei_phys_cpuid;
|
||||
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include "xtalk/hubdev.h"
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
|
||||
|
||||
/*
|
||||
@ -64,6 +63,7 @@ static acpi_status __init
|
||||
sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
u64 addr;
|
||||
struct hubdev_info *hubdev;
|
||||
struct hubdev_info *hubdev_ptr;
|
||||
@ -77,11 +77,12 @@ sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret)
|
||||
status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,
|
||||
&sn_uuid, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR
|
||||
"sn_acpi_hubdev_init: acpi_get_vendor_resource() "
|
||||
"(0x%x) failed for: ", status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"(0x%x) failed for: %s\n", status,
|
||||
(char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return AE_OK; /* Continue walking namespace */
|
||||
}
|
||||
|
||||
@ -89,11 +90,12 @@ sn_acpi_hubdev_init(acpi_handle handle, u32 depth, void *context, void **ret)
|
||||
vendor = &resource->data.vendor_typed;
|
||||
if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) !=
|
||||
sizeof(struct hubdev_info *)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR
|
||||
"sn_acpi_hubdev_init: Invalid vendor data length: %d for: ",
|
||||
vendor->byte_length);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"sn_acpi_hubdev_init: Invalid vendor data length: "
|
||||
"%d for: %s\n",
|
||||
vendor->byte_length, (char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@ -120,6 +122,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
|
||||
{
|
||||
u64 addr;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
acpi_handle handle;
|
||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||
struct acpi_resource *resource;
|
||||
@ -131,11 +134,11 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
|
||||
status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,
|
||||
&sn_uuid, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR "%s: "
|
||||
"acpi_get_vendor_resource() failed (0x%x) for: ",
|
||||
__func__, status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"acpi_get_vendor_resource() failed (0x%x) for: %s\n",
|
||||
__func__, status, (char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return NULL;
|
||||
}
|
||||
resource = buffer.pointer;
|
||||
@ -168,6 +171,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
|
||||
{
|
||||
u64 addr;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct sn_irq_info *irq_info, *irq_info_prom;
|
||||
struct pcidev_info *pcidev_ptr, *pcidev_prom_ptr;
|
||||
struct acpi_resource *resource;
|
||||
@ -182,11 +186,11 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
|
||||
status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,
|
||||
&sn_uuid, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR
|
||||
"%s: acpi_get_vendor_resource() failed (0x%x) for: ",
|
||||
__func__, status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"%s: acpi_get_vendor_resource() failed (0x%x) for: %s\n",
|
||||
__func__, status, (char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -194,11 +198,12 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
|
||||
vendor = &resource->data.vendor_typed;
|
||||
if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) !=
|
||||
sizeof(struct pci_devdev_info *)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR
|
||||
"%s: Invalid vendor data length: %d for: ",
|
||||
__func__, vendor->byte_length);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"%s: Invalid vendor data length: %d for: %s\n",
|
||||
__func__, vendor->byte_length,
|
||||
(char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
ret = 1;
|
||||
goto exit;
|
||||
}
|
||||
@ -239,6 +244,9 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
|
||||
acpi_handle parent;
|
||||
int slot;
|
||||
acpi_status status;
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
acpi_get_name(device_handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
|
||||
/*
|
||||
* Do an upward search to find the root bus device, and
|
||||
@ -249,9 +257,8 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
|
||||
status = acpi_get_parent(child, &parent);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR "%s: acpi_get_parent() failed "
|
||||
"(0x%x) for: ", __func__, status);
|
||||
acpi_ns_print_node_pathname(child, NULL);
|
||||
printk("\n");
|
||||
"(0x%x) for: %s\n", __func__, status,
|
||||
(char *)name_buffer.pointer);
|
||||
panic("%s: Unable to find host devfn\n", __func__);
|
||||
}
|
||||
if (parent == rootbus_handle)
|
||||
@ -259,22 +266,20 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
|
||||
child = parent;
|
||||
}
|
||||
if (!child) {
|
||||
printk(KERN_ERR "%s: Unable to find root bus for: ",
|
||||
__func__);
|
||||
acpi_ns_print_node_pathname(device_handle, NULL);
|
||||
printk("\n");
|
||||
printk(KERN_ERR "%s: Unable to find root bus for: %s\n",
|
||||
__func__, (char *)name_buffer.pointer);
|
||||
BUG();
|
||||
}
|
||||
|
||||
status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: ",
|
||||
__func__, status);
|
||||
acpi_ns_print_node_pathname(child, NULL);
|
||||
printk("\n");
|
||||
printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: %s\n",
|
||||
__func__, status, (char *)name_buffer.pointer);
|
||||
panic("%s: Unable to find host devfn\n", __func__);
|
||||
}
|
||||
|
||||
kfree(name_buffer.pointer);
|
||||
|
||||
slot = (adr >> 16) & 0xffff;
|
||||
function = adr & 0xffff;
|
||||
devfn = PCI_DEVFN(slot, function);
|
||||
@ -300,27 +305,28 @@ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv)
|
||||
int function;
|
||||
int slot;
|
||||
struct sn_pcidev_match *info = context;
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
|
||||
&adr);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = acpi_get_parent(handle, &parent);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR
|
||||
"%s: acpi_get_parent() failed (0x%x) for: ",
|
||||
__func__, status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"%s: acpi_get_parent() failed (0x%x) for: %s\n",
|
||||
__func__, status, (char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return AE_OK;
|
||||
}
|
||||
status = acpi_evaluate_integer(parent, METHOD_NAME__BBN,
|
||||
NULL, &bbn);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR
|
||||
"%s: Failed to find _BBN in parent of: ",
|
||||
__func__);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
"%s: Failed to find _BBN in parent of: %s\n",
|
||||
__func__, (char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
@ -350,24 +356,27 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
|
||||
acpi_handle rootbus_handle;
|
||||
unsigned long long segment;
|
||||
acpi_status status;
|
||||
struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle;
|
||||
status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL,
|
||||
&segment);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (segment != pci_domain_nr(dev)) {
|
||||
acpi_get_name(rootbus_handle, ACPI_FULL_PATHNAME,
|
||||
&name_buffer);
|
||||
printk(KERN_ERR
|
||||
"%s: Segment number mismatch, 0x%llx vs 0x%x for: ",
|
||||
__func__, segment, pci_domain_nr(dev));
|
||||
acpi_ns_print_node_pathname(rootbus_handle, NULL);
|
||||
printk("\n");
|
||||
"%s: Segment number mismatch, 0x%llx vs 0x%x for: %s\n",
|
||||
__func__, segment, pci_domain_nr(dev),
|
||||
(char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
printk(KERN_ERR "%s: Unable to get __SEG from: ",
|
||||
__func__);
|
||||
acpi_ns_print_node_pathname(rootbus_handle, NULL);
|
||||
printk("\n");
|
||||
acpi_get_name(rootbus_handle, ACPI_FULL_PATHNAME, &name_buffer);
|
||||
printk(KERN_ERR "%s: Unable to get __SEG from: %s\n",
|
||||
__func__, (char *)name_buffer.pointer);
|
||||
kfree(name_buffer.pointer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <asm/sn/sn2/sn_hwperf.h>
|
||||
#include <asm/sn/acpi.h>
|
||||
#include "acpi/acglobal.h"
|
||||
|
||||
extern void sn_init_cpei_timer(void);
|
||||
extern void register_sn_procfs(void);
|
||||
@ -473,7 +472,7 @@ sn_io_early_init(void)
|
||||
{
|
||||
struct acpi_table_header *header = NULL;
|
||||
|
||||
acpi_get_table_by_index(ACPI_TABLE_INDEX_DSDT, &header);
|
||||
acpi_get_table(ACPI_SIG_DSDT, 1, &header);
|
||||
BUG_ON(header == NULL);
|
||||
sn_acpi_rev = header->oem_revision;
|
||||
}
|
||||
@ -505,7 +504,7 @@ sn_io_early_init(void)
|
||||
|
||||
{
|
||||
struct acpi_table_header *header;
|
||||
(void)acpi_get_table_by_index(ACPI_TABLE_INDEX_DSDT, &header);
|
||||
(void)acpi_get_table(ACPI_SIG_DSDT, 1, &header);
|
||||
printk(KERN_INFO "ACPI DSDT OEM Rev 0x%x\n",
|
||||
header->oem_revision);
|
||||
}
|
||||
|
@ -47,7 +47,7 @@
|
||||
#endif
|
||||
|
||||
static int __initdata acpi_force = 0;
|
||||
|
||||
u32 acpi_rsdt_forced;
|
||||
#ifdef CONFIG_ACPI
|
||||
int acpi_disabled = 0;
|
||||
#else
|
||||
@ -1374,6 +1374,17 @@ static void __init acpi_process_madt(void)
|
||||
"Invalid BIOS MADT, disabling ACPI\n");
|
||||
disable_acpi();
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* ACPI found no MADT, and so ACPI wants UP PIC mode.
|
||||
* In the event an MPS table was found, forget it.
|
||||
* Boot with "acpi=off" to use MPS on such a system.
|
||||
*/
|
||||
if (smp_found_config) {
|
||||
printk(KERN_WARNING PREFIX
|
||||
"No APIC-table, disabling MPS\n");
|
||||
smp_found_config = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1809,6 +1820,10 @@ static int __init parse_acpi(char *arg)
|
||||
disable_acpi();
|
||||
acpi_ht = 1;
|
||||
}
|
||||
/* acpi=rsdt use RSDT instead of XSDT */
|
||||
else if (strcmp(arg, "rsdt") == 0) {
|
||||
acpi_rsdt_forced = 1;
|
||||
}
|
||||
/* "acpi=noirq" disables ACPI interrupt routing */
|
||||
else if (strcmp(arg, "noirq") == 0) {
|
||||
acpi_noirq_set();
|
||||
|
@ -56,6 +56,7 @@ static struct cstate_entry *cpu_cstate_entry; /* per CPU ptr */
|
||||
static short mwait_supported[ACPI_PROCESSOR_MAX_POWER];
|
||||
|
||||
#define MWAIT_SUBSTATE_MASK (0xf)
|
||||
#define MWAIT_CSTATE_MASK (0xf)
|
||||
#define MWAIT_SUBSTATE_SIZE (4)
|
||||
|
||||
#define CPUID_MWAIT_LEAF (5)
|
||||
@ -98,7 +99,8 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
|
||||
cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
/* Check whether this particular cx_type (in CST) is supported or not */
|
||||
cstate_type = (cx->address >> MWAIT_SUBSTATE_SIZE) + 1;
|
||||
cstate_type = ((cx->address >> MWAIT_SUBSTATE_SIZE) &
|
||||
MWAIT_CSTATE_MASK) + 1;
|
||||
edx_part = edx >> (cstate_type * MWAIT_SUBSTATE_SIZE);
|
||||
num_cstate_subtype = edx_part & MWAIT_SUBSTATE_MASK;
|
||||
|
||||
|
@ -159,6 +159,8 @@ static int __init acpi_sleep_setup(char *str)
|
||||
#endif
|
||||
if (strncmp(str, "old_ordering", 12) == 0)
|
||||
acpi_old_suspend_ordering();
|
||||
if (strncmp(str, "s4_nonvs", 8) == 0)
|
||||
acpi_s4_no_nvs();
|
||||
str = strchr(str, ',');
|
||||
if (str != NULL)
|
||||
str += strspn(str, ", \t");
|
||||
|
@ -665,6 +665,27 @@ void __init e820_mark_nosave_regions(unsigned long limit_pfn)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
/**
|
||||
* Mark ACPI NVS memory region, so that we can save/restore it during
|
||||
* hibernation and the subsequent resume.
|
||||
*/
|
||||
static int __init e820_mark_nvs_memory(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < e820.nr_map; i++) {
|
||||
struct e820entry *ei = &e820.map[i];
|
||||
|
||||
if (ei->type == E820_NVS)
|
||||
hibernate_nvs_register(ei->addr, ei->size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
core_initcall(e820_mark_nvs_memory);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Early reserved memory areas.
|
||||
*/
|
||||
|
@ -107,4 +107,6 @@ source "drivers/uio/Kconfig"
|
||||
source "drivers/xen/Kconfig"
|
||||
|
||||
source "drivers/staging/Kconfig"
|
||||
|
||||
source "drivers/platform/Kconfig"
|
||||
endmenu
|
||||
|
@ -105,3 +105,4 @@ obj-$(CONFIG_OF) += of/
|
||||
obj-$(CONFIG_SSB) += ssb/
|
||||
obj-$(CONFIG_VIRTIO) += virtio/
|
||||
obj-$(CONFIG_STAGING) += staging/
|
||||
obj-y += platform/
|
||||
|
@ -196,90 +196,6 @@ config ACPI_NUMA
|
||||
depends on (X86 || IA64)
|
||||
default y if IA64_GENERIC || IA64_SGI_SN2
|
||||
|
||||
config ACPI_WMI
|
||||
tristate "WMI (EXPERIMENTAL)"
|
||||
depends on X86
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
This driver adds support for the ACPI-WMI (Windows Management
|
||||
Instrumentation) mapper device (PNP0C14) found on some systems.
|
||||
|
||||
ACPI-WMI is a proprietary extension to ACPI to expose parts of the
|
||||
ACPI firmware to userspace - this is done through various vendor
|
||||
defined methods and data blocks in a PNP0C14 device, which are then
|
||||
made available for userspace to call.
|
||||
|
||||
The implementation of this in Linux currently only exposes this to
|
||||
other kernel space drivers.
|
||||
|
||||
This driver is a required dependency to build the firmware specific
|
||||
drivers needed on many machines, including Acer and HP laptops.
|
||||
|
||||
It is safe to enable this driver even if your DSDT doesn't define
|
||||
any ACPI-WMI devices.
|
||||
|
||||
config ACPI_ASUS
|
||||
tristate "ASUS/Medion Laptop Extras"
|
||||
depends on X86
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
---help---
|
||||
This driver provides support for extra features of ACPI-compatible
|
||||
ASUS laptops. As some of Medion laptops are made by ASUS, it may also
|
||||
support some Medion laptops (such as 9675 for example). It makes all
|
||||
the extra buttons generate standard ACPI events that go through
|
||||
/proc/acpi/events, and (on some models) adds support for changing the
|
||||
display brightness and output, switching the LCD backlight on and off,
|
||||
and most importantly, allows you to blink those fancy LEDs intended
|
||||
for reporting mail and wireless status.
|
||||
|
||||
Note: display switching code is currently considered EXPERIMENTAL,
|
||||
toying with these values may even lock your machine.
|
||||
|
||||
All settings are changed via /proc/acpi/asus directory entries. Owner
|
||||
and group for these entries can be set with asus_uid and asus_gid
|
||||
parameters.
|
||||
|
||||
More information and a userspace daemon for handling the extra buttons
|
||||
at <http://sourceforge.net/projects/acpi4asus/>.
|
||||
|
||||
If you have an ACPI-compatible ASUS laptop, say Y or M here. This
|
||||
driver is still under development, so if your laptop is unsupported or
|
||||
something works not quite as expected, please use the mailing list
|
||||
available on the above page (acpi4asus-user@lists.sourceforge.net).
|
||||
|
||||
NOTE: This driver is deprecated and will probably be removed soon,
|
||||
use asus-laptop instead.
|
||||
|
||||
config ACPI_TOSHIBA
|
||||
tristate "Toshiba Laptop Extras"
|
||||
depends on X86 && INPUT
|
||||
select INPUT_POLLDEV
|
||||
select NET
|
||||
select RFKILL
|
||||
select BACKLIGHT_CLASS_DEVICE
|
||||
---help---
|
||||
This driver adds support for access to certain system settings
|
||||
on "legacy free" Toshiba laptops. These laptops can be recognized by
|
||||
their lack of a BIOS setup menu and APM support.
|
||||
|
||||
On these machines, all system configuration is handled through the
|
||||
ACPI. This driver is required for access to controls not covered
|
||||
by the general ACPI drivers, such as LCD brightness, video output,
|
||||
etc.
|
||||
|
||||
This driver differs from the non-ACPI Toshiba laptop driver (located
|
||||
under "Processor type and features") in several aspects.
|
||||
Configuration is accessed by reading and writing text files in the
|
||||
/proc tree instead of by program interface to /dev. Furthermore, no
|
||||
power management functions are exposed, as those are handled by the
|
||||
general ACPI drivers.
|
||||
|
||||
More information about this driver is available at
|
||||
<http://memebeam.org/toys/ToshibaAcpiDriver>.
|
||||
|
||||
If you have a legacy free Toshiba laptop (such as the Libretto L1
|
||||
series), say Y.
|
||||
|
||||
config ACPI_CUSTOM_DSDT_FILE
|
||||
string "Custom DSDT Table file to include"
|
||||
default ""
|
||||
|
@ -2,15 +2,8 @@
|
||||
# Makefile for the Linux ACPI interpreter
|
||||
#
|
||||
|
||||
export ACPI_CFLAGS
|
||||
|
||||
ACPI_CFLAGS := -Os
|
||||
|
||||
ifdef CONFIG_ACPI_DEBUG
|
||||
ACPI_CFLAGS += -DACPI_DEBUG_OUTPUT
|
||||
endif
|
||||
|
||||
EXTRA_CFLAGS += $(ACPI_CFLAGS)
|
||||
ccflags-y := -Os
|
||||
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
||||
|
||||
#
|
||||
# ACPI Boot-Time Table Parsing
|
||||
@ -22,9 +15,13 @@ obj-$(CONFIG_X86) += blacklist.o
|
||||
# ACPI Core Subsystem (Interpreter)
|
||||
#
|
||||
obj-y += osl.o utils.o reboot.o\
|
||||
dispatcher/ events/ executer/ hardware/ \
|
||||
namespace/ parser/ resources/ tables/ \
|
||||
utilities/
|
||||
acpica/
|
||||
|
||||
# sleep related files
|
||||
obj-y += wakeup.o
|
||||
obj-y += main.o
|
||||
obj-$(CONFIG_ACPI_SLEEP) += proc.o
|
||||
|
||||
|
||||
#
|
||||
# ACPI Bus and Device Drivers
|
||||
@ -35,7 +32,6 @@ ifdef CONFIG_CPU_FREQ
|
||||
processor-objs += processor_perflib.o
|
||||
endif
|
||||
|
||||
obj-y += sleep/
|
||||
obj-y += bus.o glue.o
|
||||
obj-y += scan.o
|
||||
# Keep EC driver first. Initialization of others depend on it.
|
||||
@ -59,9 +55,6 @@ obj-y += power.o
|
||||
obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
|
||||
obj-$(CONFIG_ACPI_DEBUG) += debug.o
|
||||
obj-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
obj-$(CONFIG_ACPI_WMI) += wmi.o
|
||||
obj-$(CONFIG_ACPI_ASUS) += asus_acpi.o
|
||||
obj-$(CONFIG_ACPI_TOSHIBA) += toshiba_acpi.o
|
||||
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
|
||||
obj-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o
|
||||
obj-$(CONFIG_ACPI_SBS) += sbshc.o
|
||||
|
44
drivers/acpi/acpica/Makefile
Normal file
44
drivers/acpi/acpica/Makefile
Normal file
@ -0,0 +1,44 @@
|
||||
#
|
||||
# Makefile for ACPICA Core interpreter
|
||||
#
|
||||
|
||||
ccflags-y := -Os
|
||||
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
||||
|
||||
obj-y := dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o \
|
||||
dsmethod.o dsobject.o dsutils.o dswload.o dswstate.o \
|
||||
dsinit.o
|
||||
|
||||
obj-y += evevent.o evregion.o evsci.o evxfevnt.o \
|
||||
evmisc.o evrgnini.o evxface.o evxfregn.o \
|
||||
evgpe.o evgpeblk.o
|
||||
|
||||
obj-y += exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.o\
|
||||
exconvrt.o exfldio.o exoparg1.o exprep.o exresop.o exsystem.o\
|
||||
excreate.o exmisc.o exoparg2.o exregion.o exstore.o exutils.o \
|
||||
exdump.o exmutex.o exoparg3.o exresnte.o exstoren.o
|
||||
|
||||
obj-y += hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o
|
||||
|
||||
obj-$(ACPI_FUTURE_USAGE) += hwtimer.o
|
||||
|
||||
obj-y += nsaccess.o nsload.o nssearch.o nsxfeval.o \
|
||||
nsalloc.o nseval.o nsnames.o nsutils.o nsxfname.o \
|
||||
nsdump.o nsinit.o nsobject.o nswalk.o nsxfobj.o \
|
||||
nsparse.o nspredef.o
|
||||
|
||||
obj-$(ACPI_FUTURE_USAGE) += nsdumpdv.o
|
||||
|
||||
obj-y += psargs.o psparse.o psloop.o pstree.o pswalk.o \
|
||||
psopcode.o psscope.o psutils.o psxface.o
|
||||
|
||||
obj-y += rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o \
|
||||
rscalc.o rsirq.o rsmemory.o rsutils.o
|
||||
|
||||
obj-$(ACPI_FUTURE_USAGE) += rsdump.o
|
||||
|
||||
obj-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
|
||||
|
||||
obj-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
|
||||
utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
|
||||
utstate.o utmutex.o utobject.o utresrc.o
|
63
drivers/acpi/acpica/accommon.h
Normal file
63
drivers/acpi/acpica/accommon.h
Normal file
@ -0,0 +1,63 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Name: accommon.h - Common include files for generation of ACPICA source
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2008, 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 __ACCOMMON_H__
|
||||
#define __ACCOMMON_H__
|
||||
|
||||
/*
|
||||
* Common set of includes for all ACPICA source files.
|
||||
* We put them here because we don't want to duplicate them
|
||||
* in the the source code again and again.
|
||||
*
|
||||
* Note: The order of these include files is important.
|
||||
*/
|
||||
#include "acconfig.h" /* Global configuration constants */
|
||||
#include "acmacros.h" /* C macros */
|
||||
#include "aclocal.h" /* Internal data types */
|
||||
#include "acobject.h" /* ACPI internal object */
|
||||
#include "acstruct.h" /* Common structures */
|
||||
#include "acglobal.h" /* All global variables */
|
||||
#include "achware.h" /* Hardware defines and interfaces */
|
||||
#include "acutils.h" /* Utility interfaces */
|
||||
|
||||
#endif /* __ACCOMMON_H__ */
|
@ -61,10 +61,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20080926
|
||||
|
||||
/*
|
||||
* OS name, used for the _OS object. The _OS object is essentially obsolete,
|
||||
* but there is a large base of ASL/AML code in existing machines that check
|
||||
@ -119,6 +115,10 @@
|
||||
|
||||
#define ACPI_ROOT_TABLE_SIZE_INCREMENT 4
|
||||
|
||||
/* Maximum number of While() loop iterations before forced abort */
|
||||
|
||||
#define ACPI_MAX_LOOP_ITERATIONS 0xFFFF
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* ACPI Specification constants (Do not change unless the specification changes)
|
@ -93,11 +93,13 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
|
||||
*/
|
||||
u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info);
|
||||
|
||||
acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback);
|
||||
acpi_status
|
||||
acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block);
|
||||
struct acpi_gpe_block_info *gpe_block,
|
||||
void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
@ -102,6 +102,12 @@ ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_create_osi_method, TRUE);
|
||||
*/
|
||||
ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_leave_wake_gpes_disabled, 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_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Debug support
|
||||
@ -140,7 +146,7 @@ ACPI_EXTERN u32 acpi_gbl_trace_flags;
|
||||
*/
|
||||
ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list;
|
||||
ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT;
|
||||
extern u8 acpi_gbl_permanent_mmap;
|
||||
ACPI_EXTERN struct acpi_table_facs *acpi_gbl_FACS;
|
||||
|
||||
/* These addresses are calculated from FADT address values */
|
||||
|
||||
@ -326,6 +332,7 @@ ACPI_EXTERN struct acpi_fixed_event_handler
|
||||
ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head;
|
||||
ACPI_EXTERN struct acpi_gpe_block_info
|
||||
*acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS];
|
||||
ACPI_EXTERN u32 acpi_current_gpe_count;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
@ -44,11 +44,7 @@
|
||||
#ifndef __ACHWARE_H__
|
||||
#define __ACHWARE_H__
|
||||
|
||||
/* PM Timer ticks per second (HZ) */
|
||||
|
||||
#define PM_TIMER_FREQUENCY 3579545
|
||||
|
||||
/* Values for the _SST reserved method */
|
||||
/* Values for the _SST predefined method */
|
||||
|
||||
#define ACPI_SST_INDICATOR_OFF 0
|
||||
#define ACPI_SST_WORKING 1
|
||||
@ -56,8 +52,6 @@
|
||||
#define ACPI_SST_SLEEPING 3
|
||||
#define ACPI_SST_SLEEP_CONTEXT 4
|
||||
|
||||
/* Prototypes */
|
||||
|
||||
/*
|
||||
* hwacpi - high level functions
|
||||
*/
|
||||
@ -75,13 +69,6 @@ acpi_hw_register_read(u32 register_id, u32 * return_value);
|
||||
|
||||
acpi_status acpi_hw_register_write(u32 register_id, u32 value);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_low_level_read(u32 width,
|
||||
u32 * value, struct acpi_generic_address *reg);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address *reg);
|
||||
|
||||
acpi_status acpi_hw_clear_acpi_status(void);
|
||||
|
||||
/*
|
||||
@ -94,13 +81,13 @@ acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block);
|
||||
struct acpi_gpe_block_info *gpe_block, void *context);
|
||||
|
||||
acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info *gpe_event_info);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block);
|
||||
struct acpi_gpe_block_info *gpe_block, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info,
|
||||
@ -114,7 +101,8 @@ acpi_status acpi_hw_enable_all_wakeup_gpes(void);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block);
|
||||
struct acpi_gpe_block_info *gpe_block,
|
||||
void *context);
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
/*
|
@ -46,8 +46,6 @@
|
||||
|
||||
/* acpisrc:struct_defs -- for acpisrc conversion */
|
||||
|
||||
#define ACPI_WAIT_FOREVER 0xFFFF /* u16, as per ACPI spec */
|
||||
#define ACPI_DO_NOT_WAIT 0
|
||||
#define ACPI_SERIALIZED 0xFF
|
||||
|
||||
typedef u32 acpi_mutex_handle;
|
||||
@ -120,11 +118,6 @@ static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = {
|
||||
#define ACPI_MAX_LOCK 1
|
||||
#define ACPI_NUM_LOCK ACPI_MAX_LOCK+1
|
||||
|
||||
/* Owner IDs are used to track namespace nodes for selective deletion */
|
||||
|
||||
typedef u8 acpi_owner_id;
|
||||
#define ACPI_OWNER_ID_MAX 0xFF
|
||||
|
||||
/* This Thread ID means that the mutex is not in use (unlocked) */
|
||||
|
||||
#define ACPI_MUTEX_NOT_ACQUIRED (acpi_thread_id) 0
|
||||
@ -165,11 +158,6 @@ typedef enum {
|
||||
ACPI_IMODE_EXECUTE = 0x03
|
||||
} acpi_interpreter_mode;
|
||||
|
||||
union acpi_name_union {
|
||||
u32 integer;
|
||||
char ascii[4];
|
||||
};
|
||||
|
||||
/*
|
||||
* The Namespace Node describes a named object that appears in the AML.
|
||||
* descriptor_type is used to differentiate between internal descriptors.
|
||||
@ -216,26 +204,6 @@ struct acpi_namespace_node {
|
||||
#define ANOBJ_IS_BIT_OFFSET 0x40 /* i_aSL only: Reference is a bit offset */
|
||||
#define ANOBJ_IS_REFERENCED 0x80 /* i_aSL only: Object was referenced */
|
||||
|
||||
/*
|
||||
* ACPI Table Descriptor. One per ACPI table
|
||||
*/
|
||||
struct acpi_table_desc {
|
||||
acpi_physical_address address;
|
||||
struct acpi_table_header *pointer;
|
||||
u32 length; /* Length fixed at 32 bits */
|
||||
union acpi_name_union signature;
|
||||
acpi_owner_id owner_id;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
/* Flags for above */
|
||||
|
||||
#define ACPI_TABLE_ORIGIN_UNKNOWN (0)
|
||||
#define ACPI_TABLE_ORIGIN_MAPPED (1)
|
||||
#define ACPI_TABLE_ORIGIN_ALLOCATED (2)
|
||||
#define ACPI_TABLE_ORIGIN_MASK (3)
|
||||
#define ACPI_TABLE_IS_LOADED (4)
|
||||
|
||||
/* One internal RSDT for table management */
|
||||
|
||||
struct acpi_internal_rsdt {
|
||||
@ -266,15 +234,6 @@ struct acpi_ns_search_data {
|
||||
struct acpi_namespace_node *node;
|
||||
};
|
||||
|
||||
/*
|
||||
* Predefined Namespace items
|
||||
*/
|
||||
struct acpi_predefined_names {
|
||||
char *name;
|
||||
u8 type;
|
||||
char *val;
|
||||
};
|
||||
|
||||
/* Object types used during package copies */
|
||||
|
||||
#define ACPI_COPY_TYPE_SIMPLE 0
|
||||
@ -487,10 +446,15 @@ struct acpi_gpe_walk_info {
|
||||
struct acpi_gpe_block_info *gpe_block;
|
||||
};
|
||||
|
||||
typedef acpi_status(*acpi_gpe_callback) (struct acpi_gpe_xrupt_info *
|
||||
gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *
|
||||
gpe_block);
|
||||
struct acpi_gpe_device_info {
|
||||
u32 index;
|
||||
u32 next_block_base_index;
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *gpe_device;
|
||||
};
|
||||
|
||||
typedef acpi_status(*acpi_gpe_callback) (struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block, void *context);
|
||||
|
||||
/* Information about each particular fixed event */
|
||||
|
||||
@ -566,6 +530,7 @@ struct acpi_control_state {
|
||||
union acpi_parse_object *predicate_op;
|
||||
u8 *aml_predicate_start; /* Start of if/while predicate */
|
||||
u8 *package_end; /* End of if/while block */
|
||||
u32 loop_count; /* While() loop counter */
|
||||
};
|
||||
|
||||
/*
|
||||
@ -671,6 +636,12 @@ union acpi_parse_value {
|
||||
union acpi_parse_object *arg; /* arguments and contained ops */
|
||||
};
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#define ACPI_DISASM_ONLY_MEMBERS(a) a;
|
||||
#else
|
||||
#define ACPI_DISASM_ONLY_MEMBERS(a)
|
||||
#endif
|
||||
|
||||
#define ACPI_PARSE_COMMON \
|
||||
union acpi_parse_object *parent; /* Parent op */\
|
||||
u8 descriptor_type; /* To differentiate various internal objs */\
|
||||
@ -790,9 +761,6 @@ struct acpi_parse_state {
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#define PCI_ROOT_HID_STRING "PNP0A03"
|
||||
#define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08"
|
||||
|
||||
struct acpi_bit_register_info {
|
||||
u8 parent_register;
|
||||
u8 bit_position;
|
||||
@ -1019,26 +987,4 @@ struct acpi_debug_mem_block {
|
||||
#define ACPI_MEM_LIST_MAX 1
|
||||
#define ACPI_NUM_MEM_LISTS 2
|
||||
|
||||
struct acpi_memory_list {
|
||||
char *list_name;
|
||||
void *list_head;
|
||||
u16 object_size;
|
||||
u16 max_depth;
|
||||
u16 current_depth;
|
||||
u16 link_offset;
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
|
||||
/* Statistics for debug memory tracking only */
|
||||
|
||||
u32 total_allocated;
|
||||
u32 total_freed;
|
||||
u32 max_occupied;
|
||||
u32 total_size;
|
||||
u32 current_total_size;
|
||||
u32 requests;
|
||||
u32 hits;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* __ACLOCAL_H__ */
|
@ -44,23 +44,6 @@
|
||||
#ifndef __ACMACROS_H__
|
||||
#define __ACMACROS_H__
|
||||
|
||||
/*
|
||||
* Data manipulation macros
|
||||
*/
|
||||
#define ACPI_LOWORD(l) ((u16)(u32)(l))
|
||||
#define ACPI_HIWORD(l) ((u16)((((u32)(l)) >> 16) & 0xFFFF))
|
||||
#define ACPI_LOBYTE(l) ((u8)(u16)(l))
|
||||
#define ACPI_HIBYTE(l) ((u8)((((u16)(l)) >> 8) & 0xFF))
|
||||
|
||||
#define ACPI_SET_BIT(target,bit) ((target) |= (bit))
|
||||
#define ACPI_CLEAR_BIT(target,bit) ((target) &= ~(bit))
|
||||
#define ACPI_MIN(a,b) (((a)<(b))?(a):(b))
|
||||
#define ACPI_MAX(a,b) (((a)>(b))?(a):(b))
|
||||
|
||||
/* Size calculation */
|
||||
|
||||
#define ACPI_ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
/*
|
||||
* Extract data using a pointer. Any more than a byte and we
|
||||
* get into potential aligment issues -- see the STORE macros below.
|
||||
@ -75,39 +58,6 @@
|
||||
#define ACPI_SET32(ptr) *ACPI_CAST_PTR (u32, ptr)
|
||||
#define ACPI_SET64(ptr) *ACPI_CAST_PTR (u64, ptr)
|
||||
|
||||
/*
|
||||
* Pointer manipulation
|
||||
*/
|
||||
#define ACPI_CAST_PTR(t, p) ((t *) (acpi_uintptr_t) (p))
|
||||
#define ACPI_CAST_INDIRECT_PTR(t, p) ((t **) (acpi_uintptr_t) (p))
|
||||
#define ACPI_ADD_PTR(t, a, b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8, (a)) + (acpi_size)(b)))
|
||||
#define ACPI_PTR_DIFF(a, b) (acpi_size) (ACPI_CAST_PTR (u8, (a)) - ACPI_CAST_PTR (u8, (b)))
|
||||
|
||||
/* Pointer/Integer type conversions */
|
||||
|
||||
#define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void, (void *) NULL, (acpi_size) i)
|
||||
#define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) NULL)
|
||||
#define ACPI_OFFSET(d, f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f), (void *) NULL)
|
||||
#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i)
|
||||
#define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i)
|
||||
|
||||
#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
|
||||
#define ACPI_COMPARE_NAME(a, b) (*ACPI_CAST_PTR (u32, (a)) == *ACPI_CAST_PTR (u32, (b)))
|
||||
#else
|
||||
#define ACPI_COMPARE_NAME(a, b) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_CAST_PTR (char, (b)), ACPI_NAME_SIZE))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Full 64-bit integer must be available on both 32-bit and 64-bit platforms
|
||||
*/
|
||||
struct acpi_integer_overlay {
|
||||
u32 lo_dword;
|
||||
u32 hi_dword;
|
||||
};
|
||||
|
||||
#define ACPI_LODWORD(integer) (ACPI_CAST_PTR (struct acpi_integer_overlay, &integer)->lo_dword)
|
||||
#define ACPI_HIDWORD(integer) (ACPI_CAST_PTR (struct acpi_integer_overlay, &integer)->hi_dword)
|
||||
|
||||
/*
|
||||
* printf() format helpers
|
||||
*/
|
||||
@ -209,7 +159,7 @@ struct acpi_integer_overlay {
|
||||
/*
|
||||
* The hardware does not support unaligned transfers. We must move the
|
||||
* data one byte at a time. These macros work whether the source or
|
||||
* the destination (or both) is/are unaligned. (Little-endian move)
|
||||
* the destination (or both) is/are unaligned. (Little-endian move)
|
||||
*/
|
||||
|
||||
/* 16-bit source, 16/32/64 destination */
|
||||
@ -357,12 +307,6 @@ struct acpi_integer_overlay {
|
||||
{(u32)(Pargs), (u32)(Iargs), (u32)(flags), obj_type, class, type}
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#define ACPI_DISASM_ONLY_MEMBERS(a) a;
|
||||
#else
|
||||
#define ACPI_DISASM_ONLY_MEMBERS(a)
|
||||
#endif
|
||||
|
||||
#define ARG_TYPE_WIDTH 5
|
||||
#define ARG_1(x) ((u32)(x))
|
||||
#define ARG_2(x) ((u32)(x) << (1 * ARG_TYPE_WIDTH))
|
||||
@ -388,32 +332,16 @@ struct acpi_integer_overlay {
|
||||
#define GET_CURRENT_ARG_TYPE(list) (list & ((u32) 0x1F))
|
||||
#define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH))
|
||||
|
||||
#if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)
|
||||
/*
|
||||
* Module name is include in both debug and non-debug versions primarily for
|
||||
* error messages. The __FILE__ macro is not very useful for this, because it
|
||||
* often includes the entire pathname to the module
|
||||
*/
|
||||
#define ACPI_MODULE_NAME(name) static const char ACPI_UNUSED_VAR _acpi_module_name[] = name;
|
||||
#else
|
||||
#define ACPI_MODULE_NAME(name)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Ascii error messages can be configured out
|
||||
*/
|
||||
#ifndef ACPI_NO_ERROR_MESSAGES
|
||||
#define AE_INFO _acpi_module_name, __LINE__
|
||||
|
||||
/*
|
||||
* Error reporting. Callers module and line number are inserted by AE_INFO,
|
||||
* the plist contains a set of parens to allow variable-length lists.
|
||||
* These macros are used for both the debug and non-debug versions of the code.
|
||||
*/
|
||||
#define ACPI_INFO(plist) acpi_ut_info plist
|
||||
#define ACPI_WARNING(plist) acpi_ut_warning plist
|
||||
#define ACPI_EXCEPTION(plist) acpi_ut_exception plist
|
||||
#define ACPI_ERROR(plist) acpi_ut_error plist
|
||||
#define ACPI_ERROR_NAMESPACE(s, e) acpi_ns_report_error (AE_INFO, s, e);
|
||||
#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ns_report_method_error (AE_INFO, s, n, p, e);
|
||||
|
||||
@ -421,50 +349,18 @@ struct acpi_integer_overlay {
|
||||
|
||||
/* No error messages */
|
||||
|
||||
#define ACPI_INFO(plist)
|
||||
#define ACPI_WARNING(plist)
|
||||
#define ACPI_EXCEPTION(plist)
|
||||
#define ACPI_ERROR(plist)
|
||||
#define ACPI_ERROR_NAMESPACE(s, e)
|
||||
#define ACPI_ERROR_METHOD(s, n, p, e)
|
||||
#endif
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
||||
|
||||
/*
|
||||
* Debug macros that are conditionally compiled
|
||||
*/
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
|
||||
/*
|
||||
* Common parameters used for debug output functions:
|
||||
* line number, function name, module(file) name, component ID
|
||||
*/
|
||||
#define ACPI_DEBUG_PARAMETERS __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT
|
||||
|
||||
/*
|
||||
* Function entry tracing
|
||||
*/
|
||||
|
||||
/*
|
||||
* If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header,
|
||||
* define it now. This is the case where there the compiler does not support
|
||||
* a __func__ macro or equivalent.
|
||||
*/
|
||||
#ifndef ACPI_GET_FUNCTION_NAME
|
||||
#define ACPI_GET_FUNCTION_NAME _acpi_function_name
|
||||
/*
|
||||
* The Name parameter should be the procedure name as a quoted string.
|
||||
* The function name is also used by the function exit macros below.
|
||||
* Note: (const char) is used to be compatible with the debug interfaces
|
||||
* and macros such as __func__.
|
||||
*/
|
||||
#define ACPI_FUNCTION_NAME(name) static const char _acpi_function_name[] = #name;
|
||||
|
||||
#else
|
||||
/* Compiler supports __func__ (or equivalent) -- Ignore this macro */
|
||||
|
||||
#define ACPI_FUNCTION_NAME(name)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI_DEBUG_FUNC_TRACE
|
||||
|
||||
#define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \
|
||||
@ -584,15 +480,6 @@ struct acpi_integer_overlay {
|
||||
#define ACPI_DUMP_RESOURCE_LIST(a) acpi_rs_dump_resource_list(a)
|
||||
#define ACPI_DUMP_BUFFER(a, b) acpi_ut_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT)
|
||||
|
||||
/*
|
||||
* Master debug print macros
|
||||
* Print iff:
|
||||
* 1) Debug print for the current component is enabled
|
||||
* 2) Debug error level or trace level for the print statement is enabled
|
||||
*/
|
||||
#define ACPI_DEBUG_PRINT(plist) acpi_ut_debug_print plist
|
||||
#define ACPI_DEBUG_PRINT_RAW(plist) acpi_ut_debug_print_raw plist
|
||||
|
||||
#else
|
||||
/*
|
||||
* This is the non-debug case -- make everything go away,
|
||||
@ -603,7 +490,6 @@ struct acpi_integer_overlay {
|
||||
|
||||
#define ACPI_DEBUG_DEFINE(a) do { } while(0)
|
||||
#define ACPI_DEBUG_ONLY_MEMBERS(a) do { } while(0)
|
||||
#define ACPI_FUNCTION_NAME(a) do { } while(0)
|
||||
#define ACPI_FUNCTION_TRACE(a) do { } while(0)
|
||||
#define ACPI_FUNCTION_TRACE_PTR(a, b) do { } while(0)
|
||||
#define ACPI_FUNCTION_TRACE_U32(a, b) do { } while(0)
|
||||
@ -619,8 +505,6 @@ struct acpi_integer_overlay {
|
||||
#define ACPI_DUMP_PATHNAME(a, b, c, d) do { } while(0)
|
||||
#define ACPI_DUMP_RESOURCE_LIST(a) do { } while(0)
|
||||
#define ACPI_DUMP_BUFFER(a, b) do { } while(0)
|
||||
#define ACPI_DEBUG_PRINT(pl) do { } while(0)
|
||||
#define ACPI_DEBUG_PRINT_RAW(pl) do { } while(0)
|
||||
|
||||
#define return_VOID return
|
||||
#define return_ACPI_STATUS(s) return(s)
|
||||
@ -629,7 +513,7 @@ struct acpi_integer_overlay {
|
||||
#define return_UINT32(s) return(s)
|
||||
#define return_PTR(s) return(s)
|
||||
|
||||
#endif
|
||||
#endif /* ACPI_DEBUG_OUTPUT */
|
||||
|
||||
/*
|
||||
* Some code only gets executed when the debugger is built in.
|
@ -182,7 +182,9 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info);
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
union acpi_operand_object *return_object);
|
||||
u32 user_param_count,
|
||||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct
|
||||
acpi_namespace_node
|
||||
@ -191,6 +193,7 @@ const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct
|
||||
void
|
||||
acpi_ns_check_parameter_count(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *info);
|
||||
|
||||
/*
|
@ -94,6 +94,8 @@ void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded);
|
||||
/*
|
||||
* tbutils - table manager utilities
|
||||
*/
|
||||
acpi_status acpi_tb_initialize_facs(void);
|
||||
|
||||
u8 acpi_tb_tables_loaded(void);
|
||||
|
||||
void
|
@ -297,42 +297,6 @@ void acpi_ut_report_info(char *module_name, u32 line_number);
|
||||
|
||||
void acpi_ut_report_warning(char *module_name, u32 line_number);
|
||||
|
||||
/* Error and message reporting interfaces */
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_debug_print(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_ut_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_ut_error(const char *module_name,
|
||||
u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3);
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_exception(const char *module_name,
|
||||
u32 line_number,
|
||||
acpi_status status,
|
||||
const char *format, ...) ACPI_PRINTF_LIKE(4);
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_warning(const char *module_name,
|
||||
u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3);
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_info(const char *module_name,
|
||||
u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3);
|
||||
|
||||
/*
|
||||
* utdelete - Object deletion and reference counts
|
||||
*/
|
@ -42,11 +42,12 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include "accommon.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acparser.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsfield")
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
#include "acnamesp.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsinit")
|
@ -42,11 +42,14 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#include <acpi/acdisasm.h>
|
||||
#endif
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsmethod")
|
||||
@ -412,6 +415,9 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
|
||||
if (obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY) {
|
||||
status = obj_desc->method.implementation(next_walk_state);
|
||||
if (status == AE_OK) {
|
||||
status = AE_CTRL_TERMINATE;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsmthdat")
|
@ -42,11 +42,12 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsobject")
|
@ -43,13 +43,14 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acevents.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsopcode")
|
||||
@ -1140,9 +1141,28 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
|
||||
op->common.aml_opcode, walk_state));
|
||||
|
||||
switch (op->common.aml_opcode) {
|
||||
case AML_IF_OP:
|
||||
case AML_WHILE_OP:
|
||||
|
||||
/*
|
||||
* If this is an additional iteration of a while loop, continue.
|
||||
* There is no need to allocate a new control state.
|
||||
*/
|
||||
if (walk_state->control_state) {
|
||||
if (walk_state->control_state->control.aml_predicate_start
|
||||
== (walk_state->parser_state.aml - 1)) {
|
||||
|
||||
/* Reset the state to start-of-loop */
|
||||
|
||||
walk_state->control_state->common.state =
|
||||
ACPI_CONTROL_CONDITIONAL_EXECUTING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*lint -fallthrough */
|
||||
|
||||
case AML_IF_OP:
|
||||
|
||||
/*
|
||||
* IF/WHILE: Create a new control state to manage these
|
||||
* constructs. We need to manage these as a stack, in order
|
||||
@ -1243,13 +1263,36 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op));
|
||||
|
||||
if (walk_state->control_state->common.value) {
|
||||
control_state = walk_state->control_state;
|
||||
if (control_state->common.value) {
|
||||
|
||||
/* Predicate was true, go back and evaluate it again! */
|
||||
/* Predicate was true, the body of the loop was just executed */
|
||||
|
||||
/*
|
||||
* This loop counter mechanism allows the interpreter to escape
|
||||
* possibly infinite loops. This can occur in poorly written AML
|
||||
* when the hardware does not respond within a while loop and the
|
||||
* loop does not implement a timeout.
|
||||
*/
|
||||
control_state->control.loop_count++;
|
||||
if (control_state->control.loop_count >
|
||||
ACPI_MAX_LOOP_ITERATIONS) {
|
||||
status = AE_AML_INFINITE_LOOP;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Go back and evaluate the predicate and maybe execute the loop
|
||||
* another time
|
||||
*/
|
||||
status = AE_CTRL_PENDING;
|
||||
walk_state->aml_last_while =
|
||||
control_state->control.aml_predicate_start;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Predicate was false, terminate this while loop */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
"[WHILE_OP] termination! Op=%p\n", op));
|
||||
|
||||
@ -1257,9 +1300,6 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
|
||||
|
||||
control_state =
|
||||
acpi_ut_pop_generic_state(&walk_state->control_state);
|
||||
|
||||
walk_state->aml_last_while =
|
||||
control_state->control.aml_predicate_start;
|
||||
acpi_ut_delete_generic_state(control_state);
|
||||
break;
|
||||
|
@ -42,12 +42,13 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acdebug.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdebug.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsutils")
|
@ -43,12 +43,13 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acdebug.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdebug.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dswexec")
|
@ -42,12 +42,13 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
#include <acpi/acdisasm.h>
|
@ -42,7 +42,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dswscope")
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "acdispat.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dswstate")
|
@ -42,7 +42,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evevent")
|
||||
@ -72,8 +73,8 @@ acpi_status acpi_ev_initialize_events(void)
|
||||
|
||||
/*
|
||||
* Initialize the Fixed and General Purpose Events. This is done prior to
|
||||
* enabling SCIs to prevent interrupts from occurring before the handlers are
|
||||
* installed.
|
||||
* enabling SCIs to prevent interrupts from occurring before the handlers
|
||||
* are installed.
|
||||
*/
|
||||
status = acpi_ev_fixed_event_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -192,8 +193,8 @@ static acpi_status acpi_ev_fixed_event_initialize(void)
|
||||
acpi_status status;
|
||||
|
||||
/*
|
||||
* Initialize the structure that keeps track of fixed event handlers
|
||||
* and enable the fixed events.
|
||||
* Initialize the structure that keeps track of fixed event handlers and
|
||||
* enable the fixed events.
|
||||
*/
|
||||
for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
|
||||
acpi_gbl_fixed_event_handlers[i].handler = NULL;
|
||||
@ -237,7 +238,7 @@ u32 acpi_ev_fixed_event_detect(void)
|
||||
|
||||
/*
|
||||
* Read the fixed feature status and enable registers, as all the cases
|
||||
* depend on their values. Ignore errors here.
|
||||
* depend on their values. Ignore errors here.
|
||||
*/
|
||||
(void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
||||
(void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
||||
@ -291,8 +292,8 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)
|
||||
status_register_id, 1);
|
||||
|
||||
/*
|
||||
* Make sure we've got a handler. If not, report an error.
|
||||
* The event is disabled to prevent further interrupts.
|
||||
* Make sure we've got a handler. If not, report an error. The event is
|
||||
* disabled to prevent further interrupts.
|
||||
*/
|
||||
if (NULL == acpi_gbl_fixed_event_handlers[event].handler) {
|
||||
(void)acpi_set_register(acpi_gbl_fixed_event_info[event].
|
@ -42,8 +42,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evgpe")
|
||||
@ -125,7 +126,7 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
|
||||
(1 <<
|
||||
(gpe_event_info->gpe_number - gpe_register_info->base_gpe_number));
|
||||
|
||||
/* 1) Disable case. Simply clear all enable bits */
|
||||
/* 1) Disable case. Simply clear all enable bits */
|
||||
|
||||
if (type == ACPI_GPE_DISABLE) {
|
||||
ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake,
|
||||
@ -134,7 +135,7 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* 2) Enable case. Set/Clear the appropriate enable bits */
|
||||
/* 2) Enable case. Set/Clear the appropriate enable bits */
|
||||
|
||||
switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) {
|
||||
case ACPI_GPE_TYPE_WAKE:
|
||||
@ -295,7 +296,7 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||
*
|
||||
* FUNCTION: acpi_ev_get_gpe_event_info
|
||||
*
|
||||
* PARAMETERS: gpe_device - Device node. NULL for GPE0/GPE1
|
||||
* PARAMETERS: gpe_device - Device node. NULL for GPE0/GPE1
|
||||
* gpe_number - Raw GPE number
|
||||
*
|
||||
* RETURN: A GPE event_info struct. NULL if not a valid GPE
|
||||
@ -372,7 +373,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
|
||||
*
|
||||
* RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
|
||||
*
|
||||
* DESCRIPTION: Detect if any GP events have occurred. This function is
|
||||
* DESCRIPTION: Detect if any GP events have occurred. This function is
|
||||
* executed at interrupt level.
|
||||
*
|
||||
******************************************************************************/
|
||||
@ -400,8 +401,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
||||
|
||||
/*
|
||||
* We need to obtain the GPE lock for both the data structs and registers
|
||||
* Note: Not necessary to obtain the hardware lock, since the GPE registers
|
||||
* are owned by the gpe_lock.
|
||||
* Note: Not necessary to obtain the hardware lock, since the GPE
|
||||
* registers are owned by the gpe_lock.
|
||||
*/
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
|
||||
@ -410,9 +411,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
||||
gpe_block = gpe_xrupt_list->gpe_block_list_head;
|
||||
while (gpe_block) {
|
||||
/*
|
||||
* Read all of the 8-bit GPE status and enable registers
|
||||
* in this GPE block, saving all of them.
|
||||
* Find all currently active GP events.
|
||||
* Read all of the 8-bit GPE status and enable registers in this GPE
|
||||
* block, saving all of them. Find all currently active GP events.
|
||||
*/
|
||||
for (i = 0; i < gpe_block->register_count; i++) {
|
||||
|
||||
@ -423,10 +423,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
||||
/* Read the Status Register */
|
||||
|
||||
status =
|
||||
acpi_hw_low_level_read(ACPI_GPE_REGISTER_WIDTH,
|
||||
&status_reg,
|
||||
&gpe_register_info->
|
||||
status_address);
|
||||
acpi_read(&status_reg,
|
||||
&gpe_register_info->status_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
@ -434,10 +432,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
||||
/* Read the Enable Register */
|
||||
|
||||
status =
|
||||
acpi_hw_low_level_read(ACPI_GPE_REGISTER_WIDTH,
|
||||
&enable_reg,
|
||||
&gpe_register_info->
|
||||
enable_address);
|
||||
acpi_read(&enable_reg,
|
||||
&gpe_register_info->enable_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
@ -527,8 +523,8 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
|
||||
(void)acpi_ev_enable_gpe(gpe_event_info, FALSE);
|
||||
|
||||
/*
|
||||
* Take a snapshot of the GPE info for this level - we copy the
|
||||
* info to prevent a race condition with remove_handler/remove_block.
|
||||
* Take a snapshot of the GPE info for this level - we copy the info to
|
||||
* prevent a race condition with remove_handler/remove_block.
|
||||
*/
|
||||
ACPI_MEMCPY(&local_gpe_event_info, gpe_event_info,
|
||||
sizeof(struct acpi_gpe_event_info));
|
||||
@ -539,8 +535,8 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
|
||||
}
|
||||
|
||||
/*
|
||||
* Must check for control method type dispatch one more
|
||||
* time to avoid race with ev_gpe_install_handler
|
||||
* Must check for control method type dispatch one more time to avoid a
|
||||
* race with ev_gpe_install_handler
|
||||
*/
|
||||
if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) ==
|
||||
ACPI_GPE_DISPATCH_METHOD) {
|
||||
@ -584,8 +580,8 @@ static void acpi_ev_asynch_enable_gpe(void *context)
|
||||
if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
||||
ACPI_GPE_LEVEL_TRIGGERED) {
|
||||
/*
|
||||
* GPE is level-triggered, we clear the GPE status bit after
|
||||
* handling the event.
|
||||
* GPE is level-triggered, we clear the GPE status bit after handling
|
||||
* the event.
|
||||
*/
|
||||
status = acpi_hw_clear_gpe(gpe_event_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -624,7 +620,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
||||
acpi_os_gpe_count(gpe_number);
|
||||
|
||||
/*
|
||||
* If edge-triggered, clear the GPE status bit now. Note that
|
||||
* If edge-triggered, clear the GPE status bit now. Note that
|
||||
* level-triggered events are cleared after the GPE is serviced.
|
||||
*/
|
||||
if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
||||
@ -650,7 +646,8 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
||||
|
||||
/*
|
||||
* Invoke the installed handler (at interrupt level)
|
||||
* Ignore return status for now. TBD: leave GPE disabled on error?
|
||||
* Ignore return status for now.
|
||||
* TBD: leave GPE disabled on error?
|
||||
*/
|
||||
(void)gpe_event_info->dispatch.handler->address(gpe_event_info->
|
||||
dispatch.
|
||||
@ -708,7 +705,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
||||
gpe_number));
|
||||
|
||||
/*
|
||||
* Disable the GPE. The GPE will remain disabled until the ACPI
|
||||
* Disable the GPE. The GPE will remain disabled until the ACPICA
|
||||
* Core Subsystem is restarted, or a handler is installed.
|
||||
*/
|
||||
status = acpi_ev_disable_gpe(gpe_event_info);
|
@ -42,8 +42,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evgpeblk")
|
||||
@ -124,6 +125,7 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info)
|
||||
* FUNCTION: acpi_ev_walk_gpe_list
|
||||
*
|
||||
* PARAMETERS: gpe_walk_callback - Routine called for each GPE block
|
||||
* Context - Value passed to callback
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -131,7 +133,8 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback)
|
||||
acpi_status
|
||||
acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context)
|
||||
{
|
||||
struct acpi_gpe_block_info *gpe_block;
|
||||
struct acpi_gpe_xrupt_info *gpe_xrupt_info;
|
||||
@ -154,8 +157,13 @@ acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback)
|
||||
|
||||
/* One callback per GPE block */
|
||||
|
||||
status = gpe_walk_callback(gpe_xrupt_info, gpe_block);
|
||||
status =
|
||||
gpe_walk_callback(gpe_xrupt_info, gpe_block,
|
||||
context);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (status == AE_CTRL_END) { /* Callback abort */
|
||||
status = AE_OK;
|
||||
}
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
@ -186,7 +194,8 @@ acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback)
|
||||
|
||||
acpi_status
|
||||
acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block)
|
||||
struct acpi_gpe_block_info *gpe_block,
|
||||
void *context)
|
||||
{
|
||||
struct acpi_gpe_event_info *gpe_event_info;
|
||||
u32 i;
|
||||
@ -309,17 +318,17 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
|
||||
(gpe_block->block_base_number +
|
||||
(gpe_block->register_count * 8)))) {
|
||||
/*
|
||||
* Not valid for this GPE block, just ignore it
|
||||
* However, it may be valid for a different GPE block, since GPE0 and GPE1
|
||||
* methods both appear under \_GPE.
|
||||
* Not valid for this GPE block, just ignore it. However, it may be
|
||||
* valid for a different GPE block, since GPE0 and GPE1 methods both
|
||||
* appear under \_GPE.
|
||||
*/
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we can add this information to the gpe_event_info block
|
||||
* for use during dispatch of this GPE. Default type is RUNTIME, although
|
||||
* this may change when the _PRW methods are executed later.
|
||||
* Now we can add this information to the gpe_event_info block for use
|
||||
* during dispatch of this GPE. Default type is RUNTIME, although this may
|
||||
* change when the _PRW methods are executed later.
|
||||
*/
|
||||
gpe_event_info =
|
||||
&gpe_block->event_info[gpe_number - gpe_block->block_base_number];
|
||||
@ -394,8 +403,8 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
||||
gpe_block = gpe_info->gpe_block;
|
||||
|
||||
/*
|
||||
* The _PRW object must return a package, we are only interested
|
||||
* in the first element
|
||||
* The _PRW object must return a package, we are only interested in the
|
||||
* first element
|
||||
*/
|
||||
obj_desc = pkg_desc->package.elements[0];
|
||||
|
||||
@ -434,7 +443,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
||||
/*
|
||||
* Is this GPE within this block?
|
||||
*
|
||||
* TRUE iff these conditions are true:
|
||||
* TRUE if and only if these conditions are true:
|
||||
* 1) The GPE devices match.
|
||||
* 2) The GPE index(number) is within the range of the Gpe Block
|
||||
* associated with the GPE device.
|
||||
@ -457,6 +466,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_ev_update_gpe_enable_masks(gpe_event_info,
|
||||
ACPI_GPE_DISABLE);
|
||||
@ -476,9 +486,9 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
||||
* RETURN: A GPE interrupt block
|
||||
*
|
||||
* DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
|
||||
* block per unique interrupt level used for GPEs.
|
||||
* Should be called only when the GPE lists are semaphore locked
|
||||
* and not subject to change.
|
||||
* block per unique interrupt level used for GPEs. Should be
|
||||
* called only when the GPE lists are semaphore locked and not
|
||||
* subject to change.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -608,8 +618,9 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_gpe_block
|
||||
*
|
||||
* PARAMETERS: gpe_block - New GPE block
|
||||
* interrupt_number - Xrupt to be associated with this GPE block
|
||||
* PARAMETERS: gpe_block - New GPE block
|
||||
* interrupt_number - Xrupt to be associated with this
|
||||
* GPE block
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -666,7 +677,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
|
||||
*
|
||||
* FUNCTION: acpi_ev_delete_gpe_block
|
||||
*
|
||||
* PARAMETERS: gpe_block - Existing GPE block
|
||||
* PARAMETERS: gpe_block - Existing GPE block
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -688,7 +699,8 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
|
||||
|
||||
/* Disable all GPEs in this block */
|
||||
|
||||
status = acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block);
|
||||
status =
|
||||
acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block, NULL);
|
||||
|
||||
if (!gpe_block->previous && !gpe_block->next) {
|
||||
|
||||
@ -715,6 +727,9 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
}
|
||||
|
||||
acpi_current_gpe_count -=
|
||||
gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH;
|
||||
|
||||
/* Free the gpe_block */
|
||||
|
||||
ACPI_FREE(gpe_block->register_info);
|
||||
@ -786,9 +801,9 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
|
||||
|
||||
/*
|
||||
* Initialize the GPE Register and Event structures. A goal of these
|
||||
* tables is to hide the fact that there are two separate GPE register sets
|
||||
* in a given GPE hardware block, the status registers occupy the first half,
|
||||
* and the enable registers occupy the second half.
|
||||
* tables is to hide the fact that there are two separate GPE register
|
||||
* sets in a given GPE hardware block, the status registers occupy the
|
||||
* first half, and the enable registers occupy the second half.
|
||||
*/
|
||||
this_register = gpe_register_info;
|
||||
this_event = gpe_event_info;
|
||||
@ -816,10 +831,8 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
|
||||
ACPI_GPE_REGISTER_WIDTH;
|
||||
this_register->enable_address.bit_width =
|
||||
ACPI_GPE_REGISTER_WIDTH;
|
||||
this_register->status_address.bit_offset =
|
||||
ACPI_GPE_REGISTER_WIDTH;
|
||||
this_register->enable_address.bit_offset =
|
||||
ACPI_GPE_REGISTER_WIDTH;
|
||||
this_register->status_address.bit_offset = 0;
|
||||
this_register->enable_address.bit_offset = 0;
|
||||
|
||||
/* Init the event_info for each GPE within this register */
|
||||
|
||||
@ -832,18 +845,14 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
|
||||
|
||||
/* Disable all GPEs within this register */
|
||||
|
||||
status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0x00,
|
||||
&this_register->
|
||||
enable_address);
|
||||
status = acpi_write(0x00, &this_register->enable_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Clear any pending GPE events within this register */
|
||||
|
||||
status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0xFF,
|
||||
&this_register->
|
||||
status_address);
|
||||
status = acpi_write(0xFF, &this_register->status_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
@ -956,6 +965,9 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||
gpe_device->name.ascii, gpe_block->register_count,
|
||||
interrupt_number));
|
||||
|
||||
/* Update global count of currently available GPEs */
|
||||
|
||||
acpi_current_gpe_count += register_count * ACPI_GPE_REGISTER_WIDTH;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
@ -1055,7 +1067,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||
|
||||
/* Enable all valid runtime GPEs found above */
|
||||
|
||||
status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block);
|
||||
status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR((AE_INFO, "Could not enable GPEs in GpeBlock %p",
|
||||
gpe_block));
|
@ -42,18 +42,15 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evmisc")
|
||||
|
||||
/* Pointer to FACS needed for the Global Lock */
|
||||
static struct acpi_table_facs *facs = NULL;
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context);
|
||||
|
||||
static u32 acpi_ev_global_lock_handler(void *context);
|
||||
@ -152,7 +149,9 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* All other types are not supported */
|
||||
|
||||
return (AE_TYPE);
|
||||
}
|
||||
}
|
||||
@ -193,9 +192,8 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
|
||||
acpi_ut_delete_generic_state(notify_info);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* There is no notify handler (per-device or system) for this device.
|
||||
*/
|
||||
/* There is no notify handler (per-device or system) for this device */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"No notify handler for Notify (%4.4s, %X) node %p\n",
|
||||
acpi_ut_get_node_name(node), notify_value,
|
||||
@ -229,9 +227,8 @@ static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context)
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/*
|
||||
* We will invoke a global notify handler if installed.
|
||||
* This is done _before_ we invoke the per-device handler attached
|
||||
* to the device.
|
||||
* We will invoke a global notify handler if installed. This is done
|
||||
* _before_ we invoke the per-device handler attached to the device.
|
||||
*/
|
||||
if (notify_info->notify.value <= ACPI_MAX_SYS_NOTIFY) {
|
||||
|
||||
@ -299,7 +296,7 @@ static u32 acpi_ev_global_lock_handler(void *context)
|
||||
* If we don't get it now, it will be marked pending and we will
|
||||
* take another interrupt when it becomes free.
|
||||
*/
|
||||
ACPI_ACQUIRE_GLOBAL_LOCK(facs, acquired);
|
||||
ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_FACS, acquired);
|
||||
if (acquired) {
|
||||
|
||||
/* Got the lock, now wake all threads waiting for it */
|
||||
@ -336,34 +333,27 @@ acpi_status acpi_ev_init_global_lock_handler(void)
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_init_global_lock_handler);
|
||||
|
||||
status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&facs));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
/* Attempt installation of the global lock handler */
|
||||
|
||||
acpi_gbl_global_lock_present = TRUE;
|
||||
status = acpi_install_fixed_event_handler(ACPI_EVENT_GLOBAL,
|
||||
acpi_ev_global_lock_handler,
|
||||
NULL);
|
||||
|
||||
/*
|
||||
* If the global lock does not exist on this platform, the attempt
|
||||
* to enable GBL_STATUS will fail (the GBL_ENABLE bit will not stick)
|
||||
* Map to AE_OK, but mark global lock as not present.
|
||||
* Any attempt to actually use the global lock will be flagged
|
||||
* with an error.
|
||||
* If the global lock does not exist on this platform, the attempt to
|
||||
* enable GBL_STATUS will fail (the GBL_ENABLE bit will not stick).
|
||||
* Map to AE_OK, but mark global lock as not present. Any attempt to
|
||||
* actually use the global lock will be flagged with an error.
|
||||
*/
|
||||
if (status == AE_NO_HARDWARE_RESPONSE) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"No response from Global Lock hardware, disabling lock"));
|
||||
|
||||
acpi_gbl_global_lock_present = FALSE;
|
||||
status = AE_OK;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
acpi_gbl_global_lock_present = TRUE;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
@ -462,8 +452,8 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure that a global lock actually exists. If not, just treat
|
||||
* the lock as a standard mutex.
|
||||
* Make sure that a global lock actually exists. If not, just treat the
|
||||
* lock as a standard mutex.
|
||||
*/
|
||||
if (!acpi_gbl_global_lock_present) {
|
||||
acpi_gbl_global_lock_acquired = TRUE;
|
||||
@ -472,7 +462,7 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)
|
||||
|
||||
/* Attempt to acquire the actual hardware lock */
|
||||
|
||||
ACPI_ACQUIRE_GLOBAL_LOCK(facs, acquired);
|
||||
ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_FACS, acquired);
|
||||
if (acquired) {
|
||||
|
||||
/* We got the lock */
|
||||
@ -536,7 +526,7 @@ acpi_status acpi_ev_release_global_lock(void)
|
||||
|
||||
/* Allow any thread to release the lock */
|
||||
|
||||
ACPI_RELEASE_GLOBAL_LOCK(facs, pending);
|
||||
ACPI_RELEASE_GLOBAL_LOCK(acpi_gbl_FACS, pending);
|
||||
|
||||
/*
|
||||
* If the pending bit was set, we must write GBL_RLS to the control
|
||||
@ -582,8 +572,8 @@ void acpi_ev_terminate(void)
|
||||
|
||||
if (acpi_gbl_events_initialized) {
|
||||
/*
|
||||
* Disable all event-related functionality.
|
||||
* In all cases, on error, print a message but obviously we don't abort.
|
||||
* Disable all event-related functionality. In all cases, on error,
|
||||
* print a message but obviously we don't abort.
|
||||
*/
|
||||
|
||||
/* Disable all fixed events */
|
||||
@ -599,7 +589,7 @@ void acpi_ev_terminate(void)
|
||||
|
||||
/* Disable all GPEs in all GPE blocks */
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block);
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
|
||||
|
||||
/* Remove SCI handler */
|
||||
|
||||
@ -617,7 +607,7 @@ void acpi_ev_terminate(void)
|
||||
|
||||
/* Deallocate all handler objects installed within GPE info structs */
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_ev_delete_gpe_handlers);
|
||||
status = acpi_ev_walk_gpe_list(acpi_ev_delete_gpe_handlers, NULL);
|
||||
|
||||
/* Return to original mode if necessary */
|
||||
|
@ -42,22 +42,15 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evregion")
|
||||
#define ACPI_NUM_DEFAULT_SPACES 4
|
||||
static u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
|
||||
ACPI_ADR_SPACE_SYSTEM_MEMORY,
|
||||
ACPI_ADR_SPACE_SYSTEM_IO,
|
||||
ACPI_ADR_SPACE_PCI_CONFIG,
|
||||
ACPI_ADR_SPACE_DATA_TABLE
|
||||
};
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
@ -66,6 +59,17 @@ static acpi_status
|
||||
acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
|
||||
/* These are the address spaces that will get default handlers */
|
||||
|
||||
#define ACPI_NUM_DEFAULT_SPACES 4
|
||||
|
||||
static u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
|
||||
ACPI_ADR_SPACE_SYSTEM_MEMORY,
|
||||
ACPI_ADR_SPACE_SYSTEM_IO,
|
||||
ACPI_ADR_SPACE_PCI_CONFIG,
|
||||
ACPI_ADR_SPACE_DATA_TABLE
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_region_handlers
|
||||
@ -91,18 +95,19 @@ acpi_status acpi_ev_install_region_handlers(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* All address spaces (PCI Config, EC, SMBus) are scope dependent
|
||||
* and registration must occur for a specific device.
|
||||
* All address spaces (PCI Config, EC, SMBus) are scope dependent and
|
||||
* registration must occur for a specific device.
|
||||
*
|
||||
* In the case of the system memory and IO address spaces there is currently
|
||||
* no device associated with the address space. For these we use the root.
|
||||
* In the case of the system memory and IO address spaces there is
|
||||
* currently no device associated with the address space. For these we
|
||||
* use the root.
|
||||
*
|
||||
* We install the default PCI config space handler at the root so
|
||||
* that this space is immediately available even though the we have
|
||||
* not enumerated all the PCI Root Buses yet. This is to conform
|
||||
* to the ACPI specification which states that the PCI config
|
||||
* space must be always available -- even though we are nowhere
|
||||
* near ready to find the PCI root buses at this point.
|
||||
* We install the default PCI config space handler at the root so that
|
||||
* this space is immediately available even though the we have not
|
||||
* enumerated all the PCI Root Buses yet. This is to conform to the ACPI
|
||||
* specification which states that the PCI config space must be always
|
||||
* available -- even though we are nowhere near ready to find the PCI root
|
||||
* buses at this point.
|
||||
*
|
||||
* NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler
|
||||
* has already been installed (via acpi_install_address_space_handler).
|
||||
@ -160,12 +165,11 @@ acpi_status acpi_ev_initialize_op_regions(void)
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Run the _REG methods for op_regions in each default address space
|
||||
*/
|
||||
for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
|
||||
/* Run the _REG methods for op_regions in each default address space */
|
||||
|
||||
/* TBD: Make sure handler is the DEFAULT handler, otherwise
|
||||
for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
|
||||
/*
|
||||
* TBD: Make sure handler is the DEFAULT handler, otherwise
|
||||
* _REG will have already been run.
|
||||
*/
|
||||
status = acpi_ev_execute_reg_methods(acpi_gbl_root_node,
|
||||
@ -318,13 +322,13 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
}
|
||||
|
||||
/*
|
||||
* It may be the case that the region has never been initialized
|
||||
* It may be the case that the region has never been initialized.
|
||||
* Some types of regions require special init code
|
||||
*/
|
||||
if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
|
||||
/*
|
||||
* This region has not been initialized yet, do it
|
||||
*/
|
||||
|
||||
/* This region has not been initialized yet, do it */
|
||||
|
||||
region_setup = handler_desc->address_space.setup;
|
||||
if (!region_setup) {
|
||||
|
||||
@ -339,9 +343,9 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
}
|
||||
|
||||
/*
|
||||
* We must exit the interpreter because the region
|
||||
* setup will potentially execute control methods
|
||||
* (e.g., _REG method for this region)
|
||||
* We must exit the interpreter because the region setup will
|
||||
* potentially execute control methods (for example, the _REG method
|
||||
* for this region)
|
||||
*/
|
||||
acpi_ex_exit_interpreter();
|
||||
|
||||
@ -364,9 +368,8 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Region initialization may have been completed by region_setup
|
||||
*/
|
||||
/* Region initialization may have been completed by region_setup */
|
||||
|
||||
if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
|
||||
region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE;
|
||||
|
||||
@ -521,8 +524,8 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
|
||||
}
|
||||
|
||||
/*
|
||||
* If the region has been activated, call the setup handler
|
||||
* with the deactivate notification
|
||||
* If the region has been activated, call the setup handler with
|
||||
* the deactivate notification
|
||||
*/
|
||||
if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) {
|
||||
region_setup = handler_obj->address_space.setup;
|
||||
@ -668,8 +671,8 @@ acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* We only care about regions.and objects
|
||||
* that are allowed to have address space handlers
|
||||
* We only care about regions and objects that are allowed to have
|
||||
* address space handlers
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_DEVICE) &&
|
||||
(node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
|
||||
@ -710,9 +713,9 @@ acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
/*
|
||||
* Since the object we found it on was a device, then it
|
||||
* means that someone has already installed a handler for
|
||||
* the branch of the namespace from this device on. Just
|
||||
* the branch of the namespace from this device on. Just
|
||||
* bail out telling the walk routine to not traverse this
|
||||
* branch. This preserves the scoping rule for handlers.
|
||||
* branch. This preserves the scoping rule for handlers.
|
||||
*/
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
@ -723,9 +726,8 @@ acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* As long as the device didn't have a handler for this
|
||||
* space we don't care about it. We just ignore it and
|
||||
* proceed.
|
||||
* As long as the device didn't have a handler for this space we
|
||||
* don't care about it. We just ignore it and proceed.
|
||||
*/
|
||||
return (AE_OK);
|
||||
}
|
||||
@ -733,16 +735,14 @@ acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
/* Object is a Region */
|
||||
|
||||
if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
|
||||
/*
|
||||
* This region is for a different address space
|
||||
* -- just ignore it
|
||||
*/
|
||||
|
||||
/* This region is for a different address space, just ignore it */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we have a region and it is for the handler's address
|
||||
* space type.
|
||||
* Now we have a region and it is for the handler's address space type.
|
||||
*
|
||||
* First disconnect region for any previous handler (if any)
|
||||
*/
|
||||
@ -786,9 +786,8 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
||||
ACPI_FUNCTION_TRACE(ev_install_space_handler);
|
||||
|
||||
/*
|
||||
* This registration is valid for only the types below
|
||||
* and the root. This is where the default handlers
|
||||
* get placed.
|
||||
* This registration is valid for only the types below and the root. This
|
||||
* is where the default handlers get placed.
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_DEVICE) &&
|
||||
(node->type != ACPI_TYPE_PROCESSOR) &&
|
||||
@ -848,8 +847,8 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (obj_desc) {
|
||||
/*
|
||||
* The attached device object already exists.
|
||||
* Make sure the handler is not already installed.
|
||||
* The attached device object already exists. Make sure the handler
|
||||
* is not already installed.
|
||||
*/
|
||||
handler_obj = obj_desc->device.handler;
|
||||
|
||||
@ -864,8 +863,8 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
||||
handler) {
|
||||
/*
|
||||
* It is (relatively) OK to attempt to install the SAME
|
||||
* handler twice. This can easily happen
|
||||
* with PCI_Config space.
|
||||
* handler twice. This can easily happen with the
|
||||
* PCI_Config space.
|
||||
*/
|
||||
status = AE_SAME_HANDLER;
|
||||
goto unlock_and_exit;
|
||||
@ -925,9 +924,8 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
||||
/*
|
||||
* Install the handler
|
||||
*
|
||||
* At this point there is no existing handler.
|
||||
* Just allocate the object for the handler and link it
|
||||
* into the list.
|
||||
* At this point there is no existing handler. Just allocate the object
|
||||
* for the handler and link it into the list.
|
||||
*/
|
||||
handler_obj =
|
||||
acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_ADDRESS_HANDLER);
|
||||
@ -1000,11 +998,10 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
||||
ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
|
||||
|
||||
/*
|
||||
* Run all _REG methods for all Operation Regions for this
|
||||
* space ID. This is a separate walk in order to handle any
|
||||
* interdependencies between regions and _REG methods. (i.e. handlers
|
||||
* must be installed for all regions of this Space ID before we
|
||||
* can run any _REG methods)
|
||||
* Run all _REG methods for all Operation Regions for this space ID. This
|
||||
* is a separate walk in order to handle any interdependencies between
|
||||
* regions and _REG methods. (i.e. handlers must be installed for all
|
||||
* regions of this Space ID before we can run any _REG methods)
|
||||
*/
|
||||
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
|
||||
ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
|
||||
@ -1042,8 +1039,8 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* We only care about regions.and objects
|
||||
* that are allowed to have address space handlers
|
||||
* We only care about regions.and objects that are allowed to have address
|
||||
* space handlers
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
|
||||
return (AE_OK);
|
||||
@ -1062,10 +1059,9 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
/* Object is a Region */
|
||||
|
||||
if (obj_desc->region.space_id != space_id) {
|
||||
/*
|
||||
* This region is for a different address space
|
||||
* -- just ignore it
|
||||
*/
|
||||
|
||||
/* This region is for a different address space, just ignore it */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
@ -42,8 +42,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evrgnini")
|
||||
@ -233,9 +234,9 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (status == AE_SAME_HANDLER) {
|
||||
/*
|
||||
* It is OK if the handler is already installed on the root
|
||||
* bridge. Still need to return a context object for the
|
||||
* new PCI_Config operation region, however.
|
||||
* It is OK if the handler is already installed on the
|
||||
* root bridge. Still need to return a context object
|
||||
* for the new PCI_Config operation region, however.
|
||||
*/
|
||||
status = AE_OK;
|
||||
} else {
|
||||
@ -272,8 +273,8 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* For PCI_Config space access, we need the segment, bus,
|
||||
* device and function numbers. Acquire them here.
|
||||
* For PCI_Config space access, we need the segment, bus, device and
|
||||
* function numbers. Acquire them here.
|
||||
*
|
||||
* Find the parent device object. (This allows the operation region to be
|
||||
* within a subscope under the device, such as a control method.)
|
||||
@ -289,16 +290,16 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the PCI device and function numbers from the _ADR object
|
||||
* contained in the parent's scope.
|
||||
* Get the PCI device and function numbers from the _ADR object contained
|
||||
* in the parent's scope.
|
||||
*/
|
||||
status =
|
||||
acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, pci_device_node,
|
||||
&pci_value);
|
||||
|
||||
/*
|
||||
* The default is zero, and since the allocation above zeroed
|
||||
* the data, just do nothing on failure.
|
||||
* The default is zero, and since the allocation above zeroed the data,
|
||||
* just do nothing on failure.
|
||||
*/
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
pci_id->device = ACPI_HIWORD(ACPI_LODWORD(pci_value));
|
||||
@ -382,9 +383,8 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
|
||||
struct acpi_compatible_id_list *cid;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* Get the _HID and check for a PCI Root Bridge
|
||||
*/
|
||||
/* Get the _HID and check for a PCI Root Bridge */
|
||||
|
||||
status = acpi_ut_execute_HID(node, &hid);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (FALSE);
|
||||
@ -394,10 +394,8 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* The _HID did not match.
|
||||
* Get the _CID and check for a PCI Root Bridge
|
||||
*/
|
||||
/* The _HID did not match. Get the _CID and check for a PCI Root Bridge */
|
||||
|
||||
status = acpi_ut_execute_CID(node, &cid);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (FALSE);
|
||||
@ -516,9 +514,9 @@ acpi_ev_default_region_setup(acpi_handle handle,
|
||||
* Get the appropriate address space handler for a newly
|
||||
* created region.
|
||||
*
|
||||
* This also performs address space specific initialization. For
|
||||
* This also performs address space specific initialization. For
|
||||
* example, PCI regions must have an _ADR object that contains
|
||||
* a PCI address in the scope of the definition. This address is
|
||||
* a PCI address in the scope of the definition. This address is
|
||||
* required to perform an access to PCI config space.
|
||||
*
|
||||
* MUTEX: Interpreter should be unlocked, because we may run the _REG
|
||||
@ -572,7 +570,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
/*
|
||||
* The _REG method is optional and there can be only one per region
|
||||
* definition. This will be executed when the handler is attached
|
||||
* definition. This will be executed when the handler is attached
|
||||
* or removed
|
||||
*/
|
||||
region_obj2->extra.method_REG = method_node;
|
||||
@ -670,10 +668,8 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This node does not have the handler we need;
|
||||
* Pop up one level
|
||||
*/
|
||||
/* This node does not have the handler we need; Pop up one level */
|
||||
|
||||
node = acpi_ns_get_parent_node(node);
|
||||
}
|
||||
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evsci")
|
||||
@ -115,10 +116,8 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
|
||||
* if this interrupt handler is installed, ACPI is enabled.
|
||||
*/
|
||||
|
||||
/*
|
||||
* GPEs:
|
||||
* Check for and dispatch any GPEs that have occurred
|
||||
*/
|
||||
/* GPEs: Check for and dispatch any GPEs that have occurred */
|
||||
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
return_UINT32(interrupt_handled);
|
||||
@ -158,11 +157,11 @@ u32 acpi_ev_install_sci_handler(void)
|
||||
* RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not
|
||||
* installed to begin with
|
||||
*
|
||||
* DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
|
||||
* DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
|
||||
* taken.
|
||||
*
|
||||
* Note: It doesn't seem important to disable all events or set the event
|
||||
* enable registers to their original values. The OS should disable
|
||||
* enable registers to their original values. The OS should disable
|
||||
* the SCI interrupt level when the handler is removed, so no more
|
||||
* events will come in.
|
||||
*
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acevents.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evxface")
|
||||
@ -267,7 +268,7 @@ acpi_install_notify_handler(acpi_handle device,
|
||||
/*
|
||||
* Root Object:
|
||||
* Registering a notify handler on the root object indicates that the
|
||||
* caller wishes to receive notifications for all objects. Note that
|
||||
* caller wishes to receive notifications for all objects. Note that
|
||||
* only one <external> global handler can be regsitered (per notify type).
|
||||
*/
|
||||
if (device == ACPI_ROOT_OBJECT) {
|
@ -42,13 +42,19 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evxfevnt")
|
||||
|
||||
/* Local prototypes */
|
||||
acpi_status
|
||||
acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block, void *context);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_enable
|
||||
@ -60,6 +66,7 @@ ACPI_MODULE_NAME("evxfevnt")
|
||||
* DESCRIPTION: Transfers the system into ACPI mode.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_enable(void)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
@ -161,8 +168,8 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable the requested fixed event (by writing a one to the
|
||||
* enable register bit)
|
||||
* Enable the requested fixed event (by writing a one to the enable
|
||||
* register bit)
|
||||
*/
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
@ -343,8 +350,8 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable the requested fixed event (by writing a zero to the
|
||||
* enable register bit)
|
||||
* Disable the requested fixed event (by writing a zero to the enable
|
||||
* register bit)
|
||||
*/
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
@ -396,8 +403,8 @@ acpi_status acpi_clear_event(u32 event)
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear the requested fixed event (By writing a one to the
|
||||
* status register bit)
|
||||
* Clear the requested fixed event (By writing a one to the status
|
||||
* register bit)
|
||||
*/
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
@ -717,3 +724,148 @@ acpi_status acpi_remove_gpe_block(acpi_handle gpe_device)
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_remove_gpe_block)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_gpe_device
|
||||
*
|
||||
* PARAMETERS: Index - System GPE index (0-current_gpe_count)
|
||||
* gpe_device - Where the parent GPE Device is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Obtain the GPE device associated with the input index. A NULL
|
||||
* gpe device indicates that the gpe number is contained in one of
|
||||
* the FADT-defined gpe blocks. Otherwise, the GPE block device.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_get_gpe_device(u32 index, acpi_handle *gpe_device)
|
||||
{
|
||||
struct acpi_gpe_device_info info;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_get_gpe_device);
|
||||
|
||||
if (!gpe_device) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (index >= acpi_current_gpe_count) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/* Setup and walk the GPE list */
|
||||
|
||||
info.index = index;
|
||||
info.status = AE_NOT_EXIST;
|
||||
info.gpe_device = NULL;
|
||||
info.next_block_base_index = 0;
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_ev_get_gpe_device, &info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
*gpe_device = info.gpe_device;
|
||||
return_ACPI_STATUS(info.status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_get_gpe_device)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_get_gpe_device
|
||||
*
|
||||
* PARAMETERS: GPE_WALK_CALLBACK
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Matches the input GPE index (0-current_gpe_count) with a GPE
|
||||
* block device. NULL if the GPE is one of the FADT-defined GPEs.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block, void *context)
|
||||
{
|
||||
struct acpi_gpe_device_info *info = context;
|
||||
|
||||
/* Increment Index by the number of GPEs in this block */
|
||||
|
||||
info->next_block_base_index +=
|
||||
(gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH);
|
||||
|
||||
if (info->index < info->next_block_base_index) {
|
||||
/*
|
||||
* The GPE index is within this block, get the node. Leave the node
|
||||
* NULL for the FADT-defined GPEs
|
||||
*/
|
||||
if ((gpe_block->node)->type == ACPI_TYPE_DEVICE) {
|
||||
info->gpe_device = gpe_block->node;
|
||||
}
|
||||
|
||||
info->status = AE_OK;
|
||||
return (AE_CTRL_END);
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_disable_all_gpes
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Disable and clear all GPEs in all GPE blocks
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_disable_all_gpes(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_disable_all_gpes);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
status = acpi_hw_disable_all_gpes();
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_enable_all_runtime_gpes
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_enable_all_runtime_gpes(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_enable_all_runtime_gpes);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
status = acpi_hw_enable_all_runtime_gpes();
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
@ -43,8 +43,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evxfregn")
|
@ -42,10 +42,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/actables.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#include "actables.h"
|
||||
#include "acdispat.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exconfig")
|
@ -42,8 +42,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exconvrt")
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("excreate")
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exdump")
|
@ -42,8 +42,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exfield")
|
@ -42,10 +42,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "acevents.h"
|
||||
#include "acdispat.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exfldio")
|
||||
@ -498,14 +499,13 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"I/O to Data Register: ValuePtr %p\n",
|
||||
value));
|
||||
|
||||
if (read_write == ACPI_READ) {
|
||||
|
||||
/* Read the datum from the data_register */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"Read from Data Register\n"));
|
||||
|
||||
status =
|
||||
acpi_ex_extract_from_field(obj_desc->index_field.
|
||||
data_obj, value,
|
||||
@ -513,6 +513,10 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
|
||||
} else {
|
||||
/* Write the datum to the data_register */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"Write to Data Register: Value %8.8X%8.8X\n",
|
||||
ACPI_FORMAT_UINT64(*value)));
|
||||
|
||||
status =
|
||||
acpi_ex_insert_into_field(obj_desc->index_field.
|
||||
data_obj, value,
|
@ -43,9 +43,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/amlresrc.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "amlresrc.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exmisc")
|
@ -43,8 +43,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exmutex")
|
@ -43,8 +43,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exnames")
|
@ -43,11 +43,12 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exoparg1")
|
@ -42,10 +42,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "acinterp.h"
|
||||
#include "acevents.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exoparg2")
|
@ -43,9 +43,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exoparg3")
|
@ -43,9 +43,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exoparg6")
|
@ -43,9 +43,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exprep")
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exregion")
|
@ -43,9 +43,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exresnte")
|
@ -43,10 +43,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exresolv")
|
@ -43,10 +43,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "amlcode.h"
|
||||
#include "acparser.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exresop")
|
@ -43,10 +43,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exstore")
|
@ -44,8 +44,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exstoren")
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exstorob")
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exsystem")
|
@ -59,8 +59,9 @@
|
||||
#define DEFINE_AML_GLOBALS
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exutils")
|
@ -43,6 +43,7 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwacpi")
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acevents.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwgpe")
|
||||
@ -51,7 +52,8 @@ ACPI_MODULE_NAME("hwgpe")
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block);
|
||||
struct acpi_gpe_block_info *gpe_block,
|
||||
void *context);
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
@ -80,8 +82,7 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||
|
||||
/* Get current value of the enable register that contains this GPE */
|
||||
|
||||
status = acpi_hw_low_level_read(ACPI_GPE_REGISTER_WIDTH, &enable_mask,
|
||||
&gpe_register_info->enable_address);
|
||||
status = acpi_read(&enable_mask, &gpe_register_info->enable_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -95,9 +96,7 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
||||
|
||||
/* Write the updated enable mask */
|
||||
|
||||
status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, enable_mask,
|
||||
&gpe_register_info->enable_address);
|
||||
|
||||
status = acpi_write(enable_mask, &gpe_register_info->enable_address);
|
||||
return (status);
|
||||
}
|
||||
|
||||
@ -132,8 +131,8 @@ acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info)
|
||||
|
||||
/* Write the entire GPE (runtime) enable register */
|
||||
|
||||
status = acpi_hw_low_level_write(8, gpe_register_info->enable_for_run,
|
||||
&gpe_register_info->enable_address);
|
||||
status = acpi_write(gpe_register_info->enable_for_run,
|
||||
&gpe_register_info->enable_address);
|
||||
|
||||
return (status);
|
||||
}
|
||||
@ -166,9 +165,8 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
|
||||
* Write a one to the appropriate bit in the status register to
|
||||
* clear this GPE.
|
||||
*/
|
||||
status = acpi_hw_low_level_write(8, register_bit,
|
||||
&gpe_event_info->register_info->
|
||||
status_address);
|
||||
status = acpi_write(register_bit,
|
||||
&gpe_event_info->register_info->status_address);
|
||||
|
||||
return (status);
|
||||
}
|
||||
@ -227,9 +225,7 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
|
||||
|
||||
/* GPE currently active (status bit == 1)? */
|
||||
|
||||
status =
|
||||
acpi_hw_low_level_read(8, &in_byte,
|
||||
&gpe_register_info->status_address);
|
||||
status = acpi_read(&in_byte, &gpe_register_info->status_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
@ -260,8 +256,8 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info * gpe_block)
|
||||
acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block, void *context)
|
||||
{
|
||||
u32 i;
|
||||
acpi_status status;
|
||||
@ -272,9 +268,9 @@ acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
|
||||
/* Disable all GPEs in this register */
|
||||
|
||||
status = acpi_hw_low_level_write(8, 0x00,
|
||||
&gpe_block->register_info[i].
|
||||
enable_address);
|
||||
status =
|
||||
acpi_write(0x00,
|
||||
&gpe_block->register_info[i].enable_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -297,8 +293,8 @@ acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info * gpe_block)
|
||||
acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block, void *context)
|
||||
{
|
||||
u32 i;
|
||||
acpi_status status;
|
||||
@ -309,9 +305,9 @@ acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
|
||||
/* Clear status on all GPEs in this register */
|
||||
|
||||
status = acpi_hw_low_level_write(8, 0xFF,
|
||||
&gpe_block->register_info[i].
|
||||
status_address);
|
||||
status =
|
||||
acpi_write(0xFF,
|
||||
&gpe_block->register_info[i].status_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -335,8 +331,8 @@ acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info * gpe_block)
|
||||
acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block, void *context)
|
||||
{
|
||||
u32 i;
|
||||
acpi_status status;
|
||||
@ -352,12 +348,9 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
|
||||
/* Enable all "runtime" GPEs in this register */
|
||||
|
||||
status =
|
||||
acpi_hw_low_level_write(8,
|
||||
gpe_block->register_info[i].
|
||||
enable_for_run,
|
||||
&gpe_block->register_info[i].
|
||||
enable_address);
|
||||
status = acpi_write(gpe_block->register_info[i].enable_for_run,
|
||||
&gpe_block->register_info[i].
|
||||
enable_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -382,7 +375,8 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
|
||||
|
||||
static acpi_status
|
||||
acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
struct acpi_gpe_block_info *gpe_block)
|
||||
struct acpi_gpe_block_info *gpe_block,
|
||||
void *context)
|
||||
{
|
||||
u32 i;
|
||||
acpi_status status;
|
||||
@ -396,11 +390,9 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
|
||||
/* Enable all "wake" GPEs in this register */
|
||||
|
||||
status = acpi_hw_low_level_write(8,
|
||||
gpe_block->register_info[i].
|
||||
enable_for_wake,
|
||||
&gpe_block->register_info[i].
|
||||
enable_address);
|
||||
status = acpi_write(gpe_block->register_info[i].enable_for_wake,
|
||||
&gpe_block->register_info[i].
|
||||
enable_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -427,8 +419,8 @@ acpi_status acpi_hw_disable_all_gpes(void)
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_disable_all_gpes);
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block);
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block);
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block, NULL);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
@ -450,7 +442,7 @@ acpi_status acpi_hw_enable_all_runtime_gpes(void)
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_enable_all_runtime_gpes);
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_enable_runtime_gpe_block);
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_enable_runtime_gpe_block, NULL);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
@ -472,6 +464,6 @@ acpi_status acpi_hw_enable_all_wakeup_gpes(void)
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_enable_all_wakeup_gpes);
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_enable_wakeup_gpe_block);
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_enable_wakeup_gpe_block, NULL);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
353
drivers/acpi/acpica/hwregs.c
Normal file
353
drivers/acpi/acpica/hwregs.c
Normal file
@ -0,0 +1,353 @@
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Module Name: hwregs - Read/write access functions for the various ACPI
|
||||
* control and status registers.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2008, 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 "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwregs")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_clear_acpi_status
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Clears all fixed and general purpose status bits
|
||||
* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_hw_clear_acpi_status(void)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_cpu_flags lock_flags = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_clear_acpi_status);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %04X\n",
|
||||
ACPI_BITMASK_ALL_FIXED_STATUS,
|
||||
(u16) acpi_gbl_FADT.xpm1a_event_block.address));
|
||||
|
||||
lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS,
|
||||
ACPI_BITMASK_ALL_FIXED_STATUS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Clear the fixed events */
|
||||
|
||||
if (acpi_gbl_FADT.xpm1b_event_block.address) {
|
||||
status = acpi_write(ACPI_BITMASK_ALL_FIXED_STATUS,
|
||||
&acpi_gbl_FADT.xpm1b_event_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear the GPE Bits in all GPE registers in all GPE blocks */
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block, NULL);
|
||||
|
||||
unlock_and_exit:
|
||||
acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_get_register_bit_mask
|
||||
*
|
||||
* PARAMETERS: register_id - Index of ACPI Register to access
|
||||
*
|
||||
* RETURN: The bitmask to be used when accessing the register
|
||||
*
|
||||
* DESCRIPTION: Map register_id into a register bitmask.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id)
|
||||
{
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (register_id > ACPI_BITREG_MAX) {
|
||||
ACPI_ERROR((AE_INFO, "Invalid BitRegister ID: %X",
|
||||
register_id));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
return (&acpi_gbl_bit_register_info[register_id]);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_register_read
|
||||
*
|
||||
* PARAMETERS: register_id - ACPI Register ID
|
||||
* return_value - Where the register value is returned
|
||||
*
|
||||
* RETURN: Status and the value read.
|
||||
*
|
||||
* DESCRIPTION: Read from the specified ACPI register
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_hw_register_read(u32 register_id, u32 * return_value)
|
||||
{
|
||||
u32 value1 = 0;
|
||||
u32 value2 = 0;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_register_read);
|
||||
|
||||
switch (register_id) {
|
||||
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_FADT.xpm1a_event_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* PM1B is optional */
|
||||
|
||||
status = acpi_read(&value2, &acpi_gbl_FADT.xpm1b_event_block);
|
||||
value1 |= value2;
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_xpm1a_enable);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* PM1B is optional */
|
||||
|
||||
status = acpi_read(&value2, &acpi_gbl_xpm1b_enable);
|
||||
value1 |= value2;
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_FADT.xpm1a_control_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
status = acpi_read(&value2, &acpi_gbl_FADT.xpm1b_control_block);
|
||||
value1 |= value2;
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_FADT.xpm2_control_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_FADT.xpm_timer_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
|
||||
|
||||
status =
|
||||
acpi_os_read_port(acpi_gbl_FADT.smi_command, &value1, 8);
|
||||
break;
|
||||
|
||||
default:
|
||||
ACPI_ERROR((AE_INFO, "Unknown Register ID: %X", register_id));
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
exit:
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
*return_value = value1;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_register_write
|
||||
*
|
||||
* PARAMETERS: register_id - ACPI Register ID
|
||||
* Value - The value to write
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Write to the specified ACPI register
|
||||
*
|
||||
* NOTE: In accordance with the ACPI specification, this function automatically
|
||||
* preserves the value of the following bits, meaning that these bits cannot be
|
||||
* changed via this interface:
|
||||
*
|
||||
* PM1_CONTROL[0] = SCI_EN
|
||||
* PM1_CONTROL[9]
|
||||
* PM1_STATUS[11]
|
||||
*
|
||||
* ACPI References:
|
||||
* 1) Hardware Ignored Bits: When software writes to a register with ignored
|
||||
* bit fields, it preserves the ignored bit fields
|
||||
* 2) SCI_EN: OSPM always preserves this bit position
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 read_value;
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_register_write);
|
||||
|
||||
switch (register_id) {
|
||||
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
|
||||
|
||||
/* Perform a read first to preserve certain bits (per ACPI spec) */
|
||||
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS,
|
||||
&read_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Insert the bits to be preserved */
|
||||
|
||||
ACPI_INSERT_BITS(value, ACPI_PM1_STATUS_PRESERVED_BITS,
|
||||
read_value);
|
||||
|
||||
/* Now we can write the data */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1a_event_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* PM1B is optional */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1b_event_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_xpm1a_enable);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* PM1B is optional */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_xpm1b_enable);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
|
||||
|
||||
/*
|
||||
* Perform a read first to preserve certain bits (per ACPI spec)
|
||||
*/
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
|
||||
&read_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Insert the bits to be preserved */
|
||||
|
||||
ACPI_INSERT_BITS(value, ACPI_PM1_CONTROL_PRESERVED_BITS,
|
||||
read_value);
|
||||
|
||||
/* Now we can write the data */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1a_control_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1b_control_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1a_control_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1b_control_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm2_control_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm_timer_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
|
||||
|
||||
/* SMI_CMD is currently always in IO space */
|
||||
|
||||
status =
|
||||
acpi_os_write_port(acpi_gbl_FADT.smi_command, value, 8);
|
||||
break;
|
||||
|
||||
default:
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
exit:
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwsleep")
|
||||
@ -52,31 +53,19 @@ ACPI_MODULE_NAME("hwsleep")
|
||||
*
|
||||
* FUNCTION: acpi_set_firmware_waking_vector
|
||||
*
|
||||
* PARAMETERS: physical_address - Physical address of ACPI real mode
|
||||
* PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
|
||||
* entry point.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Access function for the firmware_waking_vector field in FACS
|
||||
* DESCRIPTION: Sets the 32-bit firmware_waking_vector field of the FACS
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
|
||||
acpi_set_firmware_waking_vector(u32 physical_address)
|
||||
{
|
||||
struct acpi_table_facs *facs;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
|
||||
|
||||
/* Get the FACS */
|
||||
|
||||
status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&facs));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* According to the ACPI specification 2.0c and later, the 64-bit
|
||||
@ -85,10 +74,16 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
|
||||
* Protected Mode. Some systems (for example HP dv5-1004nr) are known
|
||||
* to fail to resume if the 64-bit vector is used.
|
||||
*/
|
||||
if (facs->version >= 1)
|
||||
facs->xfirmware_waking_vector = 0;
|
||||
|
||||
facs->firmware_waking_vector = (u32)physical_address;
|
||||
/* Set the 32-bit vector */
|
||||
|
||||
acpi_gbl_FACS->firmware_waking_vector = physical_address;
|
||||
|
||||
/* Clear the 64-bit vector if it exists */
|
||||
|
||||
if ((acpi_gbl_FACS->length > 32) && (acpi_gbl_FACS->version >= 1)) {
|
||||
acpi_gbl_FACS->xfirmware_waking_vector = 0;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
@ -97,48 +92,39 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_firmware_waking_vector
|
||||
* FUNCTION: acpi_set_firmware_waking_vector64
|
||||
*
|
||||
* PARAMETERS: *physical_address - Where the contents of
|
||||
* the firmware_waking_vector field of
|
||||
* the FACS will be returned.
|
||||
* PARAMETERS: physical_address - 64-bit physical address of ACPI protected
|
||||
* mode entry point.
|
||||
*
|
||||
* RETURN: Status, vector
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Access function for the firmware_waking_vector field in FACS
|
||||
* DESCRIPTION: Sets the 64-bit X_firmware_waking_vector field of the FACS, if
|
||||
* it exists in the table.
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status
|
||||
acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
|
||||
acpi_set_firmware_waking_vector64(u64 physical_address)
|
||||
{
|
||||
struct acpi_table_facs *facs;
|
||||
acpi_status status;
|
||||
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_get_firmware_waking_vector);
|
||||
|
||||
if (!physical_address) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
/* Determine if the 64-bit vector actually exists */
|
||||
|
||||
if ((acpi_gbl_FACS->length <= 32) || (acpi_gbl_FACS->version < 1)) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/* Get the FACS */
|
||||
/* Clear 32-bit vector, set the 64-bit X_ vector */
|
||||
|
||||
status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&facs));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Get the vector */
|
||||
*physical_address = (acpi_physical_address)facs->firmware_waking_vector;
|
||||
acpi_gbl_FACS->firmware_waking_vector = 0;
|
||||
acpi_gbl_FACS->xfirmware_waking_vector = physical_address;
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_get_firmware_waking_vector)
|
||||
#endif
|
||||
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_enter_sleep_state_prep
|
@ -43,6 +43,7 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwtimer")
|
File diff suppressed because it is too large
Load Diff
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include "accommon.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdispat.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsaccess")
|
||||
@ -165,11 +166,8 @@ acpi_status acpi_ns_root_initialize(void)
|
||||
|
||||
obj_desc->method.method_flags =
|
||||
AML_METHOD_INTERNAL_ONLY;
|
||||
|
||||
#ifndef ACPI_DUMP_APP
|
||||
obj_desc->method.implementation =
|
||||
acpi_ut_osi_implementation;
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
|
||||
@ -521,11 +519,11 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
||||
}
|
||||
|
||||
/*
|
||||
* Search namespace for each segment of the name. Loop through and
|
||||
* Search namespace for each segment of the name. Loop through and
|
||||
* verify (or add to the namespace) each name segment.
|
||||
*
|
||||
* The object type is significant only at the last name
|
||||
* segment. (We don't care about the types along the path, only
|
||||
* segment. (We don't care about the types along the path, only
|
||||
* the type of the final target object.)
|
||||
*/
|
||||
this_search_type = ACPI_TYPE_ANY;
|
||||
@ -591,6 +589,10 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
||||
* segments).
|
||||
*/
|
||||
if (this_node->type == ACPI_TYPE_LOCAL_ALIAS) {
|
||||
if (!this_node->object) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
if (acpi_ns_opens_scope
|
||||
(((struct acpi_namespace_node *)this_node->
|
||||
object)->type)) {
|
@ -42,7 +42,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsalloc")
|
@ -42,7 +42,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsdump")
|
@ -42,6 +42,7 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
|
||||
/* TBD: This entire module is apparently obsolete and should be removed */
|
||||
|
||||
@ -49,7 +50,7 @@
|
||||
ACPI_MODULE_NAME("nsdumpdv")
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "acnamesp.h"
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_dump_one_device
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nseval")
|
||||
@ -89,6 +90,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
||||
/* Initialize the return value to an invalid object */
|
||||
|
||||
info->return_object = NULL;
|
||||
info->param_count = 0;
|
||||
|
||||
/*
|
||||
* Get the actual namespace node for the target object. Handles these cases:
|
||||
@ -141,41 +143,17 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
||||
return_ACPI_STATUS(AE_NULL_OBJECT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the number of arguments being passed to the method
|
||||
*/
|
||||
/* Count the number of arguments being passed to the method */
|
||||
|
||||
info->param_count = 0;
|
||||
if (info->parameters) {
|
||||
while (info->parameters[info->param_count])
|
||||
while (info->parameters[info->param_count]) {
|
||||
if (info->param_count > ACPI_METHOD_MAX_ARG) {
|
||||
return_ACPI_STATUS(AE_LIMIT);
|
||||
}
|
||||
info->param_count++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Warning if too few or too many arguments have been passed by the
|
||||
* caller. We don't want to abort here with an error because an
|
||||
* incorrect number of arguments may not cause the method to fail.
|
||||
* However, the method will fail if there are too few arguments passed
|
||||
* and the method attempts to use one of the missing ones.
|
||||
*/
|
||||
|
||||
if (info->param_count < info->obj_desc->method.param_count) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Insufficient arguments - "
|
||||
"method [%4.4s] needs %d, found %d",
|
||||
acpi_ut_get_node_name(info->resolved_node),
|
||||
info->obj_desc->method.param_count,
|
||||
info->param_count));
|
||||
} else if (info->param_count >
|
||||
info->obj_desc->method.param_count) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Excess arguments - "
|
||||
"method [%4.4s] needs %d, found %d",
|
||||
acpi_ut_get_node_name(info->
|
||||
resolved_node),
|
||||
info->obj_desc->method.param_count,
|
||||
info->param_count));
|
||||
}
|
||||
|
||||
ACPI_DUMP_PATHNAME(info->resolved_node, "Execute Method:",
|
||||
ACPI_LV_INFO, _COMPONENT);
|
||||
@ -264,32 +242,13 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
||||
}
|
||||
}
|
||||
|
||||
/* Validation of return values for ACPI-predefined methods and objects */
|
||||
|
||||
if ((status == AE_OK) || (status == AE_CTRL_RETURN_VALUE)) {
|
||||
/*
|
||||
* If this is the first evaluation, check the return value. This
|
||||
* ensures that any warnings will only be emitted during the very
|
||||
* first evaluation of the object.
|
||||
*/
|
||||
if (!(node->flags & ANOBJ_EVALUATED)) {
|
||||
/*
|
||||
* Check for a predefined ACPI name. If found, validate the
|
||||
* returned object.
|
||||
*
|
||||
* Note: Ignore return status for now, emit warnings if there are
|
||||
* problems with the returned object. May change later to abort
|
||||
* the method on invalid return object.
|
||||
*/
|
||||
(void)acpi_ns_check_predefined_names(node,
|
||||
info->
|
||||
return_object);
|
||||
}
|
||||
|
||||
/* Mark the node as having been evaluated */
|
||||
|
||||
node->flags |= ANOBJ_EVALUATED;
|
||||
}
|
||||
/*
|
||||
* Check input argument count against the ASL-defined count for a method.
|
||||
* Also check predefined names: argument count and return value against
|
||||
* the ACPI specification. Some incorrect return value types are repaired.
|
||||
*/
|
||||
(void)acpi_ns_check_predefined_names(node, info->param_count,
|
||||
status, &info->return_object);
|
||||
|
||||
/* Check if there is a return value that must be dealt with */
|
||||
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acinterp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include <linux/nmi.h>
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
@ -42,9 +42,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdispat.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsload")
|
@ -42,8 +42,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "amlcode.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsnames")
|
@ -43,7 +43,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsobject")
|
@ -42,10 +42,11 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acparser.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acparser.h"
|
||||
#include "acdispat.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsparse")
|
@ -43,8 +43,9 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/acpredef.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acpredef.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nspredef")
|
||||
@ -72,7 +73,7 @@ ACPI_MODULE_NAME("nspredef")
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ns_check_package(char *pathname,
|
||||
union acpi_operand_object *return_object,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
const union acpi_predefined_info *predefined);
|
||||
|
||||
static acpi_status
|
||||
@ -82,13 +83,18 @@ acpi_ns_check_package_elements(char *pathname,
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_object_type(char *pathname,
|
||||
union acpi_operand_object *return_object,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_reference(char *pathname,
|
||||
union acpi_operand_object *return_object);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_object(u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
/*
|
||||
* Names for the types that can be returned by the predefined objects.
|
||||
* Used for warning messages. Must be in the same order as the ACPI_RTYPEs
|
||||
@ -108,8 +114,8 @@ static const char *acpi_rtype_names[] = {
|
||||
* FUNCTION: acpi_ns_check_predefined_names
|
||||
*
|
||||
* PARAMETERS: Node - Namespace node for the method/object
|
||||
* return_object - Object returned from the evaluation of this
|
||||
* method/object
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -119,8 +125,11 @@ static const char *acpi_rtype_names[] = {
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
union acpi_operand_object *return_object)
|
||||
u32 user_param_count,
|
||||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status = AE_OK;
|
||||
const union acpi_predefined_info *predefined;
|
||||
char *pathname;
|
||||
@ -128,12 +137,6 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
/* Match the name for this method/object against the predefined list */
|
||||
|
||||
predefined = acpi_ns_check_for_predefined_name(node);
|
||||
if (!predefined) {
|
||||
|
||||
/* Name was not one of the predefined names */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Get the full pathname to the object, for use in error messages */
|
||||
|
||||
@ -143,10 +146,37 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the parameter count for this method is in accordance
|
||||
* with the ACPI specification.
|
||||
* Check that the parameter count for this method matches the ASL
|
||||
* definition. For predefined names, ensure that both the caller and
|
||||
* the method itself are in accordance with the ACPI specification.
|
||||
*/
|
||||
acpi_ns_check_parameter_count(pathname, node, predefined);
|
||||
acpi_ns_check_parameter_count(pathname, node, user_param_count,
|
||||
predefined);
|
||||
|
||||
/* If not a predefined name, we cannot validate the return object */
|
||||
|
||||
if (!predefined) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* If the method failed, we cannot validate the return object */
|
||||
|
||||
if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only validate the return value on the first successful evaluation of
|
||||
* the method. This ensures that any warnings will only be emitted during
|
||||
* the very first evaluation of the method/object.
|
||||
*/
|
||||
if (node->flags & ANOBJ_EVALUATED) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Mark the node as having been successfully evaluated */
|
||||
|
||||
node->flags |= ANOBJ_EVALUATED;
|
||||
|
||||
/*
|
||||
* If there is no return value, check if we require a return value for
|
||||
@ -171,7 +201,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
* We have a return value, but if one wasn't expected, just exit, this is
|
||||
* not a problem
|
||||
*
|
||||
* For example, if "Implicit return value" is enabled, methods will
|
||||
* For example, if the "Implicit Return" feature is enabled, methods will
|
||||
* always return a value
|
||||
*/
|
||||
if (!predefined->info.expected_btypes) {
|
||||
@ -182,7 +212,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
* Check that the type of the return object is what is expected for
|
||||
* this predefined name
|
||||
*/
|
||||
status = acpi_ns_check_object_type(pathname, return_object,
|
||||
status = acpi_ns_check_object_type(pathname, return_object_ptr,
|
||||
predefined->info.expected_btypes,
|
||||
ACPI_NOT_PACKAGE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -193,11 +223,12 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_PACKAGE) {
|
||||
status =
|
||||
acpi_ns_check_package(pathname, return_object, predefined);
|
||||
acpi_ns_check_package(pathname, return_object_ptr,
|
||||
predefined);
|
||||
}
|
||||
|
||||
exit:
|
||||
if (pathname) {
|
||||
if (pathname != predefined->info.name) {
|
||||
ACPI_FREE(pathname);
|
||||
}
|
||||
|
||||
@ -210,6 +241,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
*
|
||||
* PARAMETERS: Pathname - Full pathname to the node (for error msgs)
|
||||
* Node - Namespace node for the method/object
|
||||
* user_param_count - Number of args passed in by the caller
|
||||
* Predefined - Pointer to entry in predefined name table
|
||||
*
|
||||
* RETURN: None
|
||||
@ -223,32 +255,76 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
void
|
||||
acpi_ns_check_parameter_count(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *predefined)
|
||||
{
|
||||
u32 param_count;
|
||||
u32 required_params_current;
|
||||
u32 required_params_old;
|
||||
|
||||
/*
|
||||
* Check that the ASL-defined parameter count is what is expected for
|
||||
* this predefined name.
|
||||
*
|
||||
* Methods have 0-7 parameters. All other types have zero.
|
||||
*/
|
||||
/* Methods have 0-7 parameters. All other types have zero. */
|
||||
|
||||
param_count = 0;
|
||||
if (node->type == ACPI_TYPE_METHOD) {
|
||||
param_count = node->object->method.param_count;
|
||||
}
|
||||
|
||||
/* Validate parameter count - allow two different legal counts (_SCP) */
|
||||
/* Argument count check for non-predefined methods/objects */
|
||||
|
||||
if (!predefined) {
|
||||
/*
|
||||
* Warning if too few or too many arguments have been passed by the
|
||||
* caller. An incorrect number of arguments may not cause the method
|
||||
* to fail. However, the method will fail if there are too few
|
||||
* arguments and the method attempts to use one of the missing ones.
|
||||
*/
|
||||
if (user_param_count < param_count) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%s: Insufficient arguments - needs %d, found %d",
|
||||
pathname, param_count, user_param_count));
|
||||
} else if (user_param_count > param_count) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%s: Excess arguments - needs %d, found %d",
|
||||
pathname, param_count, user_param_count));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Allow two different legal argument counts (_SCP, etc.) */
|
||||
|
||||
required_params_current = predefined->info.param_count & 0x0F;
|
||||
required_params_old = predefined->info.param_count >> 4;
|
||||
|
||||
if (user_param_count != ACPI_UINT32_MAX) {
|
||||
|
||||
/* Validate the user-supplied parameter count */
|
||||
|
||||
if ((user_param_count != required_params_current) &&
|
||||
(user_param_count != required_params_old)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%s: Parameter count mismatch - caller passed %d, ACPI requires %d",
|
||||
pathname, user_param_count,
|
||||
required_params_current));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Only validate the argument count on the first successful evaluation of
|
||||
* the method. This ensures that any warnings will only be emitted during
|
||||
* the very first evaluation of the method/object.
|
||||
*/
|
||||
if (node->flags & ANOBJ_EVALUATED) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the ASL-defined parameter count is what is expected for
|
||||
* this predefined name.
|
||||
*/
|
||||
if ((param_count != required_params_current) &&
|
||||
(param_count != required_params_old)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%s: Parameter count mismatch - ASL declared %d, expected %d",
|
||||
"%s: Parameter count mismatch - ASL declared %d, ACPI requires %d",
|
||||
pathname, param_count, required_params_current));
|
||||
}
|
||||
}
|
||||
@ -307,8 +383,8 @@ const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct
|
||||
* FUNCTION: acpi_ns_check_package
|
||||
*
|
||||
* PARAMETERS: Pathname - Full pathname to the node (for error msgs)
|
||||
* return_object - Object returned from the evaluation of a
|
||||
* method or object
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
* Predefined - Pointer to entry in predefined name table
|
||||
*
|
||||
* RETURN: Status
|
||||
@ -320,9 +396,10 @@ const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package(char *pathname,
|
||||
union acpi_operand_object *return_object,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
const union acpi_predefined_info *predefined)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
const union acpi_predefined_info *package;
|
||||
union acpi_operand_object *sub_package;
|
||||
union acpi_operand_object **elements;
|
||||
@ -408,7 +485,7 @@ acpi_ns_check_package(char *pathname,
|
||||
* elements must be of the same type
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
status = acpi_ns_check_object_type(pathname, *elements,
|
||||
status = acpi_ns_check_object_type(pathname, elements,
|
||||
package->ret_info.
|
||||
object_type1, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -441,7 +518,7 @@ acpi_ns_check_package(char *pathname,
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(pathname,
|
||||
*elements,
|
||||
elements,
|
||||
package->
|
||||
ret_info3.
|
||||
object_type[i],
|
||||
@ -454,7 +531,7 @@ acpi_ns_check_package(char *pathname,
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(pathname,
|
||||
*elements,
|
||||
elements,
|
||||
package->
|
||||
ret_info3.
|
||||
tail_object_type,
|
||||
@ -471,7 +548,7 @@ acpi_ns_check_package(char *pathname,
|
||||
|
||||
/* First element is the (Integer) count of sub-packages to follow */
|
||||
|
||||
status = acpi_ns_check_object_type(pathname, *elements,
|
||||
status = acpi_ns_check_object_type(pathname, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
@ -509,7 +586,7 @@ acpi_ns_check_package(char *pathname,
|
||||
/* Each sub-object must be of type Package */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(pathname, sub_package,
|
||||
acpi_ns_check_object_type(pathname, &sub_package,
|
||||
ACPI_RTYPE_PACKAGE, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
@ -567,12 +644,8 @@ acpi_ns_check_package(char *pathname,
|
||||
for (j = 0; j < expected_count; j++) {
|
||||
status =
|
||||
acpi_ns_check_object_type(pathname,
|
||||
sub_elements
|
||||
[j],
|
||||
package->
|
||||
ret_info2.
|
||||
object_type
|
||||
[j], j);
|
||||
&sub_elements[j],
|
||||
package->ret_info2.object_type[j], j);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -611,7 +684,7 @@ acpi_ns_check_package(char *pathname,
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(pathname,
|
||||
*sub_elements,
|
||||
sub_elements,
|
||||
ACPI_RTYPE_INTEGER,
|
||||
0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -708,7 +781,7 @@ acpi_ns_check_package_elements(char *pathname,
|
||||
* The second group can have a count of zero.
|
||||
*/
|
||||
for (i = 0; i < count1; i++) {
|
||||
status = acpi_ns_check_object_type(pathname, *this_element,
|
||||
status = acpi_ns_check_object_type(pathname, this_element,
|
||||
type1, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
@ -717,7 +790,7 @@ acpi_ns_check_package_elements(char *pathname,
|
||||
}
|
||||
|
||||
for (i = 0; i < count2; i++) {
|
||||
status = acpi_ns_check_object_type(pathname, *this_element,
|
||||
status = acpi_ns_check_object_type(pathname, this_element,
|
||||
type2, (i + count1));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
@ -733,8 +806,8 @@ acpi_ns_check_package_elements(char *pathname,
|
||||
* FUNCTION: acpi_ns_check_object_type
|
||||
*
|
||||
* PARAMETERS: Pathname - Full pathname to the node (for error msgs)
|
||||
* return_object - Object return from the execution of this
|
||||
* method/object
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
* expected_btypes - Bitmap of expected return type(s)
|
||||
* package_index - Index of object within parent package (if
|
||||
* applicable - ACPI_NOT_PACKAGE otherwise)
|
||||
@ -748,9 +821,10 @@ acpi_ns_check_package_elements(char *pathname,
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_object_type(char *pathname,
|
||||
union acpi_operand_object *return_object,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status = AE_OK;
|
||||
u32 return_btype;
|
||||
char type_buffer[48]; /* Room for 5 types */
|
||||
@ -814,6 +888,14 @@ acpi_ns_check_object_type(char *pathname,
|
||||
/* Is the object one of the expected types? */
|
||||
|
||||
if (!(return_btype & expected_btypes)) {
|
||||
|
||||
/* Type mismatch -- attempt repair of the returned object */
|
||||
|
||||
status = acpi_ns_repair_object(expected_btypes, package_index,
|
||||
return_object_ptr);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return (status);
|
||||
}
|
||||
goto type_error_exit;
|
||||
}
|
||||
|
||||
@ -898,3 +980,86 @@ acpi_ns_check_reference(char *pathname,
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_object
|
||||
*
|
||||
* PARAMETERS: Pathname - Full pathname to the node (for error msgs)
|
||||
* package_index - Used to determine if target is in a package
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status. AE_OK if repair was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to repair/convert a return object of a type that was
|
||||
* not expected.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_object(u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_size length;
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(return_object)) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
if (!(expected_btypes & ACPI_RTYPE_STRING)) {
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Have a Buffer, expected a String, convert. Use a to_string
|
||||
* conversion, no transform performed on the buffer data. The best
|
||||
* example of this is the _BIF method, where the string data from
|
||||
* the battery is often (incorrectly) returned as buffer object(s).
|
||||
*/
|
||||
length = 0;
|
||||
while ((length < return_object->buffer.length) &&
|
||||
(return_object->buffer.pointer[length])) {
|
||||
length++;
|
||||
}
|
||||
|
||||
/* Allocate a new string object */
|
||||
|
||||
new_object = acpi_ut_create_string_object(length);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the raw buffer data with no transform. String is already NULL
|
||||
* terminated at Length+1.
|
||||
*/
|
||||
ACPI_MEMCPY(new_object->string.pointer,
|
||||
return_object->buffer.pointer, length);
|
||||
|
||||
/* Install the new return object */
|
||||
|
||||
acpi_ut_remove_reference(return_object);
|
||||
*return_object_ptr = new_object;
|
||||
|
||||
/*
|
||||
* If the object is a package element, we need to:
|
||||
* 1. Decrement the reference count of the orignal object, it was
|
||||
* incremented when building the package
|
||||
* 2. Increment the reference count of the new object, it will be
|
||||
* decremented when releasing the package
|
||||
*/
|
||||
if (package_index != ACPI_NOT_PACKAGE) {
|
||||
acpi_ut_remove_reference(return_object);
|
||||
acpi_ut_add_reference(new_object);
|
||||
}
|
||||
return (AE_OK);
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
@ -42,7 +42,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nssearch")
|
@ -43,9 +43,10 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include <acpi/amlcode.h>
|
||||
#include <acpi/actables.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "amlcode.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsutils")
|
||||
@ -314,9 +315,15 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
|
||||
*
|
||||
* strlen() + 1 covers the first name_seg, which has no path separator
|
||||
*/
|
||||
if (acpi_ns_valid_root_prefix(next_external_char[0])) {
|
||||
if (acpi_ns_valid_root_prefix(*next_external_char)) {
|
||||
info->fully_qualified = TRUE;
|
||||
next_external_char++;
|
||||
|
||||
/* Skip redundant root_prefix, like \\_SB.PCI0.SBRG.EC0 */
|
||||
|
||||
while (acpi_ns_valid_root_prefix(*next_external_char)) {
|
||||
next_external_char++;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Handle Carat prefixes
|
@ -42,7 +42,8 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nswalk")
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user