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: (140 commits) ACPI: processor: use .notify method instead of installing handler directly ACPI: button: use .notify method instead of installing handler directly ACPI: support acpi_device_ops .notify methods toshiba-acpi: remove MAINTAINERS entry ACPI: battery: asynchronous init acer-wmi: Update copyright notice & documentation acer-wmi: Cleanup the failure cleanup handling acer-wmi: Blacklist Acer Aspire One video: build fix thinkpad-acpi: rework brightness support thinkpad-acpi: enhanced debugging messages for the fan subdriver thinkpad-acpi: enhanced debugging messages for the hotkey subdriver thinkpad-acpi: enhanced debugging messages for rfkill subdrivers thinkpad-acpi: restrict access to some firmware LEDs thinkpad-acpi: remove HKEY disable functionality thinkpad-acpi: add new debug helpers and warn of deprecated atts thinkpad-acpi: add missing log levels thinkpad-acpi: cleanup debug helpers thinkpad-acpi: documentation cleanup thinkpad-acpi: drop ibm-acpi alias ...
This commit is contained in:
Коммит
32fb6c1756
|
@ -260,6 +260,22 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
to assume that this machine's pmtimer latches its value
|
||||
and always returns good values.
|
||||
|
||||
acpi_enforce_resources= [ACPI]
|
||||
{ strict | lax | no }
|
||||
Check for resource conflicts between native drivers
|
||||
and ACPI OperationRegions (SystemIO and SystemMemory
|
||||
only). IO ports and memory declared in ACPI might be
|
||||
used by the ACPI subsystem in arbitrary AML code and
|
||||
can interfere with legacy drivers.
|
||||
strict (default): access to resources claimed by ACPI
|
||||
is denied; legacy drivers trying to access reserved
|
||||
resources will fail to bind to device using them.
|
||||
lax: access to resources claimed by ACPI is allowed;
|
||||
legacy drivers trying to access reserved resources
|
||||
will bind successfully but a warning message is logged.
|
||||
no: ACPI OperationRegions are not marked as reserved,
|
||||
no further checks are performed.
|
||||
|
||||
agp= [AGP]
|
||||
{ off | try_unsupported }
|
||||
off: disable AGP support
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
Acer Laptop WMI Extras Driver
|
||||
http://code.google.com/p/aceracpi
|
||||
Version 0.2
|
||||
18th August 2008
|
||||
Version 0.3
|
||||
4th April 2009
|
||||
|
||||
Copyright 2007-2008 Carlos Corbacho <carlos@strangeworlds.co.uk>
|
||||
Copyright 2007-2009 Carlos Corbacho <carlos@strangeworlds.co.uk>
|
||||
|
||||
acer-wmi is a driver to allow you to control various parts of your Acer laptop
|
||||
hardware under Linux which are exposed via ACPI-WMI.
|
||||
|
@ -36,6 +36,10 @@ not possible in kernel space from a 64 bit OS.
|
|||
Supported Hardware
|
||||
******************
|
||||
|
||||
NOTE: The Acer Aspire One is not supported hardware. It cannot work with
|
||||
acer-wmi until Acer fix their ACPI-WMI implementation on them, so has been
|
||||
blacklisted until that happens.
|
||||
|
||||
Please see the website for the current list of known working hardare:
|
||||
|
||||
http://code.google.com/p/aceracpi/wiki/SupportedHardware
|
||||
|
|
|
@ -20,7 +20,8 @@ moved to the drivers/misc tree and renamed to thinkpad-acpi for kernel
|
|||
kernel 2.6.29 and release 0.22.
|
||||
|
||||
The driver is named "thinkpad-acpi". In some places, like module
|
||||
names, "thinkpad_acpi" is used because of userspace issues.
|
||||
names and log messages, "thinkpad_acpi" is used because of userspace
|
||||
issues.
|
||||
|
||||
"tpacpi" is used as a shorthand where "thinkpad-acpi" would be too
|
||||
long due to length limitations on some Linux kernel versions.
|
||||
|
@ -37,7 +38,7 @@ detailed description):
|
|||
- ThinkLight on and off
|
||||
- limited docking and undocking
|
||||
- UltraBay eject
|
||||
- CMOS control
|
||||
- CMOS/UCMS control
|
||||
- LED control
|
||||
- ACPI sounds
|
||||
- temperature sensors
|
||||
|
@ -46,6 +47,7 @@ detailed description):
|
|||
- Volume control
|
||||
- Fan control and monitoring: fan speed, fan enable/disable
|
||||
- WAN enable and disable
|
||||
- UWB enable and disable
|
||||
|
||||
A compatibility table by model and feature is maintained on the web
|
||||
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
||||
|
@ -53,7 +55,7 @@ reports, especially if they add to or correct the compatibility table.
|
|||
Please include the following information in your report:
|
||||
|
||||
- ThinkPad model name
|
||||
- a copy of your DSDT, from /proc/acpi/dsdt
|
||||
- a copy of your ACPI tables, using the "acpidump" utility
|
||||
- a copy of the output of dmidecode, with serial numbers
|
||||
and UUIDs masked off
|
||||
- which driver features work and which don't
|
||||
|
@ -66,17 +68,18 @@ Installation
|
|||
------------
|
||||
|
||||
If you are compiling this driver as included in the Linux kernel
|
||||
sources, simply enable the CONFIG_THINKPAD_ACPI option, and optionally
|
||||
enable the CONFIG_THINKPAD_ACPI_BAY option if you want the
|
||||
thinkpad-specific bay functionality.
|
||||
sources, look for the CONFIG_THINKPAD_ACPI Kconfig option.
|
||||
It is located on the menu path: "Device Drivers" -> "X86 Platform
|
||||
Specific Device Drivers" -> "ThinkPad ACPI Laptop Extras".
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
The driver exports two different interfaces to userspace, which can be
|
||||
used to access the features it provides. One is a legacy procfs-based
|
||||
interface, which will be removed at some time in the distant future.
|
||||
The other is a new sysfs-based interface which is not complete yet.
|
||||
interface, which will be removed at some time in the future. The other
|
||||
is a new sysfs-based interface which is not complete yet.
|
||||
|
||||
The procfs interface creates the /proc/acpi/ibm directory. There is a
|
||||
file under that directory for each feature it supports. The procfs
|
||||
|
@ -111,15 +114,17 @@ The version of thinkpad-acpi's sysfs interface is exported by the driver
|
|||
as a driver attribute (see below).
|
||||
|
||||
Sysfs driver attributes are on the driver's sysfs attribute space,
|
||||
for 2.6.23 this is /sys/bus/platform/drivers/thinkpad_acpi/ and
|
||||
for 2.6.23+ this is /sys/bus/platform/drivers/thinkpad_acpi/ and
|
||||
/sys/bus/platform/drivers/thinkpad_hwmon/
|
||||
|
||||
Sysfs device attributes are on the thinkpad_acpi device sysfs attribute
|
||||
space, for 2.6.23 this is /sys/devices/platform/thinkpad_acpi/.
|
||||
space, for 2.6.23+ this is /sys/devices/platform/thinkpad_acpi/.
|
||||
|
||||
Sysfs device attributes for the sensors and fan are on the
|
||||
thinkpad_hwmon device's sysfs attribute space, but you should locate it
|
||||
looking for a hwmon device with the name attribute of "thinkpad".
|
||||
looking for a hwmon device with the name attribute of "thinkpad", or
|
||||
better yet, through libsensors.
|
||||
|
||||
|
||||
Driver version
|
||||
--------------
|
||||
|
@ -129,6 +134,7 @@ sysfs driver attribute: version
|
|||
|
||||
The driver name and version. No commands can be written to this file.
|
||||
|
||||
|
||||
Sysfs interface version
|
||||
-----------------------
|
||||
|
||||
|
@ -160,6 +166,7 @@ expect that an attribute might not be there, and deal with it properly
|
|||
(an attribute not being there *is* a valid way to make it clear that a
|
||||
feature is not available in sysfs).
|
||||
|
||||
|
||||
Hot keys
|
||||
--------
|
||||
|
||||
|
@ -172,17 +179,14 @@ system. Enabling the hotkey functionality of thinkpad-acpi signals the
|
|||
firmware that such a driver is present, and modifies how the ThinkPad
|
||||
firmware will behave in many situations.
|
||||
|
||||
The driver enables the hot key feature automatically when loaded. The
|
||||
feature can later be disabled and enabled back at runtime. The driver
|
||||
will also restore the hot key feature to its previous state and mask
|
||||
when it is unloaded.
|
||||
The driver enables the HKEY ("hot key") event reporting automatically
|
||||
when loaded, and disables it when it is removed.
|
||||
|
||||
When the hotkey feature is enabled and the hot key mask is set (see
|
||||
below), the driver will report HKEY events in the following format:
|
||||
The driver will report HKEY events in the following format:
|
||||
|
||||
ibm/hotkey HKEY 00000080 0000xxxx
|
||||
|
||||
Some of these events refer to hot key presses, but not all.
|
||||
Some of these events refer to hot key presses, but not all of them.
|
||||
|
||||
The driver will generate events over the input layer for hot keys and
|
||||
radio switches, and over the ACPI netlink layer for other events. The
|
||||
|
@ -214,13 +218,17 @@ procfs notes:
|
|||
|
||||
The following commands can be written to the /proc/acpi/ibm/hotkey file:
|
||||
|
||||
echo enable > /proc/acpi/ibm/hotkey -- enable the hot keys feature
|
||||
echo disable > /proc/acpi/ibm/hotkey -- disable the hot keys feature
|
||||
echo 0xffffffff > /proc/acpi/ibm/hotkey -- enable all hot keys
|
||||
echo 0 > /proc/acpi/ibm/hotkey -- disable all possible hot keys
|
||||
... any other 8-hex-digit mask ...
|
||||
echo reset > /proc/acpi/ibm/hotkey -- restore the original mask
|
||||
|
||||
The following commands have been deprecated and will cause the kernel
|
||||
to log a warning:
|
||||
|
||||
echo enable > /proc/acpi/ibm/hotkey -- does nothing
|
||||
echo disable > /proc/acpi/ibm/hotkey -- returns an error
|
||||
|
||||
The procfs interface does not support NVRAM polling control. So as to
|
||||
maintain maximum bug-to-bug compatibility, it does not report any masks,
|
||||
nor does it allow one to manipulate the hot key mask when the firmware
|
||||
|
@ -229,12 +237,9 @@ does not support masks at all, even if NVRAM polling is in use.
|
|||
sysfs notes:
|
||||
|
||||
hotkey_bios_enabled:
|
||||
Returns the status of the hot keys feature when
|
||||
thinkpad-acpi was loaded. Upon module unload, the hot
|
||||
key feature status will be restored to this value.
|
||||
DEPRECATED, WILL BE REMOVED SOON.
|
||||
|
||||
0: hot keys were disabled
|
||||
1: hot keys were enabled (unusual)
|
||||
Returns 0.
|
||||
|
||||
hotkey_bios_mask:
|
||||
Returns the hot keys mask when thinkpad-acpi was loaded.
|
||||
|
@ -242,13 +247,10 @@ sysfs notes:
|
|||
to this value.
|
||||
|
||||
hotkey_enable:
|
||||
Enables/disables the hot keys feature in the ACPI
|
||||
firmware, and reports current status of the hot keys
|
||||
feature. Has no effect on the NVRAM hot key polling
|
||||
functionality.
|
||||
DEPRECATED, WILL BE REMOVED SOON.
|
||||
|
||||
0: disables the hot keys feature / feature disabled
|
||||
1: enables the hot keys feature / feature enabled
|
||||
0: returns -EPERM
|
||||
1: does nothing
|
||||
|
||||
hotkey_mask:
|
||||
bit mask to enable driver-handling (and depending on
|
||||
|
@ -618,6 +620,7 @@ For Lenovo models *with* ACPI backlight control:
|
|||
and map them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN. Process
|
||||
these keys on userspace somehow (e.g. by calling xbacklight).
|
||||
|
||||
|
||||
Bluetooth
|
||||
---------
|
||||
|
||||
|
@ -628,6 +631,9 @@ sysfs rfkill class: switch "tpacpi_bluetooth_sw"
|
|||
This feature shows the presence and current state of a ThinkPad
|
||||
Bluetooth device in the internal ThinkPad CDC slot.
|
||||
|
||||
If the ThinkPad supports it, the Bluetooth state is stored in NVRAM,
|
||||
so it is kept across reboots and power-off.
|
||||
|
||||
Procfs notes:
|
||||
|
||||
If Bluetooth is installed, the following commands can be used:
|
||||
|
@ -652,6 +658,7 @@ Sysfs notes:
|
|||
rfkill controller switch "tpacpi_bluetooth_sw": refer to
|
||||
Documentation/rfkill.txt for details.
|
||||
|
||||
|
||||
Video output control -- /proc/acpi/ibm/video
|
||||
--------------------------------------------
|
||||
|
||||
|
@ -693,11 +700,8 @@ Fn-F7 from working. This also disables the video output switching
|
|||
features of this driver, as it uses the same ACPI methods as
|
||||
Fn-F7. Video switching on the console should still work.
|
||||
|
||||
UPDATE: There's now a patch for the X.org Radeon driver which
|
||||
addresses this issue. Some people are reporting success with the patch
|
||||
while others are still having problems. For more information:
|
||||
UPDATE: refer to https://bugs.freedesktop.org/show_bug.cgi?id=2000
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=2000
|
||||
|
||||
ThinkLight control
|
||||
------------------
|
||||
|
@ -720,10 +724,11 @@ The ThinkLight sysfs interface is documented by the LED class
|
|||
documentation, in Documentation/leds-class.txt. The ThinkLight LED name
|
||||
is "tpacpi::thinklight".
|
||||
|
||||
Due to limitations in the sysfs LED class, if the status of the thinklight
|
||||
Due to limitations in the sysfs LED class, if the status of the ThinkLight
|
||||
cannot be read or if it is unknown, thinkpad-acpi will report it as "off".
|
||||
It is impossible to know if the status returned through sysfs is valid.
|
||||
|
||||
|
||||
Docking / undocking -- /proc/acpi/ibm/dock
|
||||
------------------------------------------
|
||||
|
||||
|
@ -784,6 +789,7 @@ the only docking stations currently supported are the X-series
|
|||
UltraBase docks and "dumb" port replicators like the Mini Dock (the
|
||||
latter don't need any ACPI support, actually).
|
||||
|
||||
|
||||
UltraBay eject -- /proc/acpi/ibm/bay
|
||||
------------------------------------
|
||||
|
||||
|
@ -847,8 +853,9 @@ supported. Use "eject2" instead of "eject" for the second bay.
|
|||
Note: the UltraBay eject support on the 600e/x, A22p and A3x is
|
||||
EXPERIMENTAL and may not work as expected. USE WITH CAUTION!
|
||||
|
||||
CMOS control
|
||||
------------
|
||||
|
||||
CMOS/UCMS control
|
||||
-----------------
|
||||
|
||||
procfs: /proc/acpi/ibm/cmos
|
||||
sysfs device attribute: cmos_command
|
||||
|
@ -882,6 +889,7 @@ The cmos command interface is prone to firmware split-brain problems, as
|
|||
in newer ThinkPads it is just a compatibility layer. Do not use it, it is
|
||||
exported just as a debug tool.
|
||||
|
||||
|
||||
LED control
|
||||
-----------
|
||||
|
||||
|
@ -893,6 +901,17 @@ some older ThinkPad models, it is possible to query the status of the
|
|||
LED indicators as well. Newer ThinkPads cannot query the real status
|
||||
of the LED indicators.
|
||||
|
||||
Because misuse of the LEDs could induce an unaware user to perform
|
||||
dangerous actions (like undocking or ejecting a bay device while the
|
||||
buses are still active), or mask an important alarm (such as a nearly
|
||||
empty battery, or a broken battery), access to most LEDs is
|
||||
restricted.
|
||||
|
||||
Unrestricted access to all LEDs requires that thinkpad-acpi be
|
||||
compiled with the CONFIG_THINKPAD_ACPI_UNSAFE_LEDS option enabled.
|
||||
Distributions must never enable this option. Individual users that
|
||||
are aware of the consequences are welcome to enabling it.
|
||||
|
||||
procfs notes:
|
||||
|
||||
The available commands are:
|
||||
|
@ -939,6 +958,7 @@ ThinkPad indicator LED should blink in hardware accelerated mode, use the
|
|||
"timer" trigger, and leave the delay_on and delay_off parameters set to
|
||||
zero (to request hardware acceleration autodetection).
|
||||
|
||||
|
||||
ACPI sounds -- /proc/acpi/ibm/beep
|
||||
----------------------------------
|
||||
|
||||
|
@ -968,6 +988,7 @@ X40:
|
|||
16 - one medium-pitched beep repeating constantly, stop with 17
|
||||
17 - stop 16
|
||||
|
||||
|
||||
Temperature sensors
|
||||
-------------------
|
||||
|
||||
|
@ -1115,6 +1136,7 @@ registers contain the current battery capacity, etc. If you experiment
|
|||
with this, do send me your results (including some complete dumps with
|
||||
a description of the conditions when they were taken.)
|
||||
|
||||
|
||||
LCD brightness control
|
||||
----------------------
|
||||
|
||||
|
@ -1124,10 +1146,9 @@ sysfs backlight device "thinkpad_screen"
|
|||
This feature allows software control of the LCD brightness on ThinkPad
|
||||
models which don't have a hardware brightness slider.
|
||||
|
||||
It has some limitations: the LCD backlight cannot be actually turned on or
|
||||
off by this interface, and in many ThinkPad models, the "dim while on
|
||||
battery" functionality will be enabled by the BIOS when this interface is
|
||||
used, and cannot be controlled.
|
||||
It has some limitations: the LCD backlight cannot be actually turned
|
||||
on or off by this interface, it just controls the backlight brightness
|
||||
level.
|
||||
|
||||
On IBM (and some of the earlier Lenovo) ThinkPads, the backlight control
|
||||
has eight brightness levels, ranging from 0 to 7. Some of the levels
|
||||
|
@ -1136,10 +1157,15 @@ display backlight brightness control methods have 16 levels, ranging
|
|||
from 0 to 15.
|
||||
|
||||
There are two interfaces to the firmware for direct brightness control,
|
||||
EC and CMOS. To select which one should be used, use the
|
||||
EC and UCMS (or CMOS). To select which one should be used, use the
|
||||
brightness_mode module parameter: brightness_mode=1 selects EC mode,
|
||||
brightness_mode=2 selects CMOS mode, brightness_mode=3 selects both EC
|
||||
and CMOS. The driver tries to auto-detect which interface to use.
|
||||
brightness_mode=2 selects UCMS mode, brightness_mode=3 selects EC
|
||||
mode with NVRAM backing (so that brightness changes are remembered
|
||||
across shutdown/reboot).
|
||||
|
||||
The driver tries to select which interface to use from a table of
|
||||
defaults for each ThinkPad model. If it makes a wrong choice, please
|
||||
report this as a bug, so that we can fix it.
|
||||
|
||||
When display backlight brightness controls are available through the
|
||||
standard ACPI interface, it is best to use it instead of this direct
|
||||
|
@ -1201,6 +1227,7 @@ WARNING:
|
|||
and maybe reduce the life of the backlight lamps by needlessly kicking
|
||||
its level up and down at every change.
|
||||
|
||||
|
||||
Volume control -- /proc/acpi/ibm/volume
|
||||
---------------------------------------
|
||||
|
||||
|
@ -1217,6 +1244,11 @@ distinct. The unmute the volume after the mute command, use either the
|
|||
up or down command (the level command will not unmute the volume).
|
||||
The current volume level and mute state is shown in the file.
|
||||
|
||||
The ALSA mixer interface to this feature is still missing, but patches
|
||||
to add it exist. That problem should be addressed in the not so
|
||||
distant future.
|
||||
|
||||
|
||||
Fan control and monitoring: fan speed, fan enable/disable
|
||||
---------------------------------------------------------
|
||||
|
||||
|
@ -1383,8 +1415,11 @@ procfs: /proc/acpi/ibm/wan
|
|||
sysfs device attribute: wwan_enable (deprecated)
|
||||
sysfs rfkill class: switch "tpacpi_wwan_sw"
|
||||
|
||||
This feature shows the presence and current state of a W-WAN (Sierra
|
||||
Wireless EV-DO) device.
|
||||
This feature shows the presence and current state of the built-in
|
||||
Wireless WAN device.
|
||||
|
||||
If the ThinkPad supports it, the WWAN state is stored in NVRAM,
|
||||
so it is kept across reboots and power-off.
|
||||
|
||||
It was tested on a Lenovo ThinkPad X60. It should probably work on other
|
||||
ThinkPad models which come with this module installed.
|
||||
|
@ -1413,6 +1448,7 @@ Sysfs notes:
|
|||
rfkill controller switch "tpacpi_wwan_sw": refer to
|
||||
Documentation/rfkill.txt for details.
|
||||
|
||||
|
||||
EXPERIMENTAL: UWB
|
||||
-----------------
|
||||
|
||||
|
@ -1431,6 +1467,7 @@ Sysfs notes:
|
|||
rfkill controller switch "tpacpi_uwb_sw": refer to
|
||||
Documentation/rfkill.txt for details.
|
||||
|
||||
|
||||
Multiple Commands, Module Parameters
|
||||
------------------------------------
|
||||
|
||||
|
@ -1445,6 +1482,7 @@ for example:
|
|||
|
||||
modprobe thinkpad_acpi hotkey=enable,0xffff video=auto_disable
|
||||
|
||||
|
||||
Enabling debugging output
|
||||
-------------------------
|
||||
|
||||
|
@ -1457,8 +1495,15 @@ will enable all debugging output classes. It takes a bitmask, so
|
|||
to enable more than one output class, just add their values.
|
||||
|
||||
Debug bitmask Description
|
||||
0x8000 Disclose PID of userspace programs
|
||||
accessing some functions of the driver
|
||||
0x0001 Initialization and probing
|
||||
0x0002 Removal
|
||||
0x0004 RF Transmitter control (RFKILL)
|
||||
(bluetooth, WWAN, UWB...)
|
||||
0x0008 HKEY event interface, hotkeys
|
||||
0x0010 Fan control
|
||||
0x0020 Backlight brightness
|
||||
|
||||
There is also a kernel build option to enable more debugging
|
||||
information, which may be necessary to debug driver problems.
|
||||
|
@ -1467,6 +1512,7 @@ The level of debugging information output by the driver can be changed
|
|||
at runtime through sysfs, using the driver attribute debug_level. The
|
||||
attribute takes the same bitmask as the debug module parameter above.
|
||||
|
||||
|
||||
Force loading of module
|
||||
-----------------------
|
||||
|
||||
|
@ -1505,3 +1551,7 @@ Sysfs interface changelog:
|
|||
|
||||
0x020200: Add poll()/select() support to the following attributes:
|
||||
hotkey_radio_sw, wakeup_hotunplug_complete, wakeup_reason
|
||||
|
||||
0x020300: hotkey enable/disable support removed, attributes
|
||||
hotkey_bios_enabled and hotkey_enable deprecated and
|
||||
marked for removal.
|
||||
|
|
10
MAINTAINERS
10
MAINTAINERS
|
@ -1422,6 +1422,11 @@ P: Doug Warzecha
|
|||
M: Douglas_Warzecha@dell.com
|
||||
S: Maintained
|
||||
|
||||
DELL WMI EXTRAS DRIVER
|
||||
P: Matthew Garrett
|
||||
M: mjg59@srcf.ucam.org
|
||||
S: Maintained
|
||||
|
||||
DEVICE NUMBER REGISTRY
|
||||
P: Torben Mathiasen
|
||||
M: device@lanana.org
|
||||
|
@ -4401,10 +4406,7 @@ T: quilt http://svn.sourceforge.jp/svnroot/tomoyo/trunk/2.2.x/tomoyo-lsm/patches
|
|||
S: Maintained
|
||||
|
||||
TOSHIBA ACPI EXTRAS DRIVER
|
||||
P: John Belmonte
|
||||
M: toshiba_acpi@memebeam.org
|
||||
W: http://memebeam.org/toys/ToshibaAcpiDriver
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
|
||||
TOSHIBA SMM DRIVER
|
||||
P: Jonathan Buzzard
|
||||
|
|
|
@ -229,6 +229,35 @@ static void __cpuinit acpi_register_lapic(int id, u8 enabled)
|
|||
generic_processor_info(id, ver);
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
|
||||
{
|
||||
struct acpi_madt_local_x2apic *processor = NULL;
|
||||
|
||||
processor = (struct acpi_madt_local_x2apic *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(processor, end))
|
||||
return -EINVAL;
|
||||
|
||||
acpi_table_print_madt_entry(header);
|
||||
|
||||
#ifdef CONFIG_X86_X2APIC
|
||||
/*
|
||||
* We need to register disabled CPU as well to permit
|
||||
* counting disabled CPUs. This allows us to size
|
||||
* cpus_possible_map more accurately, to permit
|
||||
* to not preallocating memory for all NR_CPUS
|
||||
* when we use CPU hotplug.
|
||||
*/
|
||||
acpi_register_lapic(processor->local_apic_id, /* APIC ID */
|
||||
processor->lapic_flags & ACPI_MADT_ENABLED);
|
||||
#else
|
||||
printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
|
@ -288,6 +317,25 @@ acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_x2apic_nmi(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_madt_local_x2apic_nmi *x2apic_nmi = NULL;
|
||||
|
||||
x2apic_nmi = (struct acpi_madt_local_x2apic_nmi *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(x2apic_nmi, end))
|
||||
return -EINVAL;
|
||||
|
||||
acpi_table_print_madt_entry(header);
|
||||
|
||||
if (x2apic_nmi->lint != 1)
|
||||
printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
|
@ -793,6 +841,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
|
|||
static int __init acpi_parse_madt_lapic_entries(void)
|
||||
{
|
||||
int count;
|
||||
int x2count = 0;
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
|
@ -816,22 +865,28 @@ static int __init acpi_parse_madt_lapic_entries(void)
|
|||
count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,
|
||||
acpi_parse_sapic, MAX_APICS);
|
||||
|
||||
if (!count)
|
||||
if (!count) {
|
||||
x2count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC,
|
||||
acpi_parse_x2apic, MAX_APICS);
|
||||
count = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC,
|
||||
acpi_parse_lapic, MAX_APICS);
|
||||
if (!count) {
|
||||
}
|
||||
if (!count && !x2count) {
|
||||
printk(KERN_ERR PREFIX "No LAPIC entries present\n");
|
||||
/* TBD: Cleanup to allow fallback to MPS */
|
||||
return -ENODEV;
|
||||
} else if (count < 0) {
|
||||
} else if (count < 0 || x2count < 0) {
|
||||
printk(KERN_ERR PREFIX "Error parsing LAPIC entry\n");
|
||||
/* TBD: Cleanup to allow fallback to MPS */
|
||||
return count;
|
||||
}
|
||||
|
||||
x2count =
|
||||
acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_X2APIC_NMI,
|
||||
acpi_parse_x2apic_nmi, 0);
|
||||
count =
|
||||
acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0);
|
||||
if (count < 0) {
|
||||
if (count < 0 || x2count < 0) {
|
||||
printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
|
||||
/* TBD: Cleanup to allow fallback to MPS */
|
||||
return count;
|
||||
|
@ -1470,7 +1525,7 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
|
|||
|
||||
/*
|
||||
* If your system is blacklisted here, but you find that acpi=force
|
||||
* works for you, please contact acpi-devel@sourceforge.net
|
||||
* works for you, please contact linux-acpi@vger.kernel.org
|
||||
*/
|
||||
static struct dmi_system_id __initdata acpi_dmi_table[] = {
|
||||
/*
|
||||
|
|
|
@ -682,6 +682,18 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
|||
perf->states[i].transition_latency * 1000;
|
||||
}
|
||||
|
||||
/* Check for high latency (>20uS) from buggy BIOSes, like on T42 */
|
||||
if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
|
||||
policy->cpuinfo.transition_latency > 20 * 1000) {
|
||||
static int print_once;
|
||||
policy->cpuinfo.transition_latency = 20 * 1000;
|
||||
if (!print_once) {
|
||||
print_once = 1;
|
||||
printk(KERN_INFO "Capping off P-state tranision latency"
|
||||
" at 20 uS\n");
|
||||
}
|
||||
}
|
||||
|
||||
data->max_freq = perf->states[0].core_frequency * 1000;
|
||||
/* table init */
|
||||
for (i = 0; i < perf->state_count; i++) {
|
||||
|
|
|
@ -305,7 +305,7 @@ retry_loop:
|
|||
outb(3, 0x22);
|
||||
} else if ((pr != NULL) && pr->flags.bm_control) {
|
||||
/* Disable bus master arbitration */
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
|
||||
acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 1);
|
||||
}
|
||||
switch (longhaul_version) {
|
||||
|
||||
|
@ -328,7 +328,7 @@ retry_loop:
|
|||
case TYPE_POWERSAVER:
|
||||
if (longhaul_flags & USE_ACPI_C3) {
|
||||
/* Don't allow wakeup */
|
||||
acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
||||
acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
||||
do_powersaver(cx->address, mults_index, dir);
|
||||
} else {
|
||||
do_powersaver(0, mults_index, dir);
|
||||
|
@ -341,7 +341,7 @@ retry_loop:
|
|||
outb(0, 0x22);
|
||||
} else if ((pr != NULL) && pr->flags.bm_control) {
|
||||
/* Enable bus master arbitration */
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
|
||||
acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 0);
|
||||
}
|
||||
outb(pic2_mask, 0xA1); /* restore mask */
|
||||
outb(pic1_mask, 0x21);
|
||||
|
|
|
@ -116,6 +116,36 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
|
|||
reserve_early(phys, phys + length, "ACPI SLIT");
|
||||
}
|
||||
|
||||
/* Callback for Proximity Domain -> x2APIC mapping */
|
||||
void __init
|
||||
acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
||||
{
|
||||
int pxm, node;
|
||||
int apic_id;
|
||||
|
||||
if (srat_disabled())
|
||||
return;
|
||||
if (pa->header.length < sizeof(struct acpi_srat_x2apic_cpu_affinity)) {
|
||||
bad_srat();
|
||||
return;
|
||||
}
|
||||
if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0)
|
||||
return;
|
||||
pxm = pa->proximity_domain;
|
||||
node = setup_node(pxm);
|
||||
if (node < 0) {
|
||||
printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
|
||||
bad_srat();
|
||||
return;
|
||||
}
|
||||
|
||||
apic_id = pa->apic_id;
|
||||
apicid_to_node[apic_id] = node;
|
||||
acpi_numa = 1;
|
||||
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
|
||||
pxm, apic_id, node);
|
||||
}
|
||||
|
||||
/* Callback for Proximity Domain -> LAPIC mapping */
|
||||
void __init
|
||||
acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
|
||||
|
|
|
@ -11,9 +11,9 @@ menuconfig ACPI
|
|||
select PNP
|
||||
select CPU_IDLE
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Advanced Configuration and Power Interface (ACPI) support for
|
||||
Linux requires an ACPI compliant platform (hardware/firmware),
|
||||
Linux requires an ACPI-compliant platform (hardware/firmware),
|
||||
and assumes the presence of OS-directed configuration and power
|
||||
management (OSPM) software. This option will enlarge your
|
||||
kernel by about 70K.
|
||||
|
@ -23,20 +23,19 @@ menuconfig ACPI
|
|||
the Plug-and-Play BIOS specification (PnP BIOS), the
|
||||
MultiProcessor Specification (MPS), and the Advanced Power
|
||||
Management (APM) specification. If both ACPI and APM support
|
||||
are configured, whichever is loaded first shall be used.
|
||||
are configured, ACPI is used.
|
||||
|
||||
The ACPI SourceForge project contains the latest source code,
|
||||
documentation, tools, mailing list subscription, and other
|
||||
information. This project is available at:
|
||||
<http://sourceforge.net/projects/acpi>
|
||||
The project home page for the Linux ACPI subsystem is here:
|
||||
<http://www.lesswatts.org/projects/acpi/>
|
||||
|
||||
Linux support for ACPI is based on Intel Corporation's ACPI
|
||||
Component Architecture (ACPI CA). For more information see:
|
||||
<http://developer.intel.com/technology/iapc/acpi>
|
||||
Component Architecture (ACPI CA). For more information on the
|
||||
ACPI CA, see:
|
||||
<http://acpica.org/>
|
||||
|
||||
ACPI is an open industry specification co-developed by Compaq,
|
||||
Intel, Microsoft, Phoenix, and Toshiba. The specification is
|
||||
available at:
|
||||
ACPI is an open industry specification co-developed by
|
||||
Hewlett-Packard, Intel, Microsoft, Phoenix, and Toshiba.
|
||||
The specification is available at:
|
||||
<http://www.acpi.info>
|
||||
|
||||
if ACPI
|
||||
|
@ -49,14 +48,14 @@ config ACPI_SLEEP
|
|||
config ACPI_PROCFS
|
||||
bool "Deprecated /proc/acpi files"
|
||||
depends on PROC_FS
|
||||
---help---
|
||||
help
|
||||
For backwards compatibility, this option allows
|
||||
deprecated /proc/acpi/ files to exist, even when
|
||||
they have been replaced by functions in /sys.
|
||||
The deprecated files (and their replacements) include:
|
||||
|
||||
/proc/acpi/sleep (/sys/power/state)
|
||||
/proc/acpi/info (/sys/modules/acpi/parameters/acpica_version)
|
||||
/proc/acpi/info (/sys/module/acpi/parameters/acpica_version)
|
||||
/proc/acpi/dsdt (/sys/firmware/acpi/tables/DSDT)
|
||||
/proc/acpi/fadt (/sys/firmware/acpi/tables/FACP)
|
||||
/proc/acpi/debug_layer (/sys/module/acpi/parameters/debug_layer)
|
||||
|
@ -66,11 +65,12 @@ config ACPI_PROCFS
|
|||
and functions which do not yet exist in /sys.
|
||||
|
||||
Say N to delete /proc/acpi/ files that have moved to /sys/
|
||||
|
||||
config ACPI_PROCFS_POWER
|
||||
bool "Deprecated power /proc/acpi directories"
|
||||
depends on PROC_FS
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
For backwards compatibility, this option allows
|
||||
deprecated power /proc/acpi/ directories to exist, even when
|
||||
they have been replaced by functions in /sys.
|
||||
|
@ -86,19 +86,19 @@ config ACPI_SYSFS_POWER
|
|||
bool "Future power /sys interface"
|
||||
select POWER_SUPPLY
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Say N to disable power /sys interface
|
||||
|
||||
config ACPI_PROC_EVENT
|
||||
bool "Deprecated /proc/acpi/event support"
|
||||
depends on PROC_FS
|
||||
default y
|
||||
---help---
|
||||
A user-space daemon, acpi, typically read /proc/acpi/event
|
||||
and handled all ACPI sub-system generated events.
|
||||
help
|
||||
A user-space daemon, acpid, typically reads /proc/acpi/event
|
||||
and handles all ACPI-generated events.
|
||||
|
||||
These events are now delivered to user-space via
|
||||
either the input layer, or as netlink events.
|
||||
These events are now delivered to user-space either
|
||||
via the input layer or as netlink events.
|
||||
|
||||
This build option enables the old code for legacy
|
||||
user-space implementation. After some time, this will
|
||||
|
@ -112,10 +112,13 @@ config ACPI_AC
|
|||
depends on X86
|
||||
default y
|
||||
help
|
||||
This driver adds support for the AC Adapter object, which indicates
|
||||
whether a system is on AC, or not. If you have a system that can
|
||||
This driver supports the AC Adapter object, which indicates
|
||||
whether a system is on AC or not. If you have a system that can
|
||||
switch between A/C and battery, say Y.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called ac.
|
||||
|
||||
config ACPI_BATTERY
|
||||
tristate "Battery"
|
||||
depends on X86
|
||||
|
@ -125,15 +128,21 @@ config ACPI_BATTERY
|
|||
/proc/acpi/battery. If you have a mobile system with a battery,
|
||||
say Y.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called battery.
|
||||
|
||||
config ACPI_BUTTON
|
||||
tristate "Button"
|
||||
depends on INPUT
|
||||
default y
|
||||
help
|
||||
This driver handles events on the power, sleep and lid buttons.
|
||||
This driver handles events on the power, sleep, and lid buttons.
|
||||
A daemon reads /proc/acpi/event and perform user-defined actions
|
||||
such as shutting down the system. This is necessary for
|
||||
software controlled poweroff.
|
||||
software-controlled poweroff.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called button.
|
||||
|
||||
config ACPI_VIDEO
|
||||
tristate "Video"
|
||||
|
@ -141,38 +150,45 @@ config ACPI_VIDEO
|
|||
depends on INPUT
|
||||
select THERMAL
|
||||
help
|
||||
This driver implement the ACPI Extensions For Display Adapters
|
||||
This driver implements the ACPI Extensions For Display Adapters
|
||||
for integrated graphics devices on motherboard, as specified in
|
||||
ACPI 2.0 Specification, Appendix B, allowing to perform some basic
|
||||
control like defining the video POST device, retrieving EDID information
|
||||
or to setup a video output, etc.
|
||||
Note that this is an ref. implementation only. It may or may not work
|
||||
for your integrated video device.
|
||||
ACPI 2.0 Specification, Appendix B. This supports basic operations
|
||||
such as defining the video POST device, retrieving EDID information,
|
||||
and setting up a video output.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called video.
|
||||
|
||||
config ACPI_FAN
|
||||
tristate "Fan"
|
||||
select THERMAL
|
||||
default y
|
||||
help
|
||||
This driver adds support for ACPI fan devices, allowing user-mode
|
||||
This driver supports ACPI fan devices, allowing user-mode
|
||||
applications to perform basic fan control (on, off, status).
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called fan.
|
||||
|
||||
config ACPI_DOCK
|
||||
bool "Dock"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
This driver adds support for ACPI controlled docking stations and removable
|
||||
drive bays such as the IBM ultrabay or the Dell Module Bay.
|
||||
This driver supports ACPI-controlled docking stations and removable
|
||||
drive bays such as the IBM Ultrabay and the Dell Module Bay.
|
||||
|
||||
config ACPI_PROCESSOR
|
||||
tristate "Processor"
|
||||
select THERMAL
|
||||
default y
|
||||
help
|
||||
This driver installs ACPI as the idle handler for Linux, and uses
|
||||
ACPI C2 and C3 processor states to save power, on systems that
|
||||
This driver installs ACPI as the idle handler for Linux and uses
|
||||
ACPI C2 and C3 processor states to save power on systems that
|
||||
support it. It is required by several flavors of cpufreq
|
||||
Performance-state drivers.
|
||||
performance-state drivers.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called processor.
|
||||
|
||||
config ACPI_HOTPLUG_CPU
|
||||
bool
|
||||
|
@ -186,11 +202,14 @@ config ACPI_THERMAL
|
|||
select THERMAL
|
||||
default y
|
||||
help
|
||||
This driver adds support for ACPI thermal zones. Most mobile and
|
||||
This driver supports ACPI thermal zones. Most mobile and
|
||||
some desktop systems support ACPI thermal zones. It is HIGHLY
|
||||
recommended that this option be enabled, as your processor(s)
|
||||
may be damaged without it.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called thermal.
|
||||
|
||||
config ACPI_NUMA
|
||||
bool "NUMA support"
|
||||
depends on NUMA
|
||||
|
@ -218,7 +237,7 @@ config ACPI_BLACKLIST_YEAR
|
|||
int "Disable ACPI for systems before Jan 1st this year" if X86_32
|
||||
default 0
|
||||
help
|
||||
enter a 4-digit year, eg. 2001 to disable ACPI by default
|
||||
Enter a 4-digit year, e.g., 2001, to disable ACPI by default
|
||||
on platforms with DMI BIOS date before January 1st that year.
|
||||
"acpi=force" can be used to override this mechanism.
|
||||
|
||||
|
@ -249,10 +268,13 @@ config ACPI_PCI_SLOT
|
|||
tristate "PCI slot detection driver"
|
||||
default n
|
||||
help
|
||||
This driver will attempt to discover all PCI slots in your system,
|
||||
and creates entries in /sys/bus/pci/slots/. This feature can
|
||||
help you correlate PCI bus addresses with the physical geography
|
||||
of your slots. If you are unsure, say N.
|
||||
This driver creates entries in /sys/bus/pci/slots/ for all PCI
|
||||
slots in the system. This can help correlate PCI bus addresses,
|
||||
i.e., segment/bus/device/function tuples, with physical slots in
|
||||
the system. If you are unsure, say N.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called pci_slot.
|
||||
|
||||
config X86_PM_TIMER
|
||||
bool "Power Management Timer Support" if EMBEDDED
|
||||
|
@ -271,43 +293,43 @@ config X86_PM_TIMER
|
|||
systems require this timer.
|
||||
|
||||
config ACPI_CONTAINER
|
||||
tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)"
|
||||
tristate "Container and Module Devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU || ACPI_HOTPLUG_IO)
|
||||
---help---
|
||||
This allows _physical_ insertion and removal of CPUs and memory.
|
||||
This can be useful, for example, on NUMA machines that support
|
||||
ACPI based physical hotplug of nodes, or non-NUMA machines that
|
||||
support physical cpu/memory hot-plug.
|
||||
help
|
||||
This driver supports ACPI Container and Module devices (IDs
|
||||
ACPI0004, PNP0A05, and PNP0A06).
|
||||
|
||||
If one selects "m", this driver can be loaded with
|
||||
"modprobe container".
|
||||
This helps support hotplug of nodes, CPUs, and memory.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called container.
|
||||
|
||||
config ACPI_HOTPLUG_MEMORY
|
||||
tristate "Memory Hotplug"
|
||||
depends on MEMORY_HOTPLUG
|
||||
default n
|
||||
help
|
||||
This driver adds supports for ACPI Memory Hotplug. This driver
|
||||
provides support for fielding notifications on ACPI memory
|
||||
devices (PNP0C80) which represent memory ranges that may be
|
||||
onlined or offlined during runtime.
|
||||
This driver supports ACPI memory hotplug. The driver
|
||||
fields notifications on ACPI memory devices (PNP0C80),
|
||||
which represent memory ranges that may be onlined or
|
||||
offlined during runtime.
|
||||
|
||||
Enabling this driver assumes that your platform hardware
|
||||
and firmware have support for hot-plugging physical memory. If
|
||||
your system does not support physically adding or ripping out
|
||||
memory DIMMs at some platform defined granularity (individually
|
||||
or as a bank) at runtime, then you need not enable this driver.
|
||||
If your hardware and firmware do not support adding or
|
||||
removing memory devices at runtime, you need not enable
|
||||
this driver.
|
||||
|
||||
If one selects "m," this driver can be loaded using the following
|
||||
command:
|
||||
$>modprobe acpi_memhotplug
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called acpi_memhotplug.
|
||||
|
||||
config ACPI_SBS
|
||||
tristate "Smart Battery System"
|
||||
depends on X86
|
||||
help
|
||||
This driver adds support for the Smart Battery System, another
|
||||
This driver supports the Smart Battery System, another
|
||||
type of access to battery information, found on some laptops.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the modules will be called sbs and sbshc.
|
||||
|
||||
endif # ACPI
|
||||
|
|
|
@ -14,48 +14,50 @@ obj-$(CONFIG_X86) += blacklist.o
|
|||
#
|
||||
# ACPI Core Subsystem (Interpreter)
|
||||
#
|
||||
obj-y += osl.o utils.o reboot.o\
|
||||
obj-y += acpi.o \
|
||||
acpica/
|
||||
|
||||
# All the builtin files are in the "acpi." module_param namespace.
|
||||
acpi-y += osl.o utils.o reboot.o
|
||||
|
||||
# sleep related files
|
||||
obj-y += wakeup.o
|
||||
obj-y += sleep.o
|
||||
obj-$(CONFIG_ACPI_SLEEP) += proc.o
|
||||
acpi-y += wakeup.o
|
||||
acpi-y += sleep.o
|
||||
acpi-$(CONFIG_ACPI_SLEEP) += proc.o
|
||||
|
||||
|
||||
#
|
||||
# ACPI Bus and Device Drivers
|
||||
#
|
||||
processor-objs += processor_core.o processor_throttling.o \
|
||||
processor_idle.o processor_thermal.o
|
||||
ifdef CONFIG_CPU_FREQ
|
||||
processor-objs += processor_perflib.o
|
||||
acpi-y += bus.o glue.o
|
||||
acpi-y += scan.o
|
||||
acpi-y += ec.o
|
||||
acpi-$(CONFIG_ACPI_DOCK) += dock.o
|
||||
acpi-y += pci_root.o pci_link.o pci_irq.o pci_bind.o
|
||||
acpi-y += power.o
|
||||
acpi-y += system.o event.o
|
||||
acpi-$(CONFIG_ACPI_DEBUG) += debug.o
|
||||
acpi-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o
|
||||
ifdef CONFIG_ACPI_VIDEO
|
||||
acpi-y += video_detect.o
|
||||
endif
|
||||
|
||||
obj-y += bus.o glue.o
|
||||
obj-y += scan.o
|
||||
# Keep EC driver first. Initialization of others depend on it.
|
||||
obj-y += ec.o
|
||||
# These are (potentially) separate modules
|
||||
obj-$(CONFIG_ACPI_AC) += ac.o
|
||||
obj-$(CONFIG_ACPI_BATTERY) += battery.o
|
||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||
obj-$(CONFIG_ACPI_DOCK) += dock.o
|
||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
ifdef CONFIG_ACPI_VIDEO
|
||||
obj-y += video_detect.o
|
||||
endif
|
||||
|
||||
obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o
|
||||
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
|
||||
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
|
||||
obj-$(CONFIG_ACPI_CONTAINER) += container.o
|
||||
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
|
||||
obj-y += power.o
|
||||
obj-y += system.o event.o
|
||||
obj-$(CONFIG_ACPI_DEBUG) += debug.o
|
||||
obj-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
|
||||
obj-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o
|
||||
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
|
||||
obj-$(CONFIG_ACPI_BATTERY) += battery.o
|
||||
obj-$(CONFIG_ACPI_SBS) += sbshc.o
|
||||
obj-$(CONFIG_ACPI_SBS) += sbs.o
|
||||
|
||||
# processor has its own "processor." module_param namespace
|
||||
processor-y := processor_core.o processor_throttling.o
|
||||
processor-y += processor_idle.o processor_thermal.o
|
||||
processor-$(CONFIG_CPU_FREQ) += processor_perflib.o
|
||||
|
|
|
@ -18,7 +18,7 @@ obj-y += exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.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-y += hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o
|
||||
|
||||
obj-$(ACPI_FUTURE_USAGE) += hwtimer.o
|
||||
|
||||
|
@ -41,4 +41,4 @@ 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
|
||||
utstate.o utmutex.o utobject.o utresrc.o utlock.o
|
||||
|
|
|
@ -148,9 +148,12 @@ ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list;
|
|||
ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT;
|
||||
ACPI_EXTERN struct acpi_table_facs *acpi_gbl_FACS;
|
||||
|
||||
/* These addresses are calculated from FADT address values */
|
||||
/* These addresses are calculated from the FADT Event Block addresses */
|
||||
|
||||
ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_status;
|
||||
ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_enable;
|
||||
|
||||
ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_status;
|
||||
ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable;
|
||||
|
||||
/*
|
||||
|
@ -162,6 +165,10 @@ ACPI_EXTERN u8 acpi_gbl_integer_bit_width;
|
|||
ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
|
||||
ACPI_EXTERN u8 acpi_gbl_integer_nybble_width;
|
||||
|
||||
/* Reader/Writer lock is used for namespace walk and dynamic table unload */
|
||||
|
||||
ACPI_EXTERN struct acpi_rw_lock acpi_gbl_namespace_rw_lock;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Mutual exlusion within ACPICA subsystem
|
||||
|
@ -245,6 +252,7 @@ ACPI_EXTERN u8 acpi_gbl_step_to_next_call;
|
|||
ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present;
|
||||
ACPI_EXTERN u8 acpi_gbl_events_initialized;
|
||||
ACPI_EXTERN u8 acpi_gbl_system_awake_and_running;
|
||||
ACPI_EXTERN u8 acpi_gbl_osi_data;
|
||||
|
||||
#ifndef DEFINE_ACPI_GLOBALS
|
||||
|
||||
|
@ -371,7 +379,6 @@ ACPI_EXTERN char *acpi_gbl_db_buffer;
|
|||
ACPI_EXTERN char *acpi_gbl_db_filename;
|
||||
ACPI_EXTERN u32 acpi_gbl_db_debug_level;
|
||||
ACPI_EXTERN u32 acpi_gbl_db_console_debug_level;
|
||||
ACPI_EXTERN struct acpi_table_header *acpi_gbl_db_table_ptr;
|
||||
ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_db_scope_node;
|
||||
|
||||
/*
|
||||
|
|
|
@ -64,13 +64,21 @@ u32 acpi_hw_get_mode(void);
|
|||
*/
|
||||
struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_register_read(u32 register_id, u32 * return_value);
|
||||
acpi_status acpi_hw_write_pm1_control(u32 pm1a_control, u32 pm1b_control);
|
||||
|
||||
acpi_status 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_clear_acpi_status(void);
|
||||
|
||||
/*
|
||||
* hwvalid - Port I/O with validation
|
||||
*/
|
||||
acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width);
|
||||
|
||||
acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width);
|
||||
|
||||
/*
|
||||
* hwgpe - GPE support
|
||||
*/
|
||||
|
|
|
@ -108,6 +108,14 @@ static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = {
|
|||
#endif
|
||||
#endif
|
||||
|
||||
/* Lock structure for reader/writer interfaces */
|
||||
|
||||
struct acpi_rw_lock {
|
||||
acpi_mutex writer_mutex;
|
||||
acpi_mutex reader_mutex;
|
||||
u32 num_readers;
|
||||
};
|
||||
|
||||
/*
|
||||
* Predefined handles for spinlocks used within the subsystem.
|
||||
* These spinlocks are created by acpi_ut_mutex_initialize
|
||||
|
@ -772,7 +780,19 @@ struct acpi_bit_register_info {
|
|||
* must be preserved.
|
||||
*/
|
||||
#define ACPI_PM1_STATUS_PRESERVED_BITS 0x0800 /* Bit 11 */
|
||||
#define ACPI_PM1_CONTROL_PRESERVED_BITS 0x0200 /* Bit 9 (whatever) */
|
||||
|
||||
/* Write-only bits must be zeroed by software */
|
||||
|
||||
#define ACPI_PM1_CONTROL_WRITEONLY_BITS 0x2004 /* Bits 13, 2 */
|
||||
|
||||
/* For control registers, both ignored and reserved bits must be preserved */
|
||||
|
||||
#define ACPI_PM1_CONTROL_IGNORED_BITS 0x0201 /* Bits 9, 0(SCI_EN) */
|
||||
#define ACPI_PM1_CONTROL_RESERVED_BITS 0xC1F8 /* Bits 14-15, 3-8 */
|
||||
#define ACPI_PM1_CONTROL_PRESERVED_BITS \
|
||||
(ACPI_PM1_CONTROL_IGNORED_BITS | ACPI_PM1_CONTROL_RESERVED_BITS)
|
||||
|
||||
#define ACPI_PM2_CONTROL_PRESERVED_BITS 0xFFFFFFFE /* All except bit 0 */
|
||||
|
||||
/*
|
||||
* Register IDs
|
||||
|
@ -781,12 +801,10 @@ struct acpi_bit_register_info {
|
|||
#define ACPI_REGISTER_PM1_STATUS 0x01
|
||||
#define ACPI_REGISTER_PM1_ENABLE 0x02
|
||||
#define ACPI_REGISTER_PM1_CONTROL 0x03
|
||||
#define ACPI_REGISTER_PM1A_CONTROL 0x04
|
||||
#define ACPI_REGISTER_PM1B_CONTROL 0x05
|
||||
#define ACPI_REGISTER_PM2_CONTROL 0x06
|
||||
#define ACPI_REGISTER_PM_TIMER 0x07
|
||||
#define ACPI_REGISTER_PROCESSOR_BLOCK 0x08
|
||||
#define ACPI_REGISTER_SMI_COMMAND_BLOCK 0x09
|
||||
#define ACPI_REGISTER_PM2_CONTROL 0x04
|
||||
#define ACPI_REGISTER_PM_TIMER 0x05
|
||||
#define ACPI_REGISTER_PROCESSOR_BLOCK 0x06
|
||||
#define ACPI_REGISTER_SMI_COMMAND_BLOCK 0x07
|
||||
|
||||
/* Masks used to access the bit_registers */
|
||||
|
||||
|
@ -818,7 +836,7 @@ struct acpi_bit_register_info {
|
|||
#define ACPI_BITMASK_SCI_ENABLE 0x0001
|
||||
#define ACPI_BITMASK_BUS_MASTER_RLD 0x0002
|
||||
#define ACPI_BITMASK_GLOBAL_LOCK_RELEASE 0x0004
|
||||
#define ACPI_BITMASK_SLEEP_TYPE_X 0x1C00
|
||||
#define ACPI_BITMASK_SLEEP_TYPE 0x1C00
|
||||
#define ACPI_BITMASK_SLEEP_ENABLE 0x2000
|
||||
|
||||
#define ACPI_BITMASK_ARB_DISABLE 0x0001
|
||||
|
@ -844,11 +862,35 @@ struct acpi_bit_register_info {
|
|||
#define ACPI_BITPOSITION_SCI_ENABLE 0x00
|
||||
#define ACPI_BITPOSITION_BUS_MASTER_RLD 0x01
|
||||
#define ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE 0x02
|
||||
#define ACPI_BITPOSITION_SLEEP_TYPE_X 0x0A
|
||||
#define ACPI_BITPOSITION_SLEEP_TYPE 0x0A
|
||||
#define ACPI_BITPOSITION_SLEEP_ENABLE 0x0D
|
||||
|
||||
#define ACPI_BITPOSITION_ARB_DISABLE 0x00
|
||||
|
||||
/* Structs and definitions for _OSI support and I/O port validation */
|
||||
|
||||
#define ACPI_OSI_WIN_2000 0x01
|
||||
#define ACPI_OSI_WIN_XP 0x02
|
||||
#define ACPI_OSI_WIN_XP_SP1 0x03
|
||||
#define ACPI_OSI_WINSRV_2003 0x04
|
||||
#define ACPI_OSI_WIN_XP_SP2 0x05
|
||||
#define ACPI_OSI_WINSRV_2003_SP1 0x06
|
||||
#define ACPI_OSI_WIN_VISTA 0x07
|
||||
|
||||
#define ACPI_ALWAYS_ILLEGAL 0x00
|
||||
|
||||
struct acpi_interface_info {
|
||||
char *name;
|
||||
u8 value;
|
||||
};
|
||||
|
||||
struct acpi_port_info {
|
||||
char *name;
|
||||
u16 start;
|
||||
u16 end;
|
||||
u8 osi_dependency;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Resource descriptors
|
||||
|
|
|
@ -292,10 +292,6 @@
|
|||
#define ACPI_GET_DESCRIPTOR_TYPE(d) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type)
|
||||
#define ACPI_SET_DESCRIPTOR_TYPE(d, t) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = t)
|
||||
|
||||
/* Macro to test the object type */
|
||||
|
||||
#define ACPI_GET_OBJECT_TYPE(d) (((union acpi_operand_object *)(void *)(d))->common.type)
|
||||
|
||||
/*
|
||||
* Macros for the master AML opcode table
|
||||
*/
|
||||
|
|
|
@ -97,7 +97,6 @@
|
|||
#define AOPOBJ_OBJECT_INITIALIZED 0x08
|
||||
#define AOPOBJ_SETUP_COMPLETE 0x10
|
||||
#define AOPOBJ_SINGLE_DATUM 0x20
|
||||
#define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an op_region address */
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
|
|
|
@ -52,41 +52,44 @@
|
|||
* 1) PTYPE1 packages do not contain sub-packages.
|
||||
*
|
||||
* ACPI_PTYPE1_FIXED: Fixed length, 1 or 2 object types:
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
*
|
||||
* ACPI_PTYPE1_VAR: Variable length:
|
||||
* object type (Int/Buf/Ref)
|
||||
* object type (Int/Buf/Ref)
|
||||
*
|
||||
* ACPI_PTYPE1_OPTION: Package has some required and some optional elements:
|
||||
* Used for _PRW
|
||||
* ACPI_PTYPE1_OPTION: Package has some required and some optional elements
|
||||
* (Used for _PRW)
|
||||
*
|
||||
*
|
||||
* 2) PTYPE2 packages contain a variable number of sub-packages. Each of the
|
||||
* different types describe the contents of each of the sub-packages.
|
||||
*
|
||||
* ACPI_PTYPE2: Each subpackage contains 1 or 2 object types:
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* (Used for _ALR,_MLS,_PSS,_TRT,_TSS)
|
||||
*
|
||||
* ACPI_PTYPE2_COUNT: Each subpackage has a count as first element:
|
||||
* object type
|
||||
* object type
|
||||
* (Used for _CSD,_PSD,_TSD)
|
||||
*
|
||||
* ACPI_PTYPE2_PKG_COUNT: Count of subpackages at start, 1 or 2 object types:
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
* (Used for _CST)
|
||||
*
|
||||
* ACPI_PTYPE2_FIXED: Each subpackage is of fixed length:
|
||||
* Used for _PRT
|
||||
* ACPI_PTYPE2_FIXED: Each subpackage is of fixed length
|
||||
* (Used for _PRT)
|
||||
*
|
||||
* ACPI_PTYPE2_MIN: Each subpackage has a variable but minimum length
|
||||
* Used for _HPX
|
||||
* (Used for _HPX)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ acpi_status acpi_allocate_root_table(u32 initial_table_count);
|
|||
/*
|
||||
* tbfadt - FADT parse/convert/validate
|
||||
*/
|
||||
void acpi_tb_parse_fadt(u32 table_index, u8 flags);
|
||||
void acpi_tb_parse_fadt(u32 table_index);
|
||||
|
||||
void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length);
|
||||
|
||||
|
@ -79,7 +79,7 @@ void acpi_tb_delete_table(struct acpi_table_desc *table_desc);
|
|||
|
||||
void acpi_tb_terminate(void);
|
||||
|
||||
void acpi_tb_delete_namespace_by_owner(u32 table_index);
|
||||
acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index);
|
||||
|
||||
acpi_status acpi_tb_allocate_owner_id(u32 table_index);
|
||||
|
||||
|
@ -109,9 +109,8 @@ acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length);
|
|||
|
||||
void
|
||||
acpi_tb_install_table(acpi_physical_address address,
|
||||
u8 flags, char *signature, u32 table_index);
|
||||
char *signature, u32 table_index);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags);
|
||||
acpi_status acpi_tb_parse_root_table(acpi_physical_address rsdp_address);
|
||||
|
||||
#endif /* __ACTABLES_H__ */
|
||||
|
|
|
@ -345,6 +345,21 @@ acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
|
|||
acpi_status
|
||||
acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest);
|
||||
|
||||
/*
|
||||
* utlock - reader/writer locks
|
||||
*/
|
||||
acpi_status acpi_ut_create_rw_lock(struct acpi_rw_lock *lock);
|
||||
|
||||
void acpi_ut_delete_rw_lock(struct acpi_rw_lock *lock);
|
||||
|
||||
acpi_status acpi_ut_acquire_read_lock(struct acpi_rw_lock *lock);
|
||||
|
||||
acpi_status acpi_ut_release_read_lock(struct acpi_rw_lock *lock);
|
||||
|
||||
acpi_status acpi_ut_acquire_write_lock(struct acpi_rw_lock *lock);
|
||||
|
||||
void acpi_ut_release_write_lock(struct acpi_rw_lock *lock);
|
||||
|
||||
/*
|
||||
* utobject - internal object create/delete/cache routines
|
||||
*/
|
||||
|
|
|
@ -180,11 +180,23 @@ acpi_ds_initialize_objects(u32 table_index,
|
|||
|
||||
/* Walk entire namespace from the supplied root */
|
||||
|
||||
status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
|
||||
acpi_ds_init_one_object, &info, NULL);
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't use acpi_walk_namespace since we do not want to acquire
|
||||
* the namespace reader lock.
|
||||
*/
|
||||
status =
|
||||
acpi_ns_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
|
||||
ACPI_NS_WALK_UNLOCK, acpi_ds_init_one_object,
|
||||
&info, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "During WalkNamespace"));
|
||||
}
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
@ -713,6 +713,6 @@ acpi_ds_method_data_get_type(u16 opcode,
|
|||
|
||||
/* Get the object type */
|
||||
|
||||
return_VALUE(ACPI_GET_OBJECT_TYPE(object));
|
||||
return_VALUE(object->type);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -565,7 +565,7 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state,
|
|||
|
||||
/* Re-type the object according to its argument */
|
||||
|
||||
node->type = ACPI_GET_OBJECT_TYPE(obj_desc);
|
||||
node->type = obj_desc->common.type;
|
||||
|
||||
/* Attach obj to node */
|
||||
|
||||
|
@ -619,7 +619,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|||
|
||||
/* Perform per-object initialization */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/*
|
||||
|
@ -803,7 +803,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unimplemented data type: %X",
|
||||
ACPI_GET_OBJECT_TYPE(obj_desc)));
|
||||
obj_desc->common.type));
|
||||
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
break;
|
||||
|
|
|
@ -397,30 +397,6 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
|
|||
status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node),
|
||||
extra_desc->extra.aml_length,
|
||||
extra_desc->extra.aml_start);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Validate the region address/length via the host OS */
|
||||
|
||||
status = acpi_os_validate_address(obj_desc->region.space_id,
|
||||
obj_desc->region.address,
|
||||
(acpi_size) obj_desc->region.length,
|
||||
acpi_ut_get_node_name(node));
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
/*
|
||||
* Invalid address/length. We will emit an error message and mark
|
||||
* the region as invalid, so that it will cause an additional error if
|
||||
* it is ever used. Then return AE_OK.
|
||||
*/
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During address validation of OpRegion [%4.4s]",
|
||||
node->name.ascii));
|
||||
obj_desc->common.flags |= AOPOBJ_INVALID;
|
||||
status = AE_OK;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -484,7 +460,7 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
|
|||
|
||||
/* Host object must be a Buffer */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) {
|
||||
if (buffer_desc->common.type != ACPI_TYPE_BUFFER) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Target of Create Field is not a Buffer object - %s",
|
||||
acpi_ut_get_object_type_name(buffer_desc)));
|
||||
|
@ -1365,10 +1341,8 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
|
|||
if ((ACPI_GET_DESCRIPTOR_TYPE
|
||||
(walk_state->results->results.obj_desc[0]) ==
|
||||
ACPI_DESC_TYPE_OPERAND)
|
||||
&&
|
||||
(ACPI_GET_OBJECT_TYPE
|
||||
(walk_state->results->results.obj_desc[0]) ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE)
|
||||
&& ((walk_state->results->results.obj_desc[0])->
|
||||
common.type == ACPI_TYPE_LOCAL_REFERENCE)
|
||||
&& ((walk_state->results->results.obj_desc[0])->
|
||||
reference.class != ACPI_REFCLASS_INDEX)) {
|
||||
status =
|
||||
|
|
|
@ -816,7 +816,7 @@ acpi_status acpi_ds_evaluate_name_path(struct acpi_walk_state *walk_state)
|
|||
goto push_result;
|
||||
}
|
||||
|
||||
type = ACPI_GET_OBJECT_TYPE(*operand);
|
||||
type = (*operand)->common.type;
|
||||
|
||||
status = acpi_ex_resolve_to_value(operand, walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
@ -138,11 +138,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) {
|
||||
if (local_obj_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Bad predicate (not an integer) ObjDesc=%p State=%p Type=%X",
|
||||
obj_desc, walk_state,
|
||||
ACPI_GET_OBJECT_TYPE(obj_desc)));
|
||||
obj_desc, walk_state, obj_desc->common.type));
|
||||
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
goto cleanup;
|
||||
|
|
|
@ -183,7 +183,7 @@ acpi_status acpi_ev_install_xrupt_handlers(void)
|
|||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Install the fixed event handlers and enable the fixed events.
|
||||
* DESCRIPTION: Install the fixed event handlers and disable all fixed events.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -200,12 +200,13 @@ static acpi_status acpi_ev_fixed_event_initialize(void)
|
|||
acpi_gbl_fixed_event_handlers[i].handler = NULL;
|
||||
acpi_gbl_fixed_event_handlers[i].context = NULL;
|
||||
|
||||
/* Enable the fixed event */
|
||||
/* Disable the fixed event */
|
||||
|
||||
if (acpi_gbl_fixed_event_info[i].enable_register_id != 0xFF) {
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[i].
|
||||
enable_register_id, 0);
|
||||
acpi_write_bit_register(acpi_gbl_fixed_event_info
|
||||
[i].enable_register_id,
|
||||
ACPI_DISABLE_EVENT);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -288,16 +289,17 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)
|
|||
|
||||
/* Clear the status bit */
|
||||
|
||||
(void)acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
status_register_id, 1);
|
||||
(void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
status_register_id, ACPI_CLEAR_STATUS);
|
||||
|
||||
/*
|
||||
* 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].
|
||||
enable_register_id, 0);
|
||||
(void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id,
|
||||
ACPI_DISABLE_EVENT);
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"No installed handler for fixed event [%08X]",
|
||||
|
|
|
@ -88,10 +88,10 @@ acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type)
|
|||
|
||||
status = acpi_ev_disable_gpe(gpe_event_info);
|
||||
|
||||
/* Type was validated above */
|
||||
/* Clear the type bits and insert the new Type */
|
||||
|
||||
gpe_event_info->flags &= ~ACPI_GPE_TYPE_MASK; /* Clear type bits */
|
||||
gpe_event_info->flags |= type; /* Insert type */
|
||||
gpe_event_info->flags &= ~ACPI_GPE_TYPE_MASK;
|
||||
gpe_event_info->flags |= type;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -122,6 +122,7 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
|
|||
if (!gpe_register_info) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
register_bit = (u8)
|
||||
(1 <<
|
||||
(gpe_event_info->gpe_number - gpe_register_info->base_gpe_number));
|
||||
|
|
|
@ -104,9 +104,9 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info)
|
|||
|
||||
while (gpe_block) {
|
||||
if ((&gpe_block->event_info[0] <= gpe_event_info) &&
|
||||
(&gpe_block->
|
||||
event_info[((acpi_size) gpe_block->
|
||||
register_count) * 8] >
|
||||
(&gpe_block->event_info[((acpi_size)
|
||||
gpe_block->
|
||||
register_count) * 8] >
|
||||
gpe_event_info)) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
@ -210,10 +210,9 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
|||
/* Now look at the individual GPEs in this byte register */
|
||||
|
||||
for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
|
||||
gpe_event_info =
|
||||
&gpe_block->
|
||||
event_info[((acpi_size) i *
|
||||
ACPI_GPE_REGISTER_WIDTH) + j];
|
||||
gpe_event_info = &gpe_block->event_info[((acpi_size) i *
|
||||
ACPI_GPE_REGISTER_WIDTH)
|
||||
+ j];
|
||||
|
||||
if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
|
||||
ACPI_GPE_DISPATCH_HANDLER) {
|
||||
|
@ -293,8 +292,8 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
|
|||
/* Unknown method type, just ignore it! */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
|
||||
"Ignoring unknown GPE method type: %s (name not of form _Lxx or _Exx)",
|
||||
name));
|
||||
"Ignoring unknown GPE method type: %s "
|
||||
"(name not of form _Lxx or _Exx)", name));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
@ -306,17 +305,16 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
|
|||
/* Conversion failed; invalid method, just ignore it */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
|
||||
"Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)",
|
||||
name));
|
||||
"Could not extract GPE number from name: %s "
|
||||
"(name is not of form _Lxx or _Exx)", name));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Ensure that we have a valid GPE number for this GPE block */
|
||||
|
||||
if ((gpe_number < gpe_block->block_base_number) ||
|
||||
(gpe_number >=
|
||||
(gpe_block->block_base_number +
|
||||
(gpe_block->register_count * 8)))) {
|
||||
(gpe_number >= (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
|
||||
|
@ -408,7 +406,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
|||
*/
|
||||
obj_desc = pkg_desc->package.elements[0];
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
|
||||
|
||||
/* Use FADT-defined GPE device (from definition of _PRW) */
|
||||
|
||||
|
@ -417,15 +415,15 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
|||
/* Integer is the GPE number in the FADT described GPE blocks */
|
||||
|
||||
gpe_number = (u32) obj_desc->integer.value;
|
||||
} else if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
|
||||
} else if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
|
||||
|
||||
/* Package contains a GPE reference and GPE number within a GPE block */
|
||||
|
||||
if ((obj_desc->package.count < 2) ||
|
||||
(ACPI_GET_OBJECT_TYPE(obj_desc->package.elements[0]) !=
|
||||
ACPI_TYPE_LOCAL_REFERENCE)
|
||||
|| (ACPI_GET_OBJECT_TYPE(obj_desc->package.elements[1]) !=
|
||||
ACPI_TYPE_INTEGER)) {
|
||||
((obj_desc->package.elements[0])->common.type !=
|
||||
ACPI_TYPE_LOCAL_REFERENCE) ||
|
||||
((obj_desc->package.elements[1])->common.type !=
|
||||
ACPI_TYPE_INTEGER)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
@ -450,11 +448,11 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
|
|||
*/
|
||||
if ((gpe_device == target_gpe_device) &&
|
||||
(gpe_number >= gpe_block->block_base_number) &&
|
||||
(gpe_number <
|
||||
gpe_block->block_base_number + (gpe_block->register_count * 8))) {
|
||||
gpe_event_info =
|
||||
&gpe_block->event_info[gpe_number -
|
||||
gpe_block->block_base_number];
|
||||
(gpe_number < gpe_block->block_base_number +
|
||||
(gpe_block->register_count * 8))) {
|
||||
gpe_event_info = &gpe_block->event_info[gpe_number -
|
||||
gpe_block->
|
||||
block_base_number];
|
||||
|
||||
/* Mark GPE for WAKE-ONLY but WAKE_DISABLED */
|
||||
|
||||
|
@ -1033,8 +1031,8 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
|
|||
* 1) are "runtime" or "run/wake" GPEs, and
|
||||
* 2) have a corresponding _Lxx or _Exx method
|
||||
*
|
||||
* Any other GPEs within this block must be enabled via the acpi_enable_gpe()
|
||||
* external interface.
|
||||
* Any other GPEs within this block must be enabled via the
|
||||
* acpi_enable_gpe() external interface.
|
||||
*/
|
||||
wake_gpe_count = 0;
|
||||
gpe_enabled_count = 0;
|
||||
|
@ -1044,14 +1042,13 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
|
|||
|
||||
/* Get the info block for this particular GPE */
|
||||
|
||||
gpe_event_info =
|
||||
&gpe_block->
|
||||
event_info[((acpi_size) i *
|
||||
ACPI_GPE_REGISTER_WIDTH) + j];
|
||||
gpe_event_info = &gpe_block->event_info[((acpi_size) i *
|
||||
ACPI_GPE_REGISTER_WIDTH)
|
||||
+ j];
|
||||
|
||||
if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
|
||||
ACPI_GPE_DISPATCH_METHOD)
|
||||
&& (gpe_event_info->flags & ACPI_GPE_TYPE_RUNTIME)) {
|
||||
ACPI_GPE_DISPATCH_METHOD) &&
|
||||
(gpe_event_info->flags & ACPI_GPE_TYPE_RUNTIME)) {
|
||||
gpe_enabled_count++;
|
||||
}
|
||||
|
||||
|
@ -1105,8 +1102,8 @@ acpi_status acpi_ev_gpe_initialize(void)
|
|||
/*
|
||||
* Initialize the GPE Block(s) defined in the FADT
|
||||
*
|
||||
* Why the GPE register block lengths are divided by 2: From the ACPI Spec,
|
||||
* section "General-Purpose Event Registers", we have:
|
||||
* Why the GPE register block lengths are divided by 2: From the ACPI
|
||||
* Spec, section "General-Purpose Event Registers", we have:
|
||||
*
|
||||
* "Each register block contains two registers of equal length
|
||||
* GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the
|
||||
|
@ -1163,7 +1160,8 @@ acpi_status acpi_ev_gpe_initialize(void)
|
|||
if ((register_count0) &&
|
||||
(gpe_number_max >= acpi_gbl_FADT.gpe1_base)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1",
|
||||
"GPE0 block (GPE 0 to %d) overlaps the GPE1 block "
|
||||
"(GPE %d to %d) - Ignoring GPE1",
|
||||
gpe_number_max, acpi_gbl_FADT.gpe1_base,
|
||||
acpi_gbl_FADT.gpe1_base +
|
||||
((register_count1 *
|
||||
|
|
|
@ -163,10 +163,10 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
|
|||
* 2) Global device notify handler
|
||||
* 3) Per-device notify handler
|
||||
*/
|
||||
if ((acpi_gbl_system_notify.handler
|
||||
&& (notify_value <= ACPI_MAX_SYS_NOTIFY))
|
||||
|| (acpi_gbl_device_notify.handler
|
||||
&& (notify_value > ACPI_MAX_SYS_NOTIFY)) || handler_obj) {
|
||||
if ((acpi_gbl_system_notify.handler &&
|
||||
(notify_value <= ACPI_MAX_SYS_NOTIFY)) ||
|
||||
(acpi_gbl_device_notify.handler &&
|
||||
(notify_value > ACPI_MAX_SYS_NOTIFY)) || handler_obj) {
|
||||
notify_info = acpi_ut_create_generic_state();
|
||||
if (!notify_info) {
|
||||
return (AE_NO_MEMORY);
|
||||
|
@ -174,7 +174,8 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
|
|||
|
||||
if (!handler_obj) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Executing system notify handler for Notify (%4.4s, %X) node %p\n",
|
||||
"Executing system notify handler for Notify (%4.4s, %X) "
|
||||
"node %p\n",
|
||||
acpi_ut_get_node_name(node),
|
||||
notify_value, node));
|
||||
}
|
||||
|
@ -534,8 +535,9 @@ acpi_status acpi_ev_release_global_lock(void)
|
|||
*/
|
||||
if (pending) {
|
||||
status =
|
||||
acpi_set_register(ACPI_BITREG_GLOBAL_LOCK_RELEASE,
|
||||
1);
|
||||
acpi_write_bit_register
|
||||
(ACPI_BITREG_GLOBAL_LOCK_RELEASE,
|
||||
ACPI_ENABLE_EVENT);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
|
|
|
@ -691,7 +691,7 @@ acpi_ev_install_handler(acpi_handle obj_handle,
|
|||
|
||||
/* Devices are handled different than regions */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_DEVICE) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_DEVICE) {
|
||||
|
||||
/* Check if this Device already has a handler for this address space */
|
||||
|
||||
|
@ -703,7 +703,8 @@ acpi_ev_install_handler(acpi_handle obj_handle,
|
|||
if (next_handler_obj->address_space.space_id ==
|
||||
handler_obj->address_space.space_id) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Found handler for region [%s] in device %p(%p) handler %p\n",
|
||||
"Found handler for region [%s] in device %p(%p) "
|
||||
"handler %p\n",
|
||||
acpi_ut_get_region_name
|
||||
(handler_obj->address_space.
|
||||
space_id), obj_desc,
|
||||
|
|
|
@ -241,7 +241,8 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
|
|||
status = AE_OK;
|
||||
} else {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Could not install PciConfig handler for Root Bridge %4.4s",
|
||||
"Could not install PciConfig handler "
|
||||
"for Root Bridge %4.4s",
|
||||
acpi_ut_get_node_name
|
||||
(pci_root_node)));
|
||||
}
|
||||
|
@ -293,9 +294,8 @@ 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.
|
||||
*/
|
||||
status =
|
||||
acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, pci_device_node,
|
||||
&pci_value);
|
||||
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,
|
||||
|
@ -308,18 +308,16 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
|
|||
|
||||
/* The PCI segment number comes from the _SEG method */
|
||||
|
||||
status =
|
||||
acpi_ut_evaluate_numeric_object(METHOD_NAME__SEG, pci_root_node,
|
||||
&pci_value);
|
||||
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__SEG,
|
||||
pci_root_node, &pci_value);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
pci_id->segment = ACPI_LOWORD(pci_value);
|
||||
}
|
||||
|
||||
/* The PCI bus number comes from the _BBN method */
|
||||
|
||||
status =
|
||||
acpi_ut_evaluate_numeric_object(METHOD_NAME__BBN, pci_root_node,
|
||||
&pci_value);
|
||||
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__BBN,
|
||||
pci_root_node, &pci_value);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
pci_id->bus = ACPI_LOWORD(pci_value);
|
||||
}
|
||||
|
@ -632,8 +630,8 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
|||
acpi_ns_locked);
|
||||
|
||||
/*
|
||||
* Tell all users that this region is usable by running the _REG
|
||||
* method
|
||||
* Tell all users that this region is usable by
|
||||
* running the _REG method
|
||||
*/
|
||||
if (acpi_ns_locked) {
|
||||
status =
|
||||
|
|
|
@ -631,7 +631,8 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
|||
|
||||
/* Setup up dispatch flags to indicate handler (vs. method) */
|
||||
|
||||
gpe_event_info->flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); /* Clear bits */
|
||||
gpe_event_info->flags &=
|
||||
~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
|
||||
gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER);
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
|
|
|
@ -172,8 +172,8 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
|
|||
* register bit)
|
||||
*/
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, 1);
|
||||
acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, ACPI_ENABLE_EVENT);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -181,8 +181,8 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
|
|||
/* Make sure that the hardware responded */
|
||||
|
||||
status =
|
||||
acpi_get_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, &value);
|
||||
acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -354,15 +354,15 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
|
|||
* register bit)
|
||||
*/
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, 0);
|
||||
acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, ACPI_DISABLE_EVENT);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_get_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, &value);
|
||||
acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -407,8 +407,8 @@ acpi_status acpi_clear_event(u32 event)
|
|||
* register bit)
|
||||
*/
|
||||
status =
|
||||
acpi_set_register(acpi_gbl_fixed_event_info[event].
|
||||
status_register_id, 1);
|
||||
acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
status_register_id, ACPI_CLEAR_STATUS);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -495,7 +495,7 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
|
|||
/* Get the status of the requested fixed event */
|
||||
|
||||
status =
|
||||
acpi_get_register(acpi_gbl_fixed_event_info[event].
|
||||
acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id, &value);
|
||||
if (ACPI_FAILURE(status))
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -503,7 +503,7 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
|
|||
*event_status = value;
|
||||
|
||||
status =
|
||||
acpi_get_register(acpi_gbl_fixed_event_info[event].
|
||||
acpi_read_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
status_register_id, &value);
|
||||
if (ACPI_FAILURE(status))
|
||||
return_ACPI_STATUS(status);
|
||||
|
|
|
@ -193,7 +193,8 @@ acpi_remove_address_space_handler(acpi_handle device,
|
|||
/* Matched space_id, first dereference this in the Regions */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Removing address handler %p(%p) for region %s on Device %p(%p)\n",
|
||||
"Removing address handler %p(%p) for region %s "
|
||||
"on Device %p(%p)\n",
|
||||
handler_obj, handler,
|
||||
acpi_ut_get_region_name(space_id),
|
||||
node, obj_desc));
|
||||
|
|
|
@ -291,7 +291,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* Source Object can be either an op_region or a Buffer/Field */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_REGION:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
|
@ -501,7 +501,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
|||
*/
|
||||
if ((!ddb_handle) ||
|
||||
(ACPI_GET_DESCRIPTOR_TYPE(ddb_handle) != ACPI_DESC_TYPE_OPERAND) ||
|
||||
(ACPI_GET_OBJECT_TYPE(ddb_handle) != ACPI_TYPE_LOCAL_REFERENCE)) {
|
||||
(ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE)) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
@ -520,13 +520,14 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete the entire namespace under this table Node
|
||||
* (Offset contains the table_id)
|
||||
*/
|
||||
acpi_tb_delete_namespace_by_owner(table_index);
|
||||
(void)acpi_tb_release_owner_id(table_index);
|
||||
/* Delete the portion of the namespace owned by this table */
|
||||
|
||||
status = acpi_tb_delete_namespace_by_owner(table_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
(void)acpi_tb_release_owner_id(table_index);
|
||||
acpi_tb_set_table_loaded_flag(table_index, FALSE);
|
||||
|
||||
/* Table unloaded, remove a reference to the ddb_handle object */
|
||||
|
|
|
@ -82,7 +82,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
|||
|
||||
ACPI_FUNCTION_TRACE_PTR(ex_convert_to_integer, obj_desc);
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* No conversion necessary */
|
||||
|
@ -116,7 +116,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* String conversion is different than Buffer conversion */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/*
|
||||
|
@ -206,7 +206,7 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
|
|||
|
||||
ACPI_FUNCTION_TRACE_PTR(ex_convert_to_buffer, obj_desc);
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/* No conversion necessary */
|
||||
|
@ -409,7 +409,7 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
|
|||
|
||||
ACPI_FUNCTION_TRACE_PTR(ex_convert_to_string, obj_desc);
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* No conversion necessary */
|
||||
|
@ -605,8 +605,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
|
|||
default:
|
||||
/* No conversion allowed for these types */
|
||||
|
||||
if (destination_type !=
|
||||
ACPI_GET_OBJECT_TYPE(source_desc)) {
|
||||
if (destination_type != source_desc->common.type) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Explicit operator, will store (%s) over existing type (%s)\n",
|
||||
acpi_ut_get_object_type_name
|
||||
|
|
|
@ -350,6 +350,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
case ACPI_EXD_TYPE:
|
||||
|
||||
acpi_ex_out_string("Type",
|
||||
acpi_ut_get_object_type_name
|
||||
(obj_desc));
|
||||
|
@ -422,6 +423,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_os_printf("**** Invalid table opcode [%X] ****\n",
|
||||
info->opcode);
|
||||
return;
|
||||
|
@ -492,7 +494,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
|
||||
/* Decode object type */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
|
||||
acpi_os_printf("Reference: [%s] ",
|
||||
|
@ -527,46 +529,18 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
type));
|
||||
break;
|
||||
|
||||
case ACPI_REFCLASS_ARG:
|
||||
|
||||
acpi_os_printf("%X", obj_desc->reference.value);
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
|
||||
|
||||
/* Value is an Integer */
|
||||
|
||||
acpi_os_printf(" value is [%8.8X%8.8x]",
|
||||
ACPI_FORMAT_UINT64(obj_desc->
|
||||
integer.
|
||||
value));
|
||||
}
|
||||
|
||||
acpi_os_printf("\n");
|
||||
break;
|
||||
|
||||
case ACPI_REFCLASS_LOCAL:
|
||||
|
||||
acpi_os_printf("%X", obj_desc->reference.value);
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
|
||||
|
||||
/* Value is an Integer */
|
||||
|
||||
acpi_os_printf(" value is [%8.8X%8.8x]",
|
||||
ACPI_FORMAT_UINT64(obj_desc->
|
||||
integer.
|
||||
value));
|
||||
}
|
||||
|
||||
acpi_os_printf("\n");
|
||||
break;
|
||||
|
||||
case ACPI_REFCLASS_NAME:
|
||||
|
||||
acpi_os_printf("- [%4.4s]\n",
|
||||
obj_desc->reference.node->name.ascii);
|
||||
break;
|
||||
|
||||
case ACPI_REFCLASS_ARG:
|
||||
case ACPI_REFCLASS_LOCAL:
|
||||
|
||||
acpi_os_printf("%X\n", obj_desc->reference.value);
|
||||
break;
|
||||
|
||||
default: /* Unknown reference class */
|
||||
|
||||
acpi_os_printf("%2.2X\n", obj_desc->reference.class);
|
||||
|
@ -661,8 +635,8 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
case ACPI_TYPE_LOCAL_REGION_FIELD:
|
||||
|
||||
acpi_os_printf
|
||||
("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n",
|
||||
obj_desc->field.bit_length,
|
||||
("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
|
||||
"byte=%X bit=%X of below:\n", obj_desc->field.bit_length,
|
||||
obj_desc->field.access_byte_width,
|
||||
obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK,
|
||||
obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK,
|
||||
|
@ -686,9 +660,8 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
|
||||
if (!obj_desc->buffer_field.buffer_obj) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n"));
|
||||
} else
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc->buffer_field.buffer_obj)
|
||||
!= ACPI_TYPE_BUFFER) {
|
||||
} else if ((obj_desc->buffer_field.buffer_obj)->common.type !=
|
||||
ACPI_TYPE_BUFFER) {
|
||||
acpi_os_printf("*not a Buffer*\n");
|
||||
} else {
|
||||
acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj,
|
||||
|
@ -737,8 +710,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
default:
|
||||
/* Unknown Type */
|
||||
|
||||
acpi_os_printf("Unknown Type %X\n",
|
||||
ACPI_GET_OBJECT_TYPE(obj_desc));
|
||||
acpi_os_printf("Unknown Type %X\n", obj_desc->common.type);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -939,7 +911,7 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* Packages may only contain a few object types */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
acpi_os_printf("[Integer] = %8.8X%8.8X\n",
|
||||
|
@ -990,8 +962,7 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
|
|||
|
||||
default:
|
||||
|
||||
acpi_os_printf("[Unknown Type] %X\n",
|
||||
ACPI_GET_OBJECT_TYPE(obj_desc));
|
||||
acpi_os_printf("[Unknown Type] %X\n", obj_desc->common.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -84,7 +84,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state,
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_BUFFER_FIELD) {
|
||||
/*
|
||||
* If the buffer_field arguments have not been previously evaluated,
|
||||
* evaluate them now and save the results.
|
||||
|
@ -95,9 +95,8 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
} else
|
||||
if ((ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REGION_FIELD)
|
||||
&& (obj_desc->field.region_obj->region.space_id ==
|
||||
} else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
|
||||
(obj_desc->field.region_obj->region.space_id ==
|
||||
ACPI_ADR_SPACE_SMBUS)) {
|
||||
/*
|
||||
* This is an SMBus read. We must create a buffer to hold the data
|
||||
|
@ -163,7 +162,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n",
|
||||
obj_desc, ACPI_GET_OBJECT_TYPE(obj_desc), buffer,
|
||||
obj_desc, obj_desc->common.type, buffer,
|
||||
(u32) length));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"FieldRead [FROM]: BitLen %X, BitOff %X, ByteOff %X\n",
|
||||
|
@ -222,7 +221,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
return_ACPI_STATUS(AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_BUFFER_FIELD) {
|
||||
/*
|
||||
* If the buffer_field arguments have not been previously evaluated,
|
||||
* evaluate them now and save the results.
|
||||
|
@ -233,9 +232,8 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
} else
|
||||
if ((ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REGION_FIELD)
|
||||
&& (obj_desc->field.region_obj->region.space_id ==
|
||||
} else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
|
||||
(obj_desc->field.region_obj->region.space_id ==
|
||||
ACPI_ADR_SPACE_SMBUS)) {
|
||||
/*
|
||||
* This is an SMBus write. We will bypass the entire field mechanism
|
||||
|
@ -243,7 +241,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
*
|
||||
* Source must be a buffer of sufficient size (ACPI_SMBUS_BUFFER_SIZE).
|
||||
*/
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) {
|
||||
if (source_desc->common.type != ACPI_TYPE_BUFFER) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"SMBus write requires Buffer, found type %s",
|
||||
acpi_ut_get_object_type_name(source_desc)));
|
||||
|
@ -291,7 +289,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
|
||||
/* Get a pointer to the data to be written */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(source_desc)) {
|
||||
switch (source_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
buffer = &source_desc->integer.value;
|
||||
length = sizeof(source_desc->integer.value);
|
||||
|
@ -314,15 +312,14 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"FieldWrite [FROM]: Obj %p (%s:%X), Buf %p, ByteLen %X\n",
|
||||
source_desc,
|
||||
acpi_ut_get_type_name(ACPI_GET_OBJECT_TYPE
|
||||
(source_desc)),
|
||||
ACPI_GET_OBJECT_TYPE(source_desc), buffer, length));
|
||||
acpi_ut_get_type_name(source_desc->common.type),
|
||||
source_desc->common.type, buffer, length));
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"FieldWrite [TO]: Obj %p (%s:%X), BitLen %X, BitOff %X, ByteOff %X\n",
|
||||
obj_desc,
|
||||
acpi_ut_get_type_name(ACPI_GET_OBJECT_TYPE(obj_desc)),
|
||||
ACPI_GET_OBJECT_TYPE(obj_desc),
|
||||
acpi_ut_get_type_name(obj_desc->common.type),
|
||||
obj_desc->common.type,
|
||||
obj_desc->common_field.bit_length,
|
||||
obj_desc->common_field.start_field_bit_offset,
|
||||
obj_desc->common_field.base_byte_offset));
|
||||
|
|
|
@ -94,9 +94,9 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
|
|||
|
||||
/* We must have a valid region */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(rgn_desc) != ACPI_TYPE_REGION) {
|
||||
if (rgn_desc->common.type != ACPI_TYPE_REGION) {
|
||||
ACPI_ERROR((AE_INFO, "Needed Region, found type %X (%s)",
|
||||
ACPI_GET_OBJECT_TYPE(rgn_desc),
|
||||
rgn_desc->common.type,
|
||||
acpi_ut_get_object_type_name(rgn_desc)));
|
||||
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
|
@ -113,12 +113,6 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
|
|||
}
|
||||
}
|
||||
|
||||
/* Exit if Address/Length have been disallowed by the host OS */
|
||||
|
||||
if (rgn_desc->common.flags & AOPOBJ_INVALID) {
|
||||
return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Exit now for SMBus address space, it has a non-linear address space
|
||||
* and the request cannot be directly validated
|
||||
|
@ -390,7 +384,7 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
|
|||
* index_field - Write to an Index Register, then read/write from/to a
|
||||
* Data Register
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
/*
|
||||
* If the buffer_field arguments have not been previously evaluated,
|
||||
|
@ -527,7 +521,7 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
|
|||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Wrong object type in field I/O %X",
|
||||
ACPI_GET_OBJECT_TYPE(obj_desc)));
|
||||
obj_desc->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
|
|||
switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
|
||||
case ACPI_DESC_TYPE_OPERAND:
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
if (obj_desc->common.type != ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
@ -260,7 +260,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|||
* guaranteed to be either Integer/String/Buffer by the operand
|
||||
* resolution mechanism.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(operand0)) {
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
status =
|
||||
acpi_ex_convert_to_integer(operand1, &local_operand1, 16);
|
||||
|
@ -277,7 +277,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|||
|
||||
default:
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: %X",
|
||||
ACPI_GET_OBJECT_TYPE(operand0)));
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
}
|
||||
|
||||
|
@ -298,7 +298,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|||
* 2) Two Strings concatenated to produce a new String
|
||||
* 3) Two Buffers concatenated to produce a new Buffer
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(operand0)) {
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* Result of two Integers is a Buffer */
|
||||
|
@ -379,7 +379,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|||
/* Invalid object type, should not happen here */
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: %X",
|
||||
ACPI_GET_OBJECT_TYPE(operand0)));
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -581,7 +581,7 @@ acpi_ex_do_logical_op(u16 opcode,
|
|||
* guaranteed to be either Integer/String/Buffer by the operand
|
||||
* resolution mechanism.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(operand0)) {
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
status =
|
||||
acpi_ex_convert_to_integer(operand1, &local_operand1, 16);
|
||||
|
@ -608,7 +608,7 @@ acpi_ex_do_logical_op(u16 opcode,
|
|||
/*
|
||||
* Two cases: 1) Both Integers, 2) Both Strings or Buffers
|
||||
*/
|
||||
if (ACPI_GET_OBJECT_TYPE(operand0) == ACPI_TYPE_INTEGER) {
|
||||
if (operand0->common.type == ACPI_TYPE_INTEGER) {
|
||||
/*
|
||||
* 1) Both operands are of type integer
|
||||
* Note: local_operand1 may have changed above
|
||||
|
|
|
@ -807,11 +807,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
acpi_namespace_node *)
|
||||
operand[0]);
|
||||
if (temp_desc
|
||||
&&
|
||||
((ACPI_GET_OBJECT_TYPE(temp_desc) ==
|
||||
ACPI_TYPE_STRING)
|
||||
|| (ACPI_GET_OBJECT_TYPE(temp_desc) ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE))) {
|
||||
&& ((temp_desc->common.type == ACPI_TYPE_STRING)
|
||||
|| (temp_desc->common.type ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE))) {
|
||||
operand[0] = temp_desc;
|
||||
acpi_ut_add_reference(temp_desc);
|
||||
} else {
|
||||
|
@ -819,7 +817,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
goto cleanup;
|
||||
}
|
||||
} else {
|
||||
switch (ACPI_GET_OBJECT_TYPE(operand[0])) {
|
||||
switch ((operand[0])->common.type) {
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
/*
|
||||
* This is a deref_of (local_x | arg_x)
|
||||
|
@ -877,8 +875,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE(operand[0]) !=
|
||||
ACPI_DESC_TYPE_NAMED) {
|
||||
if (ACPI_GET_OBJECT_TYPE(operand[0]) ==
|
||||
ACPI_TYPE_STRING) {
|
||||
if ((operand[0])->common.type == ACPI_TYPE_STRING) {
|
||||
/*
|
||||
* This is a deref_of (String). The string is a reference
|
||||
* to a named ACPI object.
|
||||
|
|
|
@ -399,7 +399,7 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
* At this point, the Source operand is a String, Buffer, or Package.
|
||||
* Verify that the index is within range.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(operand[0])) {
|
||||
switch ((operand[0])->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
if (index >= operand[0]->string.length) {
|
||||
|
|
|
@ -161,9 +161,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
* Create the return object. The Source operand is guaranteed to be
|
||||
* either a String or a Buffer, so just use its type.
|
||||
*/
|
||||
return_desc =
|
||||
acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE
|
||||
(operand[0]));
|
||||
return_desc = acpi_ut_create_internal_object((operand[0])->
|
||||
common.type);
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
|
@ -191,7 +190,7 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
|
||||
/* Strings always have a sub-pointer, not so for buffers */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(operand[0])) {
|
||||
switch ((operand[0])->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* Always allocate a new buffer for the String */
|
||||
|
|
|
@ -279,7 +279,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
|
|||
return_UINT32(0);
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_BUFFER_FIELD) {
|
||||
/*
|
||||
* buffer_field access can be on any byte boundary, so the
|
||||
* byte_alignment is always 1 byte -- regardless of any byte_alignment
|
||||
|
|
|
@ -294,14 +294,14 @@ acpi_ex_system_io_space_handler(u32 function,
|
|||
switch (function) {
|
||||
case ACPI_READ:
|
||||
|
||||
status = acpi_os_read_port((acpi_io_address) address,
|
||||
status = acpi_hw_read_port((acpi_io_address) address,
|
||||
&value32, bit_width);
|
||||
*value = value32;
|
||||
break;
|
||||
|
||||
case ACPI_WRITE:
|
||||
|
||||
status = acpi_os_write_port((acpi_io_address) address,
|
||||
status = acpi_hw_write_port((acpi_io_address) address,
|
||||
(u32) * value, bit_width);
|
||||
break;
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
|
|||
switch (entry_type) {
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_PACKAGE) {
|
||||
if (source_desc->common.type != ACPI_TYPE_PACKAGE) {
|
||||
ACPI_ERROR((AE_INFO, "Object not a Package, type %s",
|
||||
acpi_ut_get_object_type_name(source_desc)));
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
|
@ -154,7 +154,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
|
|||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) {
|
||||
if (source_desc->common.type != ACPI_TYPE_BUFFER) {
|
||||
ACPI_ERROR((AE_INFO, "Object not a Buffer, type %s",
|
||||
acpi_ut_get_object_type_name(source_desc)));
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
|
@ -172,7 +172,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
|
|||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) {
|
||||
if (source_desc->common.type != ACPI_TYPE_STRING) {
|
||||
ACPI_ERROR((AE_INFO, "Object not a String, type %s",
|
||||
acpi_ut_get_object_type_name(source_desc)));
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
|
@ -186,7 +186,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
|
|||
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_INTEGER) {
|
||||
if (source_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
ACPI_ERROR((AE_INFO, "Object not a Integer, type %s",
|
||||
acpi_ut_get_object_type_name(source_desc)));
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
|
|
|
@ -149,7 +149,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
|
|||
|
||||
/* This is a union acpi_operand_object */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(stack_desc)) {
|
||||
switch (stack_desc->common.type) {
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
|
||||
ref_type = stack_desc->reference.class;
|
||||
|
@ -297,8 +297,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"FieldRead SourceDesc=%p Type=%X\n",
|
||||
stack_desc,
|
||||
ACPI_GET_OBJECT_TYPE(stack_desc)));
|
||||
stack_desc, stack_desc->common.type));
|
||||
|
||||
status =
|
||||
acpi_ex_read_data_from_field(walk_state, stack_desc,
|
||||
|
@ -386,7 +385,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
* specification of the object_type and size_of operators). This means
|
||||
* traversing the list of possibly many nested references.
|
||||
*/
|
||||
while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
while (obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
switch (obj_desc->reference.class) {
|
||||
case ACPI_REFCLASS_REFOF:
|
||||
case ACPI_REFCLASS_NAME:
|
||||
|
@ -518,7 +517,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
* Now we are guaranteed to have an object that has not been created
|
||||
* via the ref_of or Index operators.
|
||||
*/
|
||||
type = ACPI_GET_OBJECT_TYPE(obj_desc);
|
||||
type = obj_desc->common.type;
|
||||
|
||||
exit:
|
||||
/* Convert internal types to external types */
|
||||
|
|
|
@ -212,7 +212,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
/* ACPI internal object */
|
||||
|
||||
object_type = ACPI_GET_OBJECT_TYPE(obj_desc);
|
||||
object_type = obj_desc->common.type;
|
||||
|
||||
/* Check for bad acpi_object_type */
|
||||
|
||||
|
@ -287,8 +287,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
|
||||
ACPI_DESC_TYPE_OPERAND)
|
||||
&& (ACPI_GET_OBJECT_TYPE(obj_desc) ==
|
||||
ACPI_TYPE_STRING)) {
|
||||
&& (obj_desc->common.type == ACPI_TYPE_STRING)) {
|
||||
/*
|
||||
* String found - the string references a named object and
|
||||
* must be resolved to a node
|
||||
|
@ -336,7 +335,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
* -- All others must be resolved below.
|
||||
*/
|
||||
if ((opcode == AML_STORE_OP) &&
|
||||
(ACPI_GET_OBJECT_TYPE(*stack_ptr) ==
|
||||
((*stack_ptr)->common.type ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE)
|
||||
&& ((*stack_ptr)->reference.class == ACPI_REFCLASS_INDEX)) {
|
||||
goto next_operand;
|
||||
|
@ -490,7 +489,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
/* Need an operand of type INTEGER, STRING or BUFFER */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
@ -512,7 +511,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
/* Need an operand of type STRING or BUFFER */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
|
@ -553,7 +552,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
* The only reference allowed here is a direct reference to
|
||||
* a namespace node.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
@ -576,7 +575,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
/* Need a buffer or package or (ACPI 2.0) String */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
@ -598,7 +597,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
/* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
case ACPI_TYPE_REGION:
|
||||
|
||||
|
@ -619,7 +618,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
|
||||
/* Used by the Store() operator only */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
case ACPI_TYPE_STRING:
|
||||
|
@ -677,8 +676,8 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
* required object type (Simple cases only).
|
||||
*/
|
||||
status = acpi_ex_check_object_type(type_needed,
|
||||
ACPI_GET_OBJECT_TYPE
|
||||
(*stack_ptr), *stack_ptr);
|
||||
(*stack_ptr)->common.type,
|
||||
*stack_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
@ -129,7 +129,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|||
|
||||
/* source_desc is of type ACPI_DESC_TYPE_OPERAND */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(source_desc)) {
|
||||
switch (source_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* Output correct integer width */
|
||||
|
@ -324,7 +324,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
|
|||
|
||||
/* Destination object must be a Reference or a Constant object */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(dest_desc)) {
|
||||
switch (dest_desc->common.type) {
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
break;
|
||||
|
||||
|
@ -460,9 +460,8 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
|
|||
*/
|
||||
obj_desc = *(index_desc->reference.where);
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE
|
||||
&& source_desc->reference.class == ACPI_REFCLASS_TABLE) {
|
||||
if (source_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE &&
|
||||
source_desc->reference.class == ACPI_REFCLASS_TABLE) {
|
||||
|
||||
/* This is a DDBHandle, just add a reference to it */
|
||||
|
||||
|
@ -520,8 +519,8 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
|
|||
* by the INDEX_OP code.
|
||||
*/
|
||||
obj_desc = index_desc->reference.object;
|
||||
if ((ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_BUFFER) &&
|
||||
(ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_STRING)) {
|
||||
if ((obj_desc->common.type != ACPI_TYPE_BUFFER) &&
|
||||
(obj_desc->common.type != ACPI_TYPE_STRING)) {
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
@ -529,7 +528,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
|
|||
* The assignment of the individual elements will be slightly
|
||||
* different for each source type.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(source_desc)) {
|
||||
switch (source_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* Use the least-significant byte of the integer */
|
||||
|
@ -707,8 +706,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
|
|||
/* No conversions for all other types. Just attach the source object */
|
||||
|
||||
status = acpi_ns_attach_object(node, source_desc,
|
||||
ACPI_GET_OBJECT_TYPE
|
||||
(source_desc));
|
||||
source_desc->common.type);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -96,8 +96,7 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
|
|||
* are all essentially the same. This case handles the
|
||||
* "interchangeable" types Integer, String, and Buffer.
|
||||
*/
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
if (source_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
|
||||
/* Resolve a reference object first */
|
||||
|
||||
|
@ -117,13 +116,11 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
|
|||
|
||||
/* Must have a Integer, Buffer, or String */
|
||||
|
||||
if ((ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_INTEGER) &&
|
||||
(ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) &&
|
||||
(ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) &&
|
||||
!((ACPI_GET_OBJECT_TYPE(source_desc) ==
|
||||
ACPI_TYPE_LOCAL_REFERENCE)
|
||||
&& (source_desc->reference.class ==
|
||||
ACPI_REFCLASS_TABLE))) {
|
||||
if ((source_desc->common.type != ACPI_TYPE_INTEGER) &&
|
||||
(source_desc->common.type != ACPI_TYPE_BUFFER) &&
|
||||
(source_desc->common.type != ACPI_TYPE_STRING) &&
|
||||
!((source_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
|
||||
(source_desc->reference.class == ACPI_REFCLASS_TABLE))) {
|
||||
|
||||
/* Conversion successful but still not a valid type */
|
||||
|
||||
|
@ -218,8 +215,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) !=
|
||||
ACPI_GET_OBJECT_TYPE(dest_desc)) {
|
||||
if (source_desc->common.type != dest_desc->common.type) {
|
||||
/*
|
||||
* The source type does not match the type of the destination.
|
||||
* Perform the "implicit conversion" of the source to the current type
|
||||
|
@ -229,11 +225,10 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
|
|||
* Otherwise, actual_src_desc is a temporary object to hold the
|
||||
* converted object.
|
||||
*/
|
||||
status =
|
||||
acpi_ex_convert_to_target_type(ACPI_GET_OBJECT_TYPE
|
||||
(dest_desc), source_desc,
|
||||
&actual_src_desc,
|
||||
walk_state);
|
||||
status = acpi_ex_convert_to_target_type(dest_desc->common.type,
|
||||
source_desc,
|
||||
&actual_src_desc,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -252,7 +247,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
|
|||
* We now have two objects of identical types, and we can perform a
|
||||
* copy of the *value* of the source object.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(dest_desc)) {
|
||||
switch (dest_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
dest_desc->integer.value = actual_src_desc->integer.value;
|
||||
|
|
|
@ -221,7 +221,7 @@ void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc)
|
|||
*/
|
||||
if ((!obj_desc) ||
|
||||
(ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) ||
|
||||
(ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER)) {
|
||||
(obj_desc->common.type != ACPI_TYPE_INTEGER)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -86,7 +86,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
|||
*/
|
||||
if (!acpi_gbl_FADT.acpi_enable && !acpi_gbl_FADT.acpi_disable) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"No ACPI mode transition supported in this system (enable/disable both zero)"));
|
||||
"No ACPI mode transition supported in this system "
|
||||
"(enable/disable both zero)"));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
@ -95,7 +96,7 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
|||
|
||||
/* BIOS should have disabled ALL fixed and GP events */
|
||||
|
||||
status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
|
||||
status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
|
||||
(u32) acpi_gbl_FADT.acpi_enable, 8);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Attempting to enable ACPI mode\n"));
|
||||
|
@ -107,7 +108,7 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
|||
* BIOS should clear all fixed status bits and restore fixed event
|
||||
* enable bits to default
|
||||
*/
|
||||
status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
|
||||
status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
|
||||
(u32) acpi_gbl_FADT.acpi_disable,
|
||||
8);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
|
@ -172,7 +173,7 @@ u32 acpi_hw_get_mode(void)
|
|||
return_UINT32(ACPI_SYS_MODE_ACPI);
|
||||
}
|
||||
|
||||
status = acpi_get_register(ACPI_BITREG_SCI_ENABLE, &value);
|
||||
status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_UINT32(ACPI_SYS_MODE_LEGACY);
|
||||
}
|
||||
|
|
|
@ -89,10 +89,9 @@ acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
|||
|
||||
/* Clear just the bit that corresponds to this GPE */
|
||||
|
||||
ACPI_CLEAR_BIT(enable_mask,
|
||||
((u32) 1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_register_info->base_gpe_number)));
|
||||
ACPI_CLEAR_BIT(enable_mask, ((u32)1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_register_info->base_gpe_number)));
|
||||
|
||||
/* Write the updated enable mask */
|
||||
|
||||
|
@ -156,10 +155,9 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
|
|||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
register_bit = (u8)
|
||||
(1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_event_info->register_info->base_gpe_number));
|
||||
register_bit = (u8)(1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_event_info->register_info->base_gpe_number));
|
||||
|
||||
/*
|
||||
* Write a one to the appropriate bit in the status register to
|
||||
|
@ -206,10 +204,9 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
|
|||
|
||||
/* Get the register bitmask for this GPE */
|
||||
|
||||
register_bit = (u8)
|
||||
(1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_event_info->register_info->base_gpe_number));
|
||||
register_bit = (u8)(1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_event_info->register_info->base_gpe_number));
|
||||
|
||||
/* GPE currently enabled? (enabled for runtime?) */
|
||||
|
||||
|
|
|
@ -51,6 +51,17 @@
|
|||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwregs")
|
||||
|
||||
/* Local Prototypes */
|
||||
static acpi_status
|
||||
acpi_hw_read_multiple(u32 *value,
|
||||
struct acpi_generic_address *register_a,
|
||||
struct acpi_generic_address *register_b);
|
||||
|
||||
static acpi_status
|
||||
acpi_hw_write_multiple(u32 value,
|
||||
struct acpi_generic_address *register_a,
|
||||
struct acpi_generic_address *register_b);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_clear_acpi_status
|
||||
|
@ -60,9 +71,9 @@ ACPI_MODULE_NAME("hwregs")
|
|||
* 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;
|
||||
|
@ -70,28 +81,20 @@ acpi_status acpi_hw_clear_acpi_status(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(hw_clear_acpi_status);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %04X\n",
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %0llX\n",
|
||||
ACPI_BITMASK_ALL_FIXED_STATUS,
|
||||
(u16) acpi_gbl_FADT.xpm1a_event_block.address));
|
||||
acpi_gbl_xpm1a_status.address));
|
||||
|
||||
lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
|
||||
|
||||
/* Clear the fixed events in PM1 A/B */
|
||||
|
||||
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);
|
||||
|
@ -126,6 +129,42 @@ struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id)
|
|||
return (&acpi_gbl_bit_register_info[register_id]);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_write_pm1_control
|
||||
*
|
||||
* PARAMETERS: pm1a_control - Value to be written to PM1A control
|
||||
* pm1b_control - Value to be written to PM1B control
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Write the PM1 A/B control registers. These registers are
|
||||
* different than than the PM1 A/B status and enable registers
|
||||
* in that different values can be written to the A/B registers.
|
||||
* Most notably, the SLP_TYP bits can be different, as per the
|
||||
* values returned from the _Sx predefined methods.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_hw_write_pm1_control(u32 pm1a_control, u32 pm1b_control)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_write_pm1_control);
|
||||
|
||||
status = acpi_write(pm1a_control, &acpi_gbl_FADT.xpm1a_control_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (acpi_gbl_FADT.xpm1b_control_block.address) {
|
||||
status =
|
||||
acpi_write(pm1b_control,
|
||||
&acpi_gbl_FADT.xpm1b_control_block);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_register_read
|
||||
|
@ -141,64 +180,56 @@ struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id)
|
|||
acpi_status
|
||||
acpi_hw_register_read(u32 register_id, u32 * return_value)
|
||||
{
|
||||
u32 value1 = 0;
|
||||
u32 value2 = 0;
|
||||
u32 value = 0;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_register_read);
|
||||
|
||||
switch (register_id) {
|
||||
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
|
||||
case ACPI_REGISTER_PM1_STATUS: /* PM1 A/B: 16-bit access each */
|
||||
|
||||
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;
|
||||
status = acpi_hw_read_multiple(&value,
|
||||
&acpi_gbl_xpm1a_status,
|
||||
&acpi_gbl_xpm1b_status);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* PM1 A/B: 16-bit access each */
|
||||
|
||||
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;
|
||||
status = acpi_hw_read_multiple(&value,
|
||||
&acpi_gbl_xpm1a_enable,
|
||||
&acpi_gbl_xpm1b_enable);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_FADT.xpm1a_control_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
status = acpi_hw_read_multiple(&value,
|
||||
&acpi_gbl_FADT.
|
||||
xpm1a_control_block,
|
||||
&acpi_gbl_FADT.
|
||||
xpm1b_control_block);
|
||||
|
||||
status = acpi_read(&value2, &acpi_gbl_FADT.xpm1b_control_block);
|
||||
value1 |= value2;
|
||||
/*
|
||||
* Zero the write-only bits. From the ACPI specification, "Hardware
|
||||
* Write-Only Bits": "Upon reads to registers with write-only bits,
|
||||
* software masks out all write-only bits."
|
||||
*/
|
||||
value &= ~ACPI_PM1_CONTROL_WRITEONLY_BITS;
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
|
||||
|
||||
status = acpi_read(&value1, &acpi_gbl_FADT.xpm2_control_block);
|
||||
status = acpi_read(&value, &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);
|
||||
status = acpi_read(&value, &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);
|
||||
acpi_hw_read_port(acpi_gbl_FADT.smi_command, &value, 8);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -207,10 +238,8 @@ acpi_hw_register_read(u32 register_id, u32 * return_value)
|
|||
break;
|
||||
}
|
||||
|
||||
exit:
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
*return_value = value1;
|
||||
*return_value = value;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -250,52 +279,42 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
ACPI_FUNCTION_TRACE(hw_register_write);
|
||||
|
||||
switch (register_id) {
|
||||
case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
|
||||
case ACPI_REGISTER_PM1_STATUS: /* PM1 A/B: 16-bit access each */
|
||||
/*
|
||||
* Handle the "ignored" bit in PM1 Status. According to the ACPI
|
||||
* specification, ignored bits are to be preserved when writing.
|
||||
* Normally, this would mean a read/modify/write sequence. However,
|
||||
* preserving a bit in the status register is different. Writing a
|
||||
* one clears the status, and writing a zero preserves the status.
|
||||
* Therefore, we must always write zero to the ignored bit.
|
||||
*
|
||||
* This behavior is clarified in the ACPI 4.0 specification.
|
||||
*/
|
||||
value &= ~ACPI_PM1_STATUS_PRESERVED_BITS;
|
||||
|
||||
/* 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);
|
||||
status = acpi_hw_write_multiple(value,
|
||||
&acpi_gbl_xpm1a_status,
|
||||
&acpi_gbl_xpm1b_status);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* PM1 A/B: 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);
|
||||
status = acpi_hw_write_multiple(value,
|
||||
&acpi_gbl_xpm1a_enable,
|
||||
&acpi_gbl_xpm1b_enable);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */
|
||||
|
||||
/*
|
||||
* Perform a read first to preserve certain bits (per ACPI spec)
|
||||
* Note: This includes SCI_EN, we never want to change this bit
|
||||
*/
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
|
||||
&read_value);
|
||||
status = acpi_hw_read_multiple(&read_value,
|
||||
&acpi_gbl_FADT.
|
||||
xpm1a_control_block,
|
||||
&acpi_gbl_FADT.
|
||||
xpm1b_control_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
@ -307,25 +326,29 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
|
||||
/* Now we can write the data */
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1a_control_block);
|
||||
status = acpi_hw_write_multiple(value,
|
||||
&acpi_gbl_FADT.
|
||||
xpm1a_control_block,
|
||||
&acpi_gbl_FADT.
|
||||
xpm1b_control_block);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
|
||||
|
||||
/*
|
||||
* For control registers, all reserved bits must be preserved,
|
||||
* as per the ACPI spec.
|
||||
*/
|
||||
status =
|
||||
acpi_read(&read_value, &acpi_gbl_FADT.xpm2_control_block);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm1b_control_block);
|
||||
break;
|
||||
/* Insert the bits to be preserved */
|
||||
|
||||
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 */
|
||||
ACPI_INSERT_BITS(value, ACPI_PM2_CONTROL_PRESERVED_BITS,
|
||||
read_value);
|
||||
|
||||
status = acpi_write(value, &acpi_gbl_FADT.xpm2_control_block);
|
||||
break;
|
||||
|
@ -340,10 +363,11 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
/* SMI_CMD is currently always in IO space */
|
||||
|
||||
status =
|
||||
acpi_os_write_port(acpi_gbl_FADT.smi_command, value, 8);
|
||||
acpi_hw_write_port(acpi_gbl_FADT.smi_command, value, 8);
|
||||
break;
|
||||
|
||||
default:
|
||||
ACPI_ERROR((AE_INFO, "Unknown Register ID: %X", register_id));
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
@ -351,3 +375,103 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
exit:
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_read_multiple
|
||||
*
|
||||
* PARAMETERS: Value - Where the register value is returned
|
||||
* register_a - First ACPI register (required)
|
||||
* register_b - Second ACPI register (optional)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Read from the specified two-part ACPI register (such as PM1 A/B)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_hw_read_multiple(u32 *value,
|
||||
struct acpi_generic_address *register_a,
|
||||
struct acpi_generic_address *register_b)
|
||||
{
|
||||
u32 value_a = 0;
|
||||
u32 value_b = 0;
|
||||
acpi_status status;
|
||||
|
||||
/* The first register is always required */
|
||||
|
||||
status = acpi_read(&value_a, register_a);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Second register is optional */
|
||||
|
||||
if (register_b->address) {
|
||||
status = acpi_read(&value_b, register_b);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* OR the two return values together. No shifting or masking is necessary,
|
||||
* because of how the PM1 registers are defined in the ACPI specification:
|
||||
*
|
||||
* "Although the bits can be split between the two register blocks (each
|
||||
* register block has a unique pointer within the FADT), the bit positions
|
||||
* are maintained. The register block with unimplemented bits (that is,
|
||||
* those implemented in the other register block) always returns zeros,
|
||||
* and writes have no side effects"
|
||||
*/
|
||||
*value = (value_a | value_b);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_write_multiple
|
||||
*
|
||||
* PARAMETERS: Value - The value to write
|
||||
* register_a - First ACPI register (required)
|
||||
* register_b - Second ACPI register (optional)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Write to the specified two-part ACPI register (such as PM1 A/B)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_hw_write_multiple(u32 value,
|
||||
struct acpi_generic_address *register_a,
|
||||
struct acpi_generic_address *register_b)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
/* The first register is always required */
|
||||
|
||||
status = acpi_write(value, register_a);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Second register is optional
|
||||
*
|
||||
* No bit shifting or clearing is necessary, because of how the PM1
|
||||
* registers are defined in the ACPI specification:
|
||||
*
|
||||
* "Although the bits can be split between the two register blocks (each
|
||||
* register block has a unique pointer within the FADT), the bit positions
|
||||
* are maintained. The register block with unimplemented bits (that is,
|
||||
* those implemented in the other register block) always returns zeros,
|
||||
* and writes have no side effects"
|
||||
*/
|
||||
if (register_b->address) {
|
||||
status = acpi_write(value, register_b);
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
|
|
@ -90,6 +90,7 @@ acpi_set_firmware_waking_vector(u32 physical_address)
|
|||
|
||||
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
|
||||
|
||||
#if ACPI_MACHINE_WIDTH == 64
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_set_firmware_waking_vector64
|
||||
|
@ -100,7 +101,8 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
|
|||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Sets the 64-bit X_firmware_waking_vector field of the FACS, if
|
||||
* it exists in the table.
|
||||
* it exists in the table. This function is intended for use with
|
||||
* 64-bit host operating systems.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
|
@ -124,6 +126,7 @@ acpi_set_firmware_waking_vector64(u64 physical_address)
|
|||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -147,9 +150,8 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
|
|||
|
||||
ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_prep);
|
||||
|
||||
/*
|
||||
* _PSW methods could be run here to enable wake-on keyboard, LAN, etc.
|
||||
*/
|
||||
/* _PSW methods could be run here to enable wake-on keyboard, LAN, etc. */
|
||||
|
||||
status = acpi_get_sleep_type_data(sleep_state,
|
||||
&acpi_gbl_sleep_type_a,
|
||||
&acpi_gbl_sleep_type_b);
|
||||
|
@ -223,8 +225,8 @@ ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
|
|||
******************************************************************************/
|
||||
acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
||||
{
|
||||
u32 PM1Acontrol;
|
||||
u32 PM1Bcontrol;
|
||||
u32 pm1a_control;
|
||||
u32 pm1b_control;
|
||||
struct acpi_bit_register_info *sleep_type_reg_info;
|
||||
struct acpi_bit_register_info *sleep_enable_reg_info;
|
||||
u32 in_value;
|
||||
|
@ -242,13 +244,14 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|||
}
|
||||
|
||||
sleep_type_reg_info =
|
||||
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE_A);
|
||||
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE);
|
||||
sleep_enable_reg_info =
|
||||
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_ENABLE);
|
||||
|
||||
/* Clear wake status */
|
||||
|
||||
status = acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
|
||||
status =
|
||||
acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -289,24 +292,25 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|||
|
||||
/* Get current value of PM1A control */
|
||||
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL, &PM1Acontrol);
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
|
||||
&pm1a_control);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT,
|
||||
"Entering sleep state [S%d]\n", sleep_state));
|
||||
|
||||
/* Clear SLP_EN and SLP_TYP fields */
|
||||
/* Clear the SLP_EN and SLP_TYP fields */
|
||||
|
||||
PM1Acontrol &= ~(sleep_type_reg_info->access_bit_mask |
|
||||
sleep_enable_reg_info->access_bit_mask);
|
||||
PM1Bcontrol = PM1Acontrol;
|
||||
pm1a_control &= ~(sleep_type_reg_info->access_bit_mask |
|
||||
sleep_enable_reg_info->access_bit_mask);
|
||||
pm1b_control = pm1a_control;
|
||||
|
||||
/* Insert SLP_TYP bits */
|
||||
/* Insert the SLP_TYP bits */
|
||||
|
||||
PM1Acontrol |=
|
||||
pm1a_control |=
|
||||
(acpi_gbl_sleep_type_a << sleep_type_reg_info->bit_position);
|
||||
PM1Bcontrol |=
|
||||
pm1b_control |=
|
||||
(acpi_gbl_sleep_type_b << sleep_type_reg_info->bit_position);
|
||||
|
||||
/*
|
||||
|
@ -314,37 +318,25 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|||
* poorly implemented hardware.
|
||||
*/
|
||||
|
||||
/* Write #1: fill in SLP_TYP data */
|
||||
/* Write #1: write the SLP_TYP data to the PM1 Control registers */
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
|
||||
PM1Acontrol);
|
||||
status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
|
||||
PM1Bcontrol);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
/* Insert the sleep enable (SLP_EN) bit */
|
||||
|
||||
/* Insert SLP_ENABLE bit */
|
||||
pm1a_control |= sleep_enable_reg_info->access_bit_mask;
|
||||
pm1b_control |= sleep_enable_reg_info->access_bit_mask;
|
||||
|
||||
PM1Acontrol |= sleep_enable_reg_info->access_bit_mask;
|
||||
PM1Bcontrol |= sleep_enable_reg_info->access_bit_mask;
|
||||
|
||||
/* Write #2: SLP_TYP + SLP_EN */
|
||||
/* Flush caches, as per ACPI specification */
|
||||
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
|
||||
PM1Acontrol);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
/* Write #2: Write both SLP_TYP + SLP_EN */
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
|
||||
PM1Bcontrol);
|
||||
status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -357,8 +349,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|||
* Wait ten seconds, then try again. This is to get S4/S5 to work on
|
||||
* all machines.
|
||||
*
|
||||
* We wait so long to allow chipsets that poll this reg very slowly to
|
||||
* still read the right value. Ideally, this block would go
|
||||
* We wait so long to allow chipsets that poll this reg very slowly
|
||||
* to still read the right value. Ideally, this block would go
|
||||
* away entirely.
|
||||
*/
|
||||
acpi_os_stall(10000000);
|
||||
|
@ -374,7 +366,7 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|||
/* Wait until we enter sleep state */
|
||||
|
||||
do {
|
||||
status = acpi_get_register_unlocked(ACPI_BITREG_WAKE_STATUS,
|
||||
status = acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS,
|
||||
&in_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -408,7 +400,10 @@ acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_s4bios);
|
||||
|
||||
status = acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
|
||||
/* Clear the wake status bit (PM1) */
|
||||
|
||||
status =
|
||||
acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -435,12 +430,13 @@ acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
|
|||
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
|
||||
status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
|
||||
status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
|
||||
(u32) acpi_gbl_FADT.S4bios_request, 8);
|
||||
|
||||
do {
|
||||
acpi_os_stall(1000);
|
||||
status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value);
|
||||
status =
|
||||
acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS, &in_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -471,8 +467,8 @@ acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
|
|||
acpi_status status;
|
||||
struct acpi_bit_register_info *sleep_type_reg_info;
|
||||
struct acpi_bit_register_info *sleep_enable_reg_info;
|
||||
u32 PM1Acontrol;
|
||||
u32 PM1Bcontrol;
|
||||
u32 pm1a_control;
|
||||
u32 pm1b_control;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_leave_sleep_state_prep);
|
||||
|
||||
|
@ -486,38 +482,34 @@ acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
|
|||
&acpi_gbl_sleep_type_b);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
sleep_type_reg_info =
|
||||
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE_A);
|
||||
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE);
|
||||
sleep_enable_reg_info =
|
||||
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_ENABLE);
|
||||
|
||||
/* Get current value of PM1A control */
|
||||
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
|
||||
&PM1Acontrol);
|
||||
&pm1a_control);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
|
||||
/* Clear SLP_EN and SLP_TYP fields */
|
||||
/* Clear the SLP_EN and SLP_TYP fields */
|
||||
|
||||
PM1Acontrol &= ~(sleep_type_reg_info->access_bit_mask |
|
||||
sleep_enable_reg_info->
|
||||
access_bit_mask);
|
||||
PM1Bcontrol = PM1Acontrol;
|
||||
pm1a_control &= ~(sleep_type_reg_info->access_bit_mask |
|
||||
sleep_enable_reg_info->
|
||||
access_bit_mask);
|
||||
pm1b_control = pm1a_control;
|
||||
|
||||
/* Insert SLP_TYP bits */
|
||||
/* Insert the SLP_TYP bits */
|
||||
|
||||
PM1Acontrol |=
|
||||
(acpi_gbl_sleep_type_a << sleep_type_reg_info->
|
||||
bit_position);
|
||||
PM1Bcontrol |=
|
||||
(acpi_gbl_sleep_type_b << sleep_type_reg_info->
|
||||
bit_position);
|
||||
pm1a_control |= (acpi_gbl_sleep_type_a <<
|
||||
sleep_type_reg_info->bit_position);
|
||||
pm1b_control |= (acpi_gbl_sleep_type_b <<
|
||||
sleep_type_reg_info->bit_position);
|
||||
|
||||
/* Just ignore any errors */
|
||||
/* Write the control registers and ignore any errors */
|
||||
|
||||
(void)acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
|
||||
PM1Acontrol);
|
||||
(void)acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
|
||||
PM1Bcontrol);
|
||||
(void)acpi_hw_write_pm1_control(pm1a_control,
|
||||
pm1b_control);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -603,19 +595,21 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
|
|||
* it to determine whether the system is rebooting or resuming. Clear
|
||||
* it for compatibility.
|
||||
*/
|
||||
acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
|
||||
acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, 1);
|
||||
|
||||
acpi_gbl_system_awake_and_running = TRUE;
|
||||
|
||||
/* Enable power button */
|
||||
|
||||
(void)
|
||||
acpi_set_register(acpi_gbl_fixed_event_info
|
||||
[ACPI_EVENT_POWER_BUTTON].enable_register_id, 1);
|
||||
acpi_write_bit_register(acpi_gbl_fixed_event_info
|
||||
[ACPI_EVENT_POWER_BUTTON].
|
||||
enable_register_id, ACPI_ENABLE_EVENT);
|
||||
|
||||
(void)
|
||||
acpi_set_register(acpi_gbl_fixed_event_info
|
||||
[ACPI_EVENT_POWER_BUTTON].status_register_id, 1);
|
||||
acpi_write_bit_register(acpi_gbl_fixed_event_info
|
||||
[ACPI_EVENT_POWER_BUTTON].
|
||||
status_register_id, ACPI_CLEAR_STATUS);
|
||||
|
||||
arg.integer.value = ACPI_SST_WORKING;
|
||||
status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
|
||||
|
|
|
@ -0,0 +1,258 @@
|
|||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: hwvalid - I/O request validation
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2009, 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"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwvalid")
|
||||
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width);
|
||||
|
||||
/*
|
||||
* Protected I/O ports. Some ports are always illegal, and some are
|
||||
* conditionally illegal. This table must remain ordered by port address.
|
||||
*
|
||||
* The table is used to implement the Microsoft port access rules that
|
||||
* first appeared in Windows XP. Some ports are always illegal, and some
|
||||
* ports are only illegal if the BIOS calls _OSI with a win_xP string or
|
||||
* later (meaning that the BIOS itelf is post-XP.)
|
||||
*
|
||||
* This provides ACPICA with the desired port protections and
|
||||
* Microsoft compatibility.
|
||||
*
|
||||
* Description of port entries:
|
||||
* DMA: DMA controller
|
||||
* PIC0: Programmable Interrupt Controller (8259_a)
|
||||
* PIT1: System Timer 1
|
||||
* PIT2: System Timer 2 failsafe
|
||||
* RTC: Real-time clock
|
||||
* CMOS: Extended CMOS
|
||||
* DMA1: DMA 1 page registers
|
||||
* DMA1L: DMA 1 Ch 0 low page
|
||||
* DMA2: DMA 2 page registers
|
||||
* DMA2L: DMA 2 low page refresh
|
||||
* ARBC: Arbitration control
|
||||
* SETUP: Reserved system board setup
|
||||
* POS: POS channel select
|
||||
* PIC1: Cascaded PIC
|
||||
* IDMA: ISA DMA
|
||||
* ELCR: PIC edge/level registers
|
||||
* PCI: PCI configuration space
|
||||
*/
|
||||
static const struct acpi_port_info acpi_protected_ports[] = {
|
||||
{"DMA", 0x0000, 0x000F, ACPI_OSI_WIN_XP},
|
||||
{"PIC0", 0x0020, 0x0021, ACPI_ALWAYS_ILLEGAL},
|
||||
{"PIT1", 0x0040, 0x0043, ACPI_OSI_WIN_XP},
|
||||
{"PIT2", 0x0048, 0x004B, ACPI_OSI_WIN_XP},
|
||||
{"RTC", 0x0070, 0x0071, ACPI_OSI_WIN_XP},
|
||||
{"CMOS", 0x0074, 0x0076, ACPI_OSI_WIN_XP},
|
||||
{"DMA1", 0x0081, 0x0083, ACPI_OSI_WIN_XP},
|
||||
{"DMA1L", 0x0087, 0x0087, ACPI_OSI_WIN_XP},
|
||||
{"DMA2", 0x0089, 0x008B, ACPI_OSI_WIN_XP},
|
||||
{"DMA2L", 0x008F, 0x008F, ACPI_OSI_WIN_XP},
|
||||
{"ARBC", 0x0090, 0x0091, ACPI_OSI_WIN_XP},
|
||||
{"SETUP", 0x0093, 0x0094, ACPI_OSI_WIN_XP},
|
||||
{"POS", 0x0096, 0x0097, ACPI_OSI_WIN_XP},
|
||||
{"PIC1", 0x00A0, 0x00A1, ACPI_ALWAYS_ILLEGAL},
|
||||
{"IDMA", 0x00C0, 0x00DF, ACPI_OSI_WIN_XP},
|
||||
{"ELCR", 0x04D0, 0x04D1, ACPI_ALWAYS_ILLEGAL},
|
||||
{"PCI", 0x0CF8, 0x0CFF, ACPI_OSI_WIN_XP}
|
||||
};
|
||||
|
||||
#define ACPI_PORT_INFO_ENTRIES ACPI_ARRAY_LENGTH (acpi_protected_ports)
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_validate_io_request
|
||||
*
|
||||
* PARAMETERS: Address Address of I/O port/register
|
||||
* bit_width Number of bits (8,16,32)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Validates an I/O request (address/length). Certain ports are
|
||||
* always illegal and some ports are only illegal depending on
|
||||
* the requests the BIOS AML code makes to the predefined
|
||||
* _OSI method.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
||||
{
|
||||
u32 i;
|
||||
u32 byte_width;
|
||||
acpi_io_address last_address;
|
||||
const struct acpi_port_info *port_info;
|
||||
|
||||
ACPI_FUNCTION_TRACE(hw_validate_io_request);
|
||||
|
||||
/* Supported widths are 8/16/32 */
|
||||
|
||||
if ((bit_width != 8) && (bit_width != 16) && (bit_width != 32)) {
|
||||
return AE_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
port_info = acpi_protected_ports;
|
||||
byte_width = ACPI_DIV_8(bit_width);
|
||||
last_address = address + byte_width - 1;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "Address %p LastAddress %p Length %X",
|
||||
ACPI_CAST_PTR(void, address), ACPI_CAST_PTR(void,
|
||||
last_address),
|
||||
byte_width));
|
||||
|
||||
/* Maximum 16-bit address in I/O space */
|
||||
|
||||
if (last_address > ACPI_UINT16_MAX) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Illegal I/O port address/length above 64K: 0x%p/%X",
|
||||
ACPI_CAST_PTR(void, address), byte_width));
|
||||
return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS);
|
||||
}
|
||||
|
||||
/* Exit if requested address is not within the protected port table */
|
||||
|
||||
if (address > acpi_protected_ports[ACPI_PORT_INFO_ENTRIES - 1].end) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Check request against the list of protected I/O ports */
|
||||
|
||||
for (i = 0; i < ACPI_PORT_INFO_ENTRIES; i++, port_info++) {
|
||||
/*
|
||||
* Check if the requested address range will write to a reserved
|
||||
* port. Four cases to consider:
|
||||
*
|
||||
* 1) Address range is contained completely in the port address range
|
||||
* 2) Address range overlaps port range at the port range start
|
||||
* 3) Address range overlaps port range at the port range end
|
||||
* 4) Address range completely encompasses the port range
|
||||
*/
|
||||
if ((address <= port_info->end)
|
||||
&& (last_address >= port_info->start)) {
|
||||
|
||||
/* Port illegality may depend on the _OSI calls made by the BIOS */
|
||||
|
||||
if (acpi_gbl_osi_data >= port_info->osi_dependency) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Denied AML access to port 0x%p/%X (%s 0x%.4X-0x%.4X)",
|
||||
ACPI_CAST_PTR(void, address),
|
||||
byte_width, port_info->name,
|
||||
port_info->start, port_info->end));
|
||||
|
||||
return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS);
|
||||
}
|
||||
}
|
||||
|
||||
/* Finished if address range ends before the end of this port */
|
||||
|
||||
if (last_address <= port_info->end) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_read_port
|
||||
*
|
||||
* PARAMETERS: Address Address of I/O port/register to read
|
||||
* Value Where value is placed
|
||||
* Width Number of bits
|
||||
*
|
||||
* RETURN: Value read from port
|
||||
*
|
||||
* DESCRIPTION: Read data from an I/O port or register. This is a front-end
|
||||
* to acpi_os_read_port that performs validation on both the port
|
||||
* address and the length.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_hw_validate_io_request(address, width);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = acpi_os_read_port(address, value, width);
|
||||
return status;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_hw_write_port
|
||||
*
|
||||
* PARAMETERS: Address Address of I/O port/register to write
|
||||
* Value Value to write
|
||||
* Width Number of bits
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Write data to an I/O port or register. This is a front-end
|
||||
* to acpi_os_write_port that performs validation on both the port
|
||||
* address and the length.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_hw_validate_io_request(address, width);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = acpi_os_write_port(address, value, width);
|
||||
return status;
|
||||
}
|
|
@ -107,19 +107,18 @@ acpi_status acpi_read(u32 *value, struct acpi_generic_address *reg)
|
|||
ACPI_FUNCTION_NAME(acpi_read);
|
||||
|
||||
/*
|
||||
* Must have a valid pointer to a GAS structure, and
|
||||
* a non-zero address within. However, don't return an error
|
||||
* because the PM1A/B code must not fail if B isn't present.
|
||||
* Must have a valid pointer to a GAS structure, and a non-zero address
|
||||
* within.
|
||||
*/
|
||||
if (!reg) {
|
||||
return (AE_OK);
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Get a local copy of the address. Handles possible alignment issues */
|
||||
|
||||
ACPI_MOVE_64_TO_64(&address, ®->address);
|
||||
if (!address) {
|
||||
return (AE_OK);
|
||||
return (AE_BAD_ADDRESS);
|
||||
}
|
||||
|
||||
/* Supported widths are 8/16/32 */
|
||||
|
@ -134,8 +133,8 @@ acpi_status acpi_read(u32 *value, struct acpi_generic_address *reg)
|
|||
*value = 0;
|
||||
|
||||
/*
|
||||
* Two address spaces supported: Memory or IO.
|
||||
* PCI_Config is not supported here because the GAS struct is insufficient
|
||||
* Two address spaces supported: Memory or IO. PCI_Config is
|
||||
* not supported here because the GAS structure is insufficient
|
||||
*/
|
||||
switch (reg->space_id) {
|
||||
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
|
||||
|
@ -147,7 +146,7 @@ acpi_status acpi_read(u32 *value, struct acpi_generic_address *reg)
|
|||
case ACPI_ADR_SPACE_SYSTEM_IO:
|
||||
|
||||
status =
|
||||
acpi_os_read_port((acpi_io_address) address, value, width);
|
||||
acpi_hw_read_port((acpi_io_address) address, value, width);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -187,19 +186,18 @@ acpi_status acpi_write(u32 value, struct acpi_generic_address *reg)
|
|||
ACPI_FUNCTION_NAME(acpi_write);
|
||||
|
||||
/*
|
||||
* Must have a valid pointer to a GAS structure, and
|
||||
* a non-zero address within. However, don't return an error
|
||||
* because the PM1A/B code must not fail if B isn't present.
|
||||
* Must have a valid pointer to a GAS structure, and a non-zero address
|
||||
* within.
|
||||
*/
|
||||
if (!reg) {
|
||||
return (AE_OK);
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Get a local copy of the address. Handles possible alignment issues */
|
||||
|
||||
ACPI_MOVE_64_TO_64(&address, ®->address);
|
||||
if (!address) {
|
||||
return (AE_OK);
|
||||
return (AE_BAD_ADDRESS);
|
||||
}
|
||||
|
||||
/* Supported widths are 8/16/32 */
|
||||
|
@ -222,7 +220,7 @@ acpi_status acpi_write(u32 value, struct acpi_generic_address *reg)
|
|||
|
||||
case ACPI_ADR_SPACE_SYSTEM_IO:
|
||||
|
||||
status = acpi_os_write_port((acpi_io_address) address, value,
|
||||
status = acpi_hw_write_port((acpi_io_address) address, value,
|
||||
width);
|
||||
break;
|
||||
|
||||
|
@ -244,24 +242,36 @@ ACPI_EXPORT_SYMBOL(acpi_write)
|
|||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_register_unlocked
|
||||
* FUNCTION: acpi_read_bit_register
|
||||
*
|
||||
* PARAMETERS: register_id - ID of ACPI bit_register to access
|
||||
* return_value - Value that was read from the register
|
||||
* PARAMETERS: register_id - ID of ACPI Bit Register to access
|
||||
* return_value - Value that was read from the register,
|
||||
* normalized to bit position zero.
|
||||
*
|
||||
* RETURN: Status and the value read from specified Register. Value
|
||||
* RETURN: Status and the value read from the specified Register. Value
|
||||
* returned is normalized to bit0 (is shifted all the way right)
|
||||
*
|
||||
* DESCRIPTION: ACPI bit_register read function. Does not acquire the HW lock.
|
||||
*
|
||||
* SUPPORTS: Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
|
||||
* PM2 Control.
|
||||
*
|
||||
* Note: The hardware lock is not required when reading the ACPI bit registers
|
||||
* since almost all of them are single bit and it does not matter that
|
||||
* the parent hardware register can be split across two physical
|
||||
* registers. The only multi-bit field is SLP_TYP in the PM1 control
|
||||
* register, but this field does not cross an 8-bit boundary (nor does
|
||||
* it make much sense to actually read this field.)
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value)
|
||||
acpi_status acpi_read_bit_register(u32 register_id, u32 *return_value)
|
||||
{
|
||||
u32 register_value = 0;
|
||||
struct acpi_bit_register_info *bit_reg_info;
|
||||
u32 register_value;
|
||||
u32 value;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_get_register_unlocked);
|
||||
ACPI_FUNCTION_TRACE_U32(acpi_read_bit_register, register_id);
|
||||
|
||||
/* Get the info structure corresponding to the requested ACPI Register */
|
||||
|
||||
|
@ -270,209 +280,133 @@ acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value)
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Read from the register */
|
||||
/* Read the entire parent register */
|
||||
|
||||
status = acpi_hw_register_read(bit_reg_info->parent_register,
|
||||
®ister_value);
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
|
||||
/* Normalize the value that was read */
|
||||
|
||||
register_value =
|
||||
((register_value & bit_reg_info->access_bit_mask)
|
||||
>> bit_reg_info->bit_position);
|
||||
|
||||
*return_value = register_value;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "Read value %8.8X register %X\n",
|
||||
register_value,
|
||||
bit_reg_info->parent_register));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
/* Normalize the value that was read, mask off other bits */
|
||||
|
||||
value = ((register_value & bit_reg_info->access_bit_mask)
|
||||
>> bit_reg_info->bit_position);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"BitReg %X, ParentReg %X, Actual %8.8X, ReturnValue %8.8X\n",
|
||||
register_id, bit_reg_info->parent_register,
|
||||
register_value, value));
|
||||
|
||||
*return_value = value;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_get_register_unlocked)
|
||||
ACPI_EXPORT_SYMBOL(acpi_read_bit_register)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_register
|
||||
* FUNCTION: acpi_write_bit_register
|
||||
*
|
||||
* PARAMETERS: register_id - ID of ACPI bit_register to access
|
||||
* return_value - Value that was read from the register
|
||||
*
|
||||
* RETURN: Status and the value read from specified Register. Value
|
||||
* returned is normalized to bit0 (is shifted all the way right)
|
||||
*
|
||||
* DESCRIPTION: ACPI bit_register read function.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_get_register(u32 register_id, u32 *return_value)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_cpu_flags flags;
|
||||
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
|
||||
status = acpi_get_register_unlocked(register_id, return_value);
|
||||
acpi_os_release_lock(acpi_gbl_hardware_lock, flags);
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_get_register)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_set_register
|
||||
*
|
||||
* PARAMETERS: register_id - ID of ACPI bit_register to access
|
||||
* Value - (only used on write) value to write to the
|
||||
* Register, NOT pre-normalized to the bit pos
|
||||
* PARAMETERS: register_id - ID of ACPI Bit Register to access
|
||||
* Value - Value to write to the register, in bit
|
||||
* position zero. The bit is automaticallly
|
||||
* shifted to the correct position.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: ACPI Bit Register write function.
|
||||
* DESCRIPTION: ACPI Bit Register write function. Acquires the hardware lock
|
||||
* since most operations require a read/modify/write sequence.
|
||||
*
|
||||
* SUPPORTS: Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
|
||||
* PM2 Control.
|
||||
*
|
||||
* Note that at this level, the fact that there may be actually two
|
||||
* hardware registers (A and B - and B may not exist) is abstracted.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_set_register(u32 register_id, u32 value)
|
||||
acpi_status acpi_write_bit_register(u32 register_id, u32 value)
|
||||
{
|
||||
u32 register_value = 0;
|
||||
struct acpi_bit_register_info *bit_reg_info;
|
||||
acpi_status status;
|
||||
acpi_cpu_flags lock_flags;
|
||||
u32 register_value;
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE_U32(acpi_set_register, register_id);
|
||||
ACPI_FUNCTION_TRACE_U32(acpi_write_bit_register, register_id);
|
||||
|
||||
/* Get the info structure corresponding to the requested ACPI Register */
|
||||
|
||||
bit_reg_info = acpi_hw_get_bit_register_info(register_id);
|
||||
if (!bit_reg_info) {
|
||||
ACPI_ERROR((AE_INFO, "Bad ACPI HW RegisterId: %X",
|
||||
register_id));
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
|
||||
|
||||
/* Always do a register read first so we can insert the new bits */
|
||||
|
||||
status = acpi_hw_register_read(bit_reg_info->parent_register,
|
||||
®ister_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode the Register ID
|
||||
* Register ID = [Register block ID] | [bit ID]
|
||||
*
|
||||
* Check bit ID to fine locate Register offset.
|
||||
* Check Mask to determine Register offset, and then read-write.
|
||||
* At this point, we know that the parent register is one of the
|
||||
* following: PM1 Status, PM1 Enable, PM1 Control, or PM2 Control
|
||||
*/
|
||||
switch (bit_reg_info->parent_register) {
|
||||
case ACPI_REGISTER_PM1_STATUS:
|
||||
|
||||
if (bit_reg_info->parent_register != ACPI_REGISTER_PM1_STATUS) {
|
||||
/*
|
||||
* Status Registers are different from the rest. Clear by
|
||||
* writing 1, and writing 0 has no effect. So, the only relevant
|
||||
* information is the single bit we're interested in, all others should
|
||||
* be written as 0 so they will be left unchanged.
|
||||
* 1) Case for PM1 Enable, PM1 Control, and PM2 Control
|
||||
*
|
||||
* Perform a register read to preserve the bits that we are not
|
||||
* interested in
|
||||
*/
|
||||
value = ACPI_REGISTER_PREPARE_BITS(value,
|
||||
bit_reg_info->bit_position,
|
||||
bit_reg_info->
|
||||
access_bit_mask);
|
||||
if (value) {
|
||||
status =
|
||||
acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS,
|
||||
(u16) value);
|
||||
register_value = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_ENABLE:
|
||||
|
||||
ACPI_REGISTER_INSERT_VALUE(register_value,
|
||||
bit_reg_info->bit_position,
|
||||
bit_reg_info->access_bit_mask,
|
||||
value);
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1_ENABLE,
|
||||
(u16) register_value);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_CONTROL:
|
||||
|
||||
/*
|
||||
* Write the PM1 Control register.
|
||||
* Note that at this level, the fact that there are actually TWO
|
||||
* registers (A and B - and B may not exist) is abstracted.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "PM1 control: Read %X\n",
|
||||
register_value));
|
||||
|
||||
ACPI_REGISTER_INSERT_VALUE(register_value,
|
||||
bit_reg_info->bit_position,
|
||||
bit_reg_info->access_bit_mask,
|
||||
value);
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1_CONTROL,
|
||||
(u16) register_value);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM2_CONTROL:
|
||||
|
||||
status = acpi_hw_register_read(ACPI_REGISTER_PM2_CONTROL,
|
||||
status = acpi_hw_register_read(bit_reg_info->parent_register,
|
||||
®ister_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"PM2 control: Read %X from %8.8X%8.8X\n",
|
||||
register_value,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_FADT.
|
||||
xpm2_control_block.
|
||||
address)));
|
||||
|
||||
/*
|
||||
* Insert the input bit into the value that was just read
|
||||
* and write the register
|
||||
*/
|
||||
ACPI_REGISTER_INSERT_VALUE(register_value,
|
||||
bit_reg_info->bit_position,
|
||||
bit_reg_info->access_bit_mask,
|
||||
value);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"About to write %4.4X to %8.8X%8.8X\n",
|
||||
register_value,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_FADT.
|
||||
xpm2_control_block.
|
||||
address)));
|
||||
status = acpi_hw_register_write(bit_reg_info->parent_register,
|
||||
register_value);
|
||||
} else {
|
||||
/*
|
||||
* 2) Case for PM1 Status
|
||||
*
|
||||
* The Status register is different from the rest. Clear an event
|
||||
* by writing 1, writing 0 has no effect. So, the only relevant
|
||||
* information is the single bit we're interested in, all others
|
||||
* should be written as 0 so they will be left unchanged.
|
||||
*/
|
||||
register_value = ACPI_REGISTER_PREPARE_BITS(value,
|
||||
bit_reg_info->
|
||||
bit_position,
|
||||
bit_reg_info->
|
||||
access_bit_mask);
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM2_CONTROL,
|
||||
(u8) (register_value));
|
||||
break;
|
||||
/* No need to write the register if value is all zeros */
|
||||
|
||||
default:
|
||||
break;
|
||||
if (register_value) {
|
||||
status =
|
||||
acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS,
|
||||
register_value);
|
||||
}
|
||||
}
|
||||
|
||||
unlock_and_exit:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"BitReg %X, ParentReg %X, Value %8.8X, Actual %8.8X\n",
|
||||
register_id, bit_reg_info->parent_register, value,
|
||||
register_value));
|
||||
|
||||
unlock_and_exit:
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags);
|
||||
|
||||
/* Normalize the value that was read */
|
||||
|
||||
ACPI_DEBUG_EXEC(register_value =
|
||||
((register_value & bit_reg_info->access_bit_mask) >>
|
||||
bit_reg_info->bit_position));
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"Set bits: %8.8X actual %8.8X register %X\n", value,
|
||||
register_value, bit_reg_info->parent_register));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_set_register)
|
||||
ACPI_EXPORT_SYMBOL(acpi_write_bit_register)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -534,7 +468,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
|||
|
||||
/* It must be of type Package */
|
||||
|
||||
else if (ACPI_GET_OBJECT_TYPE(info->return_object) != ACPI_TYPE_PACKAGE) {
|
||||
else if (info->return_object->common.type != ACPI_TYPE_PACKAGE) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Sleep State return object is not a Package"));
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
|
@ -555,12 +489,13 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
|||
|
||||
/* The first two elements must both be of type Integer */
|
||||
|
||||
else if ((ACPI_GET_OBJECT_TYPE(info->return_object->package.elements[0])
|
||||
else if (((info->return_object->package.elements[0])->common.type
|
||||
!= ACPI_TYPE_INTEGER) ||
|
||||
(ACPI_GET_OBJECT_TYPE(info->return_object->package.elements[1])
|
||||
((info->return_object->package.elements[1])->common.type
|
||||
!= ACPI_TYPE_INTEGER)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Sleep State return package elements are not both Integers (%s, %s)",
|
||||
"Sleep State return package elements are not both Integers "
|
||||
"(%s, %s)",
|
||||
acpi_ut_get_object_type_name(info->return_object->
|
||||
package.elements[0]),
|
||||
acpi_ut_get_object_type_name(info->return_object->
|
||||
|
|
|
@ -118,9 +118,8 @@ acpi_status acpi_ns_root_initialize(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* Name entered successfully.
|
||||
* If entry in pre_defined_names[] specifies an
|
||||
* initial value, create the initial value.
|
||||
* Name entered successfully. If entry in pre_defined_names[] specifies
|
||||
* an initial value, create the initial value.
|
||||
*/
|
||||
if (init_val->val) {
|
||||
status = acpi_os_predefined_override(init_val, &val);
|
||||
|
@ -178,9 +177,8 @@ acpi_status acpi_ns_root_initialize(void)
|
|||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/*
|
||||
* Build an object around the static string
|
||||
*/
|
||||
/* Build an object around the static string */
|
||||
|
||||
obj_desc->string.length =
|
||||
(u32) ACPI_STRLEN(val);
|
||||
obj_desc->string.pointer = val;
|
||||
|
@ -234,8 +232,7 @@ acpi_status acpi_ns_root_initialize(void)
|
|||
/* Store pointer to value descriptor in the Node */
|
||||
|
||||
status = acpi_ns_attach_object(new_node, obj_desc,
|
||||
ACPI_GET_OBJECT_TYPE
|
||||
(obj_desc));
|
||||
obj_desc->common.type);
|
||||
|
||||
/* Remove local reference to the object */
|
||||
|
||||
|
@ -315,10 +312,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
return_ACPI_STATUS(AE_NO_NAMESPACE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the prefix scope.
|
||||
* A null scope means use the root scope
|
||||
*/
|
||||
/* Get the prefix scope. A null scope means use the root scope */
|
||||
|
||||
if ((!scope_info) || (!scope_info->scope.node)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"Null scope prefix, using root node (%p)\n",
|
||||
|
@ -338,8 +333,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
if (!(flags & ACPI_NS_PREFIX_IS_SCOPE)) {
|
||||
/*
|
||||
* This node might not be a actual "scope" node (such as a
|
||||
* Device/Method, etc.) It could be a Package or other object node.
|
||||
* Backup up the tree to find the containing scope node.
|
||||
* Device/Method, etc.) It could be a Package or other object
|
||||
* node. Backup up the tree to find the containing scope node.
|
||||
*/
|
||||
while (!acpi_ns_opens_scope(prefix_node->type) &&
|
||||
prefix_node->type != ACPI_TYPE_ANY) {
|
||||
|
@ -349,7 +344,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
}
|
||||
}
|
||||
|
||||
/* Save type TBD: may be no longer necessary */
|
||||
/* Save type. TBD: may be no longer necessary */
|
||||
|
||||
type_to_check_for = type;
|
||||
|
||||
|
@ -414,6 +409,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
/* Name is fully qualified, no search rules apply */
|
||||
|
||||
search_parent_flag = ACPI_NS_NO_UPSEARCH;
|
||||
|
||||
/*
|
||||
* Point past this prefix to the name segment
|
||||
* part or the next Parent Prefix
|
||||
|
@ -429,7 +425,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
/* Current scope has no parent scope */
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"ACPI path has too many parent prefixes (^) - reached beyond root node"));
|
||||
"ACPI path has too many parent prefixes (^) "
|
||||
"- reached beyond root node"));
|
||||
return_ACPI_STATUS(AE_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
@ -531,9 +528,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
while (num_segments && current_node) {
|
||||
num_segments--;
|
||||
if (!num_segments) {
|
||||
/*
|
||||
* This is the last segment, enable typechecking
|
||||
*/
|
||||
|
||||
/* This is the last segment, enable typechecking */
|
||||
|
||||
this_search_type = type;
|
||||
|
||||
/*
|
||||
|
@ -584,9 +581,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
if (num_segments > 0) {
|
||||
/*
|
||||
* If we have an alias to an object that opens a scope (such as a
|
||||
* device or processor), we need to dereference the alias here so that
|
||||
* we can access any children of the original node (via the remaining
|
||||
* segments).
|
||||
* device or processor), we need to dereference the alias here so
|
||||
* that we can access any children of the original node (via the
|
||||
* remaining segments).
|
||||
*/
|
||||
if (this_node->type == ACPI_TYPE_LOCAL_ALIAS) {
|
||||
if (!this_node->object) {
|
||||
|
@ -594,8 +591,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
}
|
||||
|
||||
if (acpi_ns_opens_scope
|
||||
(((struct acpi_namespace_node *)this_node->
|
||||
object)->type)) {
|
||||
(((struct acpi_namespace_node *)
|
||||
this_node->object)->type)) {
|
||||
this_node =
|
||||
(struct acpi_namespace_node *)
|
||||
this_node->object;
|
||||
|
@ -639,8 +636,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
|
||||
/*
|
||||
* If this is the last name segment and we are not looking for a
|
||||
* specific type, but the type of found object is known, use that type
|
||||
* to (later) see if it opens a scope.
|
||||
* specific type, but the type of found object is known, use that
|
||||
* type to (later) see if it opens a scope.
|
||||
*/
|
||||
if (type == ACPI_TYPE_ANY) {
|
||||
type = this_node->type;
|
||||
|
@ -653,9 +650,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
current_node = this_node;
|
||||
}
|
||||
|
||||
/*
|
||||
* Always check if we need to open a new scope
|
||||
*/
|
||||
/* Always check if we need to open a new scope */
|
||||
|
||||
if (!(flags & ACPI_NS_DONT_OPEN_SCOPE) && (walk_state)) {
|
||||
/*
|
||||
* If entry is a type which opens a scope, push the new scope on the
|
||||
|
|
|
@ -76,8 +76,7 @@ struct acpi_namespace_node *acpi_ns_create_node(u32 name)
|
|||
ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_allocated++);
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
temp =
|
||||
acpi_gbl_ns_node_list->total_allocated -
|
||||
temp = acpi_gbl_ns_node_list->total_allocated -
|
||||
acpi_gbl_ns_node_list->total_freed;
|
||||
if (temp > acpi_gbl_ns_node_list->max_occupied) {
|
||||
acpi_gbl_ns_node_list->max_occupied = temp;
|
||||
|
@ -145,9 +144,8 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)
|
|||
|
||||
ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++);
|
||||
|
||||
/*
|
||||
* Detach an object if there is one, then delete the node
|
||||
*/
|
||||
/* Detach an object if there is one, then delete the node */
|
||||
|
||||
acpi_ns_detach_object(node);
|
||||
(void)acpi_os_release_object(acpi_gbl_namespace_cache, node);
|
||||
return_VOID;
|
||||
|
@ -183,9 +181,8 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp
|
|||
ACPI_FUNCTION_TRACE(ns_install_node);
|
||||
|
||||
/*
|
||||
* Get the owner ID from the Walk state
|
||||
* The owner ID is used to track table deletion and
|
||||
* deletion of objects created by methods
|
||||
* Get the owner ID from the Walk state. The owner ID is used to track
|
||||
* table deletion and deletion of objects created by methods.
|
||||
*/
|
||||
if (walk_state) {
|
||||
owner_id = walk_state->owner_id;
|
||||
|
@ -260,9 +257,8 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
|
|||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
* Deallocate all children at this level
|
||||
*/
|
||||
/* Deallocate all children at this level */
|
||||
|
||||
do {
|
||||
|
||||
/* Get the things we need */
|
||||
|
@ -285,9 +281,8 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
|
|||
"Object %p, Remaining %X\n", child_node,
|
||||
acpi_gbl_current_node_count));
|
||||
|
||||
/*
|
||||
* Detach an object if there is one, then free the child node
|
||||
*/
|
||||
/* Detach an object if there is one, then free the child node */
|
||||
|
||||
acpi_ns_detach_object(child_node);
|
||||
|
||||
/* Now we can delete the node */
|
||||
|
@ -304,7 +299,6 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
|
|||
/* Clear the parent's child pointer */
|
||||
|
||||
parent_node->child = NULL;
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
|
|
@ -181,6 +181,12 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
}
|
||||
|
||||
this_node = acpi_ns_map_handle_to_node(obj_handle);
|
||||
if (!this_node) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Invalid object handle %p\n",
|
||||
obj_handle));
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
type = this_node->type;
|
||||
|
||||
/* Check if the owner matches */
|
||||
|
@ -214,9 +220,8 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node));
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we can print out the pertinent information
|
||||
*/
|
||||
/* Now we can print out the pertinent information */
|
||||
|
||||
acpi_os_printf(" %-12s %p %2.2X ",
|
||||
acpi_ut_get_type_name(type), this_node,
|
||||
this_node->owner_id);
|
||||
|
@ -509,7 +514,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
|
||||
case ACPI_DESC_TYPE_OPERAND:
|
||||
|
||||
obj_type = ACPI_GET_OBJECT_TYPE(obj_desc);
|
||||
obj_type = obj_desc->common.type;
|
||||
|
||||
if (obj_type > ACPI_TYPE_LOCAL_MAX) {
|
||||
acpi_os_printf
|
||||
|
@ -539,9 +544,8 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Valid object, get the pointer to next level, if any
|
||||
*/
|
||||
/* Valid object, get the pointer to next level, if any */
|
||||
|
||||
switch (obj_type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
case ACPI_TYPE_STRING:
|
||||
|
@ -602,14 +606,14 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
* display_type - 0 or ACPI_DISPLAY_SUMMARY
|
||||
* max_depth - Maximum depth of dump. Use ACPI_UINT32_MAX
|
||||
* for an effectively unlimited depth.
|
||||
* owner_id - Dump only objects owned by this ID. Use
|
||||
* owner_id - Dump only objects owned by this ID. Use
|
||||
* ACPI_UINT32_MAX to match all owners.
|
||||
* start_handle - Where in namespace to start/end search
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Dump typed objects within the loaded namespace.
|
||||
* Uses acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object.
|
||||
* DESCRIPTION: Dump typed objects within the loaded namespace. Uses
|
||||
* acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
|||
}
|
||||
|
||||
|
||||
ACPI_DUMP_PATHNAME(info->resolved_node, "Execute Method:",
|
||||
ACPI_DUMP_PATHNAME(info->resolved_node, "ACPI: Execute Method",
|
||||
ACPI_LV_INFO, _COMPONENT);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
|
|
|
@ -103,7 +103,8 @@ acpi_status acpi_ns_initialize_objects(void)
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"\nInitialized %hd/%hd Regions %hd/%hd Fields %hd/%hd Buffers %hd/%hd Packages (%hd nodes)\n",
|
||||
"\nInitialized %hd/%hd Regions %hd/%hd Fields %hd/%hd "
|
||||
"Buffers %hd/%hd Packages (%hd nodes)\n",
|
||||
info.op_region_init, info.op_region_count,
|
||||
info.field_init, info.field_count,
|
||||
info.buffer_init, info.buffer_count,
|
||||
|
@ -148,7 +149,8 @@ acpi_status acpi_ns_initialize_devices(void)
|
|||
info.num_INI = 0;
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Initializing Device/Processor/Thermal objects by executing _INI methods:"));
|
||||
"Initializing Device/Processor/Thermal objects "
|
||||
"by executing _INI methods:"));
|
||||
|
||||
/* Tree analysis: find all subtrees that contain _INI methods */
|
||||
|
||||
|
@ -180,7 +182,8 @@ acpi_status acpi_ns_initialize_devices(void)
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"\nExecuted %hd _INI methods requiring %hd _STA executions (examined %hd objects)\n",
|
||||
"\nExecuted %hd _INI methods requiring %hd _STA executions "
|
||||
"(examined %hd objects)\n",
|
||||
info.num_INI, info.num_STA, info.device_count));
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -263,16 +266,14 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
|||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the object is already initialized, nothing else to do
|
||||
*/
|
||||
/* If the object is already initialized, nothing else to do */
|
||||
|
||||
if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Must lock the interpreter before executing AML code
|
||||
*/
|
||||
/* Must lock the interpreter before executing AML code */
|
||||
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/*
|
||||
|
|
|
@ -128,12 +128,12 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
|
|||
* parse trees.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"**** Begin Table Method Parsing and Object Initialization ****\n"));
|
||||
"**** Begin Table Method Parsing and Object Initialization\n"));
|
||||
|
||||
status = acpi_ds_initialize_objects(table_index, node);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"**** Completed Table Method Parsing and Object Initialization ****\n"));
|
||||
"**** Completed Table Method Parsing and Object Initialization\n"));
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
@ -209,8 +209,7 @@ void acpi_ns_detach_object(struct acpi_namespace_node *node)
|
|||
|
||||
obj_desc = node->object;
|
||||
|
||||
if (!obj_desc ||
|
||||
(ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_DATA)) {
|
||||
if (!obj_desc || (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
@ -220,8 +219,7 @@ void acpi_ns_detach_object(struct acpi_namespace_node *node)
|
|||
if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_OPERAND) {
|
||||
node->object = obj_desc->common.next_object;
|
||||
if (node->object &&
|
||||
(ACPI_GET_OBJECT_TYPE(node->object) !=
|
||||
ACPI_TYPE_LOCAL_DATA)) {
|
||||
((node->object)->common.type != ACPI_TYPE_LOCAL_DATA)) {
|
||||
node->object = node->object->common.next_object;
|
||||
}
|
||||
}
|
||||
|
@ -267,7 +265,7 @@ union acpi_operand_object *acpi_ns_get_attached_object(struct
|
|||
((ACPI_GET_DESCRIPTOR_TYPE(node->object) != ACPI_DESC_TYPE_OPERAND)
|
||||
&& (ACPI_GET_DESCRIPTOR_TYPE(node->object) !=
|
||||
ACPI_DESC_TYPE_NAMED))
|
||||
|| (ACPI_GET_OBJECT_TYPE(node->object) == ACPI_TYPE_LOCAL_DATA)) {
|
||||
|| ((node->object)->common.type == ACPI_TYPE_LOCAL_DATA)) {
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
||||
|
@ -294,9 +292,9 @@ union acpi_operand_object *acpi_ns_get_secondary_object(union
|
|||
ACPI_FUNCTION_TRACE_PTR(ns_get_secondary_object, obj_desc);
|
||||
|
||||
if ((!obj_desc) ||
|
||||
(ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_DATA) ||
|
||||
(obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) ||
|
||||
(!obj_desc->common.next_object) ||
|
||||
(ACPI_GET_OBJECT_TYPE(obj_desc->common.next_object) ==
|
||||
((obj_desc->common.next_object)->common.type ==
|
||||
ACPI_TYPE_LOCAL_DATA)) {
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
@ -331,7 +329,7 @@ acpi_ns_attach_data(struct acpi_namespace_node *node,
|
|||
prev_obj_desc = NULL;
|
||||
obj_desc = node->object;
|
||||
while (obj_desc) {
|
||||
if ((ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_DATA) &&
|
||||
if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) &&
|
||||
(obj_desc->data.handler == handler)) {
|
||||
return (AE_ALREADY_EXISTS);
|
||||
}
|
||||
|
@ -385,7 +383,7 @@ acpi_ns_detach_data(struct acpi_namespace_node * node,
|
|||
prev_obj_desc = NULL;
|
||||
obj_desc = node->object;
|
||||
while (obj_desc) {
|
||||
if ((ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_DATA) &&
|
||||
if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) &&
|
||||
(obj_desc->data.handler == handler)) {
|
||||
if (prev_obj_desc) {
|
||||
prev_obj_desc->common.next_object =
|
||||
|
@ -428,7 +426,7 @@ acpi_ns_get_attached_data(struct acpi_namespace_node * node,
|
|||
|
||||
obj_desc = node->object;
|
||||
while (obj_desc) {
|
||||
if ((ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_DATA) &&
|
||||
if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) &&
|
||||
(obj_desc->data.handler == handler)) {
|
||||
*data = obj_desc->data.pointer;
|
||||
return (AE_OK);
|
||||
|
|
|
@ -176,9 +176,8 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node)
|
|||
* performs another complete parse of the AML.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 1\n"));
|
||||
status =
|
||||
acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1, table_index,
|
||||
start_node);
|
||||
status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1,
|
||||
table_index, start_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -193,9 +192,8 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node)
|
|||
* parse objects are all cached.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 2\n"));
|
||||
status =
|
||||
acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS2, table_index,
|
||||
start_node);
|
||||
status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS2,
|
||||
table_index, start_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
@ -79,7 +79,9 @@ acpi_ns_check_package(char *pathname,
|
|||
static acpi_status
|
||||
acpi_ns_check_package_elements(char *pathname,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1, u32 count1, u8 type2, u32 count2);
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
u8 type2, u32 count2, u32 start_index);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_object_type(char *pathname,
|
||||
|
@ -221,7 +223,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
|
||||
/* For returned Package objects, check the type of all sub-objects */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_PACKAGE) {
|
||||
if (return_object->common.type == ACPI_TYPE_PACKAGE) {
|
||||
status =
|
||||
acpi_ns_check_package(pathname, return_object_ptr,
|
||||
predefined);
|
||||
|
@ -302,7 +304,8 @@ acpi_ns_check_parameter_count(char *pathname,
|
|||
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",
|
||||
"%s: Parameter count mismatch - "
|
||||
"caller passed %d, ACPI requires %d",
|
||||
pathname, user_param_count,
|
||||
required_params_current));
|
||||
}
|
||||
|
@ -472,7 +475,7 @@ acpi_ns_check_package(char *pathname,
|
|||
package->ret_info.
|
||||
object_type2,
|
||||
package->ret_info.
|
||||
count2);
|
||||
count2, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -623,7 +626,7 @@ acpi_ns_check_package(char *pathname,
|
|||
object_type2,
|
||||
package->
|
||||
ret_info.
|
||||
count2);
|
||||
count2, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -672,7 +675,8 @@ acpi_ns_check_package(char *pathname,
|
|||
object_type1,
|
||||
sub_package->
|
||||
package.
|
||||
count, 0, 0);
|
||||
count, 0, 0,
|
||||
0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -710,7 +714,8 @@ acpi_ns_check_package(char *pathname,
|
|||
ret_info.
|
||||
object_type1,
|
||||
(expected_count
|
||||
- 1), 0, 0);
|
||||
- 1), 0, 0,
|
||||
1);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -758,6 +763,7 @@ acpi_ns_check_package(char *pathname,
|
|||
* Count1 - Count for first group
|
||||
* Type2 - Object type for second group
|
||||
* Count2 - Count for second group
|
||||
* start_index - Start of the first group of elements
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -769,7 +775,9 @@ acpi_ns_check_package(char *pathname,
|
|||
static acpi_status
|
||||
acpi_ns_check_package_elements(char *pathname,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1, u32 count1, u8 type2, u32 count2)
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
u8 type2, u32 count2, u32 start_index)
|
||||
{
|
||||
union acpi_operand_object **this_element = elements;
|
||||
acpi_status status;
|
||||
|
@ -782,7 +790,7 @@ acpi_ns_check_package_elements(char *pathname,
|
|||
*/
|
||||
for (i = 0; i < count1; i++) {
|
||||
status = acpi_ns_check_object_type(pathname, this_element,
|
||||
type1, i);
|
||||
type1, i + start_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -791,7 +799,8 @@ acpi_ns_check_package_elements(char *pathname,
|
|||
|
||||
for (i = 0; i < count2; i++) {
|
||||
status = acpi_ns_check_object_type(pathname, this_element,
|
||||
type2, (i + count1));
|
||||
type2,
|
||||
(i + count1 + start_index));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -858,7 +867,7 @@ acpi_ns_check_object_type(char *pathname,
|
|||
* from all of the predefined names (including elements of returned
|
||||
* packages)
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(return_object)) {
|
||||
switch (return_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
return_btype = ACPI_RTYPE_INTEGER;
|
||||
break;
|
||||
|
@ -901,7 +910,7 @@ acpi_ns_check_object_type(char *pathname,
|
|||
|
||||
/* For reference objects, check that the reference type is correct */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
if (return_object->common.type == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
status = acpi_ns_check_reference(pathname, return_object);
|
||||
}
|
||||
|
||||
|
@ -974,7 +983,8 @@ acpi_ns_check_reference(char *pathname,
|
|||
}
|
||||
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%s: Return type mismatch - unexpected reference object type [%s] %2.2X",
|
||||
"%s: Return type mismatch - "
|
||||
"unexpected reference object type [%s] %2.2X",
|
||||
pathname, acpi_ut_get_reference_name(return_object),
|
||||
return_object->reference.class));
|
||||
|
||||
|
@ -1006,7 +1016,7 @@ acpi_ns_repair_object(u32 expected_btypes,
|
|||
union acpi_operand_object *new_object;
|
||||
acpi_size length;
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(return_object)) {
|
||||
switch (return_object->common.type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
if (!(expected_btypes & ACPI_RTYPE_STRING)) {
|
||||
|
|
|
@ -167,7 +167,8 @@ acpi_ns_search_one_scope(u32 target_name,
|
|||
/* Searched entire namespace level, not found */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
|
||||
"Name [%4.4s] (%s) not found in search in scope [%4.4s] "
|
||||
"%p first child %p\n",
|
||||
ACPI_CAST_PTR(char, &target_name),
|
||||
acpi_ut_get_type_name(type),
|
||||
acpi_ut_get_node_name(parent_node), parent_node,
|
||||
|
@ -239,9 +240,8 @@ acpi_ns_search_parent_tree(u32 target_name,
|
|||
acpi_ut_get_node_name(parent_node),
|
||||
ACPI_CAST_PTR(char, &target_name)));
|
||||
|
||||
/*
|
||||
* Search parents until target is found or we have backed up to the root
|
||||
*/
|
||||
/* Search parents until target is found or we have backed up to the root */
|
||||
|
||||
while (parent_node) {
|
||||
/*
|
||||
* Search parent scope. Use TYPE_ANY because we don't care about the
|
||||
|
@ -395,9 +395,9 @@ acpi_ns_search_and_enter(u32 target_name,
|
|||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
/*
|
||||
* Node is an object defined by an External() statement
|
||||
*/
|
||||
|
||||
/* Node is an object defined by an External() statement */
|
||||
|
||||
if (flags & ACPI_NS_EXTERNAL) {
|
||||
new_node->flags |= ANOBJ_IS_EXTERNAL;
|
||||
}
|
||||
|
|
|
@ -325,9 +325,8 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
|
|||
next_external_char++;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Handle Carat prefixes
|
||||
*/
|
||||
/* Handle Carat prefixes */
|
||||
|
||||
while (*next_external_char == '^') {
|
||||
info->num_carats++;
|
||||
next_external_char++;
|
||||
|
@ -552,9 +551,8 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for a prefix (one '\' | one or more '^').
|
||||
*/
|
||||
/* Check for a prefix (one '\' | one or more '^') */
|
||||
|
||||
switch (internal_name[0]) {
|
||||
case '\\':
|
||||
prefix_length = 1;
|
||||
|
@ -580,7 +578,7 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
|||
}
|
||||
|
||||
/*
|
||||
* Check for object names. Note that there could be 0-255 of these
|
||||
* Check for object names. Note that there could be 0-255 of these
|
||||
* 4-byte elements.
|
||||
*/
|
||||
if (prefix_length < internal_name_length) {
|
||||
|
@ -637,9 +635,8 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
|||
return_ACPI_STATUS(AE_BAD_PATHNAME);
|
||||
}
|
||||
|
||||
/*
|
||||
* Build converted_name
|
||||
*/
|
||||
/* Build the converted_name */
|
||||
|
||||
*converted_name = ACPI_ALLOCATE_ZEROED(required_length);
|
||||
if (!(*converted_name)) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
|
@ -685,6 +682,9 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
|||
* and keep all pointers within this subsystem - however this introduces
|
||||
* more (and perhaps unnecessary) overhead.
|
||||
*
|
||||
* The current implemenation is basically a placeholder until such time comes
|
||||
* that it is needed.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_namespace_node *acpi_ns_map_handle_to_node(acpi_handle handle)
|
||||
|
@ -692,9 +692,8 @@ struct acpi_namespace_node *acpi_ns_map_handle_to_node(acpi_handle handle)
|
|||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/*
|
||||
* Simple implementation
|
||||
*/
|
||||
/* Parameter validation */
|
||||
|
||||
if ((!handle) || (handle == ACPI_ROOT_OBJECT)) {
|
||||
return (acpi_gbl_root_node);
|
||||
}
|
||||
|
@ -872,7 +871,7 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
|
|||
(flags | ACPI_NS_DONT_OPEN_SCOPE), NULL,
|
||||
return_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s, %s\n",
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s, %s\n",
|
||||
pathname, acpi_format_exception(status)));
|
||||
}
|
||||
|
||||
|
|
|
@ -135,8 +135,8 @@ struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct
|
|||
* starting (and ending) at the node specified by start_handle.
|
||||
* The user_function is called whenever a node that matches
|
||||
* the type parameter is found. If the user function returns
|
||||
* a non-zero value, the search is terminated immediately and this
|
||||
* value is returned to the caller.
|
||||
* a non-zero value, the search is terminated immediately and
|
||||
* this value is returned to the caller.
|
||||
*
|
||||
* The point of this procedure is to provide a generic namespace
|
||||
* walk routine that can be called from multiple places to
|
||||
|
@ -200,10 +200,10 @@ acpi_ns_walk_namespace(acpi_object_type type,
|
|||
/*
|
||||
* Ignore all temporary namespace nodes (created during control
|
||||
* method execution) unless told otherwise. These temporary nodes
|
||||
* can cause a race condition because they can be deleted during the
|
||||
* execution of the user function (if the namespace is unlocked before
|
||||
* invocation of the user function.) Only the debugger namespace dump
|
||||
* will examine the temporary nodes.
|
||||
* can cause a race condition because they can be deleted during
|
||||
* the execution of the user function (if the namespace is
|
||||
* unlocked before invocation of the user function.) Only the
|
||||
* debugger namespace dump will examine the temporary nodes.
|
||||
*/
|
||||
if ((child_node->flags & ANOBJ_TEMPORARY) &&
|
||||
!(flags & ACPI_NS_WALK_TEMP_NODES)) {
|
||||
|
|
|
@ -387,8 +387,7 @@ static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
|
|||
|
||||
/* We are interested in reference objects only */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(info->return_object) !=
|
||||
ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
if ((info->return_object)->common.type != ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -476,21 +475,40 @@ acpi_walk_namespace(acpi_object_type type,
|
|||
}
|
||||
|
||||
/*
|
||||
* Lock the namespace around the walk.
|
||||
* The namespace will be unlocked/locked around each call
|
||||
* to the user function - since this function
|
||||
* must be allowed to make Acpi calls itself.
|
||||
* Need to acquire the namespace reader lock to prevent interference
|
||||
* with any concurrent table unloads (which causes the deletion of
|
||||
* namespace objects). We cannot allow the deletion of a namespace node
|
||||
* while the user function is using it. The exception to this are the
|
||||
* nodes created and deleted during control method execution -- these
|
||||
* nodes are marked as temporary nodes and are ignored by the namespace
|
||||
* walk. Thus, control methods can be executed while holding the
|
||||
* namespace deletion lock (and the user function can execute control
|
||||
* methods.)
|
||||
*/
|
||||
status = acpi_ut_acquire_read_lock(&acpi_gbl_namespace_rw_lock);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock the namespace around the walk. The namespace will be
|
||||
* unlocked/locked around each call to the user function - since the user
|
||||
* function must be allowed to make ACPICA calls itself (for example, it
|
||||
* will typically execute control methods during device enumeration.)
|
||||
*/
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
status = acpi_ns_walk_namespace(type, start_object, max_depth,
|
||||
ACPI_NS_WALK_UNLOCK,
|
||||
user_function, context, return_value);
|
||||
ACPI_NS_WALK_UNLOCK, user_function,
|
||||
context, return_value);
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_read_lock(&acpi_gbl_namespace_rw_lock);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
@ -557,9 +557,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
|
|||
table_index++) {
|
||||
if (*sub_object_list && /* Null object allowed */
|
||||
((ACPI_TYPE_STRING ==
|
||||
ACPI_GET_OBJECT_TYPE(*sub_object_list)) ||
|
||||
(*sub_object_list)->common.type) ||
|
||||
((ACPI_TYPE_LOCAL_REFERENCE ==
|
||||
ACPI_GET_OBJECT_TYPE(*sub_object_list)) &&
|
||||
(*sub_object_list)->common.type) &&
|
||||
((*sub_object_list)->reference.class ==
|
||||
ACPI_REFCLASS_NAME)))) {
|
||||
name_found = TRUE;
|
||||
|
@ -575,8 +575,7 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
|
|||
/* Was a String type found? */
|
||||
|
||||
if (name_found) {
|
||||
if (ACPI_GET_OBJECT_TYPE(*sub_object_list) ==
|
||||
ACPI_TYPE_STRING) {
|
||||
if ((*sub_object_list)->common.type == ACPI_TYPE_STRING) {
|
||||
/*
|
||||
* The length String.Length field does not include the
|
||||
* terminating NULL, add 1
|
||||
|
|
|
@ -212,7 +212,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
|
||||
/* Each element of the top-level package must also be a package */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(*top_object_list) != ACPI_TYPE_PACKAGE) {
|
||||
if ((*top_object_list)->common.type != ACPI_TYPE_PACKAGE) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"(PRT[%X]) Need sub-package, found %s",
|
||||
index,
|
||||
|
@ -240,7 +240,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
/* 1) First subobject: Dereference the PRT.Address */
|
||||
|
||||
obj_desc = sub_object_list[0];
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) {
|
||||
if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"(PRT[%X].Address) Need Integer, found %s",
|
||||
index,
|
||||
|
@ -253,7 +253,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
/* 2) Second subobject: Dereference the PRT.Pin */
|
||||
|
||||
obj_desc = sub_object_list[1];
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) {
|
||||
if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"(PRT[%X].Pin) Need Integer, found %s",
|
||||
index,
|
||||
|
@ -265,7 +265,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
* If BIOS erroneously reversed the _PRT source_name and source_index,
|
||||
* then reverse them back.
|
||||
*/
|
||||
if (ACPI_GET_OBJECT_TYPE(sub_object_list[3]) !=
|
||||
if ((sub_object_list[3])->common.type !=
|
||||
ACPI_TYPE_INTEGER) {
|
||||
if (acpi_gbl_enable_interpreter_slack) {
|
||||
source_name_index = 3;
|
||||
|
@ -291,8 +291,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
* other ACPI implementations.
|
||||
*/
|
||||
obj_desc = sub_object_list[3];
|
||||
if (!obj_desc
|
||||
|| (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER)) {
|
||||
if (!obj_desc || (obj_desc->common.type != ACPI_TYPE_INTEGER)) {
|
||||
sub_object_list[3] = sub_object_list[2];
|
||||
sub_object_list[2] = obj_desc;
|
||||
|
||||
|
@ -307,7 +306,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
*/
|
||||
obj_desc = sub_object_list[source_name_index];
|
||||
if (obj_desc) {
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
|
||||
if (obj_desc->reference.class !=
|
||||
|
@ -380,7 +379,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
/* 4) Fourth subobject: Dereference the PRT.source_index */
|
||||
|
||||
obj_desc = sub_object_list[source_index_index];
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) {
|
||||
if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"(PRT[%X].SourceIndex) Need Integer, found %s",
|
||||
index,
|
||||
|
|
|
@ -57,6 +57,8 @@ static void acpi_tb_convert_fadt(void);
|
|||
|
||||
static void acpi_tb_validate_fadt(void);
|
||||
|
||||
static void acpi_tb_setup_fadt_registers(void);
|
||||
|
||||
/* Table for conversion of FADT to common internal format and FADT validation */
|
||||
|
||||
typedef struct acpi_fadt_info {
|
||||
|
@ -130,7 +132,38 @@ static struct acpi_fadt_info fadt_info_table[] = {
|
|||
ACPI_FADT_SEPARATE_LENGTH}
|
||||
};
|
||||
|
||||
#define ACPI_FADT_INFO_ENTRIES (sizeof (fadt_info_table) / sizeof (struct acpi_fadt_info))
|
||||
#define ACPI_FADT_INFO_ENTRIES \
|
||||
(sizeof (fadt_info_table) / sizeof (struct acpi_fadt_info))
|
||||
|
||||
/* Table used to split Event Blocks into separate status/enable registers */
|
||||
|
||||
typedef struct acpi_fadt_pm_info {
|
||||
struct acpi_generic_address *target;
|
||||
u8 source;
|
||||
u8 register_num;
|
||||
|
||||
} acpi_fadt_pm_info;
|
||||
|
||||
static struct acpi_fadt_pm_info fadt_pm_info_table[] = {
|
||||
{&acpi_gbl_xpm1a_status,
|
||||
ACPI_FADT_OFFSET(xpm1a_event_block),
|
||||
0},
|
||||
|
||||
{&acpi_gbl_xpm1a_enable,
|
||||
ACPI_FADT_OFFSET(xpm1a_event_block),
|
||||
1},
|
||||
|
||||
{&acpi_gbl_xpm1b_status,
|
||||
ACPI_FADT_OFFSET(xpm1b_event_block),
|
||||
0},
|
||||
|
||||
{&acpi_gbl_xpm1b_enable,
|
||||
ACPI_FADT_OFFSET(xpm1b_event_block),
|
||||
1}
|
||||
};
|
||||
|
||||
#define ACPI_FADT_PM_INFO_ENTRIES \
|
||||
(sizeof (fadt_pm_info_table) / sizeof (struct acpi_fadt_pm_info))
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -172,7 +205,6 @@ acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
|
|||
* FUNCTION: acpi_tb_parse_fadt
|
||||
*
|
||||
* PARAMETERS: table_index - Index for the FADT
|
||||
* Flags - Flags
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
|
@ -181,7 +213,7 @@ acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_tb_parse_fadt(u32 table_index, u8 flags)
|
||||
void acpi_tb_parse_fadt(u32 table_index)
|
||||
{
|
||||
u32 length;
|
||||
struct acpi_table_header *table;
|
||||
|
@ -208,7 +240,7 @@ void acpi_tb_parse_fadt(u32 table_index, u8 flags)
|
|||
*/
|
||||
(void)acpi_tb_verify_checksum(table, length);
|
||||
|
||||
/* Obtain a local copy of the FADT in common ACPI 2.0+ format */
|
||||
/* Create a local copy of the FADT in common ACPI 2.0+ format */
|
||||
|
||||
acpi_tb_create_local_fadt(table, length);
|
||||
|
||||
|
@ -219,10 +251,10 @@ void acpi_tb_parse_fadt(u32 table_index, u8 flags)
|
|||
/* Obtain the DSDT and FACS tables via their addresses within the FADT */
|
||||
|
||||
acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xdsdt,
|
||||
flags, ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
|
||||
ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
|
||||
|
||||
acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xfacs,
|
||||
flags, ACPI_SIG_FACS, ACPI_TABLE_INDEX_FACS);
|
||||
ACPI_SIG_FACS, ACPI_TABLE_INDEX_FACS);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -266,11 +298,17 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
|
|||
ACPI_MEMCPY(&acpi_gbl_FADT, table,
|
||||
ACPI_MIN(length, sizeof(struct acpi_table_fadt)));
|
||||
|
||||
/*
|
||||
* 1) Convert the local copy of the FADT to the common internal format
|
||||
* 2) Validate some of the important values within the FADT
|
||||
*/
|
||||
/* Convert the local copy of the FADT to the common internal format */
|
||||
|
||||
acpi_tb_convert_fadt();
|
||||
|
||||
/* Validate FADT values now, before we make any changes */
|
||||
|
||||
acpi_tb_validate_fadt();
|
||||
|
||||
/* Initialize the global ACPI register structures */
|
||||
|
||||
acpi_tb_setup_fadt_registers();
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -282,31 +320,35 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
|
|||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Converts all versions of the FADT to a common internal format.
|
||||
* Expand all 32-bit addresses to 64-bit.
|
||||
* Expand 32-bit addresses to 64-bit as necessary.
|
||||
*
|
||||
* NOTE: acpi_gbl_FADT must be of size (struct acpi_table_fadt),
|
||||
* and must contain a copy of the actual FADT.
|
||||
*
|
||||
* ACPICA will use the "X" fields of the FADT for all addresses.
|
||||
* Notes on 64-bit register addresses:
|
||||
*
|
||||
* "X" fields are optional extensions to the original V1.0 fields. Even if
|
||||
* they are present in the structure, they can be optionally not used by
|
||||
* setting them to zero. Therefore, we must selectively expand V1.0 fields
|
||||
* if the corresponding X field is zero.
|
||||
* After this FADT conversion, later ACPICA code will only use the 64-bit "X"
|
||||
* fields of the FADT for all ACPI register addresses.
|
||||
*
|
||||
* For ACPI 1.0 FADTs, all address fields are expanded to the corresponding
|
||||
* "X" fields.
|
||||
* The 64-bit "X" fields are optional extensions to the original 32-bit FADT
|
||||
* V1.0 fields. Even if they are present in the FADT, they are optional and
|
||||
* are unused if the BIOS sets them to zero. Therefore, we must copy/expand
|
||||
* 32-bit V1.0 fields if the corresponding X field is zero.
|
||||
*
|
||||
* For ACPI 2.0 FADTs, any "X" fields that are NULL are filled in by
|
||||
* expanding the corresponding ACPI 1.0 field.
|
||||
* For ACPI 1.0 FADTs, all 32-bit address fields are expanded to the
|
||||
* corresponding "X" fields in the internal FADT.
|
||||
*
|
||||
* For ACPI 2.0+ FADTs, all valid (non-zero) 32-bit address fields are expanded
|
||||
* to the corresponding 64-bit X fields. For compatibility with other ACPI
|
||||
* implementations, we ignore the 64-bit field if the 32-bit field is valid,
|
||||
* regardless of whether the host OS is 32-bit or 64-bit.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_tb_convert_fadt(void)
|
||||
{
|
||||
u8 pm1_register_bit_width;
|
||||
u8 pm1_register_byte_width;
|
||||
struct acpi_generic_address *target64;
|
||||
struct acpi_generic_address *address64;
|
||||
u32 address32;
|
||||
u32 i;
|
||||
|
||||
/* Update the local FADT table header length */
|
||||
|
@ -355,35 +397,193 @@ static void acpi_tb_convert_fadt(void)
|
|||
* Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"
|
||||
* generic address structures as necessary. Later code will always use
|
||||
* the 64-bit address structures.
|
||||
*
|
||||
* March 2009:
|
||||
* We now always use the 32-bit address if it is valid (non-null). This
|
||||
* is not in accordance with the ACPI specification which states that
|
||||
* the 64-bit address supersedes the 32-bit version, but we do this for
|
||||
* compatibility with other ACPI implementations. Most notably, in the
|
||||
* case where both the 32 and 64 versions are non-null, we use the 32-bit
|
||||
* version. This is the only address that is guaranteed to have been
|
||||
* tested by the BIOS manufacturer.
|
||||
*/
|
||||
for (i = 0; i < ACPI_FADT_INFO_ENTRIES; i++) {
|
||||
target64 =
|
||||
ACPI_ADD_PTR(struct acpi_generic_address, &acpi_gbl_FADT,
|
||||
fadt_info_table[i].address64);
|
||||
address32 = *ACPI_ADD_PTR(u32,
|
||||
&acpi_gbl_FADT,
|
||||
fadt_info_table[i].address32);
|
||||
|
||||
/* Expand only if the 64-bit X target is null */
|
||||
address64 = ACPI_ADD_PTR(struct acpi_generic_address,
|
||||
&acpi_gbl_FADT,
|
||||
fadt_info_table[i].address64);
|
||||
|
||||
if (!target64->address) {
|
||||
/*
|
||||
* If both 32- and 64-bit addresses are valid (non-zero),
|
||||
* they must match.
|
||||
*/
|
||||
if (address64->address && address32 &&
|
||||
(address64->address != (u64) address32)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"32/64X address mismatch in %s: %8.8X/%8.8X%8.8X, using 32",
|
||||
fadt_info_table[i].name, address32,
|
||||
ACPI_FORMAT_UINT64(address64->address)));
|
||||
}
|
||||
|
||||
/* The space_id is always I/O for the 32-bit legacy address fields */
|
||||
/* Always use 32-bit address if it is valid (non-null) */
|
||||
|
||||
acpi_tb_init_generic_address(target64,
|
||||
if (address32) {
|
||||
/*
|
||||
* Copy the 32-bit address to the 64-bit GAS structure. The
|
||||
* Space ID is always I/O for 32-bit legacy address fields
|
||||
*/
|
||||
acpi_tb_init_generic_address(address64,
|
||||
ACPI_ADR_SPACE_SYSTEM_IO,
|
||||
*ACPI_ADD_PTR(u8,
|
||||
&acpi_gbl_FADT,
|
||||
fadt_info_table
|
||||
[i].length),
|
||||
(u64) * ACPI_ADD_PTR(u32,
|
||||
&acpi_gbl_FADT,
|
||||
fadt_info_table
|
||||
[i].
|
||||
address32));
|
||||
address32);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Validate FADT values now, before we make any changes */
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_fadt
|
||||
*
|
||||
* PARAMETERS: Table - Pointer to the FADT to be validated
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Validate various important fields within the FADT. If a problem
|
||||
* is found, issue a message, but no status is returned.
|
||||
* Used by both the table manager and the disassembler.
|
||||
*
|
||||
* Possible additional checks:
|
||||
* (acpi_gbl_FADT.pm1_event_length >= 4)
|
||||
* (acpi_gbl_FADT.pm1_control_length >= 2)
|
||||
* (acpi_gbl_FADT.pm_timer_length >= 4)
|
||||
* Gpe block lengths must be multiple of 2
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_tb_validate_fadt();
|
||||
static void acpi_tb_validate_fadt(void)
|
||||
{
|
||||
char *name;
|
||||
u32 *address32;
|
||||
struct acpi_generic_address *address64;
|
||||
u8 length;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* Check for FACS and DSDT address mismatches. An address mismatch between
|
||||
* the 32-bit and 64-bit address fields (FIRMWARE_CTRL/X_FIRMWARE_CTRL and
|
||||
* DSDT/X_DSDT) would indicate the presence of two FACS or two DSDT tables.
|
||||
*/
|
||||
if (acpi_gbl_FADT.facs &&
|
||||
(acpi_gbl_FADT.Xfacs != (u64) acpi_gbl_FADT.facs)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"32/64X FACS address mismatch in FADT - "
|
||||
"%8.8X/%8.8X%8.8X, using 32",
|
||||
acpi_gbl_FADT.facs,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xfacs)));
|
||||
|
||||
acpi_gbl_FADT.Xfacs = (u64) acpi_gbl_FADT.facs;
|
||||
}
|
||||
|
||||
if (acpi_gbl_FADT.dsdt &&
|
||||
(acpi_gbl_FADT.Xdsdt != (u64) acpi_gbl_FADT.dsdt)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"32/64X DSDT address mismatch in FADT - "
|
||||
"%8.8X/%8.8X%8.8X, using 32",
|
||||
acpi_gbl_FADT.dsdt,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xdsdt)));
|
||||
|
||||
acpi_gbl_FADT.Xdsdt = (u64) acpi_gbl_FADT.dsdt;
|
||||
}
|
||||
|
||||
/* Examine all of the 64-bit extended address fields (X fields) */
|
||||
|
||||
for (i = 0; i < ACPI_FADT_INFO_ENTRIES; i++) {
|
||||
/*
|
||||
* Generate pointers to the 32-bit and 64-bit addresses, get the
|
||||
* register length (width), and the register name
|
||||
*/
|
||||
address64 = ACPI_ADD_PTR(struct acpi_generic_address,
|
||||
&acpi_gbl_FADT,
|
||||
fadt_info_table[i].address64);
|
||||
address32 =
|
||||
ACPI_ADD_PTR(u32, &acpi_gbl_FADT,
|
||||
fadt_info_table[i].address32);
|
||||
length =
|
||||
*ACPI_ADD_PTR(u8, &acpi_gbl_FADT,
|
||||
fadt_info_table[i].length);
|
||||
name = fadt_info_table[i].name;
|
||||
|
||||
/*
|
||||
* For each extended field, check for length mismatch between the
|
||||
* legacy length field and the corresponding 64-bit X length field.
|
||||
*/
|
||||
if (address64->address &&
|
||||
(address64->bit_width != ACPI_MUL_8(length))) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"32/64X length mismatch in %s: %d/%d",
|
||||
name, ACPI_MUL_8(length),
|
||||
address64->bit_width));
|
||||
}
|
||||
|
||||
if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) {
|
||||
/*
|
||||
* Field is required (Pm1a_event, Pm1a_control, pm_timer).
|
||||
* Both the address and length must be non-zero.
|
||||
*/
|
||||
if (!address64->address || !length) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Required field %s has zero address and/or length:"
|
||||
" %8.8X%8.8X/%X",
|
||||
name,
|
||||
ACPI_FORMAT_UINT64(address64->
|
||||
address),
|
||||
length));
|
||||
}
|
||||
} else if (fadt_info_table[i].type & ACPI_FADT_SEPARATE_LENGTH) {
|
||||
/*
|
||||
* Field is optional (PM2Control, GPE0, GPE1) AND has its own
|
||||
* length field. If present, both the address and length must
|
||||
* be valid.
|
||||
*/
|
||||
if ((address64->address && !length) ||
|
||||
(!address64->address && length)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Optional field %s has zero address or length: "
|
||||
"%8.8X%8.8X/%X",
|
||||
name,
|
||||
ACPI_FORMAT_UINT64(address64->
|
||||
address),
|
||||
length));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_setup_fadt_registers
|
||||
*
|
||||
* PARAMETERS: None, uses acpi_gbl_FADT.
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Initialize global ACPI PM1 register definitions. Optionally,
|
||||
* force FADT register definitions to their default lengths.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_tb_setup_fadt_registers(void)
|
||||
{
|
||||
struct acpi_generic_address *target64;
|
||||
struct acpi_generic_address *source64;
|
||||
u8 pm1_register_byte_width;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* Optionally check all register lengths against the default values and
|
||||
|
@ -421,190 +621,39 @@ static void acpi_tb_convert_fadt(void)
|
|||
|
||||
/*
|
||||
* Get the length of the individual PM1 registers (enable and status).
|
||||
* Each register is defined to be (event block length / 2).
|
||||
* Each register is defined to be (event block length / 2). Extra divide
|
||||
* by 8 converts bits to bytes.
|
||||
*/
|
||||
pm1_register_bit_width =
|
||||
(u8)ACPI_DIV_2(acpi_gbl_FADT.xpm1a_event_block.bit_width);
|
||||
pm1_register_byte_width = (u8)ACPI_DIV_8(pm1_register_bit_width);
|
||||
pm1_register_byte_width = (u8)
|
||||
ACPI_DIV_16(acpi_gbl_FADT.xpm1a_event_block.bit_width);
|
||||
|
||||
/*
|
||||
* Adjust the lengths of the PM1 Event Blocks so that they can be used to
|
||||
* access the PM1 status register(s). Use (width / 2)
|
||||
*/
|
||||
acpi_gbl_FADT.xpm1a_event_block.bit_width = pm1_register_bit_width;
|
||||
acpi_gbl_FADT.xpm1b_event_block.bit_width = pm1_register_bit_width;
|
||||
|
||||
/*
|
||||
* Calculate separate GAS structs for the PM1 Enable registers.
|
||||
* These addresses do not appear (directly) in the FADT, so it is
|
||||
* useful to calculate them once, here.
|
||||
* Calculate separate GAS structs for the PM1x (A/B) Status and Enable
|
||||
* registers. These addresses do not appear (directly) in the FADT, so it
|
||||
* is useful to pre-calculate them from the PM1 Event Block definitions.
|
||||
*
|
||||
* The PM event blocks are split into two register blocks, first is the
|
||||
* PM Status Register block, followed immediately by the PM Enable
|
||||
* Register block. Each is of length (xpm1x_event_block.bit_width/2).
|
||||
* Register block. Each is of length (pm1_event_length/2)
|
||||
*
|
||||
* On various systems the v2 fields (and particularly the bit widths)
|
||||
* cannot be relied upon, though. Hence resort to using the v1 length
|
||||
* here (and warn about the inconsistency).
|
||||
* Note: The PM1A event block is required by the ACPI specification.
|
||||
* However, the PM1B event block is optional and is rarely, if ever,
|
||||
* used.
|
||||
*/
|
||||
if (acpi_gbl_FADT.xpm1a_event_block.bit_width
|
||||
!= acpi_gbl_FADT.pm1_event_length * 8)
|
||||
printk(KERN_WARNING "FADT: "
|
||||
"X_PM1a_EVT_BLK.bit_width (%u) does not match"
|
||||
" PM1_EVT_LEN (%u)\n",
|
||||
acpi_gbl_FADT.xpm1a_event_block.bit_width,
|
||||
acpi_gbl_FADT.pm1_event_length);
|
||||
|
||||
/* The PM1A register block is required */
|
||||
for (i = 0; i < ACPI_FADT_PM_INFO_ENTRIES; i++) {
|
||||
source64 =
|
||||
ACPI_ADD_PTR(struct acpi_generic_address, &acpi_gbl_FADT,
|
||||
fadt_pm_info_table[i].source);
|
||||
|
||||
acpi_tb_init_generic_address(&acpi_gbl_xpm1a_enable,
|
||||
acpi_gbl_FADT.xpm1a_event_block.space_id,
|
||||
pm1_register_byte_width,
|
||||
(acpi_gbl_FADT.xpm1a_event_block.address +
|
||||
pm1_register_byte_width));
|
||||
/* Don't forget to copy space_id of the GAS */
|
||||
acpi_gbl_xpm1a_enable.space_id =
|
||||
acpi_gbl_FADT.xpm1a_event_block.space_id;
|
||||
|
||||
/* The PM1B register block is optional, ignore if not present */
|
||||
|
||||
if (acpi_gbl_FADT.xpm1b_event_block.address) {
|
||||
if (acpi_gbl_FADT.xpm1b_event_block.bit_width
|
||||
!= acpi_gbl_FADT.pm1_event_length * 8)
|
||||
printk(KERN_WARNING "FADT: "
|
||||
"X_PM1b_EVT_BLK.bit_width (%u) does not match"
|
||||
" PM1_EVT_LEN (%u)\n",
|
||||
acpi_gbl_FADT.xpm1b_event_block.bit_width,
|
||||
acpi_gbl_FADT.pm1_event_length);
|
||||
acpi_tb_init_generic_address(&acpi_gbl_xpm1b_enable,
|
||||
acpi_gbl_FADT.xpm1b_event_block.space_id,
|
||||
pm1_register_byte_width,
|
||||
(acpi_gbl_FADT.xpm1b_event_block.
|
||||
address + pm1_register_byte_width));
|
||||
/* Don't forget to copy space_id of the GAS */
|
||||
acpi_gbl_xpm1b_enable.space_id =
|
||||
acpi_gbl_FADT.xpm1b_event_block.space_id;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_fadt
|
||||
*
|
||||
* PARAMETERS: Table - Pointer to the FADT to be validated
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Validate various important fields within the FADT. If a problem
|
||||
* is found, issue a message, but no status is returned.
|
||||
* Used by both the table manager and the disassembler.
|
||||
*
|
||||
* Possible additional checks:
|
||||
* (acpi_gbl_FADT.pm1_event_length >= 4)
|
||||
* (acpi_gbl_FADT.pm1_control_length >= 2)
|
||||
* (acpi_gbl_FADT.pm_timer_length >= 4)
|
||||
* Gpe block lengths must be multiple of 2
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_tb_validate_fadt(void)
|
||||
{
|
||||
char *name;
|
||||
u32 *address32;
|
||||
struct acpi_generic_address *address64;
|
||||
u8 length;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* Check for FACS and DSDT address mismatches. An address mismatch between
|
||||
* the 32-bit and 64-bit address fields (FIRMWARE_CTRL/X_FIRMWARE_CTRL and
|
||||
* DSDT/X_DSDT) would indicate the presence of two FACS or two DSDT tables.
|
||||
*/
|
||||
if (acpi_gbl_FADT.facs &&
|
||||
(acpi_gbl_FADT.Xfacs != (u64) acpi_gbl_FADT.facs)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"32/64X FACS address mismatch in FADT - "
|
||||
"two FACS tables! %8.8X/%8.8X%8.8X",
|
||||
acpi_gbl_FADT.facs,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xfacs)));
|
||||
}
|
||||
|
||||
if (acpi_gbl_FADT.dsdt &&
|
||||
(acpi_gbl_FADT.Xdsdt != (u64) acpi_gbl_FADT.dsdt)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"32/64X DSDT address mismatch in FADT - "
|
||||
"two DSDT tables! %8.8X/%8.8X%8.8X",
|
||||
acpi_gbl_FADT.dsdt,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xdsdt)));
|
||||
}
|
||||
|
||||
/* Examine all of the 64-bit extended address fields (X fields) */
|
||||
|
||||
for (i = 0; i < ACPI_FADT_INFO_ENTRIES; i++) {
|
||||
/*
|
||||
* Generate pointers to the 32-bit and 64-bit addresses, get the
|
||||
* register length (width), and the register name
|
||||
*/
|
||||
address64 = ACPI_ADD_PTR(struct acpi_generic_address,
|
||||
&acpi_gbl_FADT,
|
||||
fadt_info_table[i].address64);
|
||||
address32 =
|
||||
ACPI_ADD_PTR(u32, &acpi_gbl_FADT,
|
||||
fadt_info_table[i].address32);
|
||||
length =
|
||||
*ACPI_ADD_PTR(u8, &acpi_gbl_FADT,
|
||||
fadt_info_table[i].length);
|
||||
name = fadt_info_table[i].name;
|
||||
|
||||
/*
|
||||
* For each extended field, check for length mismatch between the
|
||||
* legacy length field and the corresponding 64-bit X length field.
|
||||
*/
|
||||
if (address64 && (address64->bit_width != ACPI_MUL_8(length))) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"32/64X length mismatch in %s: %d/%d",
|
||||
name, ACPI_MUL_8(length),
|
||||
address64->bit_width));
|
||||
}
|
||||
|
||||
if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) {
|
||||
/*
|
||||
* Field is required (Pm1a_event, Pm1a_control, pm_timer).
|
||||
* Both the address and length must be non-zero.
|
||||
*/
|
||||
if (!address64->address || !length) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Required field %s has zero address and/or length: %8.8X%8.8X/%X",
|
||||
name,
|
||||
ACPI_FORMAT_UINT64(address64->
|
||||
address),
|
||||
length));
|
||||
}
|
||||
} else if (fadt_info_table[i].type & ACPI_FADT_SEPARATE_LENGTH) {
|
||||
/*
|
||||
* Field is optional (PM2Control, GPE0, GPE1) AND has its own
|
||||
* length field. If present, both the address and length must be valid.
|
||||
*/
|
||||
if ((address64->address && !length)
|
||||
|| (!address64->address && length)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Optional field %s has zero address or length: %8.8X%8.8X/%X",
|
||||
name,
|
||||
ACPI_FORMAT_UINT64(address64->
|
||||
address),
|
||||
length));
|
||||
}
|
||||
}
|
||||
|
||||
/* If both 32- and 64-bit addresses are valid (non-zero), they must match */
|
||||
|
||||
if (address64->address && *address32 &&
|
||||
(address64->address != (u64) * address32)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"32/64X address mismatch in %s: %8.8X/%8.8X%8.8X, using 64X",
|
||||
name, *address32,
|
||||
ACPI_FORMAT_UINT64(address64->address)));
|
||||
if (source64->address) {
|
||||
acpi_tb_init_generic_address(fadt_pm_info_table[i].
|
||||
target, source64->space_id,
|
||||
pm1_register_byte_width,
|
||||
source64->address +
|
||||
(fadt_pm_info_table[i].
|
||||
register_num *
|
||||
pm1_register_byte_width));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -103,7 +103,9 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
|
|||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: This function is called to add the ACPI table
|
||||
* DESCRIPTION: This function is called to add an ACPI table. It is used to
|
||||
* dynamically load tables via the Load and load_table AML
|
||||
* operators.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -112,6 +114,7 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index)
|
|||
{
|
||||
u32 i;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_table_header *override_table = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_add_table);
|
||||
|
||||
|
@ -201,6 +204,29 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ACPI Table Override:
|
||||
* Allow the host to override dynamically loaded tables.
|
||||
*/
|
||||
status = acpi_os_table_override(table_desc->pointer, &override_table);
|
||||
if (ACPI_SUCCESS(status) && override_table) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s @ 0x%p Table override, replaced with:",
|
||||
table_desc->pointer->signature,
|
||||
ACPI_CAST_PTR(void, table_desc->address)));
|
||||
|
||||
/* We can delete the table that was passed as a parameter */
|
||||
|
||||
acpi_tb_delete_table(table_desc);
|
||||
|
||||
/* Setup descriptor for the new table */
|
||||
|
||||
table_desc->address = ACPI_PTR_TO_PHYSADDR(override_table);
|
||||
table_desc->pointer = override_table;
|
||||
table_desc->length = override_table->length;
|
||||
table_desc->flags = ACPI_TABLE_ORIGIN_OVERRIDE;
|
||||
}
|
||||
|
||||
/* Add the table to the global root table list */
|
||||
|
||||
status = acpi_tb_store_table(table_desc->address, table_desc->pointer,
|
||||
|
@ -247,8 +273,9 @@ acpi_status acpi_tb_resize_root_table_list(void)
|
|||
/* Increase the Table Array size */
|
||||
|
||||
tables = ACPI_ALLOCATE_ZEROED(((acpi_size) acpi_gbl_root_table_list.
|
||||
size + ACPI_ROOT_TABLE_SIZE_INCREMENT)
|
||||
* sizeof(struct acpi_table_desc));
|
||||
size +
|
||||
ACPI_ROOT_TABLE_SIZE_INCREMENT) *
|
||||
sizeof(struct acpi_table_desc));
|
||||
if (!tables) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not allocate new root table array"));
|
||||
|
@ -407,27 +434,56 @@ void acpi_tb_terminate(void)
|
|||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
*
|
||||
* RETURN: None
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Delete all namespace objects created when this table was loaded.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_tb_delete_namespace_by_owner(u32 table_index)
|
||||
acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index)
|
||||
{
|
||||
acpi_owner_id owner_id;
|
||||
acpi_status status;
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.count) {
|
||||
owner_id =
|
||||
acpi_gbl_root_table_list.tables[table_index].owner_id;
|
||||
} else {
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return;
|
||||
ACPI_FUNCTION_TRACE(tb_delete_namespace_by_owner);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (table_index >= acpi_gbl_root_table_list.count) {
|
||||
|
||||
/* The table index does not exist */
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/* Get the owner ID for this table, used to delete namespace nodes */
|
||||
|
||||
owner_id = acpi_gbl_root_table_list.tables[table_index].owner_id;
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
/*
|
||||
* Need to acquire the namespace writer lock to prevent interference
|
||||
* with any concurrent namespace walks. The interpreter must be
|
||||
* released during the deletion since the acquisition of the deletion
|
||||
* lock may block, and also since the execution of a namespace walk
|
||||
* must be allowed to use the interpreter.
|
||||
*/
|
||||
acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
|
||||
status = acpi_ut_acquire_write_lock(&acpi_gbl_namespace_rw_lock);
|
||||
|
||||
acpi_ns_delete_namespace_by_owner(owner_id);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ut_release_write_lock(&acpi_gbl_namespace_rw_lock);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -535,8 +591,8 @@ u8 acpi_tb_is_table_loaded(u32 table_index)
|
|||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
if (table_index < acpi_gbl_root_table_list.count) {
|
||||
is_loaded = (u8)
|
||||
(acpi_gbl_root_table_list.tables[table_index].
|
||||
flags & ACPI_TABLE_IS_LOADED);
|
||||
(acpi_gbl_root_table_list.tables[table_index].flags &
|
||||
ACPI_TABLE_IS_LOADED);
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
|
|
@ -177,19 +177,23 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
|||
struct acpi_table_header *header)
|
||||
{
|
||||
|
||||
/*
|
||||
* The reason that the Address is cast to a void pointer is so that we
|
||||
* can use %p which will work properly on both 32-bit and 64-bit hosts.
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) {
|
||||
|
||||
/* FACS only has signature and length fields of common table header */
|
||||
/* FACS only has signature and length fields */
|
||||
|
||||
ACPI_INFO((AE_INFO, "%4.4s %08lX, %04X",
|
||||
header->signature, (unsigned long)address,
|
||||
ACPI_INFO((AE_INFO, "%4.4s %p %05X",
|
||||
header->signature, ACPI_CAST_PTR(void, address),
|
||||
header->length));
|
||||
} else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) {
|
||||
|
||||
/* RSDP has no common fields */
|
||||
|
||||
ACPI_INFO((AE_INFO, "RSDP %08lX, %04X (r%d %6.6s)",
|
||||
(unsigned long)address,
|
||||
ACPI_INFO((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)",
|
||||
ACPI_CAST_PTR (void, address),
|
||||
(ACPI_CAST_PTR(struct acpi_table_rsdp, header)->
|
||||
revision >
|
||||
0) ? ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
|
@ -202,8 +206,8 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
|||
/* Standard ACPI table with full common header */
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s %08lX, %04X (r%d %6.6s %8.8s %8X %4.4s %8X)",
|
||||
header->signature, (unsigned long)address,
|
||||
"%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)",
|
||||
header->signature, ACPI_CAST_PTR (void, address),
|
||||
header->length, header->revision, header->oem_id,
|
||||
header->oem_table_id, header->oem_revision,
|
||||
header->asl_compiler_id,
|
||||
|
@ -280,22 +284,28 @@ u8 acpi_tb_checksum(u8 *buffer, u32 length)
|
|||
* FUNCTION: acpi_tb_install_table
|
||||
*
|
||||
* PARAMETERS: Address - Physical address of DSDT or FACS
|
||||
* Flags - Flags
|
||||
* Signature - Table signature, NULL if no need to
|
||||
* match
|
||||
* table_index - Index into root table array
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Install an ACPI table into the global data structure.
|
||||
* DESCRIPTION: Install an ACPI table into the global data structure. The
|
||||
* table override mechanism is implemented here to allow the host
|
||||
* OS to replace any table before it is installed in the root
|
||||
* table array.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_tb_install_table(acpi_physical_address address,
|
||||
u8 flags, char *signature, u32 table_index)
|
||||
char *signature, u32 table_index)
|
||||
{
|
||||
struct acpi_table_header *table;
|
||||
u8 flags;
|
||||
acpi_status status;
|
||||
struct acpi_table_header *table_to_install;
|
||||
struct acpi_table_header *mapped_table;
|
||||
struct acpi_table_header *override_table = NULL;
|
||||
|
||||
if (!address) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
|
@ -306,41 +316,69 @@ acpi_tb_install_table(acpi_physical_address address,
|
|||
|
||||
/* Map just the table header */
|
||||
|
||||
table = acpi_os_map_memory(address, sizeof(struct acpi_table_header));
|
||||
if (!table) {
|
||||
mapped_table =
|
||||
acpi_os_map_memory(address, sizeof(struct acpi_table_header));
|
||||
if (!mapped_table) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* If a particular signature is expected, signature must match */
|
||||
/* If a particular signature is expected (DSDT/FACS), it must match */
|
||||
|
||||
if (signature && !ACPI_COMPARE_NAME(table->signature, signature)) {
|
||||
if (signature && !ACPI_COMPARE_NAME(mapped_table->signature, signature)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Invalid signature 0x%X for ACPI table [%s]",
|
||||
*ACPI_CAST_PTR(u32, table->signature), signature));
|
||||
"Invalid signature 0x%X for ACPI table, expected [%s]",
|
||||
*ACPI_CAST_PTR(u32, mapped_table->signature),
|
||||
signature));
|
||||
goto unmap_and_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* ACPI Table Override:
|
||||
*
|
||||
* Before we install the table, let the host OS override it with a new
|
||||
* one if desired. Any table within the RSDT/XSDT can be replaced,
|
||||
* including the DSDT which is pointed to by the FADT.
|
||||
*/
|
||||
status = acpi_os_table_override(mapped_table, &override_table);
|
||||
if (ACPI_SUCCESS(status) && override_table) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s @ 0x%p Table override, replaced with:",
|
||||
mapped_table->signature, ACPI_CAST_PTR(void,
|
||||
address)));
|
||||
|
||||
acpi_gbl_root_table_list.tables[table_index].pointer =
|
||||
override_table;
|
||||
address = ACPI_PTR_TO_PHYSADDR(override_table);
|
||||
|
||||
table_to_install = override_table;
|
||||
flags = ACPI_TABLE_ORIGIN_OVERRIDE;
|
||||
} else {
|
||||
table_to_install = mapped_table;
|
||||
flags = ACPI_TABLE_ORIGIN_MAPPED;
|
||||
}
|
||||
|
||||
/* Initialize the table entry */
|
||||
|
||||
acpi_gbl_root_table_list.tables[table_index].address = address;
|
||||
acpi_gbl_root_table_list.tables[table_index].length = table->length;
|
||||
acpi_gbl_root_table_list.tables[table_index].length =
|
||||
table_to_install->length;
|
||||
acpi_gbl_root_table_list.tables[table_index].flags = flags;
|
||||
|
||||
ACPI_MOVE_32_TO_32(&
|
||||
(acpi_gbl_root_table_list.tables[table_index].
|
||||
signature), table->signature);
|
||||
signature), table_to_install->signature);
|
||||
|
||||
acpi_tb_print_table_header(address, table);
|
||||
acpi_tb_print_table_header(address, table_to_install);
|
||||
|
||||
if (table_index == ACPI_TABLE_INDEX_DSDT) {
|
||||
|
||||
/* Global integer width is based upon revision of the DSDT */
|
||||
|
||||
acpi_ut_set_integer_width(table->revision);
|
||||
acpi_ut_set_integer_width(table_to_install->revision);
|
||||
}
|
||||
|
||||
unmap_and_exit:
|
||||
acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
|
||||
acpi_os_unmap_memory(mapped_table, sizeof(struct acpi_table_header));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -379,7 +417,8 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size)
|
|||
} else {
|
||||
/*
|
||||
* 32-bit platform, XSDT: Truncate 64-bit to 32-bit and return
|
||||
* 64-bit platform, XSDT: Move (unaligned) 64-bit to local, return 64-bit
|
||||
* 64-bit platform, XSDT: Move (unaligned) 64-bit to local,
|
||||
* return 64-bit
|
||||
*/
|
||||
ACPI_MOVE_64_TO_64(&address64, table_entry);
|
||||
|
||||
|
@ -389,7 +428,8 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size)
|
|||
/* Will truncate 64-bit address to 32 bits, issue warning */
|
||||
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"64-bit Physical Address in XSDT is too large (%8.8X%8.8X), truncating",
|
||||
"64-bit Physical Address in XSDT is too large (%8.8X%8.8X),"
|
||||
" truncating",
|
||||
ACPI_FORMAT_UINT64(address64)));
|
||||
}
|
||||
#endif
|
||||
|
@ -402,7 +442,6 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size)
|
|||
* FUNCTION: acpi_tb_parse_root_table
|
||||
*
|
||||
* PARAMETERS: Rsdp - Pointer to the RSDP
|
||||
* Flags - Flags
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -416,7 +455,7 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size)
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status __init
|
||||
acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
|
||||
acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
||||
{
|
||||
struct acpi_table_rsdp *rsdp;
|
||||
u32 table_entry_size;
|
||||
|
@ -513,13 +552,12 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
|
|||
|
||||
/* Calculate the number of tables described in the root table */
|
||||
|
||||
table_count =
|
||||
(u32) ((table->length -
|
||||
sizeof(struct acpi_table_header)) / table_entry_size);
|
||||
|
||||
table_count = (u32)((table->length - sizeof(struct acpi_table_header)) /
|
||||
table_entry_size);
|
||||
/*
|
||||
* First two entries in the table array are reserved for the DSDT and FACS,
|
||||
* which are not actually present in the RSDT/XSDT - they come from the FADT
|
||||
* First two entries in the table array are reserved for the DSDT
|
||||
* and FACS, which are not actually present in the RSDT/XSDT - they
|
||||
* come from the FADT
|
||||
*/
|
||||
table_entry =
|
||||
ACPI_CAST_PTR(u8, table) + sizeof(struct acpi_table_header);
|
||||
|
@ -567,14 +605,14 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
|
|||
*/
|
||||
for (i = 2; i < acpi_gbl_root_table_list.count; i++) {
|
||||
acpi_tb_install_table(acpi_gbl_root_table_list.tables[i].
|
||||
address, flags, NULL, i);
|
||||
address, NULL, i);
|
||||
|
||||
/* Special case for FADT - get the DSDT and FACS */
|
||||
|
||||
if (ACPI_COMPARE_NAME
|
||||
(&acpi_gbl_root_table_list.tables[i].signature,
|
||||
ACPI_SIG_FADT)) {
|
||||
acpi_tb_parse_fadt(i, flags);
|
||||
acpi_tb_parse_fadt(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -150,8 +150,7 @@ acpi_initialize_tables(struct acpi_table_desc * initial_table_array,
|
|||
* Root Table Array. This array contains the information of the RSDT/XSDT
|
||||
* in a common, more useable format.
|
||||
*/
|
||||
status =
|
||||
acpi_tb_parse_root_table(rsdp_address, ACPI_TABLE_ORIGIN_MAPPED);
|
||||
status = acpi_tb_parse_root_table(rsdp_address);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -247,7 +246,7 @@ acpi_status acpi_load_table(struct acpi_table_header *table_ptr)
|
|||
|
||||
ACPI_EXPORT_SYMBOL(acpi_load_table)
|
||||
|
||||
/******************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_table_header
|
||||
*
|
||||
|
@ -262,7 +261,7 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
|
|||
* NOTE: Caller is responsible in unmapping the header with
|
||||
* acpi_os_unmap_memory
|
||||
*
|
||||
*****************************************************************************/
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_get_table_header(char *signature,
|
||||
u32 instance, struct acpi_table_header *out_table_header)
|
||||
|
@ -277,9 +276,8 @@ acpi_get_table_header(char *signature,
|
|||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/*
|
||||
* Walk the root table list
|
||||
*/
|
||||
/* Walk the root table list */
|
||||
|
||||
for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {
|
||||
if (!ACPI_COMPARE_NAME
|
||||
(&(acpi_gbl_root_table_list.tables[i].signature),
|
||||
|
@ -292,8 +290,8 @@ acpi_get_table_header(char *signature,
|
|||
}
|
||||
|
||||
if (!acpi_gbl_root_table_list.tables[i].pointer) {
|
||||
if ((acpi_gbl_root_table_list.tables[i].
|
||||
flags & ACPI_TABLE_ORIGIN_MASK) ==
|
||||
if ((acpi_gbl_root_table_list.tables[i].flags &
|
||||
ACPI_TABLE_ORIGIN_MASK) ==
|
||||
ACPI_TABLE_ORIGIN_MAPPED) {
|
||||
header =
|
||||
acpi_os_map_memory(acpi_gbl_root_table_list.
|
||||
|
@ -324,7 +322,7 @@ acpi_get_table_header(char *signature,
|
|||
|
||||
ACPI_EXPORT_SYMBOL(acpi_get_table_header)
|
||||
|
||||
/******************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_unload_table_id
|
||||
*
|
||||
|
@ -375,7 +373,7 @@ ACPI_EXPORT_SYMBOL(acpi_unload_table_id)
|
|||
*
|
||||
* DESCRIPTION: Finds and verifies an ACPI table.
|
||||
*
|
||||
*****************************************************************************/
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_get_table_with_size(char *signature,
|
||||
u32 instance, struct acpi_table_header **out_table,
|
||||
|
@ -391,9 +389,8 @@ acpi_get_table_with_size(char *signature,
|
|||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/*
|
||||
* Walk the root table list
|
||||
*/
|
||||
/* Walk the root table list */
|
||||
|
||||
for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {
|
||||
if (!ACPI_COMPARE_NAME
|
||||
(&(acpi_gbl_root_table_list.tables[i].signature),
|
||||
|
@ -502,7 +499,6 @@ ACPI_EXPORT_SYMBOL(acpi_get_table_by_index)
|
|||
static acpi_status acpi_tb_load_namespace(void)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_table_header *table;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_load_namespace);
|
||||
|
@ -526,58 +522,28 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find DSDT table
|
||||
*/
|
||||
status =
|
||||
acpi_os_table_override(acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT].pointer,
|
||||
&table);
|
||||
if (ACPI_SUCCESS(status) && table) {
|
||||
/*
|
||||
* DSDT table has been found
|
||||
*/
|
||||
acpi_tb_delete_table(&acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT]);
|
||||
acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer =
|
||||
table;
|
||||
acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].length =
|
||||
table->length;
|
||||
acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].flags =
|
||||
ACPI_TABLE_ORIGIN_UNKNOWN;
|
||||
|
||||
ACPI_INFO((AE_INFO, "Table DSDT replaced by host OS"));
|
||||
acpi_tb_print_table_header(0, table);
|
||||
|
||||
if (no_auto_ssdt == 0) {
|
||||
printk(KERN_WARNING "ACPI: DSDT override uses original SSDTs unless \"acpi_no_auto_ssdt\"\n");
|
||||
}
|
||||
}
|
||||
/* A valid DSDT is required */
|
||||
|
||||
status =
|
||||
acpi_tb_verify_table(&acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* A valid DSDT is required */
|
||||
|
||||
status = AE_NO_ACPI_TABLES;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
/*
|
||||
* Load and parse tables.
|
||||
*/
|
||||
/* Load and parse tables */
|
||||
|
||||
status = acpi_ns_load_table(ACPI_TABLE_INDEX_DSDT, acpi_gbl_root_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Load any SSDT or PSDT tables. Note: Loop leaves tables locked
|
||||
*/
|
||||
/* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
|
||||
if ((!ACPI_COMPARE_NAME
|
||||
|
@ -630,9 +596,8 @@ acpi_status acpi_load_tables(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(acpi_load_tables);
|
||||
|
||||
/*
|
||||
* Load the namespace from the tables
|
||||
*/
|
||||
/* Load the namespace from the tables */
|
||||
|
||||
status = acpi_tb_load_namespace();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
|
|
|
@ -75,8 +75,8 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
|||
* Note: Sometimes there exists more than one RSDP in memory; the valid
|
||||
* RSDP has a valid checksum, all others have an invalid checksum.
|
||||
*/
|
||||
if (ACPI_STRNCMP((char *)rsdp, ACPI_SIG_RSDP, sizeof(ACPI_SIG_RSDP) - 1)
|
||||
!= 0) {
|
||||
if (ACPI_STRNCMP((char *)rsdp, ACPI_SIG_RSDP,
|
||||
sizeof(ACPI_SIG_RSDP) - 1) != 0) {
|
||||
|
||||
/* Nope, BAD Signature */
|
||||
|
||||
|
|
|
@ -135,11 +135,11 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
|
|||
* In general, the external object will be the same type as
|
||||
* the internal object
|
||||
*/
|
||||
external_object->type = ACPI_GET_OBJECT_TYPE(internal_object);
|
||||
external_object->type = internal_object->common.type;
|
||||
|
||||
/* However, only a limited number of external types are supported */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(internal_object)) {
|
||||
switch (internal_object->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
external_object->string.pointer = (char *)data_space;
|
||||
|
@ -222,8 +222,8 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
|
|||
*/
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unsupported object type, cannot convert to external object: %s",
|
||||
acpi_ut_get_type_name(ACPI_GET_OBJECT_TYPE
|
||||
(internal_object))));
|
||||
acpi_ut_get_type_name(internal_object->common.
|
||||
type)));
|
||||
|
||||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
@ -355,7 +355,7 @@ acpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object,
|
|||
info.object_space = 0;
|
||||
info.num_packages = 1;
|
||||
|
||||
external_object->type = ACPI_GET_OBJECT_TYPE(internal_object);
|
||||
external_object->type = internal_object->common.type;
|
||||
external_object->package.count = internal_object->package.count;
|
||||
external_object->package.elements = ACPI_CAST_PTR(union acpi_object,
|
||||
info.free_space);
|
||||
|
@ -399,7 +399,7 @@ acpi_ut_copy_iobject_to_eobject(union acpi_operand_object *internal_object,
|
|||
|
||||
ACPI_FUNCTION_TRACE(ut_copy_iobject_to_eobject);
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(internal_object) == ACPI_TYPE_PACKAGE) {
|
||||
if (internal_object->common.type == ACPI_TYPE_PACKAGE) {
|
||||
/*
|
||||
* Package object: Copy all subobjects (including
|
||||
* nested packages)
|
||||
|
@ -496,8 +496,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
|
|||
case ACPI_TYPE_STRING:
|
||||
|
||||
internal_object->string.pointer =
|
||||
ACPI_ALLOCATE_ZEROED((acpi_size) external_object->string.
|
||||
length + 1);
|
||||
ACPI_ALLOCATE_ZEROED((acpi_size)
|
||||
external_object->string.length + 1);
|
||||
|
||||
if (!internal_object->string.pointer) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
@ -697,7 +698,7 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
|
|||
|
||||
/* Handle the objects with extra data */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(dest_desc)) {
|
||||
switch (dest_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
/*
|
||||
* Allocate and copy the actual buffer if and only if:
|
||||
|
@ -814,8 +815,8 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type,
|
|||
* This is a simple object, just copy it
|
||||
*/
|
||||
target_object =
|
||||
acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE
|
||||
(source_object));
|
||||
acpi_ut_create_internal_object(source_object->
|
||||
common.type);
|
||||
if (!target_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -892,7 +893,7 @@ acpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
|
|||
|
||||
ACPI_FUNCTION_TRACE(ut_copy_ipackage_to_ipackage);
|
||||
|
||||
dest_obj->common.type = ACPI_GET_OBJECT_TYPE(source_obj);
|
||||
dest_obj->common.type = source_obj->common.type;
|
||||
dest_obj->common.flags = source_obj->common.flags;
|
||||
dest_obj->package.count = source_obj->package.count;
|
||||
|
||||
|
@ -950,15 +951,14 @@ acpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc,
|
|||
|
||||
/* Create the top level object */
|
||||
|
||||
*dest_desc =
|
||||
acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE(source_desc));
|
||||
*dest_desc = acpi_ut_create_internal_object(source_desc->common.type);
|
||||
if (!*dest_desc) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Copy the object and possible subobjects */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(source_desc) == ACPI_TYPE_PACKAGE) {
|
||||
if (source_desc->common.type == ACPI_TYPE_PACKAGE) {
|
||||
status =
|
||||
acpi_ut_copy_ipackage_to_ipackage(source_desc, *dest_desc,
|
||||
walk_state);
|
||||
|
|
|
@ -86,7 +86,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
|
|||
* Must delete or free any pointers within the object that are not
|
||||
* actual ACPI objects (for example, a raw buffer pointer).
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(object)) {
|
||||
switch (object->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
|
||||
|
@ -382,7 +382,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
|
|||
object, new_count));
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(object) == ACPI_TYPE_METHOD) {
|
||||
if (object->common.type == ACPI_TYPE_METHOD) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
|
||||
"Method Obj %p Refs=%X, [Decremented]\n",
|
||||
object, new_count));
|
||||
|
@ -469,7 +469,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
|||
* All sub-objects must have their reference count incremented also.
|
||||
* Different object types have different subobjects.
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(object)) {
|
||||
switch (object->common.type) {
|
||||
case ACPI_TYPE_DEVICE:
|
||||
case ACPI_TYPE_PROCESSOR:
|
||||
case ACPI_TYPE_POWER:
|
||||
|
|
|
@ -59,26 +59,35 @@ acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
|
|||
|
||||
/*
|
||||
* Strings supported by the _OSI predefined (internal) method.
|
||||
*
|
||||
* March 2009: Removed "Linux" as this host no longer wants to respond true
|
||||
* for this string. Basically, the only safe OS strings are windows-related
|
||||
* and in many or most cases represent the only test path within the
|
||||
* BIOS-provided ASL code.
|
||||
*
|
||||
* The second element of each entry is used to track the newest version of
|
||||
* Windows that the BIOS has requested.
|
||||
*/
|
||||
static char *acpi_interfaces_supported[] = {
|
||||
static struct acpi_interface_info acpi_interfaces_supported[] = {
|
||||
/* Operating System Vendor Strings */
|
||||
|
||||
"Windows 2000", /* Windows 2000 */
|
||||
"Windows 2001", /* Windows XP */
|
||||
"Windows 2001 SP1", /* Windows XP SP1 */
|
||||
"Windows 2001 SP2", /* Windows XP SP2 */
|
||||
"Windows 2001.1", /* Windows Server 2003 */
|
||||
"Windows 2001.1 SP1", /* Windows Server 2003 SP1 - Added 03/2006 */
|
||||
"Windows 2006", /* Windows Vista - Added 03/2006 */
|
||||
{"Windows 2000", ACPI_OSI_WIN_2000}, /* Windows 2000 */
|
||||
{"Windows 2001", ACPI_OSI_WIN_XP}, /* Windows XP */
|
||||
{"Windows 2001 SP1", ACPI_OSI_WIN_XP_SP1}, /* Windows XP SP1 */
|
||||
{"Windows 2001.1", ACPI_OSI_WINSRV_2003}, /* Windows Server 2003 */
|
||||
{"Windows 2001 SP2", ACPI_OSI_WIN_XP_SP2}, /* Windows XP SP2 */
|
||||
{"Windows 2001.1 SP1", ACPI_OSI_WINSRV_2003_SP1}, /* Windows Server 2003 SP1 - Added 03/2006 */
|
||||
{"Windows 2006", ACPI_OSI_WIN_VISTA}, /* Windows Vista - Added 03/2006 */
|
||||
|
||||
/* Feature Group Strings */
|
||||
|
||||
"Extended Address Space Descriptor"
|
||||
/*
|
||||
* All "optional" feature group strings (features that are implemented
|
||||
* by the host) should be implemented in the host version of
|
||||
* acpi_os_validate_interface and should not be added here.
|
||||
*/
|
||||
{"Extended Address Space Descriptor", 0}
|
||||
|
||||
/*
|
||||
* All "optional" feature group strings (features that are implemented
|
||||
* by the host) should be implemented in the host version of
|
||||
* acpi_os_validate_interface and should not be added here.
|
||||
*/
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -98,6 +107,7 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
|
|||
acpi_status status;
|
||||
union acpi_operand_object *string_desc;
|
||||
union acpi_operand_object *return_desc;
|
||||
u32 return_value;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_osi_implementation);
|
||||
|
@ -116,19 +126,28 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
|
|||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Default return value is 0, NOT-SUPPORTED */
|
||||
/* Default return value is 0, NOT SUPPORTED */
|
||||
|
||||
return_desc->integer.value = 0;
|
||||
walk_state->return_desc = return_desc;
|
||||
return_value = 0;
|
||||
|
||||
/* Compare input string to static table of supported interfaces */
|
||||
|
||||
for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
|
||||
if (!ACPI_STRCMP
|
||||
(string_desc->string.pointer,
|
||||
acpi_interfaces_supported[i])) {
|
||||
return_desc->integer.value = ACPI_UINT32_MAX;
|
||||
goto done;
|
||||
if (!ACPI_STRCMP(string_desc->string.pointer,
|
||||
acpi_interfaces_supported[i].name)) {
|
||||
/*
|
||||
* The interface is supported.
|
||||
* Update the osi_data if necessary. We keep track of the latest
|
||||
* version of Windows that has been requested by the BIOS.
|
||||
*/
|
||||
if (acpi_interfaces_supported[i].value >
|
||||
acpi_gbl_osi_data) {
|
||||
acpi_gbl_osi_data =
|
||||
acpi_interfaces_supported[i].value;
|
||||
}
|
||||
|
||||
return_value = ACPI_UINT32_MAX;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,15 +158,22 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
|
|||
*/
|
||||
status = acpi_os_validate_interface(string_desc->string.pointer);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return_desc->integer.value = ACPI_UINT32_MAX;
|
||||
|
||||
/* The interface is supported */
|
||||
|
||||
return_value = ACPI_UINT32_MAX;
|
||||
}
|
||||
|
||||
done:
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO, "ACPI: BIOS _OSI(%s) %ssupported\n",
|
||||
string_desc->string.pointer,
|
||||
return_desc->integer.value == 0 ? "not-" : ""));
|
||||
exit:
|
||||
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO,
|
||||
"ACPI: BIOS _OSI(%s) is %ssupported\n",
|
||||
string_desc->string.pointer, return_value == 0 ? "not " : ""));
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
/* Complete the return value */
|
||||
|
||||
return_desc->integer.value = return_value;
|
||||
walk_state->return_desc = return_desc;
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -167,8 +193,8 @@ acpi_status acpi_osi_invalidate(char *interface)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
|
||||
if (!ACPI_STRCMP(interface, acpi_interfaces_supported[i])) {
|
||||
*acpi_interfaces_supported[i] = '\0';
|
||||
if (!ACPI_STRCMP(interface, acpi_interfaces_supported[i].name)) {
|
||||
*acpi_interfaces_supported[i].name = '\0';
|
||||
return AE_OK;
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +274,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
|
|||
|
||||
/* Map the return object type to the bitmapped type */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(info->return_object)) {
|
||||
switch ((info->return_object)->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
return_btype = ACPI_BTYPE_INTEGER;
|
||||
break;
|
||||
|
@ -418,7 +444,7 @@ acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
|
||||
|
||||
/* Convert the Numeric HID to string */
|
||||
|
||||
|
@ -459,7 +485,7 @@ acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
|
|||
struct acpi_compatible_id *one_cid)
|
||||
{
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* Convert the Numeric CID to string */
|
||||
|
@ -527,7 +553,7 @@ acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
|
|||
/* Get the number of _CIDs returned */
|
||||
|
||||
count = 1;
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
|
||||
count = obj_desc->package.count;
|
||||
}
|
||||
|
||||
|
@ -555,7 +581,7 @@ acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
|
|||
|
||||
/* The _CID object can be either a single CID or a package (list) of CIDs */
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
|
||||
|
||||
/* Translate each package element */
|
||||
|
||||
|
@ -620,7 +646,7 @@ acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
|
||||
if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
|
||||
|
||||
/* Convert the Numeric UID to string */
|
||||
|
||||
|
|
|
@ -294,12 +294,9 @@ struct acpi_bit_register_info acpi_gbl_bit_register_info[ACPI_NUM_BITREG] = {
|
|||
/* ACPI_BITREG_GLOBAL_LOCK_RELEASE */ {ACPI_REGISTER_PM1_CONTROL,
|
||||
ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE,
|
||||
ACPI_BITMASK_GLOBAL_LOCK_RELEASE},
|
||||
/* ACPI_BITREG_SLEEP_TYPE_A */ {ACPI_REGISTER_PM1_CONTROL,
|
||||
ACPI_BITPOSITION_SLEEP_TYPE_X,
|
||||
ACPI_BITMASK_SLEEP_TYPE_X},
|
||||
/* ACPI_BITREG_SLEEP_TYPE_B */ {ACPI_REGISTER_PM1_CONTROL,
|
||||
ACPI_BITPOSITION_SLEEP_TYPE_X,
|
||||
ACPI_BITMASK_SLEEP_TYPE_X},
|
||||
/* ACPI_BITREG_SLEEP_TYPE */ {ACPI_REGISTER_PM1_CONTROL,
|
||||
ACPI_BITPOSITION_SLEEP_TYPE,
|
||||
ACPI_BITMASK_SLEEP_TYPE},
|
||||
/* ACPI_BITREG_SLEEP_ENABLE */ {ACPI_REGISTER_PM1_CONTROL,
|
||||
ACPI_BITPOSITION_SLEEP_ENABLE,
|
||||
ACPI_BITMASK_SLEEP_ENABLE},
|
||||
|
@ -476,7 +473,7 @@ char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
|
|||
return ("[NULL Object Descriptor]");
|
||||
}
|
||||
|
||||
return (acpi_ut_get_type_name(ACPI_GET_OBJECT_TYPE(obj_desc)));
|
||||
return (acpi_ut_get_type_name(obj_desc->common.type));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -749,7 +746,10 @@ acpi_status acpi_ut_init_globals(void)
|
|||
for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
|
||||
acpi_gbl_owner_id_mask[i] = 0;
|
||||
}
|
||||
acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; /* Last ID is never valid */
|
||||
|
||||
/* Last owner_iD is never valid */
|
||||
|
||||
acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
|
||||
|
||||
/* GPE support */
|
||||
|
||||
|
@ -789,6 +789,7 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_gbl_trace_dbg_layer = 0;
|
||||
acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
|
||||
acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
|
||||
acpi_gbl_osi_data = 0;
|
||||
|
||||
/* Hardware oriented */
|
||||
|
||||
|
|
|
@ -0,0 +1,175 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: utlock - Reader/Writer lock interfaces
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2009, 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"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utlock")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_create_rw_lock
|
||||
* acpi_ut_delete_rw_lock
|
||||
*
|
||||
* PARAMETERS: Lock - Pointer to a valid RW lock
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Reader/writer lock creation and deletion interfaces.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_ut_create_rw_lock(struct acpi_rw_lock *lock)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
lock->num_readers = 0;
|
||||
status = acpi_os_create_mutex(&lock->reader_mutex);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = acpi_os_create_mutex(&lock->writer_mutex);
|
||||
return status;
|
||||
}
|
||||
|
||||
void acpi_ut_delete_rw_lock(struct acpi_rw_lock *lock)
|
||||
{
|
||||
|
||||
acpi_os_delete_mutex(lock->reader_mutex);
|
||||
acpi_os_delete_mutex(lock->writer_mutex);
|
||||
|
||||
lock->num_readers = 0;
|
||||
lock->reader_mutex = NULL;
|
||||
lock->writer_mutex = NULL;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_acquire_read_lock
|
||||
* acpi_ut_release_read_lock
|
||||
*
|
||||
* PARAMETERS: Lock - Pointer to a valid RW lock
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Reader interfaces for reader/writer locks. On acquisition,
|
||||
* only the first reader acquires the write mutex. On release,
|
||||
* only the last reader releases the write mutex. Although this
|
||||
* algorithm can in theory starve writers, this should not be a
|
||||
* problem with ACPICA since the subsystem is infrequently used
|
||||
* in comparison to (for example) an I/O system.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_acquire_read_lock(struct acpi_rw_lock *lock)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_os_acquire_mutex(lock->reader_mutex, ACPI_WAIT_FOREVER);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Acquire the write lock only for the first reader */
|
||||
|
||||
lock->num_readers++;
|
||||
if (lock->num_readers == 1) {
|
||||
status =
|
||||
acpi_os_acquire_mutex(lock->writer_mutex,
|
||||
ACPI_WAIT_FOREVER);
|
||||
}
|
||||
|
||||
acpi_os_release_mutex(lock->reader_mutex);
|
||||
return status;
|
||||
}
|
||||
|
||||
acpi_status acpi_ut_release_read_lock(struct acpi_rw_lock *lock)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_os_acquire_mutex(lock->reader_mutex, ACPI_WAIT_FOREVER);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Release the write lock only for the very last reader */
|
||||
|
||||
lock->num_readers--;
|
||||
if (lock->num_readers == 0) {
|
||||
acpi_os_release_mutex(lock->writer_mutex);
|
||||
}
|
||||
|
||||
acpi_os_release_mutex(lock->reader_mutex);
|
||||
return status;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_acquire_write_lock
|
||||
* acpi_ut_release_write_lock
|
||||
*
|
||||
* PARAMETERS: Lock - Pointer to a valid RW lock
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Writer interfaces for reader/writer locks. Simply acquire or
|
||||
* release the writer mutex associated with the lock. Acquisition
|
||||
* of the lock is fully exclusive and will block all readers and
|
||||
* writers until it is released.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_acquire_write_lock(struct acpi_rw_lock *lock)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_os_acquire_mutex(lock->writer_mutex, ACPI_WAIT_FOREVER);
|
||||
return status;
|
||||
}
|
||||
|
||||
void acpi_ut_release_write_lock(struct acpi_rw_lock *lock)
|
||||
{
|
||||
|
||||
acpi_os_release_mutex(lock->writer_mutex);
|
||||
}
|
|
@ -938,8 +938,7 @@ acpi_ut_walk_package_tree(union acpi_operand_object * source_object,
|
|||
if ((!this_source_obj) ||
|
||||
(ACPI_GET_DESCRIPTOR_TYPE(this_source_obj) !=
|
||||
ACPI_DESC_TYPE_OPERAND)
|
||||
|| (ACPI_GET_OBJECT_TYPE(this_source_obj) !=
|
||||
ACPI_TYPE_PACKAGE)) {
|
||||
|| (this_source_obj->common.type != ACPI_TYPE_PACKAGE)) {
|
||||
status =
|
||||
walk_callback(ACPI_COPY_TYPE_SIMPLE,
|
||||
this_source_obj, state, context);
|
||||
|
|
|
@ -60,7 +60,8 @@ static acpi_status acpi_ut_delete_mutex(acpi_mutex_handle mutex_id);
|
|||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Create the system mutex objects.
|
||||
* DESCRIPTION: Create the system mutex objects. This includes mutexes,
|
||||
* spin locks, and reader/writer locks.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -71,9 +72,8 @@ acpi_status acpi_ut_mutex_initialize(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(ut_mutex_initialize);
|
||||
|
||||
/*
|
||||
* Create each of the predefined mutex objects
|
||||
*/
|
||||
/* Create each of the predefined mutex objects */
|
||||
|
||||
for (i = 0; i < ACPI_NUM_MUTEX; i++) {
|
||||
status = acpi_ut_create_mutex(i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -86,6 +86,9 @@ acpi_status acpi_ut_mutex_initialize(void)
|
|||
spin_lock_init(acpi_gbl_gpe_lock);
|
||||
spin_lock_init(acpi_gbl_hardware_lock);
|
||||
|
||||
/* Create the reader/writer lock for namespace access */
|
||||
|
||||
status = acpi_ut_create_rw_lock(&acpi_gbl_namespace_rw_lock);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -97,7 +100,8 @@ acpi_status acpi_ut_mutex_initialize(void)
|
|||
*
|
||||
* RETURN: None.
|
||||
*
|
||||
* DESCRIPTION: Delete all of the system mutex objects.
|
||||
* DESCRIPTION: Delete all of the system mutex objects. This includes mutexes,
|
||||
* spin locks, and reader/writer locks.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -107,9 +111,8 @@ void acpi_ut_mutex_terminate(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(ut_mutex_terminate);
|
||||
|
||||
/*
|
||||
* Delete each predefined mutex object
|
||||
*/
|
||||
/* Delete each predefined mutex object */
|
||||
|
||||
for (i = 0; i < ACPI_NUM_MUTEX; i++) {
|
||||
(void)acpi_ut_delete_mutex(i);
|
||||
}
|
||||
|
@ -118,6 +121,10 @@ void acpi_ut_mutex_terminate(void)
|
|||
|
||||
acpi_os_delete_lock(acpi_gbl_gpe_lock);
|
||||
acpi_os_delete_lock(acpi_gbl_hardware_lock);
|
||||
|
||||
/* Delete the reader/writer lock */
|
||||
|
||||
acpi_ut_delete_rw_lock(&acpi_gbl_namespace_rw_lock);
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
|
|
@ -310,7 +310,7 @@ u8 acpi_ut_valid_internal_object(void *object)
|
|||
/* Check for a null pointer */
|
||||
|
||||
if (!object) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "**** Null Object Ptr\n"));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "**** Null Object Ptr\n"));
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
@ -324,7 +324,7 @@ u8 acpi_ut_valid_internal_object(void *object)
|
|||
return (TRUE);
|
||||
|
||||
default:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"%p is not not an ACPI operand obj [%s]\n",
|
||||
object, acpi_ut_get_descriptor_name(object)));
|
||||
break;
|
||||
|
@ -457,7 +457,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
|
|||
* must be accessed bytewise or there may be alignment problems on
|
||||
* certain processors
|
||||
*/
|
||||
switch (ACPI_GET_OBJECT_TYPE(internal_object)) {
|
||||
switch (internal_object->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
length += (acpi_size) internal_object->string.length + 1;
|
||||
|
@ -518,8 +518,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
|
|||
ACPI_ERROR((AE_INFO, "Cannot convert to external object - "
|
||||
"unsupported type [%s] %X in object %p",
|
||||
acpi_ut_get_object_type_name(internal_object),
|
||||
ACPI_GET_OBJECT_TYPE(internal_object),
|
||||
internal_object));
|
||||
internal_object->common.type, internal_object));
|
||||
status = AE_TYPE;
|
||||
break;
|
||||
}
|
||||
|
@ -664,7 +663,7 @@ acpi_ut_get_object_size(union acpi_operand_object *internal_object,
|
|||
|
||||
if ((ACPI_GET_DESCRIPTOR_TYPE(internal_object) ==
|
||||
ACPI_DESC_TYPE_OPERAND)
|
||||
&& (ACPI_GET_OBJECT_TYPE(internal_object) == ACPI_TYPE_PACKAGE)) {
|
||||
&& (internal_object->common.type == ACPI_TYPE_PACKAGE)) {
|
||||
status =
|
||||
acpi_ut_get_package_object_size(internal_object,
|
||||
obj_length);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/async.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
#include <linux/proc_fs.h>
|
||||
|
@ -92,7 +93,7 @@ struct acpi_battery {
|
|||
#endif
|
||||
struct acpi_device *device;
|
||||
unsigned long update_time;
|
||||
int current_now;
|
||||
int rate_now;
|
||||
int capacity_now;
|
||||
int voltage_now;
|
||||
int design_capacity;
|
||||
|
@ -196,7 +197,8 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
|||
val->intval = battery->voltage_now * 1000;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CURRENT_NOW:
|
||||
val->intval = battery->current_now * 1000;
|
||||
case POWER_SUPPLY_PROP_POWER_NOW:
|
||||
val->intval = battery->rate_now * 1000;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
|
||||
case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
|
||||
|
@ -247,6 +249,7 @@ static enum power_supply_property energy_battery_props[] = {
|
|||
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
POWER_SUPPLY_PROP_POWER_NOW,
|
||||
POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
|
||||
POWER_SUPPLY_PROP_ENERGY_FULL,
|
||||
POWER_SUPPLY_PROP_ENERGY_NOW,
|
||||
|
@ -273,7 +276,7 @@ struct acpi_offsets {
|
|||
|
||||
static struct acpi_offsets state_offsets[] = {
|
||||
{offsetof(struct acpi_battery, state), 0},
|
||||
{offsetof(struct acpi_battery, current_now), 0},
|
||||
{offsetof(struct acpi_battery, rate_now), 0},
|
||||
{offsetof(struct acpi_battery, capacity_now), 0},
|
||||
{offsetof(struct acpi_battery, voltage_now), 0},
|
||||
};
|
||||
|
@ -605,11 +608,11 @@ static int acpi_battery_print_state(struct seq_file *seq, int result)
|
|||
else
|
||||
seq_printf(seq, "charging state: charged\n");
|
||||
|
||||
if (battery->current_now == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "present rate: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "present rate: %d %s\n",
|
||||
battery->current_now, acpi_battery_units(battery));
|
||||
battery->rate_now, acpi_battery_units(battery));
|
||||
|
||||
if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "remaining capacity: unknown\n");
|
||||
|
@ -740,7 +743,7 @@ DECLARE_FILE_FUNCTIONS(alarm);
|
|||
static struct battery_file {
|
||||
struct file_operations ops;
|
||||
mode_t mode;
|
||||
char *name;
|
||||
const char *name;
|
||||
} acpi_battery_file[] = {
|
||||
FILE_DESCRIPTION_RO(info),
|
||||
FILE_DESCRIPTION_RO(state),
|
||||
|
@ -900,21 +903,27 @@ static struct acpi_driver acpi_battery_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
static int __init acpi_battery_init(void)
|
||||
static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
return;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_dir = acpi_lock_battery_dir();
|
||||
if (!acpi_battery_dir)
|
||||
return -ENODEV;
|
||||
return;
|
||||
#endif
|
||||
if (acpi_bus_register_driver(&acpi_battery_driver) < 0) {
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_unlock_battery_dir(acpi_battery_dir);
|
||||
#endif
|
||||
return -ENODEV;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static int __init acpi_battery_init(void)
|
||||
{
|
||||
async_schedule(acpi_battery_init_async, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define _COMPONENT ACPI_BUS_COMPONENT
|
||||
ACPI_MODULE_NAME("bus");
|
||||
|
||||
|
@ -846,6 +848,7 @@ static int __init acpi_init(void)
|
|||
acpi_kobj = NULL;
|
||||
}
|
||||
|
||||
init_acpi_device_notify();
|
||||
result = acpi_bus_init();
|
||||
|
||||
if (!result) {
|
||||
|
@ -860,11 +863,23 @@ static int __init acpi_init(void)
|
|||
}
|
||||
} else
|
||||
disable_acpi();
|
||||
|
||||
if (acpi_disabled)
|
||||
return result;
|
||||
|
||||
/*
|
||||
* If the laptop falls into the DMI check table, the power state check
|
||||
* will be disabled in the course of device power transistion.
|
||||
*/
|
||||
dmi_check_system(power_nocheck_dmi_table);
|
||||
|
||||
acpi_scan_init();
|
||||
acpi_ec_init();
|
||||
acpi_power_init();
|
||||
acpi_system_init();
|
||||
acpi_debug_init();
|
||||
acpi_sleep_proc_init();
|
||||
acpi_wakeup_device_init();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -78,6 +78,7 @@ MODULE_DEVICE_TABLE(acpi, button_device_ids);
|
|||
static int acpi_button_add(struct acpi_device *device);
|
||||
static int acpi_button_remove(struct acpi_device *device, int type);
|
||||
static int acpi_button_resume(struct acpi_device *device);
|
||||
static void acpi_button_notify(struct acpi_device *device, u32 event);
|
||||
static int acpi_button_info_open_fs(struct inode *inode, struct file *file);
|
||||
static int acpi_button_state_open_fs(struct inode *inode, struct file *file);
|
||||
|
||||
|
@ -89,6 +90,7 @@ static struct acpi_driver acpi_button_driver = {
|
|||
.add = acpi_button_add,
|
||||
.resume = acpi_button_resume,
|
||||
.remove = acpi_button_remove,
|
||||
.notify = acpi_button_notify,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -263,15 +265,18 @@ static int acpi_lid_send_state(struct acpi_button *button)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
|
||||
static void acpi_button_notify(struct acpi_device *device, u32 event)
|
||||
{
|
||||
struct acpi_button *button = data;
|
||||
struct acpi_button *button = acpi_driver_data(device);
|
||||
struct input_dev *input;
|
||||
|
||||
if (!button || !button->device)
|
||||
return;
|
||||
|
||||
switch (event) {
|
||||
case ACPI_FIXED_HARDWARE_EVENT:
|
||||
event = ACPI_BUTTON_NOTIFY_STATUS;
|
||||
/* fall through */
|
||||
case ACPI_BUTTON_NOTIFY_STATUS:
|
||||
input = button->input;
|
||||
if (button->type == ACPI_BUTTON_TYPE_LID) {
|
||||
|
@ -298,46 +303,6 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
|
|||
return;
|
||||
}
|
||||
|
||||
static acpi_status acpi_button_notify_fixed(void *data)
|
||||
{
|
||||
struct acpi_button *button = data;
|
||||
|
||||
if (!button)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
||||
acpi_button_notify(button->device->handle, ACPI_BUTTON_NOTIFY_STATUS, button);
|
||||
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
static int acpi_button_install_notify_handlers(struct acpi_button *button)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
status =
|
||||
acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
|
||||
acpi_button_notify_fixed,
|
||||
button);
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_SLEEPF:
|
||||
status =
|
||||
acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
|
||||
acpi_button_notify_fixed,
|
||||
button);
|
||||
break;
|
||||
default:
|
||||
status = acpi_install_notify_handler(button->device->handle,
|
||||
ACPI_DEVICE_NOTIFY,
|
||||
acpi_button_notify,
|
||||
button);
|
||||
break;
|
||||
}
|
||||
|
||||
return ACPI_FAILURE(status) ? -ENODEV : 0;
|
||||
}
|
||||
|
||||
static int acpi_button_resume(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_button *button;
|
||||
|
@ -349,25 +314,6 @@ static int acpi_button_resume(struct acpi_device *device)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_button_remove_notify_handlers(struct acpi_button *button)
|
||||
{
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
|
||||
acpi_button_notify_fixed);
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_SLEEPF:
|
||||
acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
|
||||
acpi_button_notify_fixed);
|
||||
break;
|
||||
default:
|
||||
acpi_remove_notify_handler(button->device->handle,
|
||||
ACPI_DEVICE_NOTIFY,
|
||||
acpi_button_notify);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int acpi_button_add(struct acpi_device *device)
|
||||
{
|
||||
int error;
|
||||
|
@ -432,10 +378,6 @@ static int acpi_button_add(struct acpi_device *device)
|
|||
if (error)
|
||||
goto err_free_input;
|
||||
|
||||
error = acpi_button_install_notify_handlers(button);
|
||||
if (error)
|
||||
goto err_remove_fs;
|
||||
|
||||
snprintf(button->phys, sizeof(button->phys),
|
||||
"%s/button/input0", acpi_device_hid(device));
|
||||
|
||||
|
@ -466,7 +408,7 @@ static int acpi_button_add(struct acpi_device *device)
|
|||
|
||||
error = input_register_device(input);
|
||||
if (error)
|
||||
goto err_remove_handlers;
|
||||
goto err_remove_fs;
|
||||
if (button->type == ACPI_BUTTON_TYPE_LID)
|
||||
acpi_lid_send_state(button);
|
||||
|
||||
|
@ -485,8 +427,6 @@ static int acpi_button_add(struct acpi_device *device)
|
|||
|
||||
return 0;
|
||||
|
||||
err_remove_handlers:
|
||||
acpi_button_remove_notify_handlers(button);
|
||||
err_remove_fs:
|
||||
acpi_button_remove_fs(device);
|
||||
err_free_input:
|
||||
|
@ -505,7 +445,6 @@ static int acpi_button_remove(struct acpi_device *device, int type)
|
|||
|
||||
button = acpi_driver_data(device);
|
||||
|
||||
acpi_button_remove_notify_handlers(button);
|
||||
acpi_button_remove_fs(device);
|
||||
input_unregister_device(button->input);
|
||||
kfree(button);
|
||||
|
|
|
@ -13,11 +13,6 @@
|
|||
#define _COMPONENT ACPI_SYSTEM_COMPONENT
|
||||
ACPI_MODULE_NAME("debug");
|
||||
|
||||
#ifdef MODULE_PARAM_PREFIX
|
||||
#undef MODULE_PARAM_PREFIX
|
||||
#endif
|
||||
#define MODULE_PARAM_PREFIX "acpi."
|
||||
|
||||
struct acpi_dlayer {
|
||||
const char *name;
|
||||
unsigned long value;
|
||||
|
@ -297,17 +292,15 @@ acpi_system_write_debug(struct file *file,
|
|||
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init acpi_debug_init(void)
|
||||
int __init acpi_debug_init(void)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
struct proc_dir_entry *entry;
|
||||
int error = 0;
|
||||
char *name;
|
||||
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
/* 'debug_layer' [R/W] */
|
||||
name = ACPI_SYSTEM_FILE_DEBUG_LAYER;
|
||||
entry =
|
||||
|
@ -338,7 +331,7 @@ static int __init acpi_debug_init(void)
|
|||
remove_proc_entry(ACPI_SYSTEM_FILE_DEBUG_LAYER, acpi_root_dir);
|
||||
error = -ENODEV;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
subsys_initcall(acpi_debug_init);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1146,9 +1146,10 @@ static int __init dock_init(void)
|
|||
static void __exit dock_exit(void)
|
||||
{
|
||||
struct dock_station *dock_station;
|
||||
struct dock_station *tmp;
|
||||
|
||||
unregister_acpi_bus_notifier(&dock_acpi_notifier);
|
||||
list_for_each_entry(dock_station, &dock_stations, sibiling)
|
||||
list_for_each_entry_safe(dock_station, tmp, &dock_stations, sibiling)
|
||||
dock_remove(dock_station);
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ enum ec_command {
|
|||
|
||||
#define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */
|
||||
#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
|
||||
#define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */
|
||||
#define ACPI_EC_CDELAY 10 /* Wait 10us before polling EC */
|
||||
|
||||
#define ACPI_EC_STORM_THRESHOLD 8 /* number of false interrupts
|
||||
per one transaction */
|
||||
|
@ -236,13 +236,23 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ec_delay(void)
|
||||
{
|
||||
/* EC in MSI notebooks don't tolerate delays other than 550 usec */
|
||||
if (EC_FLAGS_MSI)
|
||||
udelay(ACPI_EC_DELAY);
|
||||
else
|
||||
/* Use shortest sleep available */
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
static int ec_poll(struct acpi_ec *ec)
|
||||
{
|
||||
unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
|
||||
udelay(ACPI_EC_UDELAY);
|
||||
udelay(ACPI_EC_CDELAY);
|
||||
while (time_before(jiffies, delay)) {
|
||||
gpe_transaction(ec, acpi_ec_read_status(ec));
|
||||
udelay(ACPI_EC_UDELAY);
|
||||
ec_delay();
|
||||
if (ec_transaction_done(ec))
|
||||
return 0;
|
||||
}
|
||||
|
@ -672,7 +682,7 @@ static int acpi_ec_info_open_fs(struct inode *inode, struct file *file)
|
|||
return single_open(file, acpi_ec_read_info, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static struct file_operations acpi_ec_info_ops = {
|
||||
static const struct file_operations acpi_ec_info_ops = {
|
||||
.open = acpi_ec_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
|
@ -755,6 +765,10 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
|
|||
unsigned long long tmp = 0;
|
||||
|
||||
struct acpi_ec *ec = context;
|
||||
|
||||
/* clear addr values, ec_parse_io_ports depend on it */
|
||||
ec->command_addr = ec->data_addr = 0;
|
||||
|
||||
status = acpi_walk_resources(handle, METHOD_NAME__CRS,
|
||||
ec_parse_io_ports, ec);
|
||||
if (ACPI_FAILURE(status))
|
||||
|
@ -804,11 +818,11 @@ static int acpi_ec_add(struct acpi_device *device)
|
|||
ec = make_acpi_ec();
|
||||
if (!ec)
|
||||
return -ENOMEM;
|
||||
if (ec_parse_device(device->handle, 0, ec, NULL) !=
|
||||
AE_CTRL_TERMINATE) {
|
||||
}
|
||||
if (ec_parse_device(device->handle, 0, ec, NULL) !=
|
||||
AE_CTRL_TERMINATE) {
|
||||
kfree(ec);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
ec->handle = device->handle;
|
||||
|
@ -986,12 +1000,12 @@ int __init acpi_ec_ecdt_probe(void)
|
|||
boot_ec->handle = ACPI_ROOT_OBJECT;
|
||||
acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
|
||||
/* Don't trust ECDT, which comes from ASUSTek */
|
||||
if (!dmi_name_in_vendors("ASUS"))
|
||||
if (!dmi_name_in_vendors("ASUS") && EC_FLAGS_MSI == 0)
|
||||
goto install;
|
||||
saved_ec = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
|
||||
if (!saved_ec)
|
||||
return -ENOMEM;
|
||||
memcpy(saved_ec, boot_ec, sizeof(*saved_ec));
|
||||
memcpy(saved_ec, boot_ec, sizeof(struct acpi_ec));
|
||||
/* fall through */
|
||||
}
|
||||
/* This workaround is needed only on some broken machines,
|
||||
|
@ -1069,13 +1083,10 @@ static struct acpi_driver acpi_ec_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
static int __init acpi_ec_init(void)
|
||||
int __init acpi_ec_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
acpi_ec_dir = proc_mkdir(ACPI_EC_CLASS, acpi_root_dir);
|
||||
if (!acpi_ec_dir)
|
||||
return -ENODEV;
|
||||
|
@ -1090,8 +1101,6 @@ static int __init acpi_ec_init(void)
|
|||
return result;
|
||||
}
|
||||
|
||||
subsys_initcall(acpi_ec_init);
|
||||
|
||||
/* EC driver currently not unloadable */
|
||||
#if 0
|
||||
static void __exit acpi_ec_exit(void)
|
||||
|
|
|
@ -68,31 +68,35 @@ static struct acpi_driver acpi_fan_driver = {
|
|||
};
|
||||
|
||||
/* thermal cooling device callbacks */
|
||||
static int fan_get_max_state(struct thermal_cooling_device *cdev, char *buf)
|
||||
static int fan_get_max_state(struct thermal_cooling_device *cdev, unsigned long
|
||||
*state)
|
||||
{
|
||||
/* ACPI fan device only support two states: ON/OFF */
|
||||
return sprintf(buf, "1\n");
|
||||
*state = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fan_get_cur_state(struct thermal_cooling_device *cdev, char *buf)
|
||||
static int fan_get_cur_state(struct thermal_cooling_device *cdev, unsigned long
|
||||
*state)
|
||||
{
|
||||
struct acpi_device *device = cdev->devdata;
|
||||
int state;
|
||||
int result;
|
||||
int acpi_state;
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
result = acpi_bus_get_power(device->handle, &state);
|
||||
result = acpi_bus_get_power(device->handle, &acpi_state);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
return sprintf(buf, "%s\n", state == ACPI_STATE_D3 ? "0" :
|
||||
(state == ACPI_STATE_D0 ? "1" : "unknown"));
|
||||
*state = (acpi_state == ACPI_STATE_D3 ? 0 :
|
||||
(acpi_state == ACPI_STATE_D0 ? 1 : -1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned int state)
|
||||
fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
|
||||
{
|
||||
struct acpi_device *device = cdev->devdata;
|
||||
int result;
|
||||
|
|
|
@ -286,10 +286,8 @@ static int acpi_platform_notify_remove(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init init_acpi_device_notify(void)
|
||||
int __init init_acpi_device_notify(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
if (platform_notify || platform_notify_remove) {
|
||||
printk(KERN_ERR PREFIX "Can't use platform_notify\n");
|
||||
return 0;
|
||||
|
@ -298,5 +296,3 @@ static int __init init_acpi_device_notify(void)
|
|||
platform_notify_remove = acpi_platform_notify_remove;
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(init_acpi_device_notify);
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
/* For use by Linux/ACPI infrastructure, not drivers */
|
||||
|
||||
int init_acpi_device_notify(void);
|
||||
int acpi_scan_init(void);
|
||||
int acpi_system_init(void);
|
||||
|
||||
#ifdef CONFIG_ACPI_DEBUG
|
||||
int acpi_debug_init(void);
|
||||
#else
|
||||
static inline int acpi_debug_init(void) { return 0; }
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Power Resource
|
||||
-------------------------------------------------------------------------- */
|
||||
int acpi_power_init(void);
|
||||
int acpi_device_sleep_wake(struct acpi_device *dev,
|
||||
int enable, int sleep_state, int dev_state);
|
||||
int acpi_enable_wakeup_device_power(struct acpi_device *dev, int sleep_state);
|
||||
int acpi_disable_wakeup_device_power(struct acpi_device *dev);
|
||||
int acpi_power_get_inferred_state(struct acpi_device *device);
|
||||
int acpi_power_transition(struct acpi_device *device, int state);
|
||||
extern int acpi_power_nocheck;
|
||||
|
||||
int acpi_wakeup_device_init(void);
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Embedded Controller
|
||||
-------------------------------------------------------------------------- */
|
||||
int acpi_ec_init(void);
|
||||
int acpi_ec_ecdt_probe(void);
|
||||
int acpi_boot_ec_enable(void);
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Suspend/Resume
|
||||
-------------------------------------------------------------------------- */
|
||||
extern int acpi_sleep_init(void);
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
int acpi_sleep_proc_init(void);
|
||||
#else
|
||||
static inline int acpi_sleep_proc_init(void) { return 0; }
|
||||
#endif
|
|
@ -131,6 +131,21 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header)
|
|||
#endif /* ACPI_DEBUG_OUTPUT */
|
||||
break;
|
||||
|
||||
case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
{
|
||||
struct acpi_srat_x2apic_cpu_affinity *p =
|
||||
(struct acpi_srat_x2apic_cpu_affinity *)header;
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"SRAT Processor (x2apicid[0x%08x]) in"
|
||||
" proximity domain %d %s\n",
|
||||
p->apic_id,
|
||||
p->proximity_domain,
|
||||
(p->flags & ACPI_SRAT_CPU_ENABLED) ?
|
||||
"enabled" : "disabled"));
|
||||
}
|
||||
#endif /* ACPI_DEBUG_OUTPUT */
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING PREFIX
|
||||
"Found unsupported SRAT entry (type = 0x%x)\n",
|
||||
|
@ -180,8 +195,35 @@ static int __init acpi_parse_slit(struct acpi_table_header *table)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void __init __attribute__ ((weak))
|
||||
acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
||||
{
|
||||
printk(KERN_WARNING PREFIX
|
||||
"Found unsupported x2apic [0x%08x] SRAT entry\n", pa->apic_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int __init
|
||||
acpi_parse_processor_affinity(struct acpi_subtable_header * header,
|
||||
acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_srat_x2apic_cpu_affinity *processor_affinity;
|
||||
|
||||
processor_affinity = (struct acpi_srat_x2apic_cpu_affinity *)header;
|
||||
if (!processor_affinity)
|
||||
return -EINVAL;
|
||||
|
||||
acpi_table_print_srat_entry(header);
|
||||
|
||||
/* let architecture-dependent part to do it */
|
||||
acpi_numa_x2apic_affinity_init(processor_affinity);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_processor_affinity(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_srat_cpu_affinity *processor_affinity;
|
||||
|
@ -241,6 +283,8 @@ int __init acpi_numa_init(void)
|
|||
{
|
||||
/* SRAT: Static Resource Affinity Table */
|
||||
if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
|
||||
acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY,
|
||||
acpi_parse_x2apic_affinity, NR_CPUS);
|
||||
acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
|
||||
acpi_parse_processor_affinity, NR_CPUS);
|
||||
acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
|
||||
|
|
|
@ -1070,9 +1070,9 @@ __setup("acpi_wake_gpes_always_on", acpi_wake_gpes_always_on_setup);
|
|||
* in arbitrary AML code and can interfere with legacy drivers.
|
||||
* acpi_enforce_resources= can be set to:
|
||||
*
|
||||
* - strict (2)
|
||||
* - strict (default) (2)
|
||||
* -> further driver trying to access the resources will not load
|
||||
* - lax (default) (1)
|
||||
* - lax (1)
|
||||
* -> further driver trying to access the resources will load, but you
|
||||
* get a system message that something might go wrong...
|
||||
*
|
||||
|
@ -1084,7 +1084,7 @@ __setup("acpi_wake_gpes_always_on", acpi_wake_gpes_always_on_setup);
|
|||
#define ENFORCE_RESOURCES_LAX 1
|
||||
#define ENFORCE_RESOURCES_NO 0
|
||||
|
||||
static unsigned int acpi_enforce_resources = ENFORCE_RESOURCES_LAX;
|
||||
static unsigned int acpi_enforce_resources = ENFORCE_RESOURCES_STRICT;
|
||||
|
||||
static int __init acpi_enforce_resources_setup(char *str)
|
||||
{
|
||||
|
|
|
@ -86,7 +86,7 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(struct pci_dev *dev,
|
|||
}
|
||||
|
||||
/* http://bugzilla.kernel.org/show_bug.cgi?id=4773 */
|
||||
static struct dmi_system_id medion_md9580[] = {
|
||||
static const struct dmi_system_id medion_md9580[] = {
|
||||
{
|
||||
.ident = "Medion MD9580-F laptop",
|
||||
.matches = {
|
||||
|
@ -98,7 +98,7 @@ static struct dmi_system_id medion_md9580[] = {
|
|||
};
|
||||
|
||||
/* http://bugzilla.kernel.org/show_bug.cgi?id=5044 */
|
||||
static struct dmi_system_id dell_optiplex[] = {
|
||||
static const struct dmi_system_id dell_optiplex[] = {
|
||||
{
|
||||
.ident = "Dell Optiplex GX1",
|
||||
.matches = {
|
||||
|
@ -110,7 +110,7 @@ static struct dmi_system_id dell_optiplex[] = {
|
|||
};
|
||||
|
||||
/* http://bugzilla.kernel.org/show_bug.cgi?id=10138 */
|
||||
static struct dmi_system_id hp_t5710[] = {
|
||||
static const struct dmi_system_id hp_t5710[] = {
|
||||
{
|
||||
.ident = "HP t5710",
|
||||
.matches = {
|
||||
|
@ -123,13 +123,13 @@ static struct dmi_system_id hp_t5710[] = {
|
|||
};
|
||||
|
||||
struct prt_quirk {
|
||||
struct dmi_system_id *system;
|
||||
const struct dmi_system_id *system;
|
||||
unsigned int segment;
|
||||
unsigned int bus;
|
||||
unsigned int device;
|
||||
unsigned char pin;
|
||||
char *source; /* according to BIOS */
|
||||
char *actual_source;
|
||||
const char *source; /* according to BIOS */
|
||||
const char *actual_source;
|
||||
};
|
||||
|
||||
#define PCI_INTX_PIN(c) (c - 'A' + 1)
|
||||
|
@ -139,7 +139,7 @@ struct prt_quirk {
|
|||
* interrupt at the listed segment/bus/device/pin is connected to the first
|
||||
* link device, but it is actually connected to the second.
|
||||
*/
|
||||
static struct prt_quirk prt_quirks[] = {
|
||||
static const struct prt_quirk prt_quirks[] = {
|
||||
{ medion_md9580, 0, 0, 9, PCI_INTX_PIN('A'),
|
||||
"\\_SB_.PCI0.ISA_.LNKA",
|
||||
"\\_SB_.PCI0.ISA_.LNKB"},
|
||||
|
@ -155,7 +155,7 @@ static void do_prt_fixups(struct acpi_prt_entry *entry,
|
|||
struct acpi_pci_routing_table *prt)
|
||||
{
|
||||
int i;
|
||||
struct prt_quirk *quirk;
|
||||
const struct prt_quirk *quirk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(prt_quirks); i++) {
|
||||
quirk = &prt_quirks[i];
|
||||
|
@ -319,7 +319,7 @@ static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin)
|
|||
*/
|
||||
bridge = dev->bus->self;
|
||||
while (bridge) {
|
||||
pin = (((pin - 1) + PCI_SLOT(dev->devfn)) % 4) + 1;
|
||||
pin = pci_swizzle_interrupt_pin(dev, pin);
|
||||
|
||||
if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) {
|
||||
/* PC card has the same IRQ as its cardbridge */
|
||||
|
|
|
@ -43,13 +43,14 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
ACPI_MODULE_NAME("pci_link");
|
||||
#define ACPI_PCI_LINK_CLASS "pci_irq_routing"
|
||||
#define ACPI_PCI_LINK_DEVICE_NAME "PCI Interrupt Link"
|
||||
#define ACPI_PCI_LINK_FILE_INFO "info"
|
||||
#define ACPI_PCI_LINK_FILE_STATUS "state"
|
||||
#define ACPI_PCI_LINK_MAX_POSSIBLE 16
|
||||
#define ACPI_PCI_LINK_MAX_POSSIBLE 16
|
||||
|
||||
static int acpi_pci_link_add(struct acpi_device *device);
|
||||
static int acpi_pci_link_remove(struct acpi_device *device, int type);
|
||||
|
||||
|
@ -66,7 +67,7 @@ static struct acpi_driver acpi_pci_link_driver = {
|
|||
.ops = {
|
||||
.add = acpi_pci_link_add,
|
||||
.remove = acpi_pci_link_remove,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -76,7 +77,7 @@ static struct acpi_driver acpi_pci_link_driver = {
|
|||
struct acpi_pci_link_irq {
|
||||
u8 active; /* Current IRQ */
|
||||
u8 triggering; /* All IRQs */
|
||||
u8 polarity; /* All IRQs */
|
||||
u8 polarity; /* All IRQs */
|
||||
u8 resource_type;
|
||||
u8 possible_count;
|
||||
u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
|
||||
|
@ -85,16 +86,13 @@ struct acpi_pci_link_irq {
|
|||
};
|
||||
|
||||
struct acpi_pci_link {
|
||||
struct list_head node;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link_irq irq;
|
||||
int refcnt;
|
||||
struct list_head list;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link_irq irq;
|
||||
int refcnt;
|
||||
};
|
||||
|
||||
static struct {
|
||||
int count;
|
||||
struct list_head entries;
|
||||
} acpi_link;
|
||||
static LIST_HEAD(acpi_link_list);
|
||||
static DEFINE_MUTEX(acpi_link_lock);
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
|
@ -104,12 +102,11 @@ static DEFINE_MUTEX(acpi_link_lock);
|
|||
/*
|
||||
* set context (link) possible list from resource list
|
||||
*/
|
||||
static acpi_status
|
||||
acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
|
||||
static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
|
||||
void *context)
|
||||
{
|
||||
struct acpi_pci_link *link = context;
|
||||
u32 i = 0;
|
||||
|
||||
u32 i;
|
||||
|
||||
switch (resource->type) {
|
||||
case ACPI_RESOURCE_TYPE_START_DEPENDENT:
|
||||
|
@ -179,10 +176,6 @@ static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
|
|||
{
|
||||
acpi_status status;
|
||||
|
||||
|
||||
if (!link)
|
||||
return -EINVAL;
|
||||
|
||||
status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS,
|
||||
acpi_pci_link_check_possible, link);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -197,11 +190,10 @@ static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
|
||||
static acpi_status acpi_pci_link_check_current(struct acpi_resource *resource,
|
||||
void *context)
|
||||
{
|
||||
int *irq = (int *)context;
|
||||
|
||||
int *irq = context;
|
||||
|
||||
switch (resource->type) {
|
||||
case ACPI_RESOURCE_TYPE_START_DEPENDENT:
|
||||
|
@ -258,12 +250,9 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
|
|||
static int acpi_pci_link_get_current(struct acpi_pci_link *link)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
acpi_status status;
|
||||
int irq = 0;
|
||||
|
||||
if (!link)
|
||||
return -EINVAL;
|
||||
|
||||
link->irq.active = 0;
|
||||
|
||||
/* in practice, status disabled is meaningless, ignore it */
|
||||
|
@ -308,16 +297,15 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
|
|||
|
||||
static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
int result;
|
||||
acpi_status status;
|
||||
struct {
|
||||
struct acpi_resource res;
|
||||
struct acpi_resource end;
|
||||
} *resource;
|
||||
struct acpi_buffer buffer = { 0, NULL };
|
||||
|
||||
|
||||
if (!link || !irq)
|
||||
if (!irq)
|
||||
return -EINVAL;
|
||||
|
||||
resource = kzalloc(sizeof(*resource) + 1, irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL);
|
||||
|
@ -479,30 +467,22 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
|
|||
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
|
||||
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
|
||||
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
|
||||
/* >IRQ15 */
|
||||
};
|
||||
|
||||
int __init acpi_irq_penalty_init(void)
|
||||
{
|
||||
struct list_head *node = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
int i = 0;
|
||||
|
||||
struct acpi_pci_link *link;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Update penalties to facilitate IRQ balancing.
|
||||
*/
|
||||
list_for_each(node, &acpi_link.entries) {
|
||||
|
||||
link = list_entry(node, struct acpi_pci_link, node);
|
||||
if (!link) {
|
||||
printk(KERN_ERR PREFIX "Invalid link context\n");
|
||||
continue;
|
||||
}
|
||||
list_for_each_entry(link, &acpi_link_list, list) {
|
||||
|
||||
/*
|
||||
* reflect the possible and active irqs in the penalty table --
|
||||
|
@ -527,7 +507,6 @@ int __init acpi_irq_penalty_init(void)
|
|||
}
|
||||
/* Add a penalty for the SCI */
|
||||
acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -538,7 +517,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
|||
int irq;
|
||||
int i;
|
||||
|
||||
|
||||
if (link->irq.initialized) {
|
||||
if (link->refcnt == 0)
|
||||
/* This means the link is disabled but initialized */
|
||||
|
@ -566,11 +544,10 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
|||
/*
|
||||
* if active found, use it; else pick entry from end of possible list.
|
||||
*/
|
||||
if (link->irq.active) {
|
||||
if (link->irq.active)
|
||||
irq = link->irq.active;
|
||||
} else {
|
||||
else
|
||||
irq = link->irq.possible[link->irq.possible_count - 1];
|
||||
}
|
||||
|
||||
if (acpi_irq_balance || !link->irq.active) {
|
||||
/*
|
||||
|
@ -599,7 +576,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
|||
}
|
||||
|
||||
link->irq.initialized = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -608,16 +584,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
|||
* success: return IRQ >= 0
|
||||
* failure: return -1
|
||||
*/
|
||||
|
||||
int
|
||||
acpi_pci_link_allocate_irq(acpi_handle handle,
|
||||
int index,
|
||||
int *triggering, int *polarity, char **name)
|
||||
int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
|
||||
int *polarity, char **name)
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_device *device = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
|
||||
int result;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
result = acpi_bus_get_device(handle, &device);
|
||||
if (result) {
|
||||
|
@ -669,11 +641,10 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
|
|||
*/
|
||||
int acpi_pci_link_free_irq(acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *device = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link *link;
|
||||
acpi_status result;
|
||||
|
||||
|
||||
result = acpi_bus_get_device(handle, &device);
|
||||
if (result) {
|
||||
printk(KERN_ERR PREFIX "Invalid link device\n");
|
||||
|
@ -708,9 +679,9 @@ int acpi_pci_link_free_irq(acpi_handle handle)
|
|||
"Link %s is dereferenced\n",
|
||||
acpi_device_bid(link->device)));
|
||||
|
||||
if (link->refcnt == 0) {
|
||||
if (link->refcnt == 0)
|
||||
acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
|
||||
}
|
||||
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
return (link->irq.active);
|
||||
}
|
||||
|
@ -721,15 +692,11 @@ int acpi_pci_link_free_irq(acpi_handle handle)
|
|||
|
||||
static int acpi_pci_link_add(struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
int i = 0;
|
||||
int result;
|
||||
struct acpi_pci_link *link;
|
||||
int i;
|
||||
int found = 0;
|
||||
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
|
||||
if (!link)
|
||||
return -ENOMEM;
|
||||
|
@ -767,9 +734,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
|
|||
|
||||
printk("\n");
|
||||
|
||||
/* TBD: Acquire/release lock */
|
||||
list_add_tail(&link->node, &acpi_link.entries);
|
||||
acpi_link.count++;
|
||||
list_add_tail(&link->list, &acpi_link_list);
|
||||
|
||||
end:
|
||||
/* disable all links -- to be activated on use */
|
||||
|
@ -784,24 +749,17 @@ static int acpi_pci_link_add(struct acpi_device *device)
|
|||
|
||||
static int acpi_pci_link_resume(struct acpi_pci_link *link)
|
||||
{
|
||||
|
||||
if (link->refcnt && link->irq.active && link->irq.initialized)
|
||||
return (acpi_pci_link_set(link, link->irq.active));
|
||||
else
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int irqrouter_resume(struct sys_device *dev)
|
||||
{
|
||||
struct list_head *node = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
list_for_each(node, &acpi_link.entries) {
|
||||
link = list_entry(node, struct acpi_pci_link, node);
|
||||
if (!link) {
|
||||
printk(KERN_ERR PREFIX "Invalid link context\n");
|
||||
continue;
|
||||
}
|
||||
list_for_each_entry(link, &acpi_link_list, list) {
|
||||
acpi_pci_link_resume(link);
|
||||
}
|
||||
return 0;
|
||||
|
@ -809,20 +767,15 @@ static int irqrouter_resume(struct sys_device *dev)
|
|||
|
||||
static int acpi_pci_link_remove(struct acpi_device *device, int type)
|
||||
{
|
||||
struct acpi_pci_link *link = NULL;
|
||||
|
||||
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return -EINVAL;
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
link = acpi_driver_data(device);
|
||||
|
||||
mutex_lock(&acpi_link_lock);
|
||||
list_del(&link->node);
|
||||
list_del(&link->list);
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
|
||||
kfree(link);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -931,7 +884,6 @@ static int __init irqrouter_init_sysfs(void)
|
|||
{
|
||||
int error;
|
||||
|
||||
|
||||
if (acpi_disabled || acpi_noirq)
|
||||
return 0;
|
||||
|
||||
|
@ -957,9 +909,6 @@ static int __init acpi_pci_link_init(void)
|
|||
acpi_irq_balance = 0;
|
||||
}
|
||||
|
||||
acpi_link.count = 0;
|
||||
INIT_LIST_HEAD(&acpi_link.entries);
|
||||
|
||||
if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
|
|
@ -54,10 +54,6 @@ ACPI_MODULE_NAME("power");
|
|||
#define ACPI_POWER_RESOURCE_STATE_ON 0x01
|
||||
#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
|
||||
|
||||
#ifdef MODULE_PARAM_PREFIX
|
||||
#undef MODULE_PARAM_PREFIX
|
||||
#endif
|
||||
#define MODULE_PARAM_PREFIX "acpi."
|
||||
int acpi_power_nocheck;
|
||||
module_param_named(power_nocheck, acpi_power_nocheck, bool, 000);
|
||||
|
||||
|
@ -773,14 +769,10 @@ static int acpi_power_resume(struct acpi_device *device)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init acpi_power_init(void)
|
||||
int __init acpi_power_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
INIT_LIST_HEAD(&acpi_power_resource_list);
|
||||
|
||||
acpi_power_dir = proc_mkdir(ACPI_POWER_CLASS, acpi_root_dir);
|
||||
|
@ -795,5 +787,3 @@ static int __init acpi_power_init(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(acpi_power_init);
|
||||
|
|
|
@ -496,11 +496,8 @@ static u32 rtc_handler(void *context)
|
|||
}
|
||||
#endif /* HAVE_ACPI_LEGACY_ALARM */
|
||||
|
||||
static int __init acpi_sleep_proc_init(void)
|
||||
int __init acpi_sleep_proc_init(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
/* 'sleep' [R/W] */
|
||||
proc_create("sleep", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
|
@ -527,5 +524,3 @@ static int __init acpi_sleep_proc_init(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(acpi_sleep_proc_init);
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче