mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-20 16:46:23 +08:00
Merge with rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
This commit is contained in:
commit
4887c61811
35
Documentation/acpi-hotkey.txt
Normal file
35
Documentation/acpi-hotkey.txt
Normal file
@ -0,0 +1,35 @@
|
||||
driver/acpi/hotkey.c implement:
|
||||
1. /proc/acpi/hotkey/event_config
|
||||
(event based hotkey or event config interface):
|
||||
a. add a event based hotkey(event) :
|
||||
echo "0:bus::action:method:num:num" > event_config
|
||||
|
||||
b. delete a event based hotkey(event):
|
||||
echo "1:::::num:num" > event_config
|
||||
|
||||
c. modify a event based hotkey(event):
|
||||
echo "2:bus::action:method:num:num" > event_config
|
||||
|
||||
2. /proc/acpi/hotkey/poll_config
|
||||
(polling based hotkey or event config interface):
|
||||
a.add a polling based hotkey(event) :
|
||||
echo "0:bus:method:action:method:num" > poll_config
|
||||
this adding command will create a proc file
|
||||
/proc/acpi/hotkey/method, which is used to get
|
||||
result of polling.
|
||||
|
||||
b.delete a polling based hotkey(event):
|
||||
echo "1:::::num" > event_config
|
||||
|
||||
c.modify a polling based hotkey(event):
|
||||
echo "2:bus:method:action:method:num" > poll_config
|
||||
|
||||
3./proc/acpi/hotkey/action
|
||||
(interface to call aml method associated with a
|
||||
specific hotkey(event))
|
||||
echo "event_num:event_type:event_argument" >
|
||||
/proc/acpi/hotkey/action.
|
||||
The result of the execution of this aml method is
|
||||
attached to /proc/acpi/hotkey/poll_method, which is dnyamically
|
||||
created. Please use command "cat /proc/acpi/hotkey/polling_method"
|
||||
to retrieve it.
|
138
Documentation/filesystems/inotify.txt
Normal file
138
Documentation/filesystems/inotify.txt
Normal file
@ -0,0 +1,138 @@
|
||||
inotify
|
||||
a powerful yet simple file change notification system
|
||||
|
||||
|
||||
|
||||
Document started 15 Mar 2005 by Robert Love <rml@novell.com>
|
||||
|
||||
(i) User Interface
|
||||
|
||||
Inotify is controlled by a set of three sys calls
|
||||
|
||||
First step in using inotify is to initialise an inotify instance
|
||||
|
||||
int fd = inotify_init ();
|
||||
|
||||
Change events are managed by "watches". A watch is an (object,mask) pair where
|
||||
the object is a file or directory and the mask is a bit mask of one or more
|
||||
inotify events that the application wishes to receive. See <linux/inotify.h>
|
||||
for valid events. A watch is referenced by a watch descriptor, or wd.
|
||||
|
||||
Watches are added via a path to the file.
|
||||
|
||||
Watches on a directory will return events on any files inside of the directory.
|
||||
|
||||
Adding a watch is simple,
|
||||
|
||||
int wd = inotify_add_watch (fd, path, mask);
|
||||
|
||||
You can add a large number of files via something like
|
||||
|
||||
for each file to watch {
|
||||
int wd = inotify_add_watch (fd, file, mask);
|
||||
}
|
||||
|
||||
You can update an existing watch in the same manner, by passing in a new mask.
|
||||
|
||||
An existing watch is removed via the INOTIFY_IGNORE ioctl, for example
|
||||
|
||||
inotify_rm_watch (fd, wd);
|
||||
|
||||
Events are provided in the form of an inotify_event structure that is read(2)
|
||||
from a inotify instance fd. The filename is of dynamic length and follows the
|
||||
struct. It is of size len. The filename is padded with null bytes to ensure
|
||||
proper alignment. This padding is reflected in len.
|
||||
|
||||
You can slurp multiple events by passing a large buffer, for example
|
||||
|
||||
size_t len = read (fd, buf, BUF_LEN);
|
||||
|
||||
Will return as many events as are available and fit in BUF_LEN.
|
||||
|
||||
each inotify instance fd is also select()- and poll()-able.
|
||||
|
||||
You can find the size of the current event queue via the FIONREAD ioctl.
|
||||
|
||||
All watches are destroyed and cleaned up on close.
|
||||
|
||||
|
||||
(ii) Internal Kernel Implementation
|
||||
|
||||
Each open inotify instance is associated with an inotify_device structure.
|
||||
|
||||
Each watch is associated with an inotify_watch structure. Watches are chained
|
||||
off of each associated device and each associated inode.
|
||||
|
||||
See fs/inotify.c for the locking and lifetime rules.
|
||||
|
||||
|
||||
(iii) Rationale
|
||||
|
||||
Q: What is the design decision behind not tying the watch to the open fd of
|
||||
the watched object?
|
||||
|
||||
A: Watches are associated with an open inotify device, not an open file.
|
||||
This solves the primary problem with dnotify: keeping the file open pins
|
||||
the file and thus, worse, pins the mount. Dnotify is therefore infeasible
|
||||
for use on a desktop system with removable media as the media cannot be
|
||||
unmounted.
|
||||
|
||||
Q: What is the design decision behind using an-fd-per-device as opposed to
|
||||
an fd-per-watch?
|
||||
|
||||
A: An fd-per-watch quickly consumes more file descriptors than are allowed,
|
||||
more fd's than are feasible to manage, and more fd's than are optimally
|
||||
select()-able. Yes, root can bump the per-process fd limit and yes, users
|
||||
can use epoll, but requiring both is a silly and extraneous requirement.
|
||||
A watch consumes less memory than an open file, separating the number
|
||||
spaces is thus sensible. The current design is what user-space developers
|
||||
want: Users initialize inotify, once, and add n watches, requiring but one fd
|
||||
and no twiddling with fd limits. Initializing an inotify instance two
|
||||
thousand times is silly. If we can implement user-space's preferences
|
||||
cleanly--and we can, the idr layer makes stuff like this trivial--then we
|
||||
should.
|
||||
|
||||
There are other good arguments. With a single fd, there is a single
|
||||
item to block on, which is mapped to a single queue of events. The single
|
||||
fd returns all watch events and also any potential out-of-band data. If
|
||||
every fd was a separate watch,
|
||||
|
||||
- There would be no way to get event ordering. Events on file foo and
|
||||
file bar would pop poll() on both fd's, but there would be no way to tell
|
||||
which happened first. A single queue trivially gives you ordering. Such
|
||||
ordering is crucial to existing applications such as Beagle. Imagine
|
||||
"mv a b ; mv b a" events without ordering.
|
||||
|
||||
- We'd have to maintain n fd's and n internal queues with state,
|
||||
versus just one. It is a lot messier in the kernel. A single, linear
|
||||
queue is the data structure that makes sense.
|
||||
|
||||
- User-space developers prefer the current API. The Beagle guys, for
|
||||
example, love it. Trust me, I asked. It is not a surprise: Who'd want
|
||||
to manage and block on 1000 fd's via select?
|
||||
|
||||
- You'd have to manage the fd's, as an example: Call close() when you
|
||||
received a delete event.
|
||||
|
||||
- No way to get out of band data.
|
||||
|
||||
- 1024 is still too low. ;-)
|
||||
|
||||
When you talk about designing a file change notification system that
|
||||
scales to 1000s of directories, juggling 1000s of fd's just does not seem
|
||||
the right interface. It is too heavy.
|
||||
|
||||
Q: Why the system call approach?
|
||||
|
||||
A: The poor user-space interface is the second biggest problem with dnotify.
|
||||
Signals are a terrible, terrible interface for file notification. Or for
|
||||
anything, for that matter. The ideal solution, from all perspectives, is a
|
||||
file descriptor-based one that allows basic file I/O and poll/select.
|
||||
Obtaining the fd and managing the watches could have been done either via a
|
||||
device file or a family of new system calls. We decided to implement a
|
||||
family of system calls because that is the preffered approach for new kernel
|
||||
features and it means our user interface requirements.
|
||||
|
||||
Additionally, it _is_ possible to more than one instance and
|
||||
juggle more than one queue and thus more than one associated fd.
|
||||
|
@ -2,10 +2,10 @@ Kernel driver max6875
|
||||
=====================
|
||||
|
||||
Supported chips:
|
||||
* Maxim max6874, max6875
|
||||
Prefixes: 'max6875'
|
||||
* Maxim MAX6874, MAX6875
|
||||
Prefix: 'max6875'
|
||||
Addresses scanned: 0x50, 0x52
|
||||
Datasheets:
|
||||
Datasheet:
|
||||
http://pdfserv.maxim-ic.com/en/ds/MAX6874-MAX6875.pdf
|
||||
|
||||
Author: Ben Gardner <bgardner@wabtec.com>
|
||||
@ -23,14 +23,26 @@ Module Parameters
|
||||
Description
|
||||
-----------
|
||||
|
||||
The MAXIM max6875 is a EEPROM-programmable power-supply sequencer/supervisor.
|
||||
The Maxim MAX6875 is an EEPROM-programmable power-supply sequencer/supervisor.
|
||||
It provides timed outputs that can be used as a watchdog, if properly wired.
|
||||
It also provides 512 bytes of user EEPROM.
|
||||
|
||||
At reset, the max6875 reads the configuration eeprom into its configuration
|
||||
At reset, the MAX6875 reads the configuration EEPROM into its configuration
|
||||
registers. The chip then begins to operate according to the values in the
|
||||
registers.
|
||||
|
||||
The Maxim MAX6874 is a similar, mostly compatible device, with more intputs
|
||||
and outputs:
|
||||
|
||||
vin gpi vout
|
||||
MAX6874 6 4 8
|
||||
MAX6875 4 3 5
|
||||
|
||||
MAX6874 chips can have four different addresses (as opposed to only two for
|
||||
the MAX6875). The additional addresses (0x54 and 0x56) are not probed by
|
||||
this driver by default, but the probe module parameter can be used if
|
||||
needed.
|
||||
|
||||
See the datasheet for details on how to program the EEPROM.
|
||||
|
||||
|
||||
|
@ -14,9 +14,12 @@ C example
|
||||
=========
|
||||
|
||||
So let's say you want to access an i2c adapter from a C program. The
|
||||
first thing to do is `#include <linux/i2c.h>" and "#include <linux/i2c-dev.h>.
|
||||
Yes, I know, you should never include kernel header files, but until glibc
|
||||
knows about i2c, there is not much choice.
|
||||
first thing to do is "#include <linux/i2c-dev.h>". Please note that
|
||||
there are two files named "i2c-dev.h" out there, one is distributed
|
||||
with the Linux kernel and is meant to be included from kernel
|
||||
driver code, the other one is distributed with lm_sensors and is
|
||||
meant to be included from user-space programs. You obviously want
|
||||
the second one here.
|
||||
|
||||
Now, you have to decide which adapter you want to access. You should
|
||||
inspect /sys/class/i2c-dev/ to decide this. Adapter numbers are assigned
|
||||
@ -78,7 +81,7 @@ Full interface description
|
||||
==========================
|
||||
|
||||
The following IOCTLs are defined and fully supported
|
||||
(see also i2c-dev.h and i2c.h):
|
||||
(see also i2c-dev.h):
|
||||
|
||||
ioctl(file,I2C_SLAVE,long addr)
|
||||
Change slave address. The address is passed in the 7 lower bits of the
|
||||
@ -97,10 +100,10 @@ ioctl(file,I2C_PEC,long select)
|
||||
ioctl(file,I2C_FUNCS,unsigned long *funcs)
|
||||
Gets the adapter functionality and puts it in *funcs.
|
||||
|
||||
ioctl(file,I2C_RDWR,struct i2c_ioctl_rdwr_data *msgset)
|
||||
ioctl(file,I2C_RDWR,struct i2c_rdwr_ioctl_data *msgset)
|
||||
|
||||
Do combined read/write transaction without stop in between.
|
||||
The argument is a pointer to a struct i2c_ioctl_rdwr_data {
|
||||
The argument is a pointer to a struct i2c_rdwr_ioctl_data {
|
||||
|
||||
struct i2c_msg *msgs; /* ptr to array of simple messages */
|
||||
int nmsgs; /* number of messages to exchange */
|
||||
|
@ -27,7 +27,6 @@ address.
|
||||
static struct i2c_driver foo_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "Foo version 2.3 driver",
|
||||
.id = I2C_DRIVERID_FOO, /* from i2c-id.h, optional */
|
||||
.flags = I2C_DF_NOTIFY,
|
||||
.attach_adapter = &foo_attach_adapter,
|
||||
.detach_client = &foo_detach_client,
|
||||
@ -37,12 +36,6 @@ static struct i2c_driver foo_driver = {
|
||||
The name can be chosen freely, and may be upto 40 characters long. Please
|
||||
use something descriptive here.
|
||||
|
||||
If used, the id should be a unique ID. The range 0xf000 to 0xffff is
|
||||
reserved for local use, and you can use one of those until you start
|
||||
distributing the driver, at which time you should contact the i2c authors
|
||||
to get your own ID(s). Note that most of the time you don't need an ID
|
||||
at all so you can just omit it.
|
||||
|
||||
Don't worry about the flags field; just put I2C_DF_NOTIFY into it. This
|
||||
means that your driver will be notified when new adapters are found.
|
||||
This is almost always what you want.
|
||||
|
@ -37,7 +37,7 @@ restrictions referred to are that the relevant option is valid if:
|
||||
IA-32 IA-32 aka i386 architecture is enabled.
|
||||
IA-64 IA-64 architecture is enabled.
|
||||
IOSCHED More than one I/O scheduler is enabled.
|
||||
IP_PNP IP DCHP, BOOTP, or RARP is enabled.
|
||||
IP_PNP IP DHCP, BOOTP, or RARP is enabled.
|
||||
ISAPNP ISA PnP code is enabled.
|
||||
ISDN Appropriate ISDN support is enabled.
|
||||
JOY Appropriate joystick support is enabled.
|
||||
|
@ -1,6 +1,13 @@
|
||||
This file details changes in 2.6 which affect PCMCIA card driver authors:
|
||||
|
||||
* in-kernel device<->driver matching
|
||||
* event handler initialization in struct pcmcia_driver (as of 2.6.13)
|
||||
The event handler is notified of all events, and must be initialized
|
||||
as the event() callback in the driver's struct pcmcia_driver.
|
||||
|
||||
* pcmcia/version.h should not be used (as of 2.6.13)
|
||||
This file will be removed eventually.
|
||||
|
||||
* in-kernel device<->driver matching (as of 2.6.13)
|
||||
PCMCIA devices and their correct drivers can now be matched in
|
||||
kernelspace. See 'devicetable.txt' for details.
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
card=0 - *** UNKNOWN/GENERIC ***
|
||||
card=0 - *** UNKNOWN/GENERIC ***
|
||||
card=1 - MIRO PCTV
|
||||
card=2 - Hauppauge (bt848)
|
||||
card=3 - STB, Gateway P/N 6000699 (bt848)
|
||||
|
@ -27,3 +27,5 @@ card=25 - Digital-Logic MICROSPACE Entertainment Center (MEC)
|
||||
card=26 - IODATA GV/BCTV7E
|
||||
card=27 - PixelView PlayTV Ultra Pro (Stereo)
|
||||
card=28 - DViCO FusionHDTV 3 Gold-T
|
||||
card=29 - ADS Tech Instant TV DVB-T PCI
|
||||
card=30 - TerraTec Cinergy 1400 DVB-T
|
||||
|
@ -1,10 +1,10 @@
|
||||
0 -> UNKNOWN/GENERIC
|
||||
0 -> UNKNOWN/GENERIC
|
||||
1 -> Proteus Pro [philips reference design] [1131:2001,1131:2001]
|
||||
2 -> LifeView FlyVIDEO3000 [5168:0138,4e42:0138]
|
||||
3 -> LifeView FlyVIDEO2000 [5168:0138]
|
||||
4 -> EMPRESS [1131:6752]
|
||||
5 -> SKNet Monster TV [1131:4e85]
|
||||
6 -> Tevion MD 9717
|
||||
6 -> Tevion MD 9717
|
||||
7 -> KNC One TV-Station RDS / Typhoon TV Tuner RDS [1131:fe01,1894:fe01]
|
||||
8 -> Terratec Cinergy 400 TV [153B:1142]
|
||||
9 -> Medion 5044
|
||||
@ -34,6 +34,7 @@
|
||||
33 -> AVerMedia DVD EZMaker [1461:10ff]
|
||||
34 -> Noval Prime TV 7133
|
||||
35 -> AverMedia AverTV Studio 305 [1461:2115]
|
||||
36 -> UPMOST PURPLE TV [12ab:0800]
|
||||
37 -> Items MuchTV Plus / IT-005
|
||||
38 -> Terratec Cinergy 200 TV [153B:1152]
|
||||
39 -> LifeView FlyTV Platinum Mini [5168:0212]
|
||||
@ -43,20 +44,21 @@
|
||||
43 -> :Zolid Xpert TV7134
|
||||
44 -> Empire PCI TV-Radio LE
|
||||
45 -> Avermedia AVerTV Studio 307 [1461:9715]
|
||||
46 -> AVerMedia Cardbus TV/Radio [1461:d6ee]
|
||||
46 -> AVerMedia Cardbus TV/Radio (E500) [1461:d6ee]
|
||||
47 -> Terratec Cinergy 400 mobile [153b:1162]
|
||||
48 -> Terratec Cinergy 600 TV MK3 [153B:1158]
|
||||
49 -> Compro VideoMate Gold+ Pal [185b:c200]
|
||||
50 -> Pinnacle PCTV 300i DVB-T + PAL [11bd:002d]
|
||||
51 -> ProVideo PV952 [1540:9524]
|
||||
52 -> AverMedia AverTV/305 [1461:2108]
|
||||
53 -> ASUS TV-FM 7135 [1043:4845]
|
||||
54 -> LifeView FlyTV Platinum FM [5168:0214,1489:0214]
|
||||
55 -> LifeView FlyDVB-T DUO [5168:0306]
|
||||
55 -> LifeView FlyDVB-T DUO [5168:0502,5168:0306]
|
||||
56 -> Avermedia AVerTV 307 [1461:a70a]
|
||||
57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
|
||||
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0370]
|
||||
59 -> Kworld/Tevion V-Stream Xpert TV PVR7134
|
||||
60 -> Typhoon DVB-T Duo Digital/Analog Cardbus
|
||||
61 -> Philips TOUGH DVB-T reference design
|
||||
60 -> Typhoon DVB-T Duo Digital/Analog Cardbus [4e42:0502]
|
||||
61 -> Philips TOUGH DVB-T reference design [1131:2004]
|
||||
62 -> Compro VideoMate TV Gold+II
|
||||
63 -> Kworld Xpert TV PVR7134
|
||||
|
@ -56,9 +56,9 @@ tuner=54 - tda8290+75
|
||||
tuner=55 - LG PAL (TAPE series)
|
||||
tuner=56 - Philips PAL/SECAM multi (FQ1216AME MK4)
|
||||
tuner=57 - Philips FQ1236A MK4
|
||||
tuner=58 - Ymec TVision TVF-8531MF
|
||||
tuner=58 - Ymec TVision TVF-8531MF/8831MF/8731MF
|
||||
tuner=59 - Ymec TVision TVF-5533MF
|
||||
tuner=60 - Thomson DDT 7611 (ATSC/NTSC)
|
||||
tuner=61 - Tena TNF9533-D/IF
|
||||
tuner=61 - Tena TNF9533-D/IF/TNF9533-B/DF
|
||||
tuner=62 - Philips TEA5767HN FM Radio
|
||||
tuner=63 - Philips FMD1216ME MK3 Hybrid Tuner
|
||||
|
@ -20,7 +20,7 @@ All other cards only differ by additional components as tuners, sound
|
||||
decoders, EEPROMs, teletext decoders ...
|
||||
|
||||
|
||||
Unsupported Cards:
|
||||
Unsupported Cards:
|
||||
------------------
|
||||
|
||||
Cards with Zoran (ZR) or Philips (SAA) or ISA are not supported by
|
||||
@ -50,11 +50,11 @@ Bt848a/Bt849 single crytal operation support possible!!!
|
||||
Miro/Pinnacle PCTV
|
||||
------------------
|
||||
|
||||
- Bt848
|
||||
some (all??) come with 2 crystals for PAL/SECAM and NTSC
|
||||
- Bt848
|
||||
some (all??) come with 2 crystals for PAL/SECAM and NTSC
|
||||
- PAL, SECAM or NTSC TV tuner (Philips or TEMIC)
|
||||
- MSP34xx sound decoder on add on board
|
||||
decoder is supported but AFAIK does not yet work
|
||||
decoder is supported but AFAIK does not yet work
|
||||
(other sound MUX setting in GPIO port needed??? somebody who fixed this???)
|
||||
- 1 tuner, 1 composite and 1 S-VHS input
|
||||
- tuner type is autodetected
|
||||
@ -70,7 +70,7 @@ in 1997!
|
||||
Hauppauge Win/TV pci
|
||||
--------------------
|
||||
|
||||
There are many different versions of the Hauppauge cards with different
|
||||
There are many different versions of the Hauppauge cards with different
|
||||
tuners (TV+Radio ...), teletext decoders.
|
||||
Note that even cards with same model numbers have (depending on the revision)
|
||||
different chips on it.
|
||||
@ -80,22 +80,22 @@ different chips on it.
|
||||
- PAL, SECAM, NTSC or tuner with or without Radio support
|
||||
|
||||
e.g.:
|
||||
PAL:
|
||||
PAL:
|
||||
TDA5737: VHF, hyperband and UHF mixer/oscillator for TV and VCR 3-band tuners
|
||||
TSA5522: 1.4 GHz I2C-bus controlled synthesizer, I2C 0xc2-0xc3
|
||||
|
||||
|
||||
NTSC:
|
||||
TDA5731: VHF, hyperband and UHF mixer/oscillator for TV and VCR 3-band tuners
|
||||
TSA5518: no datasheet available on Philips site
|
||||
- Philips SAA5246 or SAA5284 ( or no) Teletext decoder chip
|
||||
- Philips SAA5246 or SAA5284 ( or no) Teletext decoder chip
|
||||
with buffer RAM (e.g. Winbond W24257AS-35: 32Kx8 CMOS static RAM)
|
||||
SAA5246 (I2C 0x22) is supported
|
||||
- 256 bytes EEPROM: Microchip 24LC02B or Philips 8582E2Y
|
||||
- 256 bytes EEPROM: Microchip 24LC02B or Philips 8582E2Y
|
||||
with configuration information
|
||||
I2C address 0xa0 (24LC02B also responds to 0xa2-0xaf)
|
||||
- 1 tuner, 1 composite and (depending on model) 1 S-VHS input
|
||||
- 14052B: mux for selection of sound source
|
||||
- sound decoder: TDA9800, MSP34xx (stereo cards)
|
||||
- sound decoder: TDA9800, MSP34xx (stereo cards)
|
||||
|
||||
|
||||
Askey CPH-Series
|
||||
@ -108,17 +108,17 @@ Developed by TelSignal(?), OEMed by many vendors (Typhoon, Anubis, Dynalink)
|
||||
CPH05x: BT878 with FM
|
||||
CPH06x: BT878 (w/o FM)
|
||||
CPH07x: BT878 capture only
|
||||
|
||||
|
||||
TV standards:
|
||||
CPH0x0: NTSC-M/M
|
||||
CPH0x1: PAL-B/G
|
||||
CPH0x2: PAL-I/I
|
||||
CPH0x3: PAL-D/K
|
||||
CPH0x4: SECAM-L/L
|
||||
CPH0x5: SECAM-B/G
|
||||
CPH0x6: SECAM-D/K
|
||||
CPH0x7: PAL-N/N
|
||||
CPH0x8: PAL-B/H
|
||||
CPH0x4: SECAM-L/L
|
||||
CPH0x5: SECAM-B/G
|
||||
CPH0x6: SECAM-D/K
|
||||
CPH0x7: PAL-N/N
|
||||
CPH0x8: PAL-B/H
|
||||
CPH0x9: PAL-M/M
|
||||
|
||||
CPH03x was often sold as "TV capturer".
|
||||
@ -174,7 +174,7 @@ Lifeview Flyvideo Series:
|
||||
"The FlyVideo2000 and FlyVideo2000s product name have renamed to FlyVideo98."
|
||||
Their Bt8x8 cards are listed as discontinued.
|
||||
Flyvideo 2000S was probably sold as Flyvideo 3000 in some contries(Europe?).
|
||||
The new Flyvideo 2000/3000 are SAA7130/SAA7134 based.
|
||||
The new Flyvideo 2000/3000 are SAA7130/SAA7134 based.
|
||||
|
||||
"Flyvideo II" had been the name for the 848 cards, nowadays (in Germany)
|
||||
this name is re-used for LR50 Rev.W.
|
||||
@ -235,12 +235,12 @@ Prolink
|
||||
Multimedia TV packages (card + software pack):
|
||||
PixelView Play TV Theater - (Model: PV-M4200) = PixelView Play TV pro + Software
|
||||
PixelView Play TV PAK - (Model: PV-BT878P+ REV 4E)
|
||||
PixelView Play TV/VCR - (Model: PV-M3200 REV 4C / 8D / 10A )
|
||||
PixelView Play TV/VCR - (Model: PV-M3200 REV 4C / 8D / 10A )
|
||||
PixelView Studio PAK - (Model: M2200 REV 4C / 8D / 10A )
|
||||
PixelView PowerStudio PAK - (Model: PV-M3600 REV 4E)
|
||||
PixelView DigitalVCR PAK - (Model: PV-M2400 REV 4C / 8D / 10A )
|
||||
|
||||
PixelView PlayTV PAK II (TV/FM card + usb camera) PV-M3800
|
||||
PixelView PlayTV PAK II (TV/FM card + usb camera) PV-M3800
|
||||
PixelView PlayTV XP PV-M4700,PV-M4700(w/FM)
|
||||
PixelView PlayTV DVR PV-M4600 package contents:PixelView PlayTV pro, windvr & videoMail s/w
|
||||
|
||||
@ -254,7 +254,7 @@ Prolink
|
||||
|
||||
DTV3000 PV-DTV3000P+ DVB-S CI = Twinhan VP-1030
|
||||
DTV2000 DVB-S = Twinhan VP-1020
|
||||
|
||||
|
||||
Video Conferencing:
|
||||
PixelView Meeting PAK - (Model: PV-BT878P)
|
||||
PixelView Meeting PAK Lite - (Model: PV-BT878P)
|
||||
@ -308,7 +308,7 @@ KNC One
|
||||
|
||||
newer Cards have saa7134, but model name stayed the same?
|
||||
|
||||
Provideo
|
||||
Provideo
|
||||
--------
|
||||
PV951 or PV-951 (also are sold as:
|
||||
Boeder TV-FM Video Capture Card
|
||||
@ -353,7 +353,7 @@ AVerMedia
|
||||
AVerTV
|
||||
AVerTV Stereo
|
||||
AVerTV Studio (w/FM)
|
||||
AVerMedia TV98 with Remote
|
||||
AVerMedia TV98 with Remote
|
||||
AVerMedia TV/FM98 Stereo
|
||||
AVerMedia TVCAM98
|
||||
TVCapture (Bt848)
|
||||
@ -373,7 +373,7 @@ AVerMedia
|
||||
(1) Daughterboard MB68-A with TDA9820T and TDA9840T
|
||||
(2) Sony NE41S soldered (stereo sound?)
|
||||
(3) Daughterboard M118-A w/ pic 16c54 and 4 MHz quartz
|
||||
|
||||
|
||||
US site has different drivers for (as of 09/2002):
|
||||
EZ Capture/InterCam PCI (BT-848 chip)
|
||||
EZ Capture/InterCam PCI (BT-878 chip)
|
||||
@ -437,7 +437,7 @@ Terratec
|
||||
Terra TValueRadio, "LR102 Rev.C" printed on the PCB
|
||||
Terra TV/Radio+ Version 1.0, "80-CP2830100-0" TTTV3 printed on the PCB,
|
||||
"CPH010-E83" on the back, SAA6588T, TDA9873H
|
||||
Terra TValue Version BT878, "80-CP2830110-0 TTTV4" printed on the PCB,
|
||||
Terra TValue Version BT878, "80-CP2830110-0 TTTV4" printed on the PCB,
|
||||
"CPH011-D83" on back
|
||||
Terra TValue Version 1.0 "ceb105.PCB" (really identical to Terra TV+ Version 1.0)
|
||||
Terra TValue New Revision "LR102 Rec.C"
|
||||
@ -528,7 +528,7 @@ Koutech
|
||||
KW-606RSF
|
||||
KW-607A (capture only)
|
||||
KW-608 (Zoran capture only)
|
||||
|
||||
|
||||
IODATA (jp)
|
||||
------
|
||||
GV-BCTV/PCI
|
||||
@ -542,15 +542,15 @@ Canopus (jp)
|
||||
-------
|
||||
WinDVR = Kworld "KW-TVL878RF"
|
||||
|
||||
www.sigmacom.co.kr
|
||||
www.sigmacom.co.kr
|
||||
------------------
|
||||
Sigma Cyber TV II
|
||||
Sigma Cyber TV II
|
||||
|
||||
www.sasem.co.kr
|
||||
---------------
|
||||
Litte OnAir TV
|
||||
|
||||
hama
|
||||
hama
|
||||
----
|
||||
TV/Radio-Tuner Card, PCI (Model 44677) = CPH051
|
||||
|
||||
@ -638,7 +638,7 @@ Media-Surfer (esc-kathrein.de)
|
||||
|
||||
Jetway (www.jetway.com.tw)
|
||||
--------------------------
|
||||
JW-TV 878M
|
||||
JW-TV 878M
|
||||
JW-TV 878 = KWorld KW-TV878RF
|
||||
|
||||
Galaxis
|
||||
@ -715,7 +715,7 @@ Hauppauge
|
||||
809 MyVideo
|
||||
872 MyTV2Go FM
|
||||
|
||||
|
||||
|
||||
546 WinTV Nova-S CI
|
||||
543 WinTV Nova
|
||||
907 Nova-S USB
|
||||
@ -739,7 +739,7 @@ Hauppauge
|
||||
832 MyTV2Go
|
||||
869 MyTV2Go-FM
|
||||
805 MyVideo (USB)
|
||||
|
||||
|
||||
|
||||
Matrix-Vision
|
||||
-------------
|
||||
@ -764,7 +764,7 @@ Gallant (www.gallantcom.com) www.minton.com.tw
|
||||
Intervision IV-550 (bt8x8)
|
||||
Intervision IV-100 (zoran)
|
||||
Intervision IV-1000 (bt8x8)
|
||||
|
||||
|
||||
Asonic (www.asonic.com.cn) (website down)
|
||||
-----------------------------------------
|
||||
SkyEye tv 878
|
||||
@ -804,11 +804,11 @@ Kworld (www.kworld.com.tw)
|
||||
|
||||
JTT/ Justy Corp.http://www.justy.co.jp/ (www.jtt.com.jp website down)
|
||||
---------------------------------------------------------------------
|
||||
JTT-02 (JTT TV) "TV watchmate pro" (bt848)
|
||||
JTT-02 (JTT TV) "TV watchmate pro" (bt848)
|
||||
|
||||
ADS www.adstech.com
|
||||
-------------------
|
||||
Channel Surfer TV ( CHX-950 )
|
||||
Channel Surfer TV ( CHX-950 )
|
||||
Channel Surfer TV+FM ( CHX-960FM )
|
||||
|
||||
AVEC www.prochips.com
|
||||
@ -874,7 +874,7 @@ www.ids-imaging.de
|
||||
------------------
|
||||
Falcon Series (capture only)
|
||||
In USA: http://www.theimagingsource.com/
|
||||
DFG/LC1
|
||||
DFG/LC1
|
||||
|
||||
www.sknet-web.co.jp
|
||||
-------------------
|
||||
@ -890,7 +890,7 @@ Cybertainment
|
||||
CyberMail Xtreme
|
||||
These are Flyvideo
|
||||
|
||||
VCR (http://www.vcrinc.com/)
|
||||
VCR (http://www.vcrinc.com/)
|
||||
---
|
||||
Video Catcher 16
|
||||
|
||||
@ -920,7 +920,7 @@ Sdisilk www.sdisilk.com/
|
||||
SDI Silk 200 SDI Input Card
|
||||
|
||||
www.euresys.com
|
||||
PICOLO series
|
||||
PICOLO series
|
||||
|
||||
PMC/Pace
|
||||
www.pacecom.co.uk website closed
|
||||
|
@ -34,4 +34,8 @@ MO_OUTPUT_FORMAT (0x310164)
|
||||
2: HACTEXT
|
||||
1: HSFMT
|
||||
|
||||
0x47 is the sync byte for MPEG-2 transport stream packets.
|
||||
Datasheet incorrectly states to use 47 decimal. 188 is the length.
|
||||
All DVB compliant frontends output packets with this start code.
|
||||
|
||||
=================================================================================
|
||||
|
@ -1240,7 +1240,7 @@ S: Maintained
|
||||
|
||||
IRDA SUBSYSTEM
|
||||
P: Jean Tourrilhes
|
||||
L: irda-users@lists.sourceforge.net
|
||||
L: irda-users@lists.sourceforge.net (subscribers-only)
|
||||
W: http://irda.sourceforge.net/
|
||||
S: Maintained
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION =-rc2
|
||||
EXTRAVERSION =-rc3
|
||||
NAME=Woozy Numbat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -746,6 +746,8 @@ source "drivers/char/Kconfig"
|
||||
|
||||
source "drivers/i2c/Kconfig"
|
||||
|
||||
source "drivers/hwmon/Kconfig"
|
||||
|
||||
#source "drivers/l3/Kconfig"
|
||||
|
||||
source "drivers/misc/Kconfig"
|
||||
|
@ -60,7 +60,7 @@ void __init pcibios_fixup_irqs(void)
|
||||
}
|
||||
}
|
||||
|
||||
void __init pcibios_penalize_isa_irq(int irq)
|
||||
void __init pcibios_penalize_isa_irq(int irq, int active)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -181,6 +181,8 @@ source "drivers/serial/Kconfig"
|
||||
|
||||
source "drivers/i2c/Kconfig"
|
||||
|
||||
source "drivers/hwmon/Kconfig"
|
||||
|
||||
source "drivers/usb/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
@ -2,3 +2,7 @@ obj-$(CONFIG_ACPI_BOOT) := boot.o
|
||||
obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
|
||||
obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
|
||||
|
||||
ifneq ($(CONFIG_ACPI_PROCESSOR),)
|
||||
obj-y += cstate.o
|
||||
endif
|
||||
|
||||
|
103
arch/i386/kernel/acpi/cstate.c
Normal file
103
arch/i386/kernel/acpi/cstate.c
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* arch/i386/kernel/acpi/cstate.c
|
||||
*
|
||||
* Copyright (C) 2005 Intel Corporation
|
||||
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
* - Added _PDC for SMP C-states on Intel CPUs
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <acpi/processor.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
static void acpi_processor_power_init_intel_pdc(struct acpi_processor_power
|
||||
*pow)
|
||||
{
|
||||
struct acpi_object_list *obj_list;
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
|
||||
/* allocate and initialize pdc. It will be used later. */
|
||||
obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
|
||||
if (!obj_list) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
return;
|
||||
}
|
||||
|
||||
obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
if (!obj) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf = kmalloc(12, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj);
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
|
||||
|
||||
obj->type = ACPI_TYPE_BUFFER;
|
||||
obj->buffer.length = 12;
|
||||
obj->buffer.pointer = (u8 *) buf;
|
||||
obj_list->count = 1;
|
||||
obj_list->pointer = obj;
|
||||
pow->pdc = obj_list;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Initialize _PDC data based on the CPU vendor */
|
||||
void acpi_processor_power_init_pdc(struct acpi_processor_power *pow,
|
||||
unsigned int cpu)
|
||||
{
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
|
||||
pow->pdc = NULL;
|
||||
if (c->x86_vendor == X86_VENDOR_INTEL)
|
||||
acpi_processor_power_init_intel_pdc(pow);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(acpi_processor_power_init_pdc);
|
||||
|
||||
/*
|
||||
* Initialize bm_flags based on the CPU cache properties
|
||||
* On SMP it depends on cache configuration
|
||||
* - When cache is not shared among all CPUs, we flush cache
|
||||
* before entering C3.
|
||||
* - When cache is shared among all CPUs, we use bm_check
|
||||
* mechanism as in UP case
|
||||
*
|
||||
* This routine is called only after all the CPUs are online
|
||||
*/
|
||||
void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
|
||||
unsigned int cpu)
|
||||
{
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
|
||||
flags->bm_check = 0;
|
||||
if (num_online_cpus() == 1)
|
||||
flags->bm_check = 1;
|
||||
else if (c->x86_vendor == X86_VENDOR_INTEL) {
|
||||
/*
|
||||
* Today all CPUs that support C3 share cache.
|
||||
* TBD: This needs to look at cache shared map, once
|
||||
* multi-core detection patch makes to the base.
|
||||
*/
|
||||
flags->bm_check = 1;
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(acpi_processor_power_init_bm_check);
|
@ -74,8 +74,9 @@ wakeup_code:
|
||||
movw %ax,%fs
|
||||
movw $0x0e00 + 'i', %fs:(0x12)
|
||||
|
||||
# need a gdt
|
||||
lgdt real_save_gdt - wakeup_code
|
||||
# need a gdt -- use lgdtl to force 32-bit operands, in case
|
||||
# the GDT is located past 16 megabytes.
|
||||
lgdtl real_save_gdt - wakeup_code
|
||||
|
||||
movl real_save_cr0 - wakeup_code, %eax
|
||||
movl %eax, %cr0
|
||||
|
@ -375,7 +375,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
|
||||
arg0.buffer.pointer = (u8 *) arg0_buf;
|
||||
arg0_buf[0] = ACPI_PDC_REVISION_ID;
|
||||
arg0_buf[1] = 1;
|
||||
arg0_buf[2] = ACPI_PDC_EST_CAPABILITY_SMP | ACPI_PDC_EST_CAPABILITY_MSR;
|
||||
arg0_buf[2] = ACPI_PDC_EST_CAPABILITY_SMP_MSR;
|
||||
|
||||
p.pdc = &arg_list;
|
||||
|
||||
|
@ -291,3 +291,6 @@ ENTRY(sys_call_table)
|
||||
.long sys_keyctl
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get /* 290 */
|
||||
.long sys_inotify_init
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch
|
||||
|
@ -1051,24 +1051,28 @@ static int __init pcibios_irq_init(void)
|
||||
subsys_initcall(pcibios_irq_init);
|
||||
|
||||
|
||||
static void pirq_penalize_isa_irq(int irq)
|
||||
static void pirq_penalize_isa_irq(int irq, int active)
|
||||
{
|
||||
/*
|
||||
* If any ISAPnP device reports an IRQ in its list of possible
|
||||
* IRQ's, we try to avoid assigning it to PCI devices.
|
||||
*/
|
||||
if (irq < 16)
|
||||
pirq_penalty[irq] += 100;
|
||||
if (irq < 16) {
|
||||
if (active)
|
||||
pirq_penalty[irq] += 1000;
|
||||
else
|
||||
pirq_penalty[irq] += 100;
|
||||
}
|
||||
}
|
||||
|
||||
void pcibios_penalize_isa_irq(int irq)
|
||||
void pcibios_penalize_isa_irq(int irq, int active)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_PCI
|
||||
if (!acpi_noirq)
|
||||
acpi_penalize_isa_irq(irq);
|
||||
acpi_penalize_isa_irq(irq, active);
|
||||
else
|
||||
#endif
|
||||
pirq_penalize_isa_irq(irq);
|
||||
pirq_penalize_isa_irq(irq, active);
|
||||
}
|
||||
|
||||
static int pirq_enable_irq(struct pci_dev *dev)
|
||||
|
@ -21,7 +21,7 @@ static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
|
||||
|
||||
int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq;
|
||||
|
||||
void __init pcibios_penalize_isa_irq(int irq) {}
|
||||
void __init pcibios_penalize_isa_irq(int irq, int active) {}
|
||||
|
||||
|
||||
unsigned int pci_bus0, pci_bus1;
|
||||
|
@ -11,6 +11,7 @@
|
||||
* Copyright (C) 2001 Jenna Hall <jenna.s.hall@intel.com>
|
||||
* Copyright (C) 2001 Takayoshi Kochi <t-kochi@bq.jp.nec.com>
|
||||
* Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
|
||||
* Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com>
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
@ -67,6 +68,11 @@ EXPORT_SYMBOL(pm_power_off);
|
||||
unsigned char acpi_kbd_controller_present = 1;
|
||||
unsigned char acpi_legacy_devices;
|
||||
|
||||
static unsigned int __initdata acpi_madt_rev;
|
||||
|
||||
unsigned int acpi_cpei_override;
|
||||
unsigned int acpi_cpei_phys_cpuid;
|
||||
|
||||
#define MAX_SAPICS 256
|
||||
u16 ia64_acpiid_to_sapicid[MAX_SAPICS] =
|
||||
{ [0 ... MAX_SAPICS - 1] = -1 };
|
||||
@ -265,10 +271,56 @@ acpi_parse_plat_int_src (
|
||||
(plintsrc->flags.trigger == 1) ? IOSAPIC_EDGE : IOSAPIC_LEVEL);
|
||||
|
||||
platform_intr_list[plintsrc->type] = vector;
|
||||
if (acpi_madt_rev > 1) {
|
||||
acpi_cpei_override = plintsrc->plint_flags.cpei_override_flag;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the physical id, so we can check when its being removed
|
||||
*/
|
||||
acpi_cpei_phys_cpuid = ((plintsrc->id << 8) | (plintsrc->eid)) & 0xffff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
unsigned int can_cpei_retarget(void)
|
||||
{
|
||||
extern int cpe_vector;
|
||||
|
||||
/*
|
||||
* Only if CPEI is supported and the override flag
|
||||
* is present, otherwise return that its re-targettable
|
||||
* if we are in polling mode.
|
||||
*/
|
||||
if (cpe_vector > 0 && !acpi_cpei_override)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned int is_cpu_cpei_target(unsigned int cpu)
|
||||
{
|
||||
unsigned int logical_id;
|
||||
|
||||
logical_id = cpu_logical_id(acpi_cpei_phys_cpuid);
|
||||
|
||||
if (logical_id == cpu)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void set_cpei_target_cpu(unsigned int cpu)
|
||||
{
|
||||
acpi_cpei_phys_cpuid = cpu_physical_id(cpu);
|
||||
}
|
||||
|
||||
unsigned int get_cpei_target_cpu(void)
|
||||
{
|
||||
return acpi_cpei_phys_cpuid;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_int_src_ovr (
|
||||
acpi_table_entry_header *header, const unsigned long end)
|
||||
@ -326,6 +378,8 @@ acpi_parse_madt (unsigned long phys_addr, unsigned long size)
|
||||
|
||||
acpi_madt = (struct acpi_table_madt *) __va(phys_addr);
|
||||
|
||||
acpi_madt_rev = acpi_madt->header.revision;
|
||||
|
||||
/* remember the value for reference after free_initmem() */
|
||||
#ifdef CONFIG_ITANIUM
|
||||
has_8259 = 1; /* Firmware on old Itanium systems is broken */
|
||||
|
@ -271,7 +271,7 @@ ia64_mca_log_sal_error_record(int sal_info_type)
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
static int cpe_vector = -1;
|
||||
int cpe_vector = -1;
|
||||
|
||||
static irqreturn_t
|
||||
ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
|
||||
|
@ -196,6 +196,7 @@ update_pal_halt_status(int status)
|
||||
void
|
||||
default_idle (void)
|
||||
{
|
||||
local_irq_enable();
|
||||
while (!need_resched())
|
||||
if (can_do_pal_halt)
|
||||
safe_halt();
|
||||
|
@ -40,6 +40,8 @@
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/platform.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
#include <asm/ia32.h>
|
||||
#include <asm/machvec.h>
|
||||
@ -783,6 +785,7 @@ cpu_init (void)
|
||||
/* size of physical stacked register partition plus 8 bytes: */
|
||||
__get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8;
|
||||
platform_cpu_init();
|
||||
pm_idle = default_idle;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -36,6 +36,13 @@ int arch_register_cpu(int num)
|
||||
parent = &sysfs_nodes[cpu_to_node(num)];
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
/*
|
||||
* If CPEI cannot be re-targetted, and this is
|
||||
* CPEI target, then dont create the control file
|
||||
*/
|
||||
if (!can_cpei_retarget() && is_cpu_cpei_target(num))
|
||||
sysfs_cpus[num].cpu.no_control = 1;
|
||||
|
||||
return register_cpu(&sysfs_cpus[num].cpu, num, parent);
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,12 @@ typedef NORET_TYPE void (*relocate_new_kernel_t)(
|
||||
const extern unsigned char relocate_new_kernel[];
|
||||
const extern unsigned int relocate_new_kernel_size;
|
||||
|
||||
/*
|
||||
* Provide a dummy crash_notes definition while crash dump arrives to ppc.
|
||||
* This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
|
||||
*/
|
||||
void *crash_notes = NULL;
|
||||
|
||||
void machine_shutdown(void)
|
||||
{
|
||||
if (ppc_md.machine_shutdown)
|
||||
|
@ -649,6 +649,8 @@ source "drivers/input/Kconfig"
|
||||
|
||||
source "drivers/i2c/Kconfig"
|
||||
|
||||
source "drivers/hwmon/Kconfig"
|
||||
|
||||
source "fs/Kconfig"
|
||||
|
||||
source "drivers/media/Kconfig"
|
||||
|
@ -140,7 +140,8 @@ endef
|
||||
#When cleaning we don't include .config, so we don't include
|
||||
#TT or skas makefiles and don't clean skas_ptregs.h.
|
||||
CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/include/uml-config.h \
|
||||
$(GEN_HEADERS) $(ARCH_DIR)/include/skas_ptregs.h
|
||||
$(GEN_HEADERS) $(ARCH_DIR)/include/skas_ptregs.h \
|
||||
$(ARCH_DIR)/include/user_constants.h
|
||||
|
||||
MRPROPER_FILES += $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) \
|
||||
$(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) $(ARCH_DIR)/os \
|
||||
|
@ -62,8 +62,8 @@ SECTIONS
|
||||
}
|
||||
|
||||
#define VSYSCALL_ADDR (-10*1024*1024)
|
||||
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.cacheline_aligned) + SIZEOF(.data.cacheline_aligned) + 4095) & ~(4095))
|
||||
#define VSYSCALL_VIRT_ADDR ((ADDR(.data.cacheline_aligned) + SIZEOF(.data.cacheline_aligned) + 4095) & ~(4095))
|
||||
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.read_mostly) + SIZEOF(.data.read_mostly) + 4095) & ~(4095))
|
||||
#define VSYSCALL_VIRT_ADDR ((ADDR(.data.read_mostly) + SIZEOF(.data.read_mostly) + 4095) & ~(4095))
|
||||
|
||||
#define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR)
|
||||
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <asm/processor.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
@ -69,8 +69,8 @@ int sys_pipe(int __user *userfds)
|
||||
/*
|
||||
* Common code for old and new mmaps.
|
||||
*/
|
||||
long sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, unsigned long pgoff)
|
||||
long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
@ -42,7 +42,7 @@ SYSCALL(sys_mknod, 3)
|
||||
SYSCALL(sys_chmod, 2) /* 15 */
|
||||
SYSCALL(sys_lchown, 3)
|
||||
SYSCALL(sys_ni_syscall, 0)
|
||||
SYSCALL(sys_stat, 2)
|
||||
SYSCALL(sys_newstat, 2)
|
||||
SYSCALL(sys_lseek, 3)
|
||||
SYSCALL(sys_getpid, 0) /* 20 */
|
||||
SYSCALL(sys_mount, 5)
|
||||
@ -52,7 +52,7 @@ SYSCALL(sys_getuid, 0)
|
||||
SYSCALL(sys_ni_syscall, 1) /* 25 */
|
||||
SYSCALL(sys_ptrace, 4)
|
||||
SYSCALL(sys_ni_syscall, 1)
|
||||
SYSCALL(sys_fstat, 2)
|
||||
SYSCALL(sys_newfstat, 2)
|
||||
SYSCALL(sys_ni_syscall, 0)
|
||||
SYSCALL(sys_utime, 2) /* 30 */
|
||||
SYSCALL(sys_ni_syscall, 0)
|
||||
@ -108,7 +108,7 @@ SYSCALL(sys_getgroups, 2) /* 80 */
|
||||
SYSCALL(sys_setgroups, 2)
|
||||
SYSCALL(sys_ni_syscall, 0)
|
||||
SYSCALL(sys_symlink, 2)
|
||||
SYSCALL(sys_lstat, 2)
|
||||
SYSCALL(sys_newlstat, 2)
|
||||
SYSCALL(sys_readlink, 3) /* 85 */
|
||||
SYSCALL(sys_uselib, 1)
|
||||
SYSCALL(sys_swapon, 2)
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/timex.h>
|
||||
@ -488,8 +489,7 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
|
||||
if (panic_on_oops) {
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule_timeout(5 * HZ);
|
||||
ssleep(5);
|
||||
panic("Fatal exception");
|
||||
}
|
||||
do_exit(err);
|
||||
|
@ -90,10 +90,10 @@ SECTIONS
|
||||
*(.literal .text)
|
||||
*(.srom.text)
|
||||
VMLINUX_SYMBOL(__sched_text_start) = .;
|
||||
*(.sched.text.literal .sched.text)
|
||||
*(.sched.literal .sched.text)
|
||||
VMLINUX_SYMBOL(__sched_text_end) = .;
|
||||
VMLINUX_SYMBOL(__lock_text_start) = .;
|
||||
*(.spinlock.text.literal .spinlock.text)
|
||||
*(.spinlock.literal .spinlock.text)
|
||||
VMLINUX_SYMBOL(__lock_text_end) = .;
|
||||
|
||||
}
|
||||
@ -164,7 +164,7 @@ SECTIONS
|
||||
__init_begin = .;
|
||||
.init.text : {
|
||||
_sinittext = .;
|
||||
*(.init.text.literal) *(.init.text)
|
||||
*(.init.literal) *(.init.text)
|
||||
_einittext = .;
|
||||
}
|
||||
|
||||
|
@ -44,6 +44,8 @@ source "drivers/i2c/Kconfig"
|
||||
|
||||
source "drivers/w1/Kconfig"
|
||||
|
||||
source "drivers/hwmon/Kconfig"
|
||||
|
||||
source "drivers/misc/Kconfig"
|
||||
|
||||
source "drivers/media/Kconfig"
|
||||
|
@ -52,6 +52,7 @@ obj-$(CONFIG_INPUT) += input/
|
||||
obj-$(CONFIG_I2O) += message/
|
||||
obj-$(CONFIG_I2C) += i2c/
|
||||
obj-$(CONFIG_W1) += w1/
|
||||
obj-$(CONFIG_HWMON) += hwmon/
|
||||
obj-$(CONFIG_PHONE) += telephony/
|
||||
obj-$(CONFIG_MD) += md/
|
||||
obj-$(CONFIG_BT) += bluetooth/
|
||||
|
@ -3,6 +3,7 @@
|
||||
#
|
||||
|
||||
menu "ACPI (Advanced Configuration and Power Interface) Support"
|
||||
depends on PM
|
||||
depends on !X86_VISWS
|
||||
depends on !IA64_HP_SIM
|
||||
depends on IA64 || X86
|
||||
@ -48,7 +49,6 @@ config ACPI_BOOT
|
||||
|
||||
config ACPI_INTERPRETER
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
|
||||
if ACPI_INTERPRETER
|
||||
@ -79,6 +79,14 @@ config ACPI_SLEEP_PROC_FS
|
||||
depends on ACPI_SLEEP && PROC_FS
|
||||
default y
|
||||
|
||||
config ACPI_SLEEP_PROC_SLEEP
|
||||
bool "/proc/acpi/sleep (deprecated)"
|
||||
depends on ACPI_SLEEP_PROC_FS
|
||||
default n
|
||||
---help---
|
||||
Create /proc/acpi/sleep
|
||||
Deprecated by /sys/power/state
|
||||
|
||||
config ACPI_AC
|
||||
tristate "AC Adapter"
|
||||
depends on X86
|
||||
@ -99,7 +107,6 @@ config ACPI_BATTERY
|
||||
|
||||
config ACPI_BUTTON
|
||||
tristate "Button"
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver registers for events based on buttons, such as the
|
||||
@ -111,7 +118,6 @@ config ACPI_BUTTON
|
||||
config ACPI_VIDEO
|
||||
tristate "Video"
|
||||
depends on EXPERIMENTAL
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver implement the ACPI Extensions For Display Adapters
|
||||
@ -122,9 +128,17 @@ config ACPI_VIDEO
|
||||
Note that this is an ref. implementation only. It may or may not work
|
||||
for your integrated video device.
|
||||
|
||||
config ACPI_HOTKEY
|
||||
tristate "Generic Hotkey"
|
||||
depends on ACPI_INTERPRETER
|
||||
depends on EXPERIMENTAL
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
ACPI generic hotkey
|
||||
|
||||
config ACPI_FAN
|
||||
tristate "Fan"
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver adds support for ACPI fan devices, allowing user-mode
|
||||
@ -132,7 +146,6 @@ config ACPI_FAN
|
||||
|
||||
config ACPI_PROCESSOR
|
||||
tristate "Processor"
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver installs ACPI as the idle handler for Linux, and uses
|
||||
@ -142,7 +155,6 @@ config ACPI_PROCESSOR
|
||||
config ACPI_HOTPLUG_CPU
|
||||
bool "Processor Hotplug (EXPERIMENTAL)"
|
||||
depends on ACPI_PROCESSOR && HOTPLUG_CPU && EXPERIMENTAL
|
||||
depends on !IA64_SGI_SN
|
||||
select ACPI_CONTAINER
|
||||
default n
|
||||
---help---
|
||||
@ -262,7 +274,6 @@ config ACPI_BLACKLIST_YEAR
|
||||
|
||||
config ACPI_DEBUG
|
||||
bool "Debug Statements"
|
||||
depends on !IA64_SGI_SN
|
||||
default n
|
||||
help
|
||||
The ACPI driver can optionally report errors with a great deal
|
||||
@ -271,7 +282,6 @@ config ACPI_DEBUG
|
||||
|
||||
config ACPI_BUS
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
|
||||
config ACPI_EC
|
||||
@ -285,17 +295,14 @@ config ACPI_EC
|
||||
|
||||
config ACPI_POWER
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
|
||||
config ACPI_PCI
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default PCI
|
||||
|
||||
config ACPI_SYSTEM
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
help
|
||||
This driver will enable your system to shut down using ACPI, and
|
||||
@ -327,8 +334,13 @@ config ACPI_CONTAINER
|
||||
depends on EXPERIMENTAL
|
||||
default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU || ACPI_HOTPLUG_IO)
|
||||
---help---
|
||||
This is the ACPI generic container driver which supports
|
||||
ACPI0004, PNP0A05 and PNP0A06 devices
|
||||
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.
|
||||
|
||||
If one selects "m", this driver can be loaded with
|
||||
"modprobe acpi_container".
|
||||
|
||||
config ACPI_HOTPLUG_MEMORY
|
||||
tristate "Memory Hotplug"
|
||||
|
@ -36,13 +36,14 @@ processor-objs += processor_perflib.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_ACPI_BUS) += sleep/
|
||||
obj-$(CONFIG_ACPI_BUS) += bus.o
|
||||
obj-$(CONFIG_ACPI_BUS) += bus.o glue.o
|
||||
obj-$(CONFIG_ACPI_AC) += ac.o
|
||||
obj-$(CONFIG_ACPI_BATTERY) += battery.o
|
||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||
obj-$(CONFIG_ACPI_EC) += ec.o
|
||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
obj-$(CONFIG_ACPI_HOTKEY) += hotkey.o
|
||||
obj-$(CONFIG_ACPI_PCI) += pci_root.o pci_link.o pci_irq.o pci_bind.o
|
||||
obj-$(CONFIG_ACPI_POWER) += power.o
|
||||
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
|
||||
|
@ -1204,6 +1204,10 @@ static int __init asus_acpi_init(void)
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
if (!acpi_specific_hotkey_enabled){
|
||||
printk(KERN_ERR "Using generic hotkey driver\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir);
|
||||
if (!asus_proc_dir) {
|
||||
printk(KERN_ERR "Asus ACPI: Unable to create /proc entry\n");
|
||||
|
@ -212,6 +212,12 @@ acpi_bus_set_power (
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device is not power manageable\n"));
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
/*
|
||||
* Get device's current power state if it's unknown
|
||||
* This means device power state isn't initialized or previous setting failed
|
||||
*/
|
||||
if (device->power.state == ACPI_STATE_UNKNOWN)
|
||||
acpi_bus_get_power(device->handle, &device->power.state);
|
||||
if (state == device->power.state) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", state));
|
||||
return_VALUE(0);
|
||||
@ -231,7 +237,7 @@ acpi_bus_set_power (
|
||||
* On transitions to a high-powered state we first apply power (via
|
||||
* power resources) then evalute _PSx. Conversly for transitions to
|
||||
* a lower-powered state.
|
||||
*/
|
||||
*/
|
||||
if (state < device->power.state) {
|
||||
if (device->power.flags.power_resources) {
|
||||
result = acpi_power_transition(device, state);
|
||||
|
@ -26,9 +26,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
@ -36,9 +33,6 @@
|
||||
#define ACPI_BUTTON_COMPONENT 0x00080000
|
||||
#define ACPI_BUTTON_DRIVER_NAME "ACPI Button Driver"
|
||||
#define ACPI_BUTTON_CLASS "button"
|
||||
#define ACPI_BUTTON_FILE_INFO "info"
|
||||
#define ACPI_BUTTON_FILE_STATE "state"
|
||||
#define ACPI_BUTTON_TYPE_UNKNOWN 0x00
|
||||
#define ACPI_BUTTON_NOTIFY_STATUS 0x80
|
||||
|
||||
#define ACPI_BUTTON_SUBCLASS_POWER "power"
|
||||
@ -70,8 +64,6 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static int acpi_button_add (struct acpi_device *device);
|
||||
static int acpi_button_remove (struct acpi_device *device, int type);
|
||||
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);
|
||||
|
||||
static struct acpi_driver acpi_button_driver = {
|
||||
.name = ACPI_BUTTON_DRIVER_NAME,
|
||||
@ -90,187 +82,6 @@ struct acpi_button {
|
||||
unsigned long pushed;
|
||||
};
|
||||
|
||||
static struct file_operations acpi_button_info_fops = {
|
||||
.open = acpi_button_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static struct file_operations acpi_button_state_fops = {
|
||||
.open = acpi_button_state_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static struct proc_dir_entry *acpi_button_dir;
|
||||
|
||||
static int acpi_button_info_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_button *button = (struct acpi_button *) seq->private;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_info_seq_show");
|
||||
|
||||
if (!button || !button->device)
|
||||
return_VALUE(0);
|
||||
|
||||
seq_printf(seq, "type: %s\n",
|
||||
acpi_device_name(button->device));
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int acpi_button_info_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_button_info_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_button *button = (struct acpi_button *) seq->private;
|
||||
acpi_status status;
|
||||
unsigned long state;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_state_seq_show");
|
||||
|
||||
if (!button || !button->device)
|
||||
return_VALUE(0);
|
||||
|
||||
status = acpi_evaluate_integer(button->handle,"_LID",NULL,&state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
seq_printf(seq, "state: unsupported\n");
|
||||
}
|
||||
else{
|
||||
seq_printf(seq, "state: %s\n", (state ? "open" : "closed"));
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int acpi_button_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_button_state_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_button_add_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
struct acpi_button *button = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_add_fs");
|
||||
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
button = acpi_driver_data(device);
|
||||
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWER:
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
entry = proc_mkdir(ACPI_BUTTON_SUBCLASS_POWER,
|
||||
acpi_button_dir);
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_SLEEP:
|
||||
case ACPI_BUTTON_TYPE_SLEEPF:
|
||||
entry = proc_mkdir(ACPI_BUTTON_SUBCLASS_SLEEP,
|
||||
acpi_button_dir);
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_LID:
|
||||
entry = proc_mkdir(ACPI_BUTTON_SUBCLASS_LID,
|
||||
acpi_button_dir);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!entry)
|
||||
return_VALUE(-ENODEV);
|
||||
entry->owner = THIS_MODULE;
|
||||
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), entry);
|
||||
if (!acpi_device_dir(device))
|
||||
return_VALUE(-ENODEV);
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = create_proc_entry(ACPI_BUTTON_FILE_INFO,
|
||||
S_IRUGO, acpi_device_dir(device));
|
||||
if (!entry)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Unable to create '%s' fs entry\n",
|
||||
ACPI_BUTTON_FILE_INFO));
|
||||
else {
|
||||
entry->proc_fops = &acpi_button_info_fops;
|
||||
entry->data = acpi_driver_data(device);
|
||||
entry->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* show lid state [R] */
|
||||
if (button->type == ACPI_BUTTON_TYPE_LID) {
|
||||
entry = create_proc_entry(ACPI_BUTTON_FILE_STATE,
|
||||
S_IRUGO, acpi_device_dir(device));
|
||||
if (!entry)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Unable to create '%s' fs entry\n",
|
||||
ACPI_BUTTON_FILE_INFO));
|
||||
else {
|
||||
entry->proc_fops = &acpi_button_state_fops;
|
||||
entry->data = acpi_driver_data(device);
|
||||
entry->owner = THIS_MODULE;
|
||||
}
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_button_remove_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
struct acpi_button *button = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_remove_fs");
|
||||
|
||||
button = acpi_driver_data(device);
|
||||
if (acpi_device_dir(device)) {
|
||||
if (button->type == ACPI_BUTTON_TYPE_LID)
|
||||
remove_proc_entry(ACPI_BUTTON_FILE_STATE,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(ACPI_BUTTON_FILE_INFO,
|
||||
acpi_device_dir(device));
|
||||
|
||||
remove_proc_entry(acpi_device_bid(device),
|
||||
acpi_device_dir(device)->parent);
|
||||
|
||||
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWER:
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
remove_proc_entry(ACPI_BUTTON_SUBCLASS_POWER,
|
||||
acpi_button_dir);
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_SLEEP:
|
||||
case ACPI_BUTTON_TYPE_SLEEPF:
|
||||
remove_proc_entry(ACPI_BUTTON_SUBCLASS_SLEEP,
|
||||
acpi_button_dir);
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_LID:
|
||||
remove_proc_entry(ACPI_BUTTON_SUBCLASS_LID,
|
||||
acpi_button_dir);
|
||||
break;
|
||||
}
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -310,8 +121,7 @@ acpi_button_notify_fixed (
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_notify_fixed");
|
||||
|
||||
if (!button)
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
BUG_ON(!button);
|
||||
|
||||
acpi_button_notify(button->handle, ACPI_BUTTON_NOTIFY_STATUS, button);
|
||||
|
||||
@ -327,10 +137,6 @@ acpi_button_add (
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_button *button = NULL;
|
||||
|
||||
static struct acpi_device *power_button;
|
||||
static struct acpi_device *sleep_button;
|
||||
static struct acpi_device *lid_button;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_add");
|
||||
|
||||
if (!device)
|
||||
@ -391,42 +197,6 @@ acpi_button_add (
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure only one button of each type is used.
|
||||
*/
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWER:
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
if (!power_button)
|
||||
power_button = device;
|
||||
else {
|
||||
kfree(button);
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_SLEEP:
|
||||
case ACPI_BUTTON_TYPE_SLEEPF:
|
||||
if (!sleep_button)
|
||||
sleep_button = device;
|
||||
else {
|
||||
kfree(button);
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_LID:
|
||||
if (!lid_button)
|
||||
lid_button = device;
|
||||
else {
|
||||
kfree(button);
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
result = acpi_button_add_fs(device);
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
status = acpi_install_fixed_event_handler (
|
||||
@ -470,7 +240,6 @@ acpi_button_add (
|
||||
|
||||
end:
|
||||
if (result) {
|
||||
acpi_button_remove_fs(device);
|
||||
kfree(button);
|
||||
}
|
||||
|
||||
@ -511,8 +280,6 @@ acpi_button_remove (struct acpi_device *device, int type)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Error removing notify handler\n"));
|
||||
|
||||
acpi_button_remove_fs(device);
|
||||
|
||||
kfree(button);
|
||||
|
||||
return_VALUE(0);
|
||||
@ -526,21 +293,14 @@ acpi_button_init (void)
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_init");
|
||||
|
||||
acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
if (!acpi_button_dir)
|
||||
return_VALUE(-ENODEV);
|
||||
acpi_button_dir->owner = THIS_MODULE;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_button_driver);
|
||||
if (result < 0) {
|
||||
remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static void __exit
|
||||
acpi_button_exit (void)
|
||||
{
|
||||
@ -548,11 +308,8 @@ acpi_button_exit (void)
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_button_driver);
|
||||
|
||||
remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
||||
module_init(acpi_button_init);
|
||||
module_exit(acpi_button_exit);
|
||||
|
@ -53,13 +53,20 @@
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dsfield")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ds_get_field_names (
|
||||
struct acpi_create_field_info *info,
|
||||
struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *arg);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_create_buffer_field
|
||||
*
|
||||
* PARAMETERS: Opcode - The opcode to be executed
|
||||
* Operands - List of operands for the opcode
|
||||
* PARAMETERS: Op - Current parse op (create_xXField)
|
||||
* walk_state - Current state
|
||||
*
|
||||
* RETURN: Status
|
||||
@ -70,7 +77,7 @@
|
||||
* create_word_field_op,
|
||||
* create_dword_field_op,
|
||||
* create_qword_field_op,
|
||||
* create_field_op (all of which define fields in buffers)
|
||||
* create_field_op (all of which define a field in a buffer)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -119,7 +126,8 @@ acpi_ds_create_buffer_field (
|
||||
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;
|
||||
}
|
||||
else {
|
||||
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND;
|
||||
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
|
||||
ACPI_NS_ERROR_IF_FOUND;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -134,16 +142,16 @@ acpi_ds_create_buffer_field (
|
||||
}
|
||||
}
|
||||
|
||||
/* We could put the returned object (Node) on the object stack for later, but
|
||||
* for now, we will put it in the "op" object that the parser uses, so we
|
||||
* can get it again at the end of this scope
|
||||
/* We could put the returned object (Node) on the object stack for later,
|
||||
* but for now, we will put it in the "op" object that the parser uses,
|
||||
* so we can get it again at the end of this scope
|
||||
*/
|
||||
op->common.node = node;
|
||||
|
||||
/*
|
||||
* If there is no object attached to the node, this node was just created and
|
||||
* we need to create the field object. Otherwise, this was a lookup of an
|
||||
* existing node and we don't want to create the field object again.
|
||||
* If there is no object attached to the node, this node was just created
|
||||
* and we need to create the field object. Otherwise, this was a lookup
|
||||
* of an existing node and we don't want to create the field object again.
|
||||
*/
|
||||
obj_desc = acpi_ns_get_attached_object (node);
|
||||
if (obj_desc) {
|
||||
@ -205,7 +213,7 @@ cleanup:
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ds_get_field_names (
|
||||
struct acpi_create_field_info *info,
|
||||
struct acpi_walk_state *walk_state,
|
||||
@ -238,7 +246,8 @@ acpi_ds_get_field_names (
|
||||
+ (acpi_integer) arg->common.value.size;
|
||||
|
||||
if (position > ACPI_UINT32_MAX) {
|
||||
ACPI_REPORT_ERROR (("Bit offset within field too large (> 0xFFFFFFFF)\n"));
|
||||
ACPI_REPORT_ERROR ((
|
||||
"Bit offset within field too large (> 0xFFFFFFFF)\n"));
|
||||
return_ACPI_STATUS (AE_SUPPORT);
|
||||
}
|
||||
|
||||
@ -250,12 +259,15 @@ acpi_ds_get_field_names (
|
||||
|
||||
/*
|
||||
* Get a new access_type and access_attribute -- to be used for all
|
||||
* field units that follow, until field end or another access_as keyword.
|
||||
* field units that follow, until field end or another access_as
|
||||
* keyword.
|
||||
*
|
||||
* In field_flags, preserve the flag bits other than the ACCESS_TYPE bits
|
||||
* In field_flags, preserve the flag bits other than the
|
||||
* ACCESS_TYPE bits
|
||||
*/
|
||||
info->field_flags = (u8) ((info->field_flags & ~(AML_FIELD_ACCESS_TYPE_MASK)) |
|
||||
((u8) ((u32) arg->common.value.integer >> 8)));
|
||||
info->field_flags = (u8)
|
||||
((info->field_flags & ~(AML_FIELD_ACCESS_TYPE_MASK)) |
|
||||
((u8) ((u32) arg->common.value.integer >> 8)));
|
||||
|
||||
info->attribute = (u8) (arg->common.value.integer);
|
||||
break;
|
||||
@ -267,7 +279,8 @@ acpi_ds_get_field_names (
|
||||
|
||||
status = acpi_ns_lookup (walk_state->scope_info,
|
||||
(char *) &arg->named.name,
|
||||
info->field_type, ACPI_IMODE_EXECUTE, ACPI_NS_DONT_OPEN_SCOPE,
|
||||
info->field_type, ACPI_IMODE_EXECUTE,
|
||||
ACPI_NS_DONT_OPEN_SCOPE,
|
||||
walk_state, &info->field_node);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_REPORT_NSERROR ((char *) &arg->named.name, status);
|
||||
@ -295,8 +308,9 @@ acpi_ds_get_field_names (
|
||||
+ (acpi_integer) arg->common.value.size;
|
||||
|
||||
if (position > ACPI_UINT32_MAX) {
|
||||
ACPI_REPORT_ERROR (("Field [%4.4s] bit offset too large (> 0xFFFFFFFF)\n",
|
||||
(char *) &info->field_node->name));
|
||||
ACPI_REPORT_ERROR ((
|
||||
"Field [%4.4s] bit offset too large (> 0xFFFFFFFF)\n",
|
||||
(char *) &info->field_node->name));
|
||||
return_ACPI_STATUS (AE_SUPPORT);
|
||||
}
|
||||
|
||||
@ -306,7 +320,8 @@ acpi_ds_get_field_names (
|
||||
|
||||
default:
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid opcode in field list: %X\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Invalid opcode in field list: %X\n",
|
||||
arg->common.aml_opcode));
|
||||
return_ACPI_STATUS (AE_AML_BAD_OPCODE);
|
||||
}
|
||||
@ -435,7 +450,8 @@ acpi_ds_init_field_objects (
|
||||
status = acpi_ns_lookup (walk_state->scope_info,
|
||||
(char *) &arg->named.name,
|
||||
type, ACPI_IMODE_LOAD_PASS1,
|
||||
ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND,
|
||||
ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
|
||||
ACPI_NS_ERROR_IF_FOUND,
|
||||
walk_state, &node);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_REPORT_NSERROR ((char *) &arg->named.name, status);
|
||||
|
@ -49,12 +49,21 @@
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dsinit")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ds_init_one_object (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
void *context,
|
||||
void **return_value);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_init_one_object
|
||||
*
|
||||
* PARAMETERS: obj_handle - Node
|
||||
* PARAMETERS: obj_handle - Node for the object
|
||||
* Level - Current nesting level
|
||||
* Context - Points to a init info struct
|
||||
* return_value - Not used
|
||||
@ -70,7 +79,7 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ds_init_one_object (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
@ -105,7 +114,8 @@ acpi_ds_init_one_object (
|
||||
|
||||
status = acpi_ds_initialize_region (obj_handle);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region %p [%4.4s] - Init failure, %s\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Region %p [%4.4s] - Init failure, %s\n",
|
||||
obj_handle, acpi_ut_get_node_name (obj_handle),
|
||||
acpi_format_exception (status)));
|
||||
}
|
||||
@ -118,8 +128,10 @@ acpi_ds_init_one_object (
|
||||
|
||||
info->method_count++;
|
||||
|
||||
/* Print a dot for each method unless we are going to print the entire pathname */
|
||||
|
||||
/*
|
||||
* Print a dot for each method unless we are going to print
|
||||
* the entire pathname
|
||||
*/
|
||||
if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
|
||||
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
|
||||
}
|
||||
@ -140,7 +152,8 @@ acpi_ds_init_one_object (
|
||||
*/
|
||||
status = acpi_ds_parse_method (obj_handle);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] - parse failure, %s\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Method %p [%4.4s] - parse failure, %s\n",
|
||||
obj_handle, acpi_ut_get_node_name (obj_handle),
|
||||
acpi_format_exception (status)));
|
||||
|
||||
@ -154,7 +167,8 @@ acpi_ds_init_one_object (
|
||||
* for every execution since there isn't much overhead
|
||||
*/
|
||||
acpi_ns_delete_namespace_subtree (obj_handle);
|
||||
acpi_ns_delete_namespace_by_owner (((struct acpi_namespace_node *) obj_handle)->object->method.owning_id);
|
||||
acpi_ns_delete_namespace_by_owner (
|
||||
((struct acpi_namespace_node *) obj_handle)->object->method.owning_id);
|
||||
break;
|
||||
|
||||
|
||||
|
@ -153,12 +153,11 @@ acpi_ds_parse_method (
|
||||
/*
|
||||
* Parse the method, first pass
|
||||
*
|
||||
* The first pass load is where newly declared named objects are
|
||||
* added into the namespace. Actual evaluation of
|
||||
* the named objects (what would be called a "second
|
||||
* pass") happens during the actual execution of the
|
||||
* method so that operands to the named objects can
|
||||
* take on dynamic run-time values.
|
||||
* The first pass load is where newly declared named objects are added into
|
||||
* the namespace. Actual evaluation of the named objects (what would be
|
||||
* called a "second pass") happens during the actual execution of the
|
||||
* method so that operands to the named objects can take on dynamic
|
||||
* run-time values.
|
||||
*/
|
||||
status = acpi_ps_parse_aml (walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
|
@ -52,6 +52,29 @@
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dsmthdat")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static void
|
||||
acpi_ds_method_data_delete_value (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
static acpi_status
|
||||
acpi_ds_method_data_set_value (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
union acpi_operand_object *object,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
acpi_object_type
|
||||
acpi_ds_method_data_get_type (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state);
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -62,8 +85,8 @@
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Initialize the data structures that hold the method's arguments
|
||||
* and locals. The data struct is an array of NTEs for each.
|
||||
* This allows ref_of and de_ref_of to work properly for these
|
||||
* and locals. The data struct is an array of namespace nodes for
|
||||
* each - this allows ref_of and de_ref_of to work properly for these
|
||||
* special data types.
|
||||
*
|
||||
* NOTES: walk_state fields are initialized to zero by the
|
||||
@ -92,7 +115,8 @@ acpi_ds_method_data_init (
|
||||
walk_state->arguments[i].name.integer |= (i << 24);
|
||||
walk_state->arguments[i].descriptor = ACPI_DESC_TYPE_NAMED;
|
||||
walk_state->arguments[i].type = ACPI_TYPE_ANY;
|
||||
walk_state->arguments[i].flags = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
|
||||
walk_state->arguments[i].flags = ANOBJ_END_OF_PEER_LIST |
|
||||
ANOBJ_METHOD_ARG;
|
||||
}
|
||||
|
||||
/* Init the method locals */
|
||||
@ -104,7 +128,8 @@ acpi_ds_method_data_init (
|
||||
walk_state->local_variables[i].name.integer |= (i << 24);
|
||||
walk_state->local_variables[i].descriptor = ACPI_DESC_TYPE_NAMED;
|
||||
walk_state->local_variables[i].type = ACPI_TYPE_ANY;
|
||||
walk_state->local_variables[i].flags = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
|
||||
walk_state->local_variables[i].flags = ANOBJ_END_OF_PEER_LIST |
|
||||
ANOBJ_METHOD_LOCAL;
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
@ -198,15 +223,18 @@ acpi_ds_method_data_init_args (
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
/* Copy passed parameters into the new method stack frame */
|
||||
/* Copy passed parameters into the new method stack frame */
|
||||
|
||||
while ((index < ACPI_METHOD_NUM_ARGS) && (index < max_param_count) && params[index]) {
|
||||
while ((index < ACPI_METHOD_NUM_ARGS) &&
|
||||
(index < max_param_count) &&
|
||||
params[index]) {
|
||||
/*
|
||||
* A valid parameter.
|
||||
* Store the argument in the method/walk descriptor.
|
||||
* Do not copy the arg in order to implement call by reference
|
||||
*/
|
||||
status = acpi_ds_method_data_set_value (AML_ARG_OP, index, params[index], walk_state);
|
||||
status = acpi_ds_method_data_set_value (AML_ARG_OP, index,
|
||||
params[index], walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
@ -224,11 +252,13 @@ acpi_ds_method_data_init_args (
|
||||
* FUNCTION: acpi_ds_method_data_get_node
|
||||
*
|
||||
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
|
||||
* Index - which local_var or argument whose type
|
||||
* to get
|
||||
* Index - Which Local or Arg whose type to get
|
||||
* walk_state - Current walk state object
|
||||
* Node - Where the node is returned.
|
||||
*
|
||||
* RETURN: Get the Node associated with a local or arg.
|
||||
* RETURN: Status and node
|
||||
*
|
||||
* DESCRIPTION: Get the Node associated with a local or arg.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -249,7 +279,8 @@ acpi_ds_method_data_get_node (
|
||||
case AML_LOCAL_OP:
|
||||
|
||||
if (index > ACPI_METHOD_MAX_LOCAL) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Local index %d is invalid (max %d)\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Local index %d is invalid (max %d)\n",
|
||||
index, ACPI_METHOD_MAX_LOCAL));
|
||||
return_ACPI_STATUS (AE_AML_INVALID_INDEX);
|
||||
}
|
||||
@ -262,7 +293,8 @@ acpi_ds_method_data_get_node (
|
||||
case AML_ARG_OP:
|
||||
|
||||
if (index > ACPI_METHOD_MAX_ARG) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Arg index %d is invalid (max %d)\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Arg index %d is invalid (max %d)\n",
|
||||
index, ACPI_METHOD_MAX_ARG));
|
||||
return_ACPI_STATUS (AE_AML_INVALID_INDEX);
|
||||
}
|
||||
@ -286,7 +318,7 @@ acpi_ds_method_data_get_node (
|
||||
* FUNCTION: acpi_ds_method_data_set_value
|
||||
*
|
||||
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
|
||||
* Index - which local_var or argument to get
|
||||
* Index - Which Local or Arg to get
|
||||
* Object - Object to be inserted into the stack entry
|
||||
* walk_state - Current walk state object
|
||||
*
|
||||
@ -297,7 +329,7 @@ acpi_ds_method_data_get_node (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ds_method_data_set_value (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
@ -338,56 +370,6 @@ acpi_ds_method_data_set_value (
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_method_data_get_type
|
||||
*
|
||||
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
|
||||
* Index - which local_var or argument whose type
|
||||
* to get
|
||||
* walk_state - Current walk state object
|
||||
*
|
||||
* RETURN: Data type of current value of the selected Arg or Local
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_object_type
|
||||
acpi_ds_method_data_get_type (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
union acpi_operand_object *object;
|
||||
|
||||
|
||||
ACPI_FUNCTION_TRACE ("ds_method_data_get_type");
|
||||
|
||||
|
||||
/* Get the namespace node for the arg/local */
|
||||
|
||||
status = acpi_ds_method_data_get_node (opcode, index, walk_state, &node);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_VALUE ((ACPI_TYPE_NOT_FOUND));
|
||||
}
|
||||
|
||||
/* Get the object */
|
||||
|
||||
object = acpi_ns_get_attached_object (node);
|
||||
if (!object) {
|
||||
/* Uninitialized local/arg, return TYPE_ANY */
|
||||
|
||||
return_VALUE (ACPI_TYPE_ANY);
|
||||
}
|
||||
|
||||
/* Get the object type */
|
||||
|
||||
return_VALUE (ACPI_GET_OBJECT_TYPE (object));
|
||||
}
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_method_data_get_value
|
||||
@ -395,13 +377,11 @@ acpi_ds_method_data_get_type (
|
||||
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
|
||||
* Index - which local_var or argument to get
|
||||
* walk_state - Current walk state object
|
||||
* *dest_desc - Ptr to Descriptor into which selected Arg
|
||||
* or Local value should be copied
|
||||
* dest_desc - Where Arg or Local value is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Retrieve value of selected Arg or Local from the method frame
|
||||
* at the current top of the method stack.
|
||||
* DESCRIPTION: Retrieve value of selected Arg or Local for this method
|
||||
* Used only in acpi_ex_resolve_to_value().
|
||||
*
|
||||
******************************************************************************/
|
||||
@ -467,14 +447,16 @@ acpi_ds_method_data_get_value (
|
||||
else switch (opcode) {
|
||||
case AML_ARG_OP:
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Uninitialized Arg[%d] at node %p\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Uninitialized Arg[%d] at node %p\n",
|
||||
index, node));
|
||||
|
||||
return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG);
|
||||
|
||||
case AML_LOCAL_OP:
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Uninitialized Local[%d] at node %p\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Uninitialized Local[%d] at node %p\n",
|
||||
index, node));
|
||||
|
||||
return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);
|
||||
@ -506,12 +488,12 @@ acpi_ds_method_data_get_value (
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Delete the entry at Opcode:Index on the method stack. Inserts
|
||||
* DESCRIPTION: Delete the entry at Opcode:Index. Inserts
|
||||
* a null into the stack slot after the object is deleted.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
static void
|
||||
acpi_ds_method_data_delete_value (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
@ -562,7 +544,7 @@ acpi_ds_method_data_delete_value (
|
||||
* FUNCTION: acpi_ds_store_object_to_local
|
||||
*
|
||||
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
|
||||
* Index - which local_var or argument to set
|
||||
* Index - Which Local or Arg to set
|
||||
* obj_desc - Value to be stored
|
||||
* walk_state - Current walk state
|
||||
*
|
||||
@ -651,19 +633,20 @@ acpi_ds_store_object_to_local (
|
||||
*/
|
||||
if (opcode == AML_ARG_OP) {
|
||||
/*
|
||||
* Make sure that the object is the correct type. This may be overkill, but
|
||||
* it is here because references were NS nodes in the past. Now they are
|
||||
* operand objects of type Reference.
|
||||
* Make sure that the object is the correct type. This may be
|
||||
* overkill, butit is here because references were NS nodes in
|
||||
* the past. Now they are operand objects of type Reference.
|
||||
*/
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE (current_obj_desc) != ACPI_DESC_TYPE_OPERAND) {
|
||||
ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: [%s]\n",
|
||||
acpi_ut_get_descriptor_name (current_obj_desc)));
|
||||
ACPI_REPORT_ERROR ((
|
||||
"Invalid descriptor type while storing to method arg: [%s]\n",
|
||||
acpi_ut_get_descriptor_name (current_obj_desc)));
|
||||
return_ACPI_STATUS (AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have a valid reference object that came from ref_of(), do the
|
||||
* indirect store
|
||||
* If we have a valid reference object that came from ref_of(),
|
||||
* do the indirect store
|
||||
*/
|
||||
if ((current_obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
|
||||
(current_obj_desc->reference.opcode == AML_REF_OF_OP)) {
|
||||
@ -713,3 +696,55 @@ acpi_ds_store_object_to_local (
|
||||
}
|
||||
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_method_data_get_type
|
||||
*
|
||||
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
|
||||
* Index - Which Local or Arg whose type to get
|
||||
* walk_state - Current walk state object
|
||||
*
|
||||
* RETURN: Data type of current value of the selected Arg or Local
|
||||
*
|
||||
* DESCRIPTION: Get the type of the object stored in the Local or Arg
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_object_type
|
||||
acpi_ds_method_data_get_type (
|
||||
u16 opcode,
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
union acpi_operand_object *object;
|
||||
|
||||
|
||||
ACPI_FUNCTION_TRACE ("ds_method_data_get_type");
|
||||
|
||||
|
||||
/* Get the namespace node for the arg/local */
|
||||
|
||||
status = acpi_ds_method_data_get_node (opcode, index, walk_state, &node);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_VALUE ((ACPI_TYPE_NOT_FOUND));
|
||||
}
|
||||
|
||||
/* Get the object */
|
||||
|
||||
object = acpi_ns_get_attached_object (node);
|
||||
if (!object) {
|
||||
/* Uninitialized local/arg, return TYPE_ANY */
|
||||
|
||||
return_VALUE (ACPI_TYPE_ANY);
|
||||
}
|
||||
|
||||
/* Get the object type */
|
||||
|
||||
return_VALUE (ACPI_GET_OBJECT_TYPE (object));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -52,9 +52,15 @@
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dsobject")
|
||||
|
||||
static acpi_status
|
||||
acpi_ds_build_internal_object (
|
||||
struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op,
|
||||
union acpi_operand_object **obj_desc_ptr);
|
||||
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_build_internal_object
|
||||
*
|
||||
@ -67,9 +73,9 @@
|
||||
* DESCRIPTION: Translate a parser Op object to the equivalent namespace object
|
||||
* Simple objects are any objects other than a package object!
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ds_build_internal_object (
|
||||
struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op,
|
||||
@ -90,9 +96,11 @@ acpi_ds_build_internal_object (
|
||||
* Otherwise, go ahead and look it up now
|
||||
*/
|
||||
if (!op->common.node) {
|
||||
status = acpi_ns_lookup (walk_state->scope_info, op->common.value.string,
|
||||
status = acpi_ns_lookup (walk_state->scope_info,
|
||||
op->common.value.string,
|
||||
ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
|
||||
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
|
||||
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
|
||||
NULL,
|
||||
(struct acpi_namespace_node **) &(op->common.node));
|
||||
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -104,12 +112,14 @@ acpi_ds_build_internal_object (
|
||||
|
||||
/* Create and init the internal ACPI object */
|
||||
|
||||
obj_desc = acpi_ut_create_internal_object ((acpi_ps_get_opcode_info (op->common.aml_opcode))->object_type);
|
||||
obj_desc = acpi_ut_create_internal_object (
|
||||
(acpi_ps_get_opcode_info (op->common.aml_opcode))->object_type);
|
||||
if (!obj_desc) {
|
||||
return_ACPI_STATUS (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
status = acpi_ds_init_object_from_op (walk_state, op, op->common.aml_opcode, &obj_desc);
|
||||
status = acpi_ds_init_object_from_op (walk_state, op, op->common.aml_opcode,
|
||||
&obj_desc);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
acpi_ut_remove_reference (obj_desc);
|
||||
return_ACPI_STATUS (status);
|
||||
@ -120,7 +130,7 @@ acpi_ds_build_internal_object (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_build_internal_buffer_obj
|
||||
*
|
||||
@ -134,7 +144,7 @@ acpi_ds_build_internal_object (
|
||||
* DESCRIPTION: Translate a parser Op package object to the equivalent
|
||||
* namespace object
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_build_internal_buffer_obj (
|
||||
@ -229,7 +239,7 @@ acpi_ds_build_internal_buffer_obj (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_build_internal_package_obj
|
||||
*
|
||||
@ -243,7 +253,7 @@ acpi_ds_build_internal_buffer_obj (
|
||||
* DESCRIPTION: Translate a parser Op package object to the equivalent
|
||||
* namespace object
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_build_internal_package_obj (
|
||||
@ -331,11 +341,12 @@ acpi_ds_build_internal_package_obj (
|
||||
if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
|
||||
/* Object (package or buffer) is already built */
|
||||
|
||||
obj_desc->package.elements[i] = ACPI_CAST_PTR (union acpi_operand_object, arg->common.node);
|
||||
obj_desc->package.elements[i] =
|
||||
ACPI_CAST_PTR (union acpi_operand_object, arg->common.node);
|
||||
}
|
||||
else {
|
||||
status = acpi_ds_build_internal_object (walk_state, arg,
|
||||
&obj_desc->package.elements[i]);
|
||||
&obj_desc->package.elements[i]);
|
||||
}
|
||||
|
||||
i++;
|
||||
@ -348,7 +359,7 @@ acpi_ds_build_internal_package_obj (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_create_node
|
||||
*
|
||||
@ -360,7 +371,7 @@ acpi_ds_build_internal_package_obj (
|
||||
*
|
||||
* DESCRIPTION: Create the object to be associated with a namespace node
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_create_node (
|
||||
@ -392,7 +403,8 @@ acpi_ds_create_node (
|
||||
|
||||
/* Build an internal object for the argument(s) */
|
||||
|
||||
status = acpi_ds_build_internal_object (walk_state, op->common.value.arg, &obj_desc);
|
||||
status = acpi_ds_build_internal_object (walk_state, op->common.value.arg,
|
||||
&obj_desc);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
@ -414,7 +426,7 @@ acpi_ds_create_node (
|
||||
#endif /* ACPI_NO_METHOD_EXECUTION */
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_init_object_from_op
|
||||
*
|
||||
@ -429,7 +441,7 @@ acpi_ds_create_node (
|
||||
* associated arguments. The namespace object is a more compact
|
||||
* representation of the Op and its arguments.
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_init_object_from_op (
|
||||
@ -462,7 +474,8 @@ acpi_ds_init_object_from_op (
|
||||
/*
|
||||
* Defer evaluation of Buffer term_arg operand
|
||||
*/
|
||||
obj_desc->buffer.node = (struct acpi_namespace_node *) walk_state->operands[0];
|
||||
obj_desc->buffer.node = (struct acpi_namespace_node *)
|
||||
walk_state->operands[0];
|
||||
obj_desc->buffer.aml_start = op->named.data;
|
||||
obj_desc->buffer.aml_length = op->named.length;
|
||||
break;
|
||||
@ -473,7 +486,8 @@ acpi_ds_init_object_from_op (
|
||||
/*
|
||||
* Defer evaluation of Package term_arg operand
|
||||
*/
|
||||
obj_desc->package.node = (struct acpi_namespace_node *) walk_state->operands[0];
|
||||
obj_desc->package.node = (struct acpi_namespace_node *)
|
||||
walk_state->operands[0];
|
||||
obj_desc->package.aml_start = op->named.data;
|
||||
obj_desc->package.aml_length = op->named.length;
|
||||
break;
|
||||
@ -486,9 +500,10 @@ acpi_ds_init_object_from_op (
|
||||
/*
|
||||
* Resolve AML Constants here - AND ONLY HERE!
|
||||
* All constants are integers.
|
||||
* We mark the integer with a flag that indicates that it started life
|
||||
* as a constant -- so that stores to constants will perform as expected (noop).
|
||||
* (zero_op is used as a placeholder for optional target operands.)
|
||||
* We mark the integer with a flag that indicates that it started
|
||||
* life as a constant -- so that stores to constants will perform
|
||||
* as expected (noop). zero_op is used as a placeholder for optional
|
||||
* target operands.
|
||||
*/
|
||||
obj_desc->common.flags = AOPOBJ_AML_CONSTANT;
|
||||
|
||||
@ -521,7 +536,8 @@ acpi_ds_init_object_from_op (
|
||||
|
||||
default:
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown constant opcode %X\n", opcode));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Unknown constant opcode %X\n", opcode));
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
break;
|
||||
}
|
||||
@ -535,7 +551,8 @@ acpi_ds_init_object_from_op (
|
||||
|
||||
|
||||
default:
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Integer type %X\n", op_info->type));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Integer type %X\n",
|
||||
op_info->type));
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
break;
|
||||
}
|
||||
@ -570,8 +587,10 @@ acpi_ds_init_object_from_op (
|
||||
obj_desc->reference.offset = opcode - AML_LOCAL_OP;
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
status = acpi_ds_method_data_get_node (AML_LOCAL_OP, obj_desc->reference.offset,
|
||||
walk_state, (struct acpi_namespace_node **) &obj_desc->reference.object);
|
||||
status = acpi_ds_method_data_get_node (AML_LOCAL_OP,
|
||||
obj_desc->reference.offset,
|
||||
walk_state,
|
||||
(struct acpi_namespace_node **) &obj_desc->reference.object);
|
||||
#endif
|
||||
break;
|
||||
|
||||
@ -584,8 +603,10 @@ acpi_ds_init_object_from_op (
|
||||
obj_desc->reference.offset = opcode - AML_ARG_OP;
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
status = acpi_ds_method_data_get_node (AML_ARG_OP, obj_desc->reference.offset,
|
||||
walk_state, (struct acpi_namespace_node **) &obj_desc->reference.object);
|
||||
status = acpi_ds_method_data_get_node (AML_ARG_OP,
|
||||
obj_desc->reference.offset,
|
||||
walk_state,
|
||||
(struct acpi_namespace_node **) &obj_desc->reference.object);
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -54,12 +54,31 @@
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dsopcode")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
/*****************************************************************************
|
||||
static acpi_status
|
||||
acpi_ds_execute_arguments (
|
||||
struct acpi_namespace_node *node,
|
||||
struct acpi_namespace_node *scope_node,
|
||||
u32 aml_length,
|
||||
u8 *aml_start);
|
||||
|
||||
static acpi_status
|
||||
acpi_ds_init_buffer_field (
|
||||
u16 aml_opcode,
|
||||
union acpi_operand_object *obj_desc,
|
||||
union acpi_operand_object *buffer_desc,
|
||||
union acpi_operand_object *offset_desc,
|
||||
union acpi_operand_object *length_desc,
|
||||
union acpi_operand_object *result_desc);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_execute_arguments
|
||||
*
|
||||
* PARAMETERS: Node - Parent NS node
|
||||
* PARAMETERS: Node - Object NS node
|
||||
* scope_node - Parent NS node
|
||||
* aml_length - Length of executable AML
|
||||
* aml_start - Pointer to the AML
|
||||
*
|
||||
@ -67,9 +86,9 @@
|
||||
*
|
||||
* DESCRIPTION: Late (deferred) execution of region or field arguments
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ds_execute_arguments (
|
||||
struct acpi_namespace_node *node,
|
||||
struct acpi_namespace_node *scope_node,
|
||||
@ -162,7 +181,7 @@ acpi_ds_execute_arguments (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_get_buffer_field_arguments
|
||||
*
|
||||
@ -173,7 +192,7 @@ acpi_ds_execute_arguments (
|
||||
* DESCRIPTION: Get buffer_field Buffer and Index. This implements the late
|
||||
* evaluation of these field attributes.
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_get_buffer_field_arguments (
|
||||
@ -208,7 +227,7 @@ acpi_ds_get_buffer_field_arguments (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_get_buffer_arguments
|
||||
*
|
||||
@ -219,7 +238,7 @@ acpi_ds_get_buffer_field_arguments (
|
||||
* DESCRIPTION: Get Buffer length and initializer byte list. This implements
|
||||
* the late evaluation of these attributes.
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_get_buffer_arguments (
|
||||
@ -255,7 +274,7 @@ acpi_ds_get_buffer_arguments (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_get_package_arguments
|
||||
*
|
||||
@ -266,7 +285,7 @@ acpi_ds_get_buffer_arguments (
|
||||
* DESCRIPTION: Get Package length and initializer byte list. This implements
|
||||
* the late evaluation of these attributes.
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_get_package_arguments (
|
||||
@ -353,17 +372,17 @@ acpi_ds_get_region_arguments (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_initialize_region
|
||||
*
|
||||
* PARAMETERS: Op - A valid region Op object
|
||||
* PARAMETERS: obj_handle - Region namespace node
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Front end to ev_initialize_region
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_initialize_region (
|
||||
@ -382,7 +401,7 @@ acpi_ds_initialize_region (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_init_buffer_field
|
||||
*
|
||||
@ -390,16 +409,16 @@ acpi_ds_initialize_region (
|
||||
* obj_desc - buffer_field object
|
||||
* buffer_desc - Host Buffer
|
||||
* offset_desc - Offset into buffer
|
||||
* Length - Length of field (CREATE_FIELD_OP only)
|
||||
* Result - Where to store the result
|
||||
* length_desc - Length of field (CREATE_FIELD_OP only)
|
||||
* result_desc - Where to store the result
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Perform actual initialization of a buffer field
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ds_init_buffer_field (
|
||||
u16 aml_opcode,
|
||||
union acpi_operand_object *obj_desc,
|
||||
@ -435,8 +454,10 @@ acpi_ds_init_buffer_field (
|
||||
* after resolution in acpi_ex_resolve_operands().
|
||||
*/
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE (result_desc) != ACPI_DESC_TYPE_NAMED) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) destination not a NS Node [%s]\n",
|
||||
acpi_ps_get_opcode_name (aml_opcode), acpi_ut_get_descriptor_name (result_desc)));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"(%s) destination not a NS Node [%s]\n",
|
||||
acpi_ps_get_opcode_name (aml_opcode),
|
||||
acpi_ut_get_descriptor_name (result_desc)));
|
||||
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
goto cleanup;
|
||||
@ -452,9 +473,18 @@ acpi_ds_init_buffer_field (
|
||||
|
||||
/* Offset is in bits, count is in bits */
|
||||
|
||||
field_flags = AML_FIELD_ACCESS_BYTE;
|
||||
bit_offset = offset;
|
||||
bit_count = (u32) length_desc->integer.value;
|
||||
field_flags = AML_FIELD_ACCESS_BYTE;
|
||||
|
||||
/* Must have a valid (>0) bit count */
|
||||
|
||||
if (bit_count == 0) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Attempt to create_field of length 0\n"));
|
||||
status = AE_AML_OPERAND_VALUE;
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
|
||||
case AML_CREATE_BIT_FIELD_OP:
|
||||
@ -527,7 +557,8 @@ acpi_ds_init_buffer_field (
|
||||
|
||||
/*
|
||||
* Initialize areas of the field object that are common to all fields
|
||||
* For field_flags, use LOCK_RULE = 0 (NO_LOCK), UPDATE_RULE = 0 (UPDATE_PRESERVE)
|
||||
* For field_flags, use LOCK_RULE = 0 (NO_LOCK),
|
||||
* UPDATE_RULE = 0 (UPDATE_PRESERVE)
|
||||
*/
|
||||
status = acpi_ex_prep_common_field_object (obj_desc, field_flags, 0,
|
||||
bit_offset, bit_count);
|
||||
@ -539,8 +570,8 @@ acpi_ds_init_buffer_field (
|
||||
|
||||
/* Reference count for buffer_desc inherits obj_desc count */
|
||||
|
||||
buffer_desc->common.reference_count = (u16) (buffer_desc->common.reference_count +
|
||||
obj_desc->common.reference_count);
|
||||
buffer_desc->common.reference_count = (u16)
|
||||
(buffer_desc->common.reference_count + obj_desc->common.reference_count);
|
||||
|
||||
|
||||
cleanup:
|
||||
@ -569,7 +600,7 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_eval_buffer_field_operands
|
||||
*
|
||||
@ -581,7 +612,7 @@ cleanup:
|
||||
* DESCRIPTION: Get buffer_field Buffer and Index
|
||||
* Called from acpi_ds_exec_end_op during buffer_field parse tree walk
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_eval_buffer_field_operands (
|
||||
@ -656,7 +687,7 @@ acpi_ds_eval_buffer_field_operands (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_eval_region_operands
|
||||
*
|
||||
@ -668,7 +699,7 @@ acpi_ds_eval_buffer_field_operands (
|
||||
* DESCRIPTION: Get region address and length
|
||||
* Called from acpi_ds_exec_end_op during op_region parse tree walk
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_eval_region_operands (
|
||||
@ -686,7 +717,8 @@ acpi_ds_eval_region_operands (
|
||||
|
||||
|
||||
/*
|
||||
* This is where we evaluate the address and length fields of the op_region declaration
|
||||
* This is where we evaluate the address and length fields of the
|
||||
* op_region declaration
|
||||
*/
|
||||
node = op->common.node;
|
||||
|
||||
@ -707,7 +739,8 @@ acpi_ds_eval_region_operands (
|
||||
|
||||
/* Resolve the length and address operands to numbers */
|
||||
|
||||
status = acpi_ex_resolve_operands (op->common.aml_opcode, ACPI_WALK_OPERANDS, walk_state);
|
||||
status = acpi_ex_resolve_operands (op->common.aml_opcode,
|
||||
ACPI_WALK_OPERANDS, walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
@ -736,7 +769,8 @@ acpi_ds_eval_region_operands (
|
||||
*/
|
||||
operand_desc = walk_state->operands[walk_state->num_operands - 2];
|
||||
|
||||
obj_desc->region.address = (acpi_physical_address) operand_desc->integer.value;
|
||||
obj_desc->region.address = (acpi_physical_address)
|
||||
operand_desc->integer.value;
|
||||
acpi_ut_remove_reference (operand_desc);
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n",
|
||||
@ -752,7 +786,7 @@ acpi_ds_eval_region_operands (
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_eval_data_object_operands
|
||||
*
|
||||
@ -765,7 +799,7 @@ acpi_ds_eval_region_operands (
|
||||
* DESCRIPTION: Get the operands and complete the following data object types:
|
||||
* Buffer, Package.
|
||||
*
|
||||
****************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_eval_data_object_operands (
|
||||
@ -830,7 +864,7 @@ acpi_ds_eval_data_object_operands (
|
||||
|
||||
if (ACPI_SUCCESS (status)) {
|
||||
/*
|
||||
* Return the object in the walk_state, unless the parent is a package --
|
||||
* Return the object in the walk_state, unless the parent is a package -
|
||||
* in this case, the return object will be stored in the parse tree
|
||||
* for the package.
|
||||
*/
|
||||
@ -988,7 +1022,8 @@ acpi_ds_exec_end_control_op (
|
||||
status = AE_CTRL_PENDING;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] termination! Op=%p\n", op));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"[WHILE_OP] termination! Op=%p\n",op));
|
||||
|
||||
/* Pop this control state and free it */
|
||||
|
||||
|
@ -100,7 +100,6 @@ acpi_ds_clear_implicit_return (
|
||||
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_do_implicit_return
|
||||
@ -205,7 +204,7 @@ acpi_ds_is_result_used (
|
||||
* NOTE: this is optional because the ASL language does not actually
|
||||
* support this behavior.
|
||||
*/
|
||||
acpi_ds_do_implicit_return (walk_state->result_obj, walk_state, TRUE);
|
||||
(void) acpi_ds_do_implicit_return (walk_state->result_obj, walk_state, TRUE);
|
||||
|
||||
/*
|
||||
* Now determine if the parent will use the result
|
||||
@ -219,8 +218,9 @@ acpi_ds_is_result_used (
|
||||
(op->common.parent->common.aml_opcode == AML_SCOPE_OP)) {
|
||||
/* No parent, the return value cannot possibly be used */
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "At Method level, result of [%s] not used\n",
|
||||
acpi_ps_get_opcode_name (op->common.aml_opcode)));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"At Method level, result of [%s] not used\n",
|
||||
acpi_ps_get_opcode_name (op->common.aml_opcode)));
|
||||
return_VALUE (FALSE);
|
||||
}
|
||||
|
||||
@ -228,7 +228,8 @@ acpi_ds_is_result_used (
|
||||
|
||||
parent_info = acpi_ps_get_opcode_info (op->common.parent->common.aml_opcode);
|
||||
if (parent_info->class == AML_CLASS_UNKNOWN) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%p\n", op));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Unknown parent opcode. Op=%p\n", op));
|
||||
return_VALUE (FALSE);
|
||||
}
|
||||
|
||||
@ -309,17 +310,19 @@ acpi_ds_is_result_used (
|
||||
|
||||
|
||||
result_used:
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Result of [%s] used by Parent [%s] Op=%p\n",
|
||||
acpi_ps_get_opcode_name (op->common.aml_opcode),
|
||||
acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"Result of [%s] used by Parent [%s] Op=%p\n",
|
||||
acpi_ps_get_opcode_name (op->common.aml_opcode),
|
||||
acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
|
||||
|
||||
return_VALUE (TRUE);
|
||||
|
||||
|
||||
result_not_used:
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Result of [%s] not used by Parent [%s] Op=%p\n",
|
||||
acpi_ps_get_opcode_name (op->common.aml_opcode),
|
||||
acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"Result of [%s] not used by Parent [%s] Op=%p\n",
|
||||
acpi_ps_get_opcode_name (op->common.aml_opcode),
|
||||
acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
|
||||
|
||||
return_VALUE (FALSE);
|
||||
}
|
||||
@ -522,7 +525,8 @@ acpi_ds_create_operand (
|
||||
if ((walk_state->deferred_node) &&
|
||||
(walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) &&
|
||||
(arg_index != 0)) {
|
||||
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, walk_state->deferred_node);
|
||||
obj_desc = ACPI_CAST_PTR (
|
||||
union acpi_operand_object, walk_state->deferred_node);
|
||||
status = AE_OK;
|
||||
}
|
||||
else /* All other opcodes */ {
|
||||
@ -565,7 +569,8 @@ acpi_ds_create_operand (
|
||||
* indicate this to the interpreter, set the
|
||||
* object to the root
|
||||
*/
|
||||
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node);
|
||||
obj_desc = ACPI_CAST_PTR (
|
||||
union acpi_operand_object, acpi_gbl_root_node);
|
||||
status = AE_OK;
|
||||
}
|
||||
else {
|
||||
@ -612,7 +617,8 @@ acpi_ds_create_operand (
|
||||
*/
|
||||
opcode = AML_ZERO_OP; /* Has no arguments! */
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", arg));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"Null namepath: Arg=%p\n", arg));
|
||||
}
|
||||
else {
|
||||
opcode = arg->common.aml_opcode;
|
||||
@ -642,7 +648,8 @@ acpi_ds_create_operand (
|
||||
* Only error is underflow, and this indicates
|
||||
* a missing or null operand!
|
||||
*/
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Missing or null operand, %s\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Missing or null operand, %s\n",
|
||||
acpi_format_exception (status)));
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
@ -657,8 +664,8 @@ acpi_ds_create_operand (
|
||||
|
||||
/* Initialize the new object */
|
||||
|
||||
status = acpi_ds_init_object_from_op (walk_state, arg,
|
||||
opcode, &obj_desc);
|
||||
status = acpi_ds_init_object_from_op (
|
||||
walk_state, arg, opcode, &obj_desc);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
acpi_ut_delete_object_desc (obj_desc);
|
||||
return_ACPI_STATUS (status);
|
||||
|
@ -73,11 +73,13 @@ static ACPI_EXECUTE_OP acpi_gbl_op_type_dispatch [] = {
|
||||
acpi_ex_opcode_3A_1T_1R,
|
||||
acpi_ex_opcode_6A_0T_1R};
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_get_predicate_value
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* result_obj - if non-zero, pop result from result stack
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -124,7 +126,8 @@ acpi_ds_get_predicate_value (
|
||||
}
|
||||
|
||||
if (!obj_desc) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No predicate obj_desc=%p State=%p\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"No predicate obj_desc=%p State=%p\n",
|
||||
obj_desc, walk_state));
|
||||
|
||||
return_ACPI_STATUS (AE_AML_NO_OPERAND);
|
||||
@ -197,7 +200,7 @@ cleanup:
|
||||
* FUNCTION: acpi_ds_exec_begin_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* out_op - Return op if a new one is created
|
||||
* out_op - Where to return op if a new one is created
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -233,7 +236,8 @@ acpi_ds_exec_begin_op (
|
||||
walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode);
|
||||
|
||||
if (acpi_ns_opens_scope (walk_state->op_info->object_type)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"(%s) Popping scope for Op %p\n",
|
||||
acpi_ut_get_type_name (walk_state->op_info->object_type), op));
|
||||
|
||||
status = acpi_ds_scope_stack_pop (walk_state);
|
||||
@ -297,11 +301,10 @@ acpi_ds_exec_begin_op (
|
||||
|
||||
if (walk_state->walk_type == ACPI_WALK_METHOD) {
|
||||
/*
|
||||
* Found a named object declaration during method
|
||||
* execution; we must enter this object into the
|
||||
* namespace. The created object is temporary and
|
||||
* will be deleted upon completion of the execution
|
||||
* of this method.
|
||||
* Found a named object declaration during method execution;
|
||||
* we must enter this object into the namespace. The created
|
||||
* object is temporary and will be deleted upon completion of
|
||||
* the execution of this method.
|
||||
*/
|
||||
status = acpi_ds_load2_begin_op (walk_state, NULL);
|
||||
}
|
||||
@ -338,8 +341,6 @@ acpi_ds_exec_begin_op (
|
||||
* FUNCTION: acpi_ds_exec_end_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* Op - Op that has been just been completed in the
|
||||
* walk; Arguments have now been evaluated.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -389,7 +390,7 @@ acpi_ds_exec_end_op (
|
||||
/* Decode the Opcode Class */
|
||||
|
||||
switch (op_class) {
|
||||
case AML_CLASS_ARGUMENT: /* constants, literals, etc. -- do nothing */
|
||||
case AML_CLASS_ARGUMENT: /* constants, literals, etc. - do nothing */
|
||||
break;
|
||||
|
||||
|
||||
@ -417,12 +418,12 @@ acpi_ds_exec_end_op (
|
||||
/* Resolve all operands */
|
||||
|
||||
status = acpi_ex_resolve_operands (walk_state->opcode,
|
||||
&(walk_state->operands [walk_state->num_operands -1]),
|
||||
walk_state);
|
||||
&(walk_state->operands [walk_state->num_operands -1]),
|
||||
walk_state);
|
||||
if (ACPI_SUCCESS (status)) {
|
||||
ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,
|
||||
acpi_ps_get_opcode_name (walk_state->opcode),
|
||||
walk_state->num_operands, "after ex_resolve_operands");
|
||||
acpi_ps_get_opcode_name (walk_state->opcode),
|
||||
walk_state->num_operands, "after ex_resolve_operands");
|
||||
}
|
||||
}
|
||||
|
||||
@ -506,7 +507,8 @@ acpi_ds_exec_end_op (
|
||||
if ((op->asl.parent) &&
|
||||
((op->asl.parent->asl.aml_opcode == AML_PACKAGE_OP) ||
|
||||
(op->asl.parent->asl.aml_opcode == AML_VAR_PACKAGE_OP))) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method Reference in a Package, Op=%p\n", op));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"Method Reference in a Package, Op=%p\n", op));
|
||||
op->common.node = (struct acpi_namespace_node *) op->asl.value.arg->asl.node->object;
|
||||
acpi_ut_add_reference (op->asl.value.arg->asl.node->object);
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
@ -583,13 +585,15 @@ acpi_ds_exec_end_op (
|
||||
case AML_NAME_OP:
|
||||
|
||||
/*
|
||||
* Put the Node on the object stack (Contains the ACPI Name of
|
||||
* this object)
|
||||
* Put the Node on the object stack (Contains the ACPI Name
|
||||
* of this object)
|
||||
*/
|
||||
walk_state->operands[0] = (void *) op->common.parent->common.node;
|
||||
walk_state->num_operands = 1;
|
||||
|
||||
status = acpi_ds_create_node (walk_state, op->common.parent->common.node, op->common.parent);
|
||||
status = acpi_ds_create_node (walk_state,
|
||||
op->common.parent->common.node,
|
||||
op->common.parent);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
break;
|
||||
}
|
||||
@ -600,7 +604,7 @@ acpi_ds_exec_end_op (
|
||||
case AML_INT_EVAL_SUBTREE_OP:
|
||||
|
||||
status = acpi_ds_eval_data_object_operands (walk_state, op,
|
||||
acpi_ns_get_attached_object (op->common.parent->common.node));
|
||||
acpi_ns_get_attached_object (op->common.parent->common.node));
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -609,7 +613,7 @@ acpi_ds_exec_end_op (
|
||||
break;
|
||||
}
|
||||
|
||||
/* Done with this result state (Now that operand stack is built) */
|
||||
/* Done with result state (Now that operand stack is built) */
|
||||
|
||||
status = acpi_ds_result_stack_pop (walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -620,8 +624,7 @@ acpi_ds_exec_end_op (
|
||||
* If a result object was returned from above, push it on the
|
||||
* current result stack
|
||||
*/
|
||||
if (ACPI_SUCCESS (status) &&
|
||||
walk_state->result_obj) {
|
||||
if (walk_state->result_obj) {
|
||||
status = acpi_ds_result_push (walk_state->result_obj, walk_state);
|
||||
}
|
||||
break;
|
||||
@ -654,7 +657,8 @@ acpi_ds_exec_end_op (
|
||||
|
||||
case AML_TYPE_UNDEFINED:
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Undefined opcode type Op=%p\n", op));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Undefined opcode type Op=%p\n", op));
|
||||
return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
|
||||
|
||||
|
||||
@ -709,13 +713,14 @@ cleanup:
|
||||
status = acpi_gbl_exception_handler (status,
|
||||
walk_state->method_node->name.integer, walk_state->opcode,
|
||||
walk_state->aml_offset, NULL);
|
||||
acpi_ex_enter_interpreter ();
|
||||
(void) acpi_ex_enter_interpreter ();
|
||||
}
|
||||
|
||||
if (walk_state->result_obj) {
|
||||
/* Break to debugger to display result */
|
||||
|
||||
ACPI_DEBUGGER_EXEC (acpi_db_display_result_object (walk_state->result_obj, walk_state));
|
||||
ACPI_DEBUGGER_EXEC (acpi_db_display_result_object (walk_state->result_obj,
|
||||
walk_state));
|
||||
|
||||
/*
|
||||
* Delete the result op if and only if:
|
||||
|
@ -79,20 +79,23 @@ acpi_ds_init_callbacks (
|
||||
|
||||
switch (pass_number) {
|
||||
case 1:
|
||||
walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 |
|
||||
ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->descending_callback = acpi_ds_load1_begin_op;
|
||||
walk_state->ascending_callback = acpi_ds_load1_end_op;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 |
|
||||
ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->descending_callback = acpi_ds_load2_begin_op;
|
||||
walk_state->ascending_callback = acpi_ds_load2_end_op;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
walk_state->parse_flags |= ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->parse_flags |= ACPI_PARSE_EXECUTE |
|
||||
ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->descending_callback = acpi_ds_exec_begin_op;
|
||||
walk_state->ascending_callback = acpi_ds_exec_end_op;
|
||||
#endif
|
||||
@ -111,8 +114,7 @@ acpi_ds_init_callbacks (
|
||||
* FUNCTION: acpi_ds_load1_begin_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* Op - Op that has been just been reached in the
|
||||
* walk; Arguments have not been evaluated yet.
|
||||
* out_op - Where to return op if a new one is created
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -146,7 +148,8 @@ acpi_ds_load1_begin_op (
|
||||
#if 0
|
||||
if ((walk_state->op_info->class == AML_CLASS_EXECUTE) ||
|
||||
(walk_state->op_info->class == AML_CLASS_CONTROL)) {
|
||||
acpi_os_printf ("\n\n***EXECUTABLE OPCODE %s***\n\n", walk_state->op_info->name);
|
||||
acpi_os_printf ("\n\n***EXECUTABLE OPCODE %s***\n\n",
|
||||
walk_state->op_info->name);
|
||||
*out_op = op;
|
||||
return (AE_CTRL_SKIP);
|
||||
}
|
||||
@ -191,7 +194,8 @@ acpi_ds_load1_begin_op (
|
||||
*/
|
||||
acpi_dm_add_to_external_list (path);
|
||||
status = acpi_ns_lookup (walk_state->scope_info, path, object_type,
|
||||
ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, walk_state, &(node));
|
||||
ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT,
|
||||
walk_state, &(node));
|
||||
}
|
||||
#endif
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -224,10 +228,12 @@ acpi_ds_load1_begin_op (
|
||||
* Name (DEB, 0)
|
||||
* Scope (DEB) { ... }
|
||||
*
|
||||
* Note: silently change the type here. On the second pass, we will report a warning
|
||||
* Note: silently change the type here. On the second pass, we will report
|
||||
* a warning
|
||||
*/
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
|
||||
"Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)\n",
|
||||
path, acpi_ut_get_type_name (node->type)));
|
||||
|
||||
node->type = ACPI_TYPE_ANY;
|
||||
@ -238,7 +244,8 @@ acpi_ds_load1_begin_op (
|
||||
|
||||
/* All other types are an error */
|
||||
|
||||
ACPI_REPORT_ERROR (("Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)\n",
|
||||
ACPI_REPORT_ERROR ((
|
||||
"Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)\n",
|
||||
acpi_ut_get_type_name (node->type), path));
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
@ -249,7 +256,8 @@ acpi_ds_load1_begin_op (
|
||||
default:
|
||||
|
||||
/*
|
||||
* For all other named opcodes, we will enter the name into the namespace.
|
||||
* For all other named opcodes, we will enter the name into
|
||||
* the namespace.
|
||||
*
|
||||
* Setup the search flags.
|
||||
* Since we are entering a name into the namespace, we do not want to
|
||||
@ -279,14 +287,16 @@ acpi_ds_load1_begin_op (
|
||||
acpi_ut_get_type_name (object_type)));
|
||||
}
|
||||
else {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Both Find or Create allowed\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"[%s] Both Find or Create allowed\n",
|
||||
acpi_ut_get_type_name (object_type)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Enter the named type into the internal namespace. We enter the name
|
||||
* as we go downward in the parse tree. Any necessary subobjects that involve
|
||||
* arguments to the opcode must be created as we go back up the parse tree later.
|
||||
* as we go downward in the parse tree. Any necessary subobjects that
|
||||
* involve arguments to the opcode must be created as we go back up the
|
||||
* parse tree later.
|
||||
*/
|
||||
status = acpi_ns_lookup (walk_state->scope_info, path, object_type,
|
||||
ACPI_IMODE_LOAD_PASS1, flags, walk_state, &(node));
|
||||
@ -335,8 +345,6 @@ acpi_ds_load1_begin_op (
|
||||
* FUNCTION: acpi_ds_load1_end_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* Op - Op that has been just been completed in the
|
||||
* walk; Arguments have now been evaluated.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -383,7 +391,9 @@ acpi_ds_load1_end_op (
|
||||
|
||||
if (op->common.aml_opcode == AML_REGION_OP) {
|
||||
status = acpi_ex_create_region (op->named.data, op->named.length,
|
||||
(acpi_adr_space_type) ((op->common.value.arg)->common.value.integer), walk_state);
|
||||
(acpi_adr_space_type)
|
||||
((op->common.value.arg)->common.value.integer),
|
||||
walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return (status);
|
||||
}
|
||||
@ -394,7 +404,8 @@ acpi_ds_load1_end_op (
|
||||
/* For Name opcode, get the object type from the argument */
|
||||
|
||||
if (op->common.value.arg) {
|
||||
object_type = (acpi_ps_get_opcode_info ((op->common.value.arg)->common.aml_opcode))->object_type;
|
||||
object_type = (acpi_ps_get_opcode_info (
|
||||
(op->common.value.arg)->common.aml_opcode))->object_type;
|
||||
op->common.node->type = (u8) object_type;
|
||||
}
|
||||
}
|
||||
@ -448,8 +459,7 @@ acpi_ds_load1_end_op (
|
||||
* FUNCTION: acpi_ds_load2_begin_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* Op - Op that has been just been reached in the
|
||||
* walk; Arguments have not been evaluated yet.
|
||||
* out_op - Wher to return op if a new one is created
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -478,14 +488,20 @@ acpi_ds_load2_begin_op (
|
||||
if (op) {
|
||||
/* We only care about Namespace opcodes here */
|
||||
|
||||
if ((!(walk_state->op_info->flags & AML_NSOPCODE) && (walk_state->opcode != AML_INT_NAMEPATH_OP)) ||
|
||||
if ((!(walk_state->op_info->flags & AML_NSOPCODE) &&
|
||||
(walk_state->opcode != AML_INT_NAMEPATH_OP)) ||
|
||||
(!(walk_state->op_info->flags & AML_NAMED))) {
|
||||
if ((walk_state->op_info->class == AML_CLASS_EXECUTE) ||
|
||||
(walk_state->op_info->class == AML_CLASS_CONTROL)) {
|
||||
ACPI_REPORT_WARNING ((
|
||||
"Encountered executable code at module level, [%s]\n",
|
||||
acpi_ps_get_opcode_name (walk_state->opcode)));
|
||||
}
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the name we are going to enter or lookup in the namespace
|
||||
*/
|
||||
/* Get the name we are going to enter or lookup in the namespace */
|
||||
|
||||
if (walk_state->opcode == AML_INT_NAMEPATH_OP) {
|
||||
/* For Namepath op, get the path string */
|
||||
|
||||
@ -528,21 +544,25 @@ acpi_ds_load2_begin_op (
|
||||
case AML_INT_NAMEPATH_OP:
|
||||
|
||||
/*
|
||||
* The name_path is an object reference to an existing object. Don't enter the
|
||||
* name into the namespace, but look it up for use later
|
||||
* The name_path is an object reference to an existing object.
|
||||
* Don't enter the name into the namespace, but look it up
|
||||
* for use later.
|
||||
*/
|
||||
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type,
|
||||
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node));
|
||||
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
|
||||
walk_state, &(node));
|
||||
break;
|
||||
|
||||
case AML_SCOPE_OP:
|
||||
|
||||
/*
|
||||
* The Path is an object reference to an existing object. Don't enter the
|
||||
* name into the namespace, but look it up for use later
|
||||
* The Path is an object reference to an existing object.
|
||||
* Don't enter the name into the namespace, but look it up
|
||||
* for use later.
|
||||
*/
|
||||
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type,
|
||||
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node));
|
||||
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
|
||||
walk_state, &(node));
|
||||
if (ACPI_FAILURE (status)) {
|
||||
#ifdef _ACPI_ASL_COMPILER
|
||||
if (status == AE_NOT_FOUND) {
|
||||
@ -582,7 +602,8 @@ acpi_ds_load2_begin_op (
|
||||
* Scope (DEB) { ... }
|
||||
*/
|
||||
|
||||
ACPI_REPORT_WARNING (("Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)\n",
|
||||
ACPI_REPORT_WARNING ((
|
||||
"Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)\n",
|
||||
buffer_ptr, acpi_ut_get_type_name (node->type)));
|
||||
|
||||
node->type = ACPI_TYPE_ANY;
|
||||
@ -593,7 +614,8 @@ acpi_ds_load2_begin_op (
|
||||
|
||||
/* All other types are an error */
|
||||
|
||||
ACPI_REPORT_ERROR (("Invalid type (%s) for target of Scope operator [%4.4s]\n",
|
||||
ACPI_REPORT_ERROR ((
|
||||
"Invalid type (%s) for target of Scope operator [%4.4s]\n",
|
||||
acpi_ut_get_type_name (node->type), buffer_ptr));
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
@ -621,8 +643,9 @@ acpi_ds_load2_begin_op (
|
||||
|
||||
/*
|
||||
* Enter the named type into the internal namespace. We enter the name
|
||||
* as we go downward in the parse tree. Any necessary subobjects that involve
|
||||
* arguments to the opcode must be created as we go back up the parse tree later.
|
||||
* as we go downward in the parse tree. Any necessary subobjects that
|
||||
* involve arguments to the opcode must be created as we go back up the
|
||||
* parse tree later.
|
||||
*
|
||||
* Note: Name may already exist if we are executing a deferred opcode.
|
||||
*/
|
||||
@ -635,7 +658,8 @@ acpi_ds_load2_begin_op (
|
||||
}
|
||||
|
||||
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type,
|
||||
ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node));
|
||||
ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH,
|
||||
walk_state, &(node));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -678,8 +702,6 @@ acpi_ds_load2_begin_op (
|
||||
* FUNCTION: acpi_ds_load2_end_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state of the parse tree walk
|
||||
* Op - Op that has been just been completed in the
|
||||
* walk; Arguments have now been evaluated.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -738,7 +760,8 @@ acpi_ds_load2_end_op (
|
||||
|
||||
/* Pop the scope stack */
|
||||
|
||||
if (acpi_ns_opens_scope (object_type) && (op->common.aml_opcode != AML_INT_METHODCALL_OP)) {
|
||||
if (acpi_ns_opens_scope (object_type) &&
|
||||
(op->common.aml_opcode != AML_INT_METHODCALL_OP)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",
|
||||
acpi_ut_get_type_name (object_type), op));
|
||||
|
||||
@ -803,7 +826,7 @@ acpi_ds_load2_end_op (
|
||||
case AML_INDEX_FIELD_OP:
|
||||
|
||||
status = acpi_ds_create_index_field (op, (acpi_handle) arg->common.node,
|
||||
walk_state);
|
||||
walk_state);
|
||||
break;
|
||||
|
||||
case AML_BANK_FIELD_OP:
|
||||
@ -884,14 +907,16 @@ acpi_ds_load2_end_op (
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
case AML_REGION_OP:
|
||||
/*
|
||||
* The op_region is not fully parsed at this time. Only valid argument is the space_id.
|
||||
* (We must save the address of the AML of the address and length operands)
|
||||
* The op_region is not fully parsed at this time. Only valid
|
||||
* argument is the space_id. (We must save the address of the
|
||||
* AML of the address and length operands)
|
||||
*/
|
||||
/*
|
||||
* If we have a valid region, initialize it
|
||||
* Namespace is NOT locked at this point.
|
||||
*/
|
||||
status = acpi_ev_initialize_region (acpi_ns_get_attached_object (node), FALSE);
|
||||
status = acpi_ev_initialize_region (acpi_ns_get_attached_object (node),
|
||||
FALSE);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
/*
|
||||
* If AE_NOT_EXIST is returned, it is not fatal
|
||||
@ -942,15 +967,16 @@ acpi_ds_load2_end_op (
|
||||
if (ACPI_SUCCESS (status)) {
|
||||
/*
|
||||
* Make sure that what we found is indeed a method
|
||||
* We didn't search for a method on purpose, to see if the name would resolve
|
||||
* We didn't search for a method on purpose, to see if the name
|
||||
* would resolve
|
||||
*/
|
||||
if (new_node->type != ACPI_TYPE_METHOD) {
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
}
|
||||
|
||||
/* We could put the returned object (Node) on the object stack for later, but
|
||||
* for now, we will put it in the "op" object that the parser uses, so we
|
||||
* can get it again at the end of this scope
|
||||
/* We could put the returned object (Node) on the object stack for
|
||||
* later, but for now, we will put it in the "op" object that the
|
||||
* parser uses, so we can get it again at the end of this scope
|
||||
*/
|
||||
op->common.node = new_node;
|
||||
}
|
||||
|
@ -50,14 +50,13 @@
|
||||
ACPI_MODULE_NAME ("dswscope")
|
||||
|
||||
|
||||
#define STACK_POP(head) head
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_scope_stack_clear
|
||||
*
|
||||
* PARAMETERS: None
|
||||
* PARAMETERS: walk_state - Current state
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Pop (and free) everything on the scope stack except the
|
||||
* root scope object (which remains at the stack top.)
|
||||
@ -80,7 +79,8 @@ acpi_ds_scope_stack_clear (
|
||||
walk_state->scope_info = scope_info->scope.next;
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
|
||||
"Popped object type (%s)\n", acpi_ut_get_type_name (scope_info->common.value)));
|
||||
"Popped object type (%s)\n",
|
||||
acpi_ut_get_type_name (scope_info->common.value)));
|
||||
acpi_ut_delete_generic_state (scope_info);
|
||||
}
|
||||
}
|
||||
@ -90,8 +90,11 @@ acpi_ds_scope_stack_clear (
|
||||
*
|
||||
* FUNCTION: acpi_ds_scope_stack_push
|
||||
*
|
||||
* PARAMETERS: *Node, - Name to be made current
|
||||
* Type, - Type of frame being pushed
|
||||
* PARAMETERS: Node - Name to be made current
|
||||
* Type - Type of frame being pushed
|
||||
* walk_state - Current state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Push the current scope on the scope stack, and make the
|
||||
* passed Node current.
|
||||
@ -121,7 +124,8 @@ acpi_ds_scope_stack_push (
|
||||
/* Make sure object type is valid */
|
||||
|
||||
if (!acpi_ut_valid_object_type (type)) {
|
||||
ACPI_REPORT_WARNING (("ds_scope_stack_push: Invalid object type: 0x%X\n", type));
|
||||
ACPI_REPORT_WARNING ((
|
||||
"ds_scope_stack_push: Invalid object type: 0x%X\n", type));
|
||||
}
|
||||
|
||||
/* Allocate a new scope object */
|
||||
@ -170,16 +174,11 @@ acpi_ds_scope_stack_push (
|
||||
*
|
||||
* FUNCTION: acpi_ds_scope_stack_pop
|
||||
*
|
||||
* PARAMETERS: Type - The type of frame to be found
|
||||
* PARAMETERS: walk_state - Current state
|
||||
*
|
||||
* DESCRIPTION: Pop the scope stack until a frame of the requested type
|
||||
* is found.
|
||||
* RETURN: Status
|
||||
*
|
||||
* RETURN: Count of frames popped. If no frame of the requested type
|
||||
* was found, the count is returned as a negative number and
|
||||
* the scope stack is emptied (which sets the current scope
|
||||
* to the root). If the scope stack was empty at entry, the
|
||||
* function is a no-op and returns 0.
|
||||
* DESCRIPTION: Pop the scope stack once.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
|
@ -50,67 +50,31 @@
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dswstate")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_result_insert
|
||||
*
|
||||
* PARAMETERS: Object - Object to push
|
||||
* Index - Where to insert the object
|
||||
* walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Insert an object onto this walk's result stack
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
acpi_status
|
||||
acpi_ds_result_insert (
|
||||
void *object,
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
acpi_status
|
||||
acpi_ds_obj_stack_delete_all (
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
ACPI_FUNCTION_NAME ("ds_result_insert");
|
||||
acpi_status
|
||||
acpi_ds_obj_stack_pop_object (
|
||||
union acpi_operand_object **object,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
void *
|
||||
acpi_ds_obj_stack_get_value (
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state);
|
||||
#endif
|
||||
|
||||
state = walk_state->results;
|
||||
if (!state) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result object pushed! State=%p\n",
|
||||
walk_state));
|
||||
return (AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
if (index >= ACPI_OBJ_NUM_OPERANDS) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Index out of range: %X Obj=%p State=%p Num=%X\n",
|
||||
index, object, walk_state, state->results.num_results));
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (!object) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Null Object! Index=%X Obj=%p State=%p Num=%X\n",
|
||||
index, object, walk_state, state->results.num_results));
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
state->results.obj_desc [index] = object;
|
||||
state->results.num_results++;
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
|
||||
"Obj=%p [%s] State=%p Num=%X Cur=%X\n",
|
||||
object, object ? acpi_ut_get_object_type_name ((union acpi_operand_object *) object) : "NULL",
|
||||
walk_state, state->results.num_results, walk_state->current_result));
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -178,7 +142,6 @@ acpi_ds_result_remove (
|
||||
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_result_pop
|
||||
@ -227,15 +190,18 @@ acpi_ds_result_pop (
|
||||
*object = state->results.obj_desc [index -1];
|
||||
state->results.obj_desc [index -1] = NULL;
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] Index=%X State=%p Num=%X\n",
|
||||
*object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
|
||||
"Obj=%p [%s] Index=%X State=%p Num=%X\n",
|
||||
*object,
|
||||
(*object) ? acpi_ut_get_object_type_name (*object) : "NULL",
|
||||
(u32) index -1, walk_state, state->results.num_results));
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result objects! State=%p\n", walk_state));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"No result objects! State=%p\n", walk_state));
|
||||
return (AE_AML_NO_RETURN_VALUE);
|
||||
}
|
||||
|
||||
@ -274,7 +240,8 @@ acpi_ds_result_pop_from_bottom (
|
||||
}
|
||||
|
||||
if (!state->results.num_results) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result objects! State=%p\n", walk_state));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result objects! State=%p\n",
|
||||
walk_state));
|
||||
return (AE_AML_NO_RETURN_VALUE);
|
||||
}
|
||||
|
||||
@ -293,7 +260,8 @@ acpi_ds_result_pop_from_bottom (
|
||||
/* Check for a valid result object */
|
||||
|
||||
if (!*object) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null operand! State=%p #Ops=%X, Index=%X\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Null operand! State=%p #Ops=%X, Index=%X\n",
|
||||
walk_state, state->results.num_results, (u32) index));
|
||||
return (AE_AML_NO_RETURN_VALUE);
|
||||
}
|
||||
@ -344,7 +312,8 @@ acpi_ds_result_push (
|
||||
}
|
||||
|
||||
if (!object) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Object! Obj=%p State=%p Num=%X\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Null Object! Obj=%p State=%p Num=%X\n",
|
||||
object, walk_state, state->results.num_results));
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
@ -437,43 +406,6 @@ acpi_ds_result_stack_pop (
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_delete_all
|
||||
*
|
||||
* PARAMETERS: walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Clear the object stack by deleting all objects that are on it.
|
||||
* Should be used with great care, if at all!
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status
|
||||
acpi_ds_obj_stack_delete_all (
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR ("ds_obj_stack_delete_all", walk_state);
|
||||
|
||||
|
||||
/* The stack size is configurable, but fixed */
|
||||
|
||||
for (i = 0; i < ACPI_OBJ_NUM_OPERANDS; i++) {
|
||||
if (walk_state->operands[i]) {
|
||||
acpi_ut_remove_reference (walk_state->operands[i]);
|
||||
walk_state->operands[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_push
|
||||
@ -517,67 +449,6 @@ acpi_ds_obj_stack_push (
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_pop_object
|
||||
*
|
||||
* PARAMETERS: pop_count - Number of objects/entries to pop
|
||||
* walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT
|
||||
* deleted by this routine.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_obj_stack_pop_object (
|
||||
union acpi_operand_object **object,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
ACPI_FUNCTION_NAME ("ds_obj_stack_pop_object");
|
||||
|
||||
|
||||
/* Check for stack underflow */
|
||||
|
||||
if (walk_state->num_operands == 0) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Missing operand/stack empty! State=%p #Ops=%X\n",
|
||||
walk_state, walk_state->num_operands));
|
||||
*object = NULL;
|
||||
return (AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
/* Pop the stack */
|
||||
|
||||
walk_state->num_operands--;
|
||||
|
||||
/* Check for a valid operand */
|
||||
|
||||
if (!walk_state->operands [walk_state->num_operands]) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Null operand! State=%p #Ops=%X\n",
|
||||
walk_state, walk_state->num_operands));
|
||||
*object = NULL;
|
||||
return (AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
/* Get operand and set stack entry to null */
|
||||
|
||||
*object = walk_state->operands [walk_state->num_operands];
|
||||
walk_state->operands [walk_state->num_operands] = NULL;
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n",
|
||||
*object, acpi_ut_get_object_type_name (*object),
|
||||
walk_state, walk_state->num_operands));
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_pop
|
||||
@ -678,48 +549,6 @@ acpi_ds_obj_stack_pop_and_delete (
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_get_value
|
||||
*
|
||||
* PARAMETERS: Index - Stack index whose value is desired. Based
|
||||
* on the top of the stack (index=0 == top)
|
||||
* walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Retrieve an object from this walk's object stack. Index must
|
||||
* be within the range of the current stack pointer.
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
void *
|
||||
acpi_ds_obj_stack_get_value (
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR ("ds_obj_stack_get_value", walk_state);
|
||||
|
||||
|
||||
/* Can't do it if the stack is empty */
|
||||
|
||||
if (walk_state->num_operands == 0) {
|
||||
return_PTR (NULL);
|
||||
}
|
||||
|
||||
/* or if the index is past the top of the stack */
|
||||
|
||||
if (index > (walk_state->num_operands - (u32) 1)) {
|
||||
return_PTR (NULL);
|
||||
}
|
||||
|
||||
return_PTR (walk_state->operands[(acpi_native_uint)(walk_state->num_operands - 1) -
|
||||
index]);
|
||||
}
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_get_current_walk_state
|
||||
@ -757,11 +586,11 @@ acpi_ds_get_current_walk_state (
|
||||
* FUNCTION: acpi_ds_push_walk_state
|
||||
*
|
||||
* PARAMETERS: walk_state - State to push
|
||||
* walk_list - The list that owns the walk stack
|
||||
* Thread - Thread state object
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Place the walk_state at the head of the state list.
|
||||
* DESCRIPTION: Place the Thread state at the head of the state list.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -784,9 +613,9 @@ acpi_ds_push_walk_state (
|
||||
*
|
||||
* FUNCTION: acpi_ds_pop_walk_state
|
||||
*
|
||||
* PARAMETERS: walk_list - The list that owns the walk stack
|
||||
* PARAMETERS: Thread - Current thread state
|
||||
*
|
||||
* RETURN: A walk_state object popped from the stack
|
||||
* RETURN: A walk_state object popped from the thread's stack
|
||||
*
|
||||
* DESCRIPTION: Remove and return the walkstate object that is at the head of
|
||||
* the walk stack for the given walk list. NULL indicates that
|
||||
@ -814,7 +643,7 @@ acpi_ds_pop_walk_state (
|
||||
/*
|
||||
* Don't clear the NEXT field, this serves as an indicator
|
||||
* that there is a parent WALK STATE
|
||||
* NO: walk_state->Next = NULL;
|
||||
* Do Not: walk_state->Next = NULL;
|
||||
*/
|
||||
}
|
||||
|
||||
@ -826,7 +655,9 @@ acpi_ds_pop_walk_state (
|
||||
*
|
||||
* FUNCTION: acpi_ds_create_walk_state
|
||||
*
|
||||
* PARAMETERS: Origin - Starting point for this walk
|
||||
* PARAMETERS: owner_id - ID for object creation
|
||||
* Origin - Starting point for this walk
|
||||
* mth_desc - Method object
|
||||
* Thread - Current thread state
|
||||
*
|
||||
* RETURN: Pointer to the new walk state.
|
||||
@ -896,8 +727,7 @@ acpi_ds_create_walk_state (
|
||||
* method_node - Control method NS node, if any
|
||||
* aml_start - Start of AML
|
||||
* aml_length - Length of AML
|
||||
* Params - Method args, if any
|
||||
* return_obj_desc - Where to store a return object, if any
|
||||
* Info - Method info block (params, etc.)
|
||||
* pass_number - 1, 2, or 3
|
||||
*
|
||||
* RETURN: Status
|
||||
@ -931,7 +761,7 @@ acpi_ds_init_aml_walk (
|
||||
|
||||
/* The next_op of the next_walk will be the beginning of the method */
|
||||
|
||||
walk_state->next_op = NULL;
|
||||
walk_state->next_op = NULL;
|
||||
|
||||
if (info) {
|
||||
if (info->parameter_type == ACPI_PARAM_GPE) {
|
||||
@ -939,8 +769,8 @@ acpi_ds_init_aml_walk (
|
||||
info->parameters);
|
||||
}
|
||||
else {
|
||||
walk_state->params = info->parameters;
|
||||
walk_state->caller_return_desc = &info->return_object;
|
||||
walk_state->params = info->parameters;
|
||||
walk_state->caller_return_desc = &info->return_object;
|
||||
}
|
||||
}
|
||||
|
||||
@ -964,7 +794,8 @@ acpi_ds_init_aml_walk (
|
||||
|
||||
/* Init the method arguments */
|
||||
|
||||
status = acpi_ds_method_data_init_args (walk_state->params, ACPI_METHOD_NUM_ARGS, walk_state);
|
||||
status = acpi_ds_method_data_init_args (walk_state->params,
|
||||
ACPI_METHOD_NUM_ARGS, walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
@ -1031,12 +862,14 @@ acpi_ds_delete_walk_state (
|
||||
}
|
||||
|
||||
if (walk_state->data_type != ACPI_DESC_TYPE_WALK) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p is not a valid walk state\n", walk_state));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p is not a valid walk state\n",
|
||||
walk_state));
|
||||
return;
|
||||
}
|
||||
|
||||
if (walk_state->parser_state.scope) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n",
|
||||
walk_state));
|
||||
}
|
||||
|
||||
/* Always must free any linked control states */
|
||||
@ -1078,7 +911,7 @@ acpi_ds_delete_walk_state (
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Purge the global state object cache. Used during subsystem
|
||||
* termination.
|
||||
@ -1098,3 +931,200 @@ acpi_ds_delete_walk_state_cache (
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_result_insert
|
||||
*
|
||||
* PARAMETERS: Object - Object to push
|
||||
* Index - Where to insert the object
|
||||
* walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Insert an object onto this walk's result stack
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_result_insert (
|
||||
void *object,
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
|
||||
|
||||
ACPI_FUNCTION_NAME ("ds_result_insert");
|
||||
|
||||
|
||||
state = walk_state->results;
|
||||
if (!state) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No result object pushed! State=%p\n",
|
||||
walk_state));
|
||||
return (AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
if (index >= ACPI_OBJ_NUM_OPERANDS) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Index out of range: %X Obj=%p State=%p Num=%X\n",
|
||||
index, object, walk_state, state->results.num_results));
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (!object) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Null Object! Index=%X Obj=%p State=%p Num=%X\n",
|
||||
index, object, walk_state, state->results.num_results));
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
state->results.obj_desc [index] = object;
|
||||
state->results.num_results++;
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
|
||||
"Obj=%p [%s] State=%p Num=%X Cur=%X\n",
|
||||
object, object ? acpi_ut_get_object_type_name ((union acpi_operand_object *) object) : "NULL",
|
||||
walk_state, state->results.num_results, walk_state->current_result));
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_delete_all
|
||||
*
|
||||
* PARAMETERS: walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Clear the object stack by deleting all objects that are on it.
|
||||
* Should be used with great care, if at all!
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_obj_stack_delete_all (
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR ("ds_obj_stack_delete_all", walk_state);
|
||||
|
||||
|
||||
/* The stack size is configurable, but fixed */
|
||||
|
||||
for (i = 0; i < ACPI_OBJ_NUM_OPERANDS; i++) {
|
||||
if (walk_state->operands[i]) {
|
||||
acpi_ut_remove_reference (walk_state->operands[i]);
|
||||
walk_state->operands[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_pop_object
|
||||
*
|
||||
* PARAMETERS: Object - Where to return the popped object
|
||||
* walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT
|
||||
* deleted by this routine.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_obj_stack_pop_object (
|
||||
union acpi_operand_object **object,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
ACPI_FUNCTION_NAME ("ds_obj_stack_pop_object");
|
||||
|
||||
|
||||
/* Check for stack underflow */
|
||||
|
||||
if (walk_state->num_operands == 0) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Missing operand/stack empty! State=%p #Ops=%X\n",
|
||||
walk_state, walk_state->num_operands));
|
||||
*object = NULL;
|
||||
return (AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
/* Pop the stack */
|
||||
|
||||
walk_state->num_operands--;
|
||||
|
||||
/* Check for a valid operand */
|
||||
|
||||
if (!walk_state->operands [walk_state->num_operands]) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Null operand! State=%p #Ops=%X\n",
|
||||
walk_state, walk_state->num_operands));
|
||||
*object = NULL;
|
||||
return (AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
/* Get operand and set stack entry to null */
|
||||
|
||||
*object = walk_state->operands [walk_state->num_operands];
|
||||
walk_state->operands [walk_state->num_operands] = NULL;
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n",
|
||||
*object, acpi_ut_get_object_type_name (*object),
|
||||
walk_state, walk_state->num_operands));
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_obj_stack_get_value
|
||||
*
|
||||
* PARAMETERS: Index - Stack index whose value is desired. Based
|
||||
* on the top of the stack (index=0 == top)
|
||||
* walk_state - Current Walk state
|
||||
*
|
||||
* RETURN: Pointer to the requested operand
|
||||
*
|
||||
* DESCRIPTION: Retrieve an object from this walk's operand stack. Index must
|
||||
* be within the range of the current stack pointer.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void *
|
||||
acpi_ds_obj_stack_get_value (
|
||||
u32 index,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR ("ds_obj_stack_get_value", walk_state);
|
||||
|
||||
|
||||
/* Can't do it if the stack is empty */
|
||||
|
||||
if (walk_state->num_operands == 0) {
|
||||
return_PTR (NULL);
|
||||
}
|
||||
|
||||
/* or if the index is past the top of the stack */
|
||||
|
||||
if (index > (walk_state->num_operands - (u32) 1)) {
|
||||
return_PTR (NULL);
|
||||
}
|
||||
|
||||
return_PTR (walk_state->operands[(acpi_native_uint)(walk_state->num_operands - 1) -
|
||||
index]);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/io.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
@ -49,17 +50,19 @@ ACPI_MODULE_NAME ("acpi_ec")
|
||||
|
||||
#define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */
|
||||
#define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */
|
||||
#define ACPI_EC_FLAG_BURST 0x10 /* burst mode */
|
||||
#define ACPI_EC_FLAG_SCI 0x20 /* EC-SCI occurred */
|
||||
|
||||
#define ACPI_EC_EVENT_OBF 0x01 /* Output buffer full */
|
||||
#define ACPI_EC_EVENT_IBE 0x02 /* Input buffer empty */
|
||||
|
||||
#define ACPI_EC_UDELAY 100 /* Poll @ 100us increments */
|
||||
#define ACPI_EC_UDELAY_COUNT 1000 /* Wait 10ms max. during EC ops */
|
||||
#define ACPI_EC_DELAY 50 /* Wait 50ms max. during EC ops */
|
||||
#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
|
||||
|
||||
#define ACPI_EC_COMMAND_READ 0x80
|
||||
#define ACPI_EC_COMMAND_WRITE 0x81
|
||||
#define ACPI_EC_BURST_ENABLE 0x82
|
||||
#define ACPI_EC_BURST_DISABLE 0x83
|
||||
#define ACPI_EC_COMMAND_QUERY 0x84
|
||||
|
||||
static int acpi_ec_add (struct acpi_device *device);
|
||||
@ -87,7 +90,11 @@ struct acpi_ec {
|
||||
struct acpi_generic_address command_addr;
|
||||
struct acpi_generic_address data_addr;
|
||||
unsigned long global_lock;
|
||||
spinlock_t lock;
|
||||
unsigned int expect_event;
|
||||
atomic_t leaving_burst; /* 0 : No, 1 : Yes, 2: abort*/
|
||||
atomic_t pending_gpe;
|
||||
struct semaphore sem;
|
||||
wait_queue_head_t wait;
|
||||
};
|
||||
|
||||
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
|
||||
@ -100,42 +107,122 @@ static struct acpi_device *first_ec;
|
||||
Transaction Management
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static int
|
||||
acpi_ec_wait (
|
||||
struct acpi_ec *ec,
|
||||
u8 event)
|
||||
static inline u32 acpi_ec_read_status(struct acpi_ec *ec)
|
||||
{
|
||||
u32 acpi_ec_status = 0;
|
||||
u32 i = ACPI_EC_UDELAY_COUNT;
|
||||
u32 status = 0;
|
||||
|
||||
if (!ec)
|
||||
return -EINVAL;
|
||||
|
||||
/* Poll the EC status register waiting for the event to occur. */
|
||||
switch (event) {
|
||||
case ACPI_EC_EVENT_OBF:
|
||||
do {
|
||||
acpi_hw_low_level_read(8, &acpi_ec_status, &ec->status_addr);
|
||||
if (acpi_ec_status & ACPI_EC_FLAG_OBF)
|
||||
return 0;
|
||||
udelay(ACPI_EC_UDELAY);
|
||||
} while (--i>0);
|
||||
break;
|
||||
case ACPI_EC_EVENT_IBE:
|
||||
do {
|
||||
acpi_hw_low_level_read(8, &acpi_ec_status, &ec->status_addr);
|
||||
if (!(acpi_ec_status & ACPI_EC_FLAG_IBF))
|
||||
return 0;
|
||||
udelay(ACPI_EC_UDELAY);
|
||||
} while (--i>0);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return -ETIME;
|
||||
acpi_hw_low_level_read(8, &status, &ec->status_addr);
|
||||
return status;
|
||||
}
|
||||
|
||||
static int acpi_ec_wait(struct acpi_ec *ec, unsigned int event)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_wait");
|
||||
|
||||
ec->expect_event = event;
|
||||
smp_mb();
|
||||
|
||||
result = wait_event_interruptible_timeout(ec->wait,
|
||||
!ec->expect_event,
|
||||
msecs_to_jiffies(ACPI_EC_DELAY));
|
||||
|
||||
ec->expect_event = 0;
|
||||
smp_mb();
|
||||
|
||||
if (result < 0){
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR," result = %d ", result));
|
||||
return_VALUE(result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that the event in question has actually happened by
|
||||
* querying EC status. Do the check even if operation timed-out
|
||||
* to make sure that we did not miss interrupt.
|
||||
*/
|
||||
switch (event) {
|
||||
case ACPI_EC_EVENT_OBF:
|
||||
if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_OBF)
|
||||
return_VALUE(0);
|
||||
break;
|
||||
|
||||
case ACPI_EC_EVENT_IBE:
|
||||
if (~acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
|
||||
return_VALUE(0);
|
||||
break;
|
||||
}
|
||||
|
||||
return_VALUE(-ETIME);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
acpi_ec_enter_burst_mode (
|
||||
struct acpi_ec *ec)
|
||||
{
|
||||
u32 tmp = 0;
|
||||
int status = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_enter_burst_mode");
|
||||
|
||||
status = acpi_ec_read_status(ec);
|
||||
if (status != -EINVAL &&
|
||||
!(status & ACPI_EC_FLAG_BURST)){
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"entering burst mode \n"));
|
||||
acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE, &ec->command_addr);
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
|
||||
if (status){
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR," status = %d\n", status));
|
||||
return_VALUE(-EINVAL);
|
||||
}
|
||||
acpi_hw_low_level_read(8, &tmp, &ec->data_addr);
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
if(tmp != 0x90 ) {/* Burst ACK byte*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,"Ack failed \n"));
|
||||
return_VALUE(-EINVAL);
|
||||
}
|
||||
} else
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"already be in burst mode \n"));
|
||||
atomic_set(&ec->leaving_burst , 0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_ec_leave_burst_mode (
|
||||
struct acpi_ec *ec)
|
||||
{
|
||||
int status =0;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
|
||||
|
||||
atomic_set(&ec->leaving_burst , 1);
|
||||
status = acpi_ec_read_status(ec);
|
||||
if (status != -EINVAL &&
|
||||
(status & ACPI_EC_FLAG_BURST)){
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"leaving burst mode\n"));
|
||||
acpi_hw_low_level_write(8, ACPI_EC_BURST_DISABLE, &ec->command_addr);
|
||||
status = acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
|
||||
if (status){
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,"------->wait fail\n"));
|
||||
return_VALUE(-EINVAL);
|
||||
}
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
status = acpi_ec_read_status(ec);
|
||||
if (status != -EINVAL &&
|
||||
(status & ACPI_EC_FLAG_BURST)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,"------->status fail\n"));
|
||||
return_VALUE(-EINVAL);
|
||||
}
|
||||
}else
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"already be in Non-burst mode \n"));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"leaving burst mode\n"));
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_ec_read (
|
||||
@ -143,16 +230,15 @@ acpi_ec_read (
|
||||
u8 address,
|
||||
u32 *data)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
int result = 0;
|
||||
unsigned long flags = 0;
|
||||
u32 glk = 0;
|
||||
int status = 0;
|
||||
u32 glk;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_read");
|
||||
|
||||
if (!ec || !data)
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
retry:
|
||||
*data = 0;
|
||||
|
||||
if (ec->global_lock) {
|
||||
@ -160,32 +246,50 @@ acpi_ec_read (
|
||||
if (ACPI_FAILURE(status))
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ec->lock, flags);
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
down(&ec->sem);
|
||||
|
||||
if(acpi_ec_enter_burst_mode(ec))
|
||||
goto end;
|
||||
|
||||
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, &ec->command_addr);
|
||||
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
if (result)
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
if (status) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
acpi_hw_low_level_write(8, address, &ec->data_addr);
|
||||
result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
|
||||
if (result)
|
||||
status= acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
|
||||
if (status){
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
goto end;
|
||||
|
||||
}
|
||||
|
||||
acpi_hw_low_level_read(8, data, &ec->data_addr);
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
|
||||
*data, address));
|
||||
|
||||
|
||||
end:
|
||||
spin_unlock_irqrestore(&ec->lock, flags);
|
||||
acpi_ec_leave_burst_mode(ec);
|
||||
up(&ec->sem);
|
||||
|
||||
if (ec->global_lock)
|
||||
acpi_release_global_lock(glk);
|
||||
|
||||
return_VALUE(result);
|
||||
if(atomic_read(&ec->leaving_burst) == 2){
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n"));
|
||||
while(atomic_read(&ec->pending_gpe)){
|
||||
msleep(1);
|
||||
}
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
return_VALUE(status);
|
||||
}
|
||||
|
||||
|
||||
@ -195,49 +299,80 @@ acpi_ec_write (
|
||||
u8 address,
|
||||
u8 data)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
unsigned long flags = 0;
|
||||
u32 glk = 0;
|
||||
int status = 0;
|
||||
u32 glk;
|
||||
u32 tmp;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_write");
|
||||
|
||||
if (!ec)
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
retry:
|
||||
if (ec->global_lock) {
|
||||
status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
|
||||
if (ACPI_FAILURE(status))
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ec->lock, flags);
|
||||
WARN_ON(in_interrupt());
|
||||
down(&ec->sem);
|
||||
|
||||
if(acpi_ec_enter_burst_mode(ec))
|
||||
goto end;
|
||||
|
||||
status = acpi_ec_read_status(ec);
|
||||
if (status != -EINVAL &&
|
||||
!(status & ACPI_EC_FLAG_BURST)){
|
||||
acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE, &ec->command_addr);
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
|
||||
if (status)
|
||||
goto end;
|
||||
acpi_hw_low_level_read(8, &tmp, &ec->data_addr);
|
||||
if(tmp != 0x90 ) /* Burst ACK byte*/
|
||||
goto end;
|
||||
}
|
||||
/*Now we are in burst mode*/
|
||||
|
||||
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, &ec->command_addr);
|
||||
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
if (result)
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
if (status){
|
||||
goto end;
|
||||
}
|
||||
|
||||
acpi_hw_low_level_write(8, address, &ec->data_addr);
|
||||
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
if (result)
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
if (status){
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
goto end;
|
||||
}
|
||||
|
||||
acpi_hw_low_level_write(8, data, &ec->data_addr);
|
||||
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
if (result)
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
if (status)
|
||||
goto end;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
|
||||
data, address));
|
||||
|
||||
end:
|
||||
spin_unlock_irqrestore(&ec->lock, flags);
|
||||
acpi_ec_leave_burst_mode(ec);
|
||||
up(&ec->sem);
|
||||
|
||||
if (ec->global_lock)
|
||||
acpi_release_global_lock(glk);
|
||||
|
||||
return_VALUE(result);
|
||||
if(atomic_read(&ec->leaving_burst) == 2){
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n"));
|
||||
while(atomic_read(&ec->pending_gpe)){
|
||||
msleep(1);
|
||||
}
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
return_VALUE(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -289,16 +424,13 @@ acpi_ec_query (
|
||||
struct acpi_ec *ec,
|
||||
u32 *data)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
unsigned long flags = 0;
|
||||
u32 glk = 0;
|
||||
int status = 0;
|
||||
u32 glk;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_query");
|
||||
|
||||
if (!ec || !data)
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
*data = 0;
|
||||
|
||||
if (ec->global_lock) {
|
||||
@ -307,29 +439,39 @@ acpi_ec_query (
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
down(&ec->sem);
|
||||
if(acpi_ec_enter_burst_mode(ec))
|
||||
goto end;
|
||||
/*
|
||||
* Query the EC to find out which _Qxx method we need to evaluate.
|
||||
* Note that successful completion of the query causes the ACPI_EC_SCI
|
||||
* bit to be cleared (and thus clearing the interrupt source).
|
||||
*/
|
||||
spin_lock_irqsave(&ec->lock, flags);
|
||||
|
||||
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY, &ec->command_addr);
|
||||
result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
|
||||
if (result)
|
||||
status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
|
||||
if (status){
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
goto end;
|
||||
|
||||
}
|
||||
|
||||
acpi_hw_low_level_read(8, data, &ec->data_addr);
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
if (!*data)
|
||||
result = -ENODATA;
|
||||
status = -ENODATA;
|
||||
|
||||
end:
|
||||
spin_unlock_irqrestore(&ec->lock, flags);
|
||||
acpi_ec_leave_burst_mode(ec);
|
||||
up(&ec->sem);
|
||||
|
||||
if (ec->global_lock)
|
||||
acpi_release_global_lock(glk);
|
||||
|
||||
return_VALUE(result);
|
||||
if(atomic_read(&ec->leaving_burst) == 2){
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n"));
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
status = -ENODATA;
|
||||
}
|
||||
return_VALUE(status);
|
||||
}
|
||||
|
||||
|
||||
@ -347,42 +489,29 @@ acpi_ec_gpe_query (
|
||||
void *ec_cxt)
|
||||
{
|
||||
struct acpi_ec *ec = (struct acpi_ec *) ec_cxt;
|
||||
u32 value = 0;
|
||||
unsigned long flags = 0;
|
||||
u32 value;
|
||||
int result = -ENODATA;
|
||||
static char object_name[5] = {'_','Q','0','0','\0'};
|
||||
const char hex[] = {'0','1','2','3','4','5','6','7',
|
||||
'8','9','A','B','C','D','E','F'};
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_gpe_query");
|
||||
|
||||
if (!ec_cxt)
|
||||
goto end;
|
||||
if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_SCI)
|
||||
result = acpi_ec_query(ec, &value);
|
||||
|
||||
spin_lock_irqsave(&ec->lock, flags);
|
||||
acpi_hw_low_level_read(8, &value, &ec->command_addr);
|
||||
spin_unlock_irqrestore(&ec->lock, flags);
|
||||
|
||||
/* TBD: Implement asynch events!
|
||||
* NOTE: All we care about are EC-SCI's. Other EC events are
|
||||
* handled via polling (yuck!). This is because some systems
|
||||
* treat EC-SCIs as level (versus EDGE!) triggered, preventing
|
||||
* a purely interrupt-driven approach (grumble, grumble).
|
||||
*/
|
||||
if (!(value & ACPI_EC_FLAG_SCI))
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
if (acpi_ec_query(ec, &value))
|
||||
goto end;
|
||||
|
||||
object_name[2] = hex[((value >> 4) & 0x0F)];
|
||||
object_name[3] = hex[(value & 0x0F)];
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name));
|
||||
|
||||
acpi_evaluate_object(ec->handle, object_name, NULL, NULL);
|
||||
|
||||
end:
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
end:
|
||||
atomic_dec(&ec->pending_gpe);
|
||||
return;
|
||||
}
|
||||
|
||||
static u32
|
||||
@ -390,6 +519,7 @@ acpi_ec_gpe_handler (
|
||||
void *data)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
u32 value;
|
||||
struct acpi_ec *ec = (struct acpi_ec *) data;
|
||||
|
||||
if (!ec)
|
||||
@ -397,13 +527,41 @@ acpi_ec_gpe_handler (
|
||||
|
||||
acpi_disable_gpe(NULL, ec->gpe_bit, ACPI_ISR);
|
||||
|
||||
status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
|
||||
acpi_ec_gpe_query, ec);
|
||||
value = acpi_ec_read_status(ec);
|
||||
|
||||
if (status == AE_OK)
|
||||
return ACPI_INTERRUPT_HANDLED;
|
||||
else
|
||||
return ACPI_INTERRUPT_NOT_HANDLED;
|
||||
if((value & ACPI_EC_FLAG_IBF) &&
|
||||
!(value & ACPI_EC_FLAG_BURST) &&
|
||||
(atomic_read(&ec->leaving_burst) == 0)) {
|
||||
/*
|
||||
* the embedded controller disables
|
||||
* burst mode for any reason other
|
||||
* than the burst disable command
|
||||
* to process critical event.
|
||||
*/
|
||||
atomic_set(&ec->leaving_burst , 2); /* block current pending transaction
|
||||
and retry */
|
||||
wake_up(&ec->wait);
|
||||
}else {
|
||||
if ((ec->expect_event == ACPI_EC_EVENT_OBF &&
|
||||
(value & ACPI_EC_FLAG_OBF)) ||
|
||||
(ec->expect_event == ACPI_EC_EVENT_IBE &&
|
||||
!(value & ACPI_EC_FLAG_IBF))) {
|
||||
ec->expect_event = 0;
|
||||
wake_up(&ec->wait);
|
||||
return ACPI_INTERRUPT_HANDLED;
|
||||
}
|
||||
}
|
||||
|
||||
if (value & ACPI_EC_FLAG_SCI){
|
||||
atomic_add(1, &ec->pending_gpe) ;
|
||||
status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
|
||||
acpi_ec_gpe_query, ec);
|
||||
return status == AE_OK ?
|
||||
ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
|
||||
}
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_ISR);
|
||||
return status == AE_OK ?
|
||||
ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
@ -421,10 +579,8 @@ acpi_ec_space_setup (
|
||||
* The EC object is in the handler context and is needed
|
||||
* when calling the acpi_ec_space_handler.
|
||||
*/
|
||||
if(function == ACPI_REGION_DEACTIVATE)
|
||||
*return_context = NULL;
|
||||
else
|
||||
*return_context = handler_context;
|
||||
*return_context = (function != ACPI_REGION_DEACTIVATE) ?
|
||||
handler_context : NULL;
|
||||
|
||||
return AE_OK;
|
||||
}
|
||||
@ -441,7 +597,7 @@ acpi_ec_space_handler (
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_ec *ec = NULL;
|
||||
u32 temp = 0;
|
||||
u64 temp = *value;
|
||||
acpi_integer f_v = 0;
|
||||
int i = 0;
|
||||
|
||||
@ -450,10 +606,9 @@ acpi_ec_space_handler (
|
||||
if ((address > 0xFF) || !value || !handler_context)
|
||||
return_VALUE(AE_BAD_PARAMETER);
|
||||
|
||||
if(bit_width != 8) {
|
||||
if (bit_width != 8 && acpi_strict) {
|
||||
printk(KERN_WARNING PREFIX "acpi_ec_space_handler: bit_width should be 8\n");
|
||||
if (acpi_strict)
|
||||
return_VALUE(AE_BAD_PARAMETER);
|
||||
return_VALUE(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
ec = (struct acpi_ec *) handler_context;
|
||||
@ -461,11 +616,11 @@ acpi_ec_space_handler (
|
||||
next_byte:
|
||||
switch (function) {
|
||||
case ACPI_READ:
|
||||
result = acpi_ec_read(ec, (u8) address, &temp);
|
||||
*value = (acpi_integer) temp;
|
||||
temp = 0;
|
||||
result = acpi_ec_read(ec, (u8) address, (u32 *)&temp);
|
||||
break;
|
||||
case ACPI_WRITE:
|
||||
result = acpi_ec_write(ec, (u8) address, (u8) *value);
|
||||
result = acpi_ec_write(ec, (u8) address, (u8) temp);
|
||||
break;
|
||||
default:
|
||||
result = -EINVAL;
|
||||
@ -474,19 +629,18 @@ next_byte:
|
||||
}
|
||||
|
||||
bit_width -= 8;
|
||||
if(bit_width){
|
||||
|
||||
if(function == ACPI_READ)
|
||||
f_v |= (acpi_integer) (*value) << 8*i;
|
||||
if(function == ACPI_WRITE)
|
||||
(*value) >>=8;
|
||||
if (bit_width) {
|
||||
if (function == ACPI_READ)
|
||||
f_v |= temp << 8 * i;
|
||||
if (function == ACPI_WRITE)
|
||||
temp >>= 8;
|
||||
i++;
|
||||
address++;
|
||||
goto next_byte;
|
||||
}
|
||||
|
||||
|
||||
if(function == ACPI_READ){
|
||||
f_v |= (acpi_integer) (*value) << 8*i;
|
||||
if (function == ACPI_READ) {
|
||||
f_v |= temp << 8 * i;
|
||||
*value = f_v;
|
||||
}
|
||||
|
||||
@ -505,8 +659,6 @@ out:
|
||||
default:
|
||||
return_VALUE(AE_OK);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -533,6 +685,7 @@ acpi_ec_read_info (struct seq_file *seq, void *offset)
|
||||
(u32) ec->status_addr.address, (u32) ec->data_addr.address);
|
||||
seq_printf(seq, "use global lock: %s\n",
|
||||
ec->global_lock?"yes":"no");
|
||||
acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
|
||||
|
||||
end:
|
||||
return_VALUE(0);
|
||||
@ -555,7 +708,7 @@ static int
|
||||
acpi_ec_add_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_add_fs");
|
||||
|
||||
@ -606,9 +759,9 @@ static int
|
||||
acpi_ec_add (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_ec *ec = NULL;
|
||||
int result;
|
||||
acpi_status status;
|
||||
struct acpi_ec *ec;
|
||||
unsigned long uid;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_add");
|
||||
@ -623,7 +776,10 @@ acpi_ec_add (
|
||||
|
||||
ec->handle = device->handle;
|
||||
ec->uid = -1;
|
||||
spin_lock_init(&ec->lock);
|
||||
atomic_set(&ec->pending_gpe, 0);
|
||||
atomic_set(&ec->leaving_burst , 1);
|
||||
init_MUTEX(&ec->sem);
|
||||
init_waitqueue_head(&ec->wait);
|
||||
strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
|
||||
strcpy(acpi_device_class(device), ACPI_EC_CLASS);
|
||||
acpi_driver_data(device) = ec;
|
||||
@ -637,7 +793,7 @@ acpi_ec_add (
|
||||
if (ec_ecdt && ec_ecdt->uid == uid) {
|
||||
acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
|
||||
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
|
||||
|
||||
|
||||
acpi_remove_gpe_handler(NULL, ec_ecdt->gpe_bit, &acpi_ec_gpe_handler);
|
||||
|
||||
kfree(ec_ecdt);
|
||||
@ -677,7 +833,7 @@ acpi_ec_remove (
|
||||
struct acpi_device *device,
|
||||
int type)
|
||||
{
|
||||
struct acpi_ec *ec = NULL;
|
||||
struct acpi_ec *ec;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_remove");
|
||||
|
||||
@ -732,8 +888,8 @@ static int
|
||||
acpi_ec_start (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_ec *ec = NULL;
|
||||
acpi_status status;
|
||||
struct acpi_ec *ec;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_start");
|
||||
|
||||
@ -789,8 +945,8 @@ acpi_ec_stop (
|
||||
struct acpi_device *device,
|
||||
int type)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_ec *ec = NULL;
|
||||
acpi_status status;
|
||||
struct acpi_ec *ec;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_stop");
|
||||
|
||||
@ -832,7 +988,6 @@ acpi_fake_ecdt_callback (
|
||||
status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec_ecdt->gpe_bit);
|
||||
if (ACPI_FAILURE(status))
|
||||
return status;
|
||||
spin_lock_init(&ec_ecdt->lock);
|
||||
ec_ecdt->global_lock = TRUE;
|
||||
ec_ecdt->handle = handle;
|
||||
|
||||
@ -890,7 +1045,7 @@ acpi_ec_get_real_ecdt(void)
|
||||
acpi_status status;
|
||||
struct acpi_table_ecdt *ecdt_ptr;
|
||||
|
||||
status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING,
|
||||
status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING,
|
||||
(struct acpi_table_header **) &ecdt_ptr);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
@ -905,11 +1060,12 @@ acpi_ec_get_real_ecdt(void)
|
||||
return -ENOMEM;
|
||||
memset(ec_ecdt, 0, sizeof(struct acpi_ec));
|
||||
|
||||
init_MUTEX(&ec_ecdt->sem);
|
||||
init_waitqueue_head(&ec_ecdt->wait);
|
||||
ec_ecdt->command_addr = ecdt_ptr->ec_control;
|
||||
ec_ecdt->status_addr = ecdt_ptr->ec_control;
|
||||
ec_ecdt->data_addr = ecdt_ptr->ec_data;
|
||||
ec_ecdt->gpe_bit = ecdt_ptr->gpe_bit;
|
||||
spin_lock_init(&ec_ecdt->lock);
|
||||
/* use the GL just to be safe */
|
||||
ec_ecdt->global_lock = TRUE;
|
||||
ec_ecdt->uid = ecdt_ptr->uid;
|
||||
@ -978,7 +1134,7 @@ error:
|
||||
|
||||
static int __init acpi_ec_init (void)
|
||||
{
|
||||
int result = 0;
|
||||
int result;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ec_init");
|
||||
|
||||
|
@ -47,6 +47,16 @@
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME ("evevent")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_fixed_event_initialize (
|
||||
void);
|
||||
|
||||
static u32
|
||||
acpi_ev_fixed_event_dispatch (
|
||||
u32 event);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -56,7 +66,7 @@
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Initialize global data structures for events.
|
||||
* DESCRIPTION: Initialize global data structures for ACPI events (Fixed, GPE)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -78,9 +88,9 @@ acpi_ev_initialize_events (
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the Fixed and General Purpose Events. This is
|
||||
* done prior to enabling SCIs to prevent interrupts from
|
||||
* occurring before handers are installed.
|
||||
* Initialize the Fixed and General Purpose Events. This is done prior to
|
||||
* enabling SCIs to prevent interrupts from occurring before the handlers are
|
||||
* installed.
|
||||
*/
|
||||
status = acpi_ev_fixed_event_initialize ();
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -161,7 +171,7 @@ acpi_ev_install_xrupt_handlers (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ev_fixed_event_initialize (
|
||||
void)
|
||||
{
|
||||
@ -180,7 +190,8 @@ acpi_ev_fixed_event_initialize (
|
||||
/* Enable 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,
|
||||
status = acpi_set_register (
|
||||
acpi_gbl_fixed_event_info[i].enable_register_id,
|
||||
0, ACPI_MTX_LOCK);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return (status);
|
||||
@ -200,7 +211,7 @@ acpi_ev_fixed_event_initialize (
|
||||
*
|
||||
* RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
|
||||
*
|
||||
* DESCRIPTION: Checks the PM status register for fixed events
|
||||
* DESCRIPTION: Checks the PM status register for active fixed events
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -221,8 +232,10 @@ acpi_ev_fixed_event_detect (
|
||||
* Read the fixed feature status and enable registers, as all the cases
|
||||
* depend on their values. Ignore errors here.
|
||||
*/
|
||||
(void) acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
||||
(void) acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
||||
(void) acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS,
|
||||
&fixed_status);
|
||||
(void) acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_ENABLE,
|
||||
&fixed_enable);
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
|
||||
"Fixed Event Block: Enable %08X Status %08X\n",
|
||||
@ -259,7 +272,7 @@ acpi_ev_fixed_event_detect (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u32
|
||||
static u32
|
||||
acpi_ev_fixed_event_dispatch (
|
||||
u32 event)
|
||||
{
|
||||
|
@ -48,6 +48,12 @@
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME ("evgpe")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static void ACPI_SYSTEM_XFACE
|
||||
acpi_ev_asynch_execute_gpe_method (
|
||||
void *context);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -335,8 +341,10 @@ acpi_ev_get_gpe_event_info (
|
||||
gpe_block = acpi_gbl_gpe_fadt_blocks[i];
|
||||
if (gpe_block) {
|
||||
if ((gpe_number >= gpe_block->block_base_number) &&
|
||||
(gpe_number < gpe_block->block_base_number + (gpe_block->register_count * 8))) {
|
||||
return (&gpe_block->event_info[gpe_number - gpe_block->block_base_number]);
|
||||
(gpe_number < gpe_block->block_base_number +
|
||||
(gpe_block->register_count * 8))) {
|
||||
return (&gpe_block->event_info[gpe_number -
|
||||
gpe_block->block_base_number]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -437,7 +445,7 @@ acpi_ev_gpe_detect (
|
||||
"Read GPE Register at GPE%X: Status=%02X, Enable=%02X\n",
|
||||
gpe_register_info->base_gpe_number, status_reg, enable_reg));
|
||||
|
||||
/* First check if there is anything active at all in this register */
|
||||
/* Check if there is anything active at all in this register */
|
||||
|
||||
enabled_status_byte = (u8) (status_reg & enable_reg);
|
||||
if (!enabled_status_byte) {
|
||||
@ -457,8 +465,8 @@ acpi_ev_gpe_detect (
|
||||
* or method.
|
||||
*/
|
||||
int_status |= acpi_ev_gpe_dispatch (
|
||||
&gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j],
|
||||
(u32) j + gpe_register_info->base_gpe_number);
|
||||
&gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j],
|
||||
(u32) j + gpe_register_info->base_gpe_number);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -523,7 +531,8 @@ acpi_ev_asynch_execute_gpe_method (
|
||||
* Take a snapshot of the GPE info for this level - we copy the
|
||||
* info to prevent a race condition with remove_handler/remove_block.
|
||||
*/
|
||||
ACPI_MEMCPY (&local_gpe_event_info, gpe_event_info, sizeof (struct acpi_gpe_event_info));
|
||||
ACPI_MEMCPY (&local_gpe_event_info, gpe_event_info,
|
||||
sizeof (struct acpi_gpe_event_info));
|
||||
|
||||
status = acpi_ut_release_mutex (ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -534,7 +543,8 @@ acpi_ev_asynch_execute_gpe_method (
|
||||
* Must check for control method type dispatch one more
|
||||
* time to avoid race with ev_gpe_install_handler
|
||||
*/
|
||||
if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_METHOD) {
|
||||
if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) ==
|
||||
ACPI_GPE_DISPATCH_METHOD) {
|
||||
/*
|
||||
* Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the _Lxx/_Exx
|
||||
* control method that corresponds to this GPE
|
||||
@ -553,7 +563,8 @@ acpi_ev_asynch_execute_gpe_method (
|
||||
}
|
||||
}
|
||||
|
||||
if ((local_gpe_event_info.flags & ACPI_GPE_XRUPT_TYPE_MASK) == ACPI_GPE_LEVEL_TRIGGERED) {
|
||||
if ((local_gpe_event_info.flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
||||
ACPI_GPE_LEVEL_TRIGGERED) {
|
||||
/*
|
||||
* GPE is level-triggered, we clear the GPE status bit after
|
||||
* handling the event.
|
||||
@ -575,7 +586,7 @@ acpi_ev_asynch_execute_gpe_method (
|
||||
*
|
||||
* FUNCTION: acpi_ev_gpe_dispatch
|
||||
*
|
||||
* PARAMETERS: gpe_event_info - info for this GPE
|
||||
* PARAMETERS: gpe_event_info - Info for this GPE
|
||||
* gpe_number - Number relative to the parent GPE block
|
||||
*
|
||||
* RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
|
||||
@ -602,10 +613,12 @@ acpi_ev_gpe_dispatch (
|
||||
* If edge-triggered, clear the GPE status bit now. Note that
|
||||
* level-triggered events are cleared after the GPE is serviced.
|
||||
*/
|
||||
if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) == ACPI_GPE_EDGE_TRIGGERED) {
|
||||
if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
||||
ACPI_GPE_EDGE_TRIGGERED) {
|
||||
status = acpi_hw_clear_gpe (gpe_event_info);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: %s, Unable to clear GPE[%2X]\n",
|
||||
ACPI_REPORT_ERROR ((
|
||||
"acpi_ev_gpe_dispatch: %s, Unable to clear GPE[%2X]\n",
|
||||
acpi_format_exception (status), gpe_number));
|
||||
return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
@ -639,7 +652,8 @@ acpi_ev_gpe_dispatch (
|
||||
|
||||
/* It is now safe to clear level-triggered events. */
|
||||
|
||||
if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) == ACPI_GPE_LEVEL_TRIGGERED) {
|
||||
if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
||||
ACPI_GPE_LEVEL_TRIGGERED) {
|
||||
status = acpi_hw_clear_gpe (gpe_event_info);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_REPORT_ERROR ((
|
||||
@ -704,7 +718,6 @@ acpi_ev_gpe_dispatch (
|
||||
|
||||
|
||||
#ifdef ACPI_GPE_NOTIFY_CHECK
|
||||
|
||||
/*******************************************************************************
|
||||
* TBD: NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED
|
||||
*
|
||||
|
@ -48,6 +48,39 @@
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME ("evgpeblk")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_save_method_info (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
void *obj_desc,
|
||||
void **return_value);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_match_prw_and_gpe (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
void *info,
|
||||
void **return_value);
|
||||
|
||||
static struct acpi_gpe_xrupt_info *
|
||||
acpi_ev_get_gpe_xrupt_block (
|
||||
u32 interrupt_level);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_delete_gpe_xrupt (
|
||||
struct acpi_gpe_xrupt_info *gpe_xrupt);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_install_gpe_block (
|
||||
struct acpi_gpe_block_info *gpe_block,
|
||||
u32 interrupt_level);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_create_gpe_info_blocks (
|
||||
struct acpi_gpe_block_info *gpe_block);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -155,7 +188,7 @@ unlock_and_exit:
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_delete_gpe_handlers
|
||||
*
|
||||
@ -190,7 +223,8 @@ acpi_ev_delete_gpe_handlers (
|
||||
for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
|
||||
gpe_event_info = &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j];
|
||||
|
||||
if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_HANDLER) {
|
||||
if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
|
||||
ACPI_GPE_DISPATCH_HANDLER) {
|
||||
ACPI_MEM_FREE (gpe_event_info->dispatch.handler);
|
||||
gpe_event_info->dispatch.handler = NULL;
|
||||
gpe_event_info->flags &= ~ACPI_GPE_DISPATCH_MASK;
|
||||
@ -471,7 +505,7 @@ acpi_ev_get_gpe_xrupt_block (
|
||||
ACPI_FUNCTION_TRACE ("ev_get_gpe_xrupt_block");
|
||||
|
||||
|
||||
/* No need for spin lock since we are not changing any list elements here */
|
||||
/* No need for lock since we are not changing any list elements here */
|
||||
|
||||
next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head;
|
||||
while (next_gpe_xrupt) {
|
||||
@ -619,7 +653,7 @@ acpi_ev_install_gpe_block (
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Install the new block at the end of the list for this interrupt with lock */
|
||||
/* Install the new block at the end of the list with lock */
|
||||
|
||||
acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
|
||||
if (gpe_xrupt_block->gpe_block_list_head) {
|
||||
@ -756,10 +790,12 @@ acpi_ev_create_gpe_info_blocks (
|
||||
* per register. Initialization to zeros is sufficient.
|
||||
*/
|
||||
gpe_event_info = ACPI_MEM_CALLOCATE (
|
||||
((acpi_size) gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) *
|
||||
((acpi_size) gpe_block->register_count *
|
||||
ACPI_GPE_REGISTER_WIDTH) *
|
||||
sizeof (struct acpi_gpe_event_info));
|
||||
if (!gpe_event_info) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not allocate the gpe_event_info table\n"));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Could not allocate the gpe_event_info table\n"));
|
||||
status = AE_NO_MEMORY;
|
||||
goto error_exit;
|
||||
}
|
||||
@ -899,7 +935,8 @@ acpi_ev_create_gpe_block (
|
||||
gpe_block->block_base_number = gpe_block_base_number;
|
||||
gpe_block->node = gpe_device;
|
||||
|
||||
ACPI_MEMCPY (&gpe_block->block_address, gpe_block_address, sizeof (struct acpi_generic_address));
|
||||
ACPI_MEMCPY (&gpe_block->block_address, gpe_block_address,
|
||||
sizeof (struct acpi_generic_address));
|
||||
|
||||
/* Create the register_info and event_info sub-structures */
|
||||
|
||||
@ -1061,8 +1098,9 @@ acpi_ev_gpe_initialize (
|
||||
|
||||
/* Install GPE Block 0 */
|
||||
|
||||
status = acpi_ev_create_gpe_block (acpi_gbl_fadt_gpe_device, &acpi_gbl_FADT->xgpe0_blk,
|
||||
register_count0, 0, acpi_gbl_FADT->sci_int, &acpi_gbl_gpe_fadt_blocks[0]);
|
||||
status = acpi_ev_create_gpe_block (acpi_gbl_fadt_gpe_device,
|
||||
&acpi_gbl_FADT->xgpe0_blk, register_count0, 0,
|
||||
acpi_gbl_FADT->sci_int, &acpi_gbl_gpe_fadt_blocks[0]);
|
||||
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_REPORT_ERROR ((
|
||||
@ -1094,8 +1132,9 @@ acpi_ev_gpe_initialize (
|
||||
else {
|
||||
/* Install GPE Block 1 */
|
||||
|
||||
status = acpi_ev_create_gpe_block (acpi_gbl_fadt_gpe_device, &acpi_gbl_FADT->xgpe1_blk,
|
||||
register_count1, acpi_gbl_FADT->gpe1_base,
|
||||
status = acpi_ev_create_gpe_block (acpi_gbl_fadt_gpe_device,
|
||||
&acpi_gbl_FADT->xgpe1_blk, register_count1,
|
||||
acpi_gbl_FADT->gpe1_base,
|
||||
acpi_gbl_FADT->sci_int, &acpi_gbl_gpe_fadt_blocks[1]);
|
||||
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -1109,7 +1148,7 @@ acpi_ev_gpe_initialize (
|
||||
* space. However, GPE0 always starts at GPE number zero.
|
||||
*/
|
||||
gpe_number_max = acpi_gbl_FADT->gpe1_base +
|
||||
((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1);
|
||||
((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,6 +50,35 @@
|
||||
ACPI_MODULE_NAME ("evmisc")
|
||||
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
static const char *acpi_notify_value_names[] =
|
||||
{
|
||||
"Bus Check",
|
||||
"Device Check",
|
||||
"Device Wake",
|
||||
"Eject request",
|
||||
"Device Check Light",
|
||||
"Frequency Mismatch",
|
||||
"Bus Mode Mismatch",
|
||||
"Power Fault"
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static void ACPI_SYSTEM_XFACE
|
||||
acpi_ev_notify_dispatch (
|
||||
void *context);
|
||||
|
||||
static void ACPI_SYSTEM_XFACE
|
||||
acpi_ev_global_lock_thread (
|
||||
void *context);
|
||||
|
||||
static u32
|
||||
acpi_ev_global_lock_handler (
|
||||
void *context);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_is_notify_object
|
||||
@ -98,20 +127,6 @@ acpi_ev_is_notify_object (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
static const char *acpi_notify_value_names[] =
|
||||
{
|
||||
"Bus Check",
|
||||
"Device Check",
|
||||
"Device Wake",
|
||||
"Eject request",
|
||||
"Device Check Light",
|
||||
"Frequency Mismatch",
|
||||
"Bus Mode Mismatch",
|
||||
"Power Fault"
|
||||
};
|
||||
#endif
|
||||
|
||||
acpi_status
|
||||
acpi_ev_queue_notify_request (
|
||||
struct acpi_namespace_node *node,
|
||||
@ -128,9 +143,10 @@ acpi_ev_queue_notify_request (
|
||||
|
||||
/*
|
||||
* For value 3 (Ejection Request), some device method may need to be run.
|
||||
* For value 2 (Device Wake) if _PRW exists, the _PS0 method may need to be run.
|
||||
* For value 2 (Device Wake) if _PRW exists, the _PS0 method may need
|
||||
* to be run.
|
||||
* For value 0x80 (Status Change) on the power button or sleep button,
|
||||
* initiate soft-off or sleep operation?
|
||||
* initiate soft-off or sleep operation?
|
||||
*/
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
|
||||
"Dispatching Notify(%X) on node %p\n", notify_value, node));
|
||||
@ -140,8 +156,9 @@ acpi_ev_queue_notify_request (
|
||||
acpi_notify_value_names[notify_value]));
|
||||
}
|
||||
else {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Notify value: 0x%2.2X **Device Specific**\n",
|
||||
notify_value));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
|
||||
"Notify value: 0x%2.2X **Device Specific**\n",
|
||||
notify_value));
|
||||
}
|
||||
|
||||
/* Get the notify object attached to the NS Node */
|
||||
@ -210,7 +227,7 @@ acpi_ev_queue_notify_request (
|
||||
*
|
||||
* FUNCTION: acpi_ev_notify_dispatch
|
||||
*
|
||||
* PARAMETERS: Context - To be passsed to the notify handler
|
||||
* PARAMETERS: Context - To be passed to the notify handler
|
||||
*
|
||||
* RETURN: None.
|
||||
*
|
||||
@ -219,7 +236,7 @@ acpi_ev_queue_notify_request (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void ACPI_SYSTEM_XFACE
|
||||
static void ACPI_SYSTEM_XFACE
|
||||
acpi_ev_notify_dispatch (
|
||||
void *context)
|
||||
{
|
||||
@ -234,7 +251,8 @@ acpi_ev_notify_dispatch (
|
||||
|
||||
/*
|
||||
* We will invoke a global notify handler if installed.
|
||||
* This is done _before_ we invoke the per-device handler attached to the device.
|
||||
* This is done _before_ we invoke the per-device handler attached
|
||||
* to the device.
|
||||
*/
|
||||
if (notify_info->notify.value <= ACPI_MAX_SYS_NOTIFY) {
|
||||
/* Global system notification handler */
|
||||
@ -256,15 +274,17 @@ acpi_ev_notify_dispatch (
|
||||
/* Invoke the system handler first, if present */
|
||||
|
||||
if (global_handler) {
|
||||
global_handler (notify_info->notify.node, notify_info->notify.value, global_context);
|
||||
global_handler (notify_info->notify.node, notify_info->notify.value,
|
||||
global_context);
|
||||
}
|
||||
|
||||
/* Now invoke the per-device handler, if present */
|
||||
|
||||
handler_obj = notify_info->notify.handler_obj;
|
||||
if (handler_obj) {
|
||||
handler_obj->notify.handler (notify_info->notify.node, notify_info->notify.value,
|
||||
handler_obj->notify.context);
|
||||
handler_obj->notify.handler (notify_info->notify.node,
|
||||
notify_info->notify.value,
|
||||
handler_obj->notify.context);
|
||||
}
|
||||
|
||||
/* All done with the info object */
|
||||
@ -370,7 +390,8 @@ acpi_ev_global_lock_handler (
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_init_global_lock_handler (void)
|
||||
acpi_ev_init_global_lock_handler (
|
||||
void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
@ -380,7 +401,7 @@ acpi_ev_init_global_lock_handler (void)
|
||||
|
||||
acpi_gbl_global_lock_present = TRUE;
|
||||
status = acpi_install_fixed_event_handler (ACPI_EVENT_GLOBAL,
|
||||
acpi_ev_global_lock_handler, NULL);
|
||||
acpi_ev_global_lock_handler, NULL);
|
||||
|
||||
/*
|
||||
* If the global lock does not exist on this platform, the attempt
|
||||
@ -433,8 +454,10 @@ acpi_ev_acquire_global_lock (
|
||||
|
||||
acpi_gbl_global_lock_thread_count++;
|
||||
|
||||
/* If we (OS side vs. BIOS side) have the hardware lock already, we are done */
|
||||
|
||||
/*
|
||||
* If we (OS side vs. BIOS side) have the hardware lock already,
|
||||
* we are done
|
||||
*/
|
||||
if (acpi_gbl_global_lock_acquired) {
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
@ -480,7 +503,8 @@ acpi_ev_acquire_global_lock (
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_release_global_lock (void)
|
||||
acpi_ev_release_global_lock (
|
||||
void)
|
||||
{
|
||||
u8 pending = FALSE;
|
||||
acpi_status status = AE_OK;
|
||||
@ -490,7 +514,8 @@ acpi_ev_release_global_lock (void)
|
||||
|
||||
|
||||
if (!acpi_gbl_global_lock_thread_count) {
|
||||
ACPI_REPORT_WARNING(("Cannot release HW Global Lock, it has not been acquired\n"));
|
||||
ACPI_REPORT_WARNING((
|
||||
"Cannot release HW Global Lock, it has not been acquired\n"));
|
||||
return_ACPI_STATUS (AE_NOT_ACQUIRED);
|
||||
}
|
||||
|
||||
@ -515,7 +540,8 @@ acpi_ev_release_global_lock (void)
|
||||
* register
|
||||
*/
|
||||
if (pending) {
|
||||
status = acpi_set_register (ACPI_BITREG_GLOBAL_LOCK_RELEASE, 1, ACPI_MTX_LOCK);
|
||||
status = acpi_set_register (ACPI_BITREG_GLOBAL_LOCK_RELEASE,
|
||||
1, ACPI_MTX_LOCK);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS (status);
|
||||
@ -535,7 +561,8 @@ acpi_ev_release_global_lock (void)
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ev_terminate (void)
|
||||
acpi_ev_terminate (
|
||||
void)
|
||||
{
|
||||
acpi_native_uint i;
|
||||
acpi_status status;
|
||||
@ -555,7 +582,8 @@ acpi_ev_terminate (void)
|
||||
for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
|
||||
status = acpi_disable_event ((u32) i, 0);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not disable fixed event %d\n", (u32) i));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Could not disable fixed event %d\n", (u32) i));
|
||||
}
|
||||
}
|
||||
|
||||
@ -567,7 +595,8 @@ acpi_ev_terminate (void)
|
||||
|
||||
status = acpi_ev_remove_sci_handler ();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not remove SCI handler\n"));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Could not remove SCI handler\n"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,22 @@ static u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPA
|
||||
ACPI_ADR_SPACE_PCI_CONFIG,
|
||||
ACPI_ADR_SPACE_DATA_TABLE};
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_reg_run (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
void *context,
|
||||
void **return_value);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_install_handler (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
void *context,
|
||||
void **return_value);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -179,8 +195,8 @@ acpi_ev_initialize_op_regions (
|
||||
*
|
||||
* FUNCTION: acpi_ev_execute_reg_method
|
||||
*
|
||||
* PARAMETERS: region_obj - Object structure
|
||||
* Function - Passed to _REG: On (1) or Off (0)
|
||||
* PARAMETERS: region_obj - Region object
|
||||
* Function - Passed to _REG: On (1) or Off (0)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -323,14 +339,16 @@ acpi_ev_address_space_dispatch (
|
||||
if (!region_setup) {
|
||||
/* No initialization routine, exit with error */
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No init routine for region(%p) [%s]\n",
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"No init routine for region(%p) [%s]\n",
|
||||
region_obj, acpi_ut_get_region_name (region_obj->region.space_id)));
|
||||
return_ACPI_STATUS (AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/*
|
||||
* We must exit the interpreter because the region setup will potentially
|
||||
* execute control methods (e.g., _REG method for this region)
|
||||
* We must exit the interpreter because the region
|
||||
* setup will potentially execute control methods
|
||||
* (e.g., _REG method for this region)
|
||||
*/
|
||||
acpi_ex_exit_interpreter ();
|
||||
|
||||
@ -621,7 +639,7 @@ acpi_ev_attach_region (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ev_install_handler (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
@ -848,7 +866,8 @@ acpi_ev_install_space_handler (
|
||||
if (handler_obj->address_space.handler == handler) {
|
||||
/*
|
||||
* It is (relatively) OK to attempt to install the SAME
|
||||
* handler twice. This can easily happen with PCI_Config space.
|
||||
* handler twice. This can easily happen
|
||||
* with PCI_Config space.
|
||||
*/
|
||||
status = AE_SAME_HANDLER;
|
||||
goto unlock_and_exit;
|
||||
@ -1011,7 +1030,7 @@ acpi_ev_execute_reg_methods (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ev_reg_run (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
|
@ -61,7 +61,7 @@
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Do any prep work for region handling, a nop for now
|
||||
* DESCRIPTION: Setup a system_memory operation region
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -115,7 +115,7 @@ acpi_ev_system_memory_region_setup (
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Do any prep work for region handling
|
||||
* DESCRIPTION: Setup a IO operation region
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -144,14 +144,14 @@ acpi_ev_io_space_region_setup (
|
||||
*
|
||||
* FUNCTION: acpi_ev_pci_config_region_setup
|
||||
*
|
||||
* PARAMETERS: Handle - Region we are interested in
|
||||
* PARAMETERS: Handle - Region we are interested in
|
||||
* Function - Start or stop
|
||||
* handler_context - Address space handler context
|
||||
* region_context - Region specific context
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Do any prep work for region handling
|
||||
* DESCRIPTION: Setup a PCI_Config operation region
|
||||
*
|
||||
* MUTEX: Assumes namespace is not locked
|
||||
*
|
||||
@ -324,7 +324,7 @@ acpi_ev_pci_config_region_setup (
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Do any prep work for region handling
|
||||
* DESCRIPTION: Setup a pci_bAR operation region
|
||||
*
|
||||
* MUTEX: Assumes namespace is not locked
|
||||
*
|
||||
@ -355,7 +355,7 @@ acpi_ev_pci_bar_region_setup (
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Do any prep work for region handling
|
||||
* DESCRIPTION: Setup a CMOS operation region
|
||||
*
|
||||
* MUTEX: Assumes namespace is not locked
|
||||
*
|
||||
@ -386,7 +386,7 @@ acpi_ev_cmos_region_setup (
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Do any prep work for region handling
|
||||
* DESCRIPTION: Default region initialization
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -49,6 +49,12 @@
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME ("evsci")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static u32 ACPI_SYSTEM_XFACE
|
||||
acpi_ev_sci_xrupt_handler (
|
||||
void *context);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -146,7 +152,8 @@ acpi_ev_gpe_xrupt_handler (
|
||||
******************************************************************************/
|
||||
|
||||
u32
|
||||
acpi_ev_install_sci_handler (void)
|
||||
acpi_ev_install_sci_handler (
|
||||
void)
|
||||
{
|
||||
u32 status = AE_OK;
|
||||
|
||||
@ -180,7 +187,8 @@ acpi_ev_install_sci_handler (void)
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_remove_sci_handler (void)
|
||||
acpi_ev_remove_sci_handler (
|
||||
void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
|
@ -64,6 +64,7 @@
|
||||
* DESCRIPTION: Saves the pointer to the handler function
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status
|
||||
acpi_install_exception_handler (
|
||||
@ -457,7 +458,8 @@ acpi_remove_notify_handler (
|
||||
/* Root Object */
|
||||
|
||||
if (device == ACPI_ROOT_OBJECT) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n"));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
|
||||
"Removing notify handler for ROOT object.\n"));
|
||||
|
||||
if (((handler_type & ACPI_SYSTEM_NOTIFY) &&
|
||||
!acpi_gbl_system_notify.handler) ||
|
||||
@ -564,8 +566,9 @@ EXPORT_SYMBOL(acpi_remove_notify_handler);
|
||||
*
|
||||
* FUNCTION: acpi_install_gpe_handler
|
||||
*
|
||||
* PARAMETERS: gpe_number - The GPE number within the GPE block
|
||||
* gpe_block - GPE block (NULL == FADT GPEs)
|
||||
* PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT
|
||||
* defined GPEs)
|
||||
* gpe_number - The GPE number within the GPE block
|
||||
* Type - Whether this GPE should be treated as an
|
||||
* edge- or level-triggered interrupt.
|
||||
* Address - Address of the handler
|
||||
@ -662,8 +665,9 @@ EXPORT_SYMBOL(acpi_install_gpe_handler);
|
||||
*
|
||||
* FUNCTION: acpi_remove_gpe_handler
|
||||
*
|
||||
* PARAMETERS: gpe_number - The event to remove a handler
|
||||
* gpe_block - GPE block (NULL == FADT GPEs)
|
||||
* PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT
|
||||
* defined GPEs)
|
||||
* gpe_number - The event to remove a handler
|
||||
* Address - Address of the handler
|
||||
*
|
||||
* RETURN: Status
|
||||
@ -766,7 +770,8 @@ EXPORT_SYMBOL(acpi_remove_gpe_handler);
|
||||
* FUNCTION: acpi_acquire_global_lock
|
||||
*
|
||||
* PARAMETERS: Timeout - How long the caller is willing to wait
|
||||
* out_handle - A handle to the lock if acquired
|
||||
* Handle - Where the handle to the lock is returned
|
||||
* (if acquired)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -812,7 +817,7 @@ EXPORT_SYMBOL(acpi_acquire_global_lock);
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Release the ACPI Global Lock
|
||||
* DESCRIPTION: Release the ACPI Global Lock. The handle must be valid.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -64,7 +64,8 @@
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_enable (void)
|
||||
acpi_enable (
|
||||
void)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
@ -91,7 +92,8 @@ acpi_enable (void)
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "Transition to ACPI mode successful\n"));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
|
||||
"Transition to ACPI mode successful\n"));
|
||||
}
|
||||
|
||||
return_ACPI_STATUS (status);
|
||||
@ -106,12 +108,13 @@ acpi_enable (void)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Transfers the system into LEGACY mode.
|
||||
* DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_disable (void)
|
||||
acpi_disable (
|
||||
void)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
@ -125,7 +128,8 @@ acpi_disable (void)
|
||||
}
|
||||
|
||||
if (acpi_hw_get_mode() == ACPI_SYS_MODE_LEGACY) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "System is already in legacy (non-ACPI) mode\n"));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
|
||||
"System is already in legacy (non-ACPI) mode\n"));
|
||||
}
|
||||
else {
|
||||
/* Transition to LEGACY mode */
|
||||
@ -133,7 +137,8 @@ acpi_disable (void)
|
||||
status = acpi_hw_set_mode (ACPI_SYS_MODE_LEGACY);
|
||||
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not exit ACPI mode to legacy mode"));
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
|
||||
"Could not exit ACPI mode to legacy mode"));
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
|
||||
@ -214,7 +219,7 @@ EXPORT_SYMBOL(acpi_enable_event);
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Enable an ACPI event (general purpose)
|
||||
* DESCRIPTION: Set the type of an individual GPE
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -519,13 +524,12 @@ unlock_and_exit:
|
||||
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_event_status
|
||||
*
|
||||
* PARAMETERS: Event - The fixed event
|
||||
* Event Status - Where the current status of the event will
|
||||
* event_status - Where the current status of the event will
|
||||
* be returned
|
||||
*
|
||||
* RETURN: Status
|
||||
@ -571,7 +575,7 @@ acpi_get_event_status (
|
||||
* PARAMETERS: gpe_device - Parent GPE Device
|
||||
* gpe_number - GPE level within the GPE block
|
||||
* Flags - Called from an ISR or not
|
||||
* Event Status - Where the current status of the event will
|
||||
* event_status - Where the current status of the event will
|
||||
* be returned
|
||||
*
|
||||
* RETURN: Status
|
||||
@ -775,4 +779,5 @@ unlock_and_exit:
|
||||
(void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(acpi_remove_gpe_block);
|
||||
|
@ -54,6 +54,14 @@
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME ("exconfig")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status
|
||||
acpi_ex_add_table (
|
||||
struct acpi_table_header *table,
|
||||
struct acpi_namespace_node *parent_node,
|
||||
union acpi_operand_object **ddb_handle);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -70,7 +78,7 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
static acpi_status
|
||||
acpi_ex_add_table (
|
||||
struct acpi_table_header *table,
|
||||
struct acpi_namespace_node *parent_node,
|
||||
@ -95,10 +103,10 @@ acpi_ex_add_table (
|
||||
|
||||
ACPI_MEMSET (&table_info, 0, sizeof (struct acpi_table_desc));
|
||||
|
||||
table_info.type = ACPI_TABLE_SSDT;
|
||||
table_info.pointer = table;
|
||||
table_info.length = (acpi_size) table->length;
|
||||
table_info.allocation = ACPI_MEM_ALLOCATED;
|
||||
table_info.type = ACPI_TABLE_SSDT;
|
||||
table_info.pointer = table;
|
||||
table_info.length = (acpi_size) table->length;
|
||||
table_info.allocation = ACPI_MEM_ALLOCATED;
|
||||
|
||||
status = acpi_tb_install_table (&table_info);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
@ -226,11 +234,10 @@ acpi_ex_load_table_op (
|
||||
start_node = parent_node;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the node referenced by the parameter_path_string
|
||||
*/
|
||||
/* Find the node referenced by the parameter_path_string */
|
||||
|
||||
status = acpi_ns_get_node_by_path (operand[4]->string.pointer, start_node,
|
||||
ACPI_NS_SEARCH_PARENT, ¶meter_node);
|
||||
ACPI_NS_SEARCH_PARENT, ¶meter_node);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
return_ACPI_STATUS (status);
|
||||
}
|
||||
@ -248,7 +255,8 @@ acpi_ex_load_table_op (
|
||||
if (parameter_node) {
|
||||
/* Store the parameter data into the optional parameter object */
|
||||
|
||||
status = acpi_ex_store (operand[5], ACPI_CAST_PTR (union acpi_operand_object, parameter_node),
|
||||
status = acpi_ex_store (operand[5],
|
||||
ACPI_CAST_PTR (union acpi_operand_object, parameter_node),
|
||||
walk_state);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
(void) acpi_ex_unload_table (ddb_handle);
|
||||
@ -371,7 +379,8 @@ acpi_ex_load_op (
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
table_ptr = ACPI_CAST_PTR (struct acpi_table_header, buffer_desc->buffer.pointer);
|
||||
table_ptr = ACPI_CAST_PTR (struct acpi_table_header,
|
||||
buffer_desc->buffer.pointer);
|
||||
|
||||
/* Sanity check the table length */
|
||||
|
||||
|
@ -50,6 +50,15 @@
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME ("exconvrt")
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static u32
|
||||
acpi_ex_convert_to_ascii (
|
||||
acpi_integer integer,
|
||||
u16 base,
|
||||
u8 *string,
|
||||
u8 max_length);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -115,9 +124,8 @@ acpi_ex_convert_to_integer (
|
||||
*/
|
||||
result = 0;
|
||||
|
||||
/*
|
||||
* String conversion is different than Buffer conversion
|
||||
*/
|
||||
/* String conversion is different than Buffer conversion */
|
||||
|
||||
switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
@ -168,9 +176,8 @@ acpi_ex_convert_to_integer (
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new integer
|
||||
*/
|
||||
/* Create a new integer */
|
||||
|
||||
return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER);
|
||||
if (!return_desc) {
|
||||
return_ACPI_STATUS (AE_NO_MEMORY);
|
||||
@ -251,7 +258,8 @@ acpi_ex_convert_to_buffer (
|
||||
* ASL/AML code that depends on the null being transferred to the new
|
||||
* buffer.
|
||||
*/
|
||||
return_desc = acpi_ut_create_buffer_object ((acpi_size) obj_desc->string.length + 1);
|
||||
return_desc = acpi_ut_create_buffer_object (
|
||||
(acpi_size) obj_desc->string.length + 1);
|
||||
if (!return_desc) {
|
||||
return_ACPI_STATUS (AE_NO_MEMORY);
|
||||
}
|
||||
@ -291,7 +299,7 @@ acpi_ex_convert_to_buffer (
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u32
|
||||
static u32
|
||||
acpi_ex_convert_to_ascii (
|
||||
acpi_integer integer,
|
||||
u16 base,
|
||||
@ -357,8 +365,9 @@ acpi_ex_convert_to_ascii (
|
||||
|
||||
case 16:
|
||||
|
||||
hex_length = ACPI_MUL_2 (data_width); /* 2 ascii hex chars per data byte */
|
||||
/* hex_length: 2 ascii hex chars per data byte */
|
||||
|
||||
hex_length = ACPI_MUL_2 (data_width);
|
||||
for (i = 0, j = (hex_length-1); i < hex_length; i++, j--) {
|
||||
/* Get one hex digit, most significant digits first */
|
||||
|
||||
@ -475,7 +484,7 @@ acpi_ex_convert_to_string (
|
||||
/* Setup string length, base, and separator */
|
||||
|
||||
switch (type) {
|
||||
case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by to_decimal_string operator */
|
||||
case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by to_decimal_string */
|
||||
/*
|
||||
* From ACPI: "If Data is a buffer, it is converted to a string of
|
||||
* decimal values separated by commas."
|
||||
@ -509,7 +518,7 @@ acpi_ex_convert_to_string (
|
||||
string_length = (obj_desc->buffer.length * 3);
|
||||
break;
|
||||
|
||||
case ACPI_EXPLICIT_CONVERT_HEX: /* Used by to_hex_string operator */
|
||||
case ACPI_EXPLICIT_CONVERT_HEX: /* Used by to_hex_string */
|
||||
/*
|
||||
* From ACPI: "If Data is a buffer, it is converted to a string of
|
||||
* hexadecimal values separated by commas."
|
||||
@ -530,9 +539,8 @@ acpi_ex_convert_to_string (
|
||||
return_ACPI_STATUS (AE_AML_STRING_LIMIT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new string object and string buffer
|
||||
*/
|
||||
/* Create a new string object and string buffer */
|
||||
|
||||
return_desc = acpi_ut_create_string_object ((acpi_size) string_length);
|
||||
if (!return_desc) {
|
||||
return_ACPI_STATUS (AE_NO_MEMORY);
|
||||
@ -551,8 +559,10 @@ acpi_ex_convert_to_string (
|
||||
*new_buf++ = separator; /* each separated by a comma or space */
|
||||
}
|
||||
|
||||
/* Null terminate the string (overwrites final comma/space from above) */
|
||||
|
||||
/*
|
||||
* Null terminate the string
|
||||
* (overwrites final comma/space from above)
|
||||
*/
|
||||
new_buf--;
|
||||
*new_buf = 0;
|
||||
break;
|
||||
@ -645,7 +655,6 @@ acpi_ex_convert_to_target_type (
|
||||
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/*
|
||||
* The operand must be a String. We can convert an
|
||||
* Integer or Buffer if necessary
|
||||
@ -656,7 +665,6 @@ acpi_ex_convert_to_target_type (
|
||||
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/*
|
||||
* The operand must be a Buffer. We can convert an
|
||||
* Integer or String if necessary
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user